<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Three Dollar Quill</title><link href="https://mwchase.neocities.org/" rel="alternate"></link><link href="https://mwchase.neocities.org/feeds/all.atom.xml" rel="self"></link><id>https://mwchase.neocities.org/</id><updated>2026-04-14T04:00:00-04:00</updated><entry><title>Weekly Roundup 2026-04-14</title><link href="https://mwchase.neocities.org/weekly-roundup-2026-04-14" rel="alternate"></link><published>2026-04-14T04:00:00-04:00</published><updated>2026-04-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-04-14:/weekly-roundup-2026-04-14</id><summary type="html">&lt;p class="first last"&gt;This has all been very interesting. Unfortunately, I'm kind of exhausted right now.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I started thinking in earnest about some hobby projects I want to pick back up.&lt;/li&gt;
&lt;li&gt;Thursday: I toyed around with both projects, and laid some groundwork.&lt;/li&gt;
&lt;li&gt;Friday: I tried some things for the calendar stuff which didn't work, so I replaced them with something that did.
On the sound synthesis side of things, deciding that I wasn't going to worry about streaming turned out to be just what I needed to work out a promising-looking (to me, at least) system for handling streaming.&lt;/li&gt;
&lt;li&gt;Saturday: Mostly on the sound synthesis side of things, I started refining the implementation of some advanced features.&lt;/li&gt;
&lt;li&gt;Sunday: I did a bit more work, but didn't feel like going into detail.&lt;/li&gt;
&lt;li&gt;Monday: I focused mainly on the calendar stuff; I made some improvements and plans, and considered real-world (ish) use cases that would motivate the kind of features I'd like for using this code in a worldbuilding context.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, maybe I'll try going back to one topic per day, if I'm going to be working on these two things, plus another third thing that I haven't been mentioning.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2026-04-13</title><link href="https://mwchase.neocities.org/coding-2026-04-13" rel="alternate"></link><published>2026-04-13T04:00:00-04:00</published><updated>2026-04-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-04-13:/coding-2026-04-13</id><summary type="html">&lt;p class="first last"&gt;This is all feeling like the realest version of this code, after my previous false starts.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't touch the synthesis code yet today, but I did work through the calendar code some more.
It's now at the point where very basic calendars probably work, but before I move on with things, I really should try to get this stuff properly organized.&lt;/p&gt;
&lt;p&gt;Let's see what I want in the near and far terms:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Divide things up into small modules.&lt;/li&gt;
&lt;li&gt;Implement more calendars.&lt;/li&gt;
&lt;li&gt;Implement some time handling.&lt;/li&gt;
&lt;li&gt;Implement proposed calendars for other planets, figure out what breaks as a result.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let's dive into that a little before I wrap up.
All of the formulas I'm working from assume, roughly speaking, that days in different calendars move in lockstep.
In particular, there's one day per day.
This doesn't quite hold if we then switch to considering martian sols.
My gut feeling is that martian calendars should require a sol-based equivalent to absolute day counts, and that conversions between martian and terrestrial calendars should be done based on moments, with some kind of conversion factor I don't want to think about.
(In a sci-fi setting, this conversion factor can be elided with the assumption of FTL communication.)
The exception is that it makes sense to talk about, given a martian month and day (or whatever), which martian year has the corresponding date falling within a given year of an earth calendar, or vice versa.&lt;/p&gt;
&lt;p&gt;Working through this might inspire some changes to the current implementation; we'll see.
For now, I want to get ready to go, and not think too much about any of this for the rest of tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2026-04-12</title><link href="https://mwchase.neocities.org/coding-2026-04-12" rel="alternate"></link><published>2026-04-12T04:00:00-04:00</published><updated>2026-04-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-04-12:/coding-2026-04-12</id><summary type="html">&lt;p class="first last"&gt;The coding equivalent of an old car up on blocks out back.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I tweaked and enhanced the various bits of hobby code I'm working on, but nothing too exciting yet.
Let's see what's coming up:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I need to finish running through the logic for the synthesis sequencing loop.
Main question to address there is when I want to do the checks for indefinitely sustained sounds.&lt;/li&gt;
&lt;li&gt;I've got a bunch of code to adapt from various prototypes to get the calendar code working.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For now, I'm tired and I want to take plenty of time winding down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2026-04-11</title><link href="https://mwchase.neocities.org/coding-2026-04-11" rel="alternate"></link><published>2026-04-11T04:00:00-04:00</published><updated>2026-04-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-04-11:/coding-2026-04-11</id><summary type="html">&lt;p class="first last"&gt;It doesn't work yet, but I'm confident it will.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, let's see what I've got.
I've got some notes on a possible set of interfaces for working with sound sequencing, but there are some areas of it that are definitely iffy.
I think the broad strokes are solid, and I've just confirmed that python-sounddevice appears to work for playback, at least on my machine.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Now then, I started filling in some of the stuff I have planned, but I need to fully nail down some of the data types.
Basically, I need to have something describing a &amp;quot;Sound&amp;quot;, which I know needs to have an onset, a sample function mapping &lt;tt class="docutils literal"&gt;npt.NDArray[np.float64]&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;npt.NDArray[np.float64]&lt;/tt&gt;,
(I will later consider working with a smaller dtype.)
and either an end time or a callback to determine when it should end.&lt;/p&gt;
&lt;p&gt;There are various problems or complications with this approach, which I'm not going to consider right now.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, I futzed around enough.
I am done for tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category></entry><entry><title>Coding 2026-04-10</title><link href="https://mwchase.neocities.org/coding-2026-04-10" rel="alternate"></link><published>2026-04-10T04:00:00-04:00</published><updated>2026-04-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-04-10:/coding-2026-04-10</id><summary type="html">&lt;p class="first last"&gt;Succeeding at some things, failing at others.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, it's getting kind of late, so let's wrap this up quickly, since I don't want a repeat of last night.
Instead of working on sequencing notes in space, I made some plans related to phase modulation.
In all likelihood, getting it to work like a physical synthesizer will require some kind of compromise, and be a prime candidate for Numba-based acceleration.
While I was thinking about all of this advanced stuff, I tossed together a sawtooth sample function.
I'll try to work out the sequencing stuff later, but first, some notes on the calendar stuff.&lt;/p&gt;
&lt;p&gt;I experimented with customizing &lt;tt class="docutils literal"&gt;__init__&lt;/tt&gt; in an attrs class hierarchy.
It didn't really work out, so I just went with a classmethod.
In order to test this, I tossed some junk implementations at the various abstract methods I defined.
The first thing to try to get done with all of this is to get actual implementations in there.&lt;/p&gt;
&lt;p&gt;Now then, let's see what I need to do back in audio synthesis land.
From an interface perspective, I believe I want to be talking about start times and durations, in seconds.
The prototype code just did a bunch of &lt;tt class="docutils literal"&gt;np.concatenate&lt;/tt&gt; calls, which, eh.
Let's ignore the question of streaming for now, since it's just going to confuse me.
The samples for each individual sound have to start at zero.
And stuff gets added, and on reflection, it might actually be easier to think of this in terms of constructing chunks, and yielding them out to something higher-level to process, so maybe I get streaming for free-ish.
The interface would, I think, look something like pushing a combination of start time, duration, and sample function into a coroutine, and getting chunks of audio data out.
I'll have to sketch out some diagrams or something tomorrow.&lt;/p&gt;
&lt;p&gt;For now, um, it got super-late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category></entry><entry><title>Coding 2026-04-09</title><link href="https://mwchase.neocities.org/coding-2026-04-09" rel="alternate"></link><published>2026-04-09T04:00:00-04:00</published><updated>2026-04-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-04-09:/coding-2026-04-09</id><summary type="html">&lt;p class="first last"&gt;A wave that's the equivalent of a triangle, though not a triangle wave.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's see what I can plan out, with a little more time.
On the audio synthesis side of things, I have a function to produce an unscaled and unshifted sine wave, which is intended to be passed an array of samples.
These samples are interpreted as fractions of a period.
I wish to have more sophisticated means of sampling and processing later, but first, let's see what's required to produce a 440 Hz tone for two seconds.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, I've got a function to convert an interval of time into samples.
Next, I need to look into writing the big array that this represents to a wav file.
Looking at SciPy's options, I see that I need to actually make some kind of decision about lots of things.
I think for now, I'll clamp the sampled values to the range from -1 to 1, and then convert to signed 16 bit integers for the output.
I'm less sure about the proper data types to use for intermediate steps.
I think for now, I'll go with &amp;quot;maybe too big, but almost certainly big enough&amp;quot;.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;All right, everything (eventually) worked the way I wanted and expected it to.
Thinking about relative utility, I think next I'm going to work on starting notes at different times, then basic envelopes, then scales.
At that point, I can work on as much additive synthesis as I feel like messing with.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;For now, though, I think I'll ponder the other project I was thinking about, making calendar stuff extensible so that it can handle funky made-up calendars.
For that, I'm right now thinking about the equivalent of Python &lt;tt class="docutils literal"&gt;date&lt;/tt&gt; objects, which are (probably) going to involve a year, a year and a month, or a year, month, and day.
The trick is, different calendars will assign different days to a given month (and different days to a given year), give a month a different number of days, or use a different set of months entirely.
(And when you get into times, different years could involve days of different lengths; in exotic enough orbital configurations, this could, technically, happen within a single calendar.)&lt;/p&gt;
&lt;p&gt;Anyway, if we ignore anything within or comparing days, then the equivalent of &lt;tt class="docutils literal"&gt;timedelta&lt;/tt&gt; can be used with any calendar.
And one way of encoding a &lt;tt class="docutils literal"&gt;datetime&lt;/tt&gt; equivalent would be &amp;quot;days since some common epoch&amp;quot; combined with &amp;quot;means of representation&amp;quot;.
Because the &amp;quot;means of representation&amp;quot; has different fields with potentially different types, I conclude that it is a class, with an instance attribute of the days since epoch, and computed attributes of year, month, day, etc.
Then, there are constructors for specifying the desired values of those computed attributes, and perhaps constructors for returning the date of a given holiday in a particular year.&lt;/p&gt;
&lt;p&gt;All right, that makes significantly more sense than my prototypes ever did, so I'm feeling good about implementing this.
Later.
Because it's super late again.
I just got really excited to be doing stuff with tangible results again.&lt;/p&gt;
&lt;p&gt;But seriously, let's wrap things up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category></entry><entry><title>Coding 2026-04-08</title><link href="https://mwchase.neocities.org/coding-2026-04-08" rel="alternate"></link><published>2026-04-08T04:00:00-04:00</published><updated>2026-04-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-04-08:/coding-2026-04-08</id><summary type="html">&lt;p class="first last"&gt;I've been thinking.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I said I was going to try to do something, and here's something.
I took longer than I would have liked with some paperwork tonight.
So I'm just going to lay out some plans.&lt;/p&gt;
&lt;p&gt;I've been thinking more about audio synthesis and music, and calendar systems.
Really getting into sinusoids, I guess.
It's getting late, so I'm going to take some quick notes for later:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Many instruments can be approximated by a combination of pure harmonics.&lt;/li&gt;
&lt;li&gt;Pure harmonics can be obtained via additive synthesis, or via phase modulation.&lt;/li&gt;
&lt;li&gt;Phase modulation is of interest because that's how many iconic synth sounds are produced.&lt;/li&gt;
&lt;li&gt;Additive synthesis can be used to produce negative harmonics, and other inharmonic sounds.&lt;/li&gt;
&lt;li&gt;Obviously inharmonic sounds are important for instruments like bells and struck bars or plates.&lt;/li&gt;
&lt;li&gt;Subtle inharmonicity can be used to change the consonances and dissonances of intervals in a given tuning system.&lt;/li&gt;
&lt;li&gt;Either approach should be not-too-hard to implement via linear interpolation of a wavetable of a sine function, or simply calling numpy.sin directly.&lt;/li&gt;
&lt;li&gt;Another aspect of an instrument is its envelope; I tried implementing ADSR before, and it wasn't clear whether it was actually doing anything.&lt;/li&gt;
&lt;li&gt;I'm planning to work with numpy arrays, and initially just write the results to a wav file, but also look into streaming.&lt;/li&gt;
&lt;li&gt;Would like to work with notes in a somewhat MIDI-like way.&lt;/li&gt;
&lt;li&gt;Overlapping them, I've thought of using the heapq module to sort upcoming notes by onset time, and playing notes by time to finish contributing; this would potentially be a workable basis for real-time-ish effects.&lt;/li&gt;
&lt;li&gt;Possibly notes could be separated into tracks, which could then apply pink noise offsets to timing and amplitude.&lt;/li&gt;
&lt;li&gt;I want to start with writing a public-domain song to a file, using sine waves with no envelope.&lt;/li&gt;
&lt;li&gt;Near-term improvements include envelopes, additive synthesis (including naturalistic inharmonicity) and phase modulation, streaming, and pink noise.&lt;/li&gt;
&lt;li&gt;Further-term improvements include alternative scales, and inharmonics to match alternative scales.&lt;/li&gt;
&lt;li&gt;I'll keep Numba in mind for this, since it's served me so well in the context of image processing, but I want to hold off on writing things for it right off the bat; I'd rather &lt;em&gt;rewrite&lt;/em&gt; for Numba if I see that things are too slow.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, it's &lt;em&gt;super&lt;/em&gt; late, so I'm just going to wrap things up now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category></entry><entry><title>Weekly Roundup 2026-04-07</title><link href="https://mwchase.neocities.org/weekly-roundup-2026-04-07" rel="alternate"></link><published>2026-04-07T04:00:00-04:00</published><updated>2026-04-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-04-07:/weekly-roundup-2026-04-07</id><summary type="html">&lt;p class="first last"&gt;Confused and out of it.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I gave some thought to what exactly the scope of Villeins of Tomorrow should be.&lt;/li&gt;
&lt;li&gt;Thursday: I made a little progress, but got tired.&lt;/li&gt;
&lt;li&gt;Friday: Bad time at work, okay time at video games.&lt;/li&gt;
&lt;li&gt;Saturday: Trying to hold on.&lt;/li&gt;
&lt;li&gt;Sunday: Tried to recuperate.&lt;/li&gt;
&lt;li&gt;Monday: Still tried to recuperate.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to... do something.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Villeins of Tomorrow"></category></entry><entry><title>Diary 2026-04-06</title><link href="https://mwchase.neocities.org/diary-2026-04-06" rel="alternate"></link><published>2026-04-06T04:00:00-04:00</published><updated>2026-04-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-04-06:/diary-2026-04-06</id><summary type="html">&lt;p class="first last"&gt;Somehow even less than yesterday.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's see what I'm even feeling like doing.
Playing Artisan of Glimmith a completely normal amount, apparently.&lt;/p&gt;
&lt;p&gt;Aside from that, I've just been kind of hanging around.
I think I need to find stuff to do not on any of my various devices, but also I have a few things I want to set up on them.
For now, though, I'd rather just get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2026-04-05</title><link href="https://mwchase.neocities.org/diary-2026-04-05" rel="alternate"></link><published>2026-04-05T04:00:00-04:00</published><updated>2026-04-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-04-05:/diary-2026-04-05</id><summary type="html">&lt;p class="first last"&gt;I'm not particularly happy when it's just a tiny paragraph, but at this point, there's nothing more I can do for the day.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I kept on taking it easy.
Did a few things that I &lt;em&gt;probably&lt;/em&gt; won't talk about, but whatever.
Still figuring out &lt;em&gt;how&lt;/em&gt; I want to deal with everything that's happening, and I guess that means a lot of slow days.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2026-04-04</title><link href="https://mwchase.neocities.org/diary-2026-04-04" rel="alternate"></link><published>2026-04-04T04:00:00-04:00</published><updated>2026-04-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-04-04:/diary-2026-04-04</id><summary type="html">&lt;p class="first last"&gt;Safe to skip.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I poked a bit at Villeins of Tomorrow, but I've been having a rough week, as I think I mentioned before.
Thus, I'm trying to take things easy right now.
Nothing in mind to talk about.&lt;/p&gt;
&lt;p&gt;(Except to mention that I was closer to the end of Tiling Forest than I thought.
Definitely interested in the full game.)&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2026-04-03</title><link href="https://mwchase.neocities.org/diary-2026-04-03" rel="alternate"></link><published>2026-04-03T04:00:00-04:00</published><updated>2026-04-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-04-03:/diary-2026-04-03</id><summary type="html">&lt;p class="first last"&gt;Work experience that caused me to use the phrase &amp;quot;going mad from the revelation&amp;quot; in earnest.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, today wasn't conducive to creative focus.
Work showed me that one of the really unpleasant parts of man-made horrors beyond your comprehension, is when you start comprehending them.&lt;/p&gt;
&lt;p&gt;I don't wish to elaborate on that, so, um, let's see... I played a bunch of Tiling Forest.
If I'm remembering my completion percentage right, there's going to somehow be a lot more going on than I can imagine, which is going to be interesting to see how they manage that.&lt;/p&gt;
&lt;p&gt;Aside from that, I can't think of anything else, so I'm going to wrap up now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Villeins of Tomorrow 2026-04-02</title><link href="https://mwchase.neocities.org/villeins-of-tomorrow-2026-04-02" rel="alternate"></link><published>2026-04-02T04:00:00-04:00</published><updated>2026-04-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-04-02:/villeins-of-tomorrow-2026-04-02</id><summary type="html">&lt;p class="first last"&gt;This one's only a paragraph lol.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Here's the plan: I've got some disaster ideas that work with science-fiction planets, so that's how I'm sketching out locations for now.
While I've come up with a few ideas there, right now I'm just... really tired.
It's sort of early, but I want to wind down &lt;em&gt;now&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Villeins of Tomorrow"></category><category term="Villeins of Tomorrow"></category><category term="rpg design"></category><category term="short post"></category></entry><entry><title>Villeins of Tomorrow 2026-04-01</title><link href="https://mwchase.neocities.org/villeins-of-tomorrow-2026-04-01" rel="alternate"></link><published>2026-04-01T04:00:00-04:00</published><updated>2026-04-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-04-01:/villeins-of-tomorrow-2026-04-01</id><summary type="html">&lt;p class="first last"&gt;Started work, just in time for my focus to give out.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I've read through the end of the current prerelease, so let's see what needs working out...&lt;/p&gt;
&lt;p&gt;The big question is what the scale of the playset should be.
Is this a big planet-hopping adventure, or a single location with more detailed breakdown?&lt;/p&gt;
&lt;p&gt;While I think about that, let's focus on what we know.
The starting inventory should be drawn from the Stars Above table, and I want to find some way to bring in other tables in a &amp;quot;planet of hats&amp;quot; or holodeck adventure kind of way, but that is not core to the premise, and I need to be ready to let go.
I need six disasters, eighteen NPCs, eighteen locations, and twelve goals.
Possibly these numbers can be tweaked, but I figure I'll hold to the numbers for The Clockwork City to start with.&lt;/p&gt;
&lt;p&gt;So, I didn't want to type my draft of this into this blog post and go scrounging for it later, so I'm putting it together elsewhere.
I've addressed some of the questions and lacks that I noticed, but I've only just started on the fifty-four entries I think I need.
I'm again really not sure what the scale should be.
Is each planet a location?
Are there several locations to a planet?
Are the locations all part of a single spaceship in which the players are encouraged to act out a slapstick parody of &lt;em&gt;Alien&lt;/em&gt;?&lt;/p&gt;
&lt;p&gt;... Maybe I commit to having many more locations, organized into &amp;quot;biomes&amp;quot;.
Now there's a thought.
Maybe not a good one.&lt;/p&gt;
&lt;p&gt;Anyway, I'm feeling kind of out of it, so I'm going to wrap things up and get some rest.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Villeins of Tomorrow"></category><category term="Villeins of Tomorrow"></category><category term="rpg design"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2026-03-31</title><link href="https://mwchase.neocities.org/weekly-roundup-2026-03-31" rel="alternate"></link><published>2026-03-31T04:00:00-04:00</published><updated>2026-03-31T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-03-31:/weekly-roundup-2026-03-31</id><summary type="html">&lt;p class="first last"&gt;It was a roleplaying game kind of week, in which I mostly just read a lot.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I made some progress prepping for Lancer solo RP, which I'm not sure is a thing the devs even expected to be possible, but whatever.&lt;/li&gt;
&lt;li&gt;Thursday: A bit more Lancer work.&lt;/li&gt;
&lt;li&gt;Friday: A little more...&lt;/li&gt;
&lt;li&gt;Saturday: So, like, part of the motivation for the solo RP stuff was to try to deal with burnout, so... it turns out I'm kinda burnt out.&lt;/li&gt;
&lt;li&gt;Sunday: I switched gears jarringly over to Villeins of Tomorrow, my space opera RPG concept in which various typical space opera heroes are, like, kind of fashy, so you have to do something about that.
For this iteration, I'm not bothering to come up with a whole system, and instead trying to turn it into an &lt;em&gt;Eat God&lt;/em&gt; playset.&lt;/li&gt;
&lt;li&gt;Monday: I read most of &lt;em&gt;Eat God&lt;/em&gt;, and came up with some questions I'm going to have to answer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to finish that up, and start sketching out the shape of the playset(s).&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Villeins of Tomorrow"></category></entry><entry><title>Villeins of Tomorrow 2026-03-30</title><link href="https://mwchase.neocities.org/villeins-of-tomorrow-2026-03-30" rel="alternate"></link><published>2026-03-30T04:00:00-04:00</published><updated>2026-03-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-03-30:/villeins-of-tomorrow-2026-03-30</id><summary type="html">&lt;p class="first last"&gt;I feel like I've done more than could have been reasonably expected, but not enough to write about at length.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Oh boy.
I really wasn't up for much today, but I did read much of the current pre-release of Eat God, which has given me a few questions to ponder:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;How should the Villeins of Tomorrow playset justify the workings of Catalysts?&lt;/li&gt;
&lt;li&gt;Do the different Creeds fit with the milieu I'm going for?&lt;/li&gt;
&lt;li&gt;Is there a principled way to allow players to enhance the in-universe &amp;quot;plausibility&amp;quot; of a Rebellious Art by rattling off some technobabble nonsense?
Like I think it would really add to stuff like vanishing from a locked room, just because nobody was looking, if it's accompanied in-character with something like &amp;quot;an elementary application of phased quasi-tachyon disruptions&amp;quot;.
Ideally with extreme ambiguity about which nouns the adjectives are even modifying.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, I kind of don't want to look at my laptop any more tonight, so let's wrap things up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Villeins of Tomorrow"></category><category term="Villeins of Tomorrow"></category><category term="rpg design"></category><category term="short post"></category></entry><entry><title>Villeins of Tomorrow 2026-03-29</title><link href="https://mwchase.neocities.org/villeins-of-tomorrow-2026-03-29" rel="alternate"></link><published>2026-03-29T04:00:00-04:00</published><updated>2026-03-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-03-29:/villeins-of-tomorrow-2026-03-29</id><summary type="html">&lt;p class="first last"&gt;A fresh start, with some assumptions reconsidered.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm back on this, and I've been thinking about a few issues I was having with the design:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;What kind of tone should I aim for?&lt;/li&gt;
&lt;li&gt;What sorts of things should the player characters be able to do?&lt;/li&gt;
&lt;li&gt;What sorts of things should the player characters be doing over the course of a campaign?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I initially wanted to have a &amp;quot;serious&amp;quot; tone, with &amp;quot;realistic&amp;quot; portrayals of &amp;quot;the enemy factions think it's like &lt;em&gt;that&lt;/em&gt;, but actually it's like &lt;em&gt;this&lt;/em&gt;&amp;quot;, and I didn't even have that clear of an idea for the other two questions.&lt;/p&gt;
&lt;p&gt;After having a few months for this to bounce around in my head, I concluded that a more irreverent tone should fit my rhetorical goals just as well, and should make the setting easier to work with.
I'm thinking &lt;em&gt;The Hitchhiker's Guide to the Galaxy&lt;/em&gt; as a major source of inspiration here, and some further inspiration from something like &lt;em&gt;Poor Superman&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;And thinking about &lt;em&gt;The Hitchhiker's Guide&lt;/em&gt; reminded me of a particular quote from it: &amp;quot;[...] and small furry creatures from Alpha Centauri were real small furry creatures from Alpha Centauri&amp;quot;.
Although I definitely want to be open to human characters, I thought it would make sense to focus on the role of puppetry in science fiction.
And that gave me an idea that let me offload a lot of my questions onto a pre-existing game: instead of trying to design everything from scratch, I can try to put together a playset for &lt;em&gt;Eat God&lt;/em&gt;.
Here are the tweaks that I think are needed, offhand:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Need rules for playing as a human.&lt;/li&gt;
&lt;li&gt;Need to have some way of representing the four character backgrounds I want.&lt;/li&gt;
&lt;li&gt;Need alternative forms of names for players to choose.&lt;/li&gt;
&lt;li&gt;Need to at least consider an alternative framing to &amp;quot;eating god&amp;quot;; on the other hand, space opera does often have lots of gods out there, so perhaps it's not really a stretch.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From there, I can then hopefully put together some generic or specific scenarios; I ideally want at least one focusing on each of the three branches of the Complex.&lt;/p&gt;
&lt;p&gt;My plan is to properly read over everything, take notes as I go, and then start putting something together.
For now, though, I need to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Villeins of Tomorrow"></category><category term="Villeins of Tomorrow"></category><category term="rpg design"></category></entry><entry><title>Diary 2026-03-28</title><link href="https://mwchase.neocities.org/diary-2026-03-28" rel="alternate"></link><published>2026-03-28T04:00:00-04:00</published><updated>2026-03-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-03-28:/diary-2026-03-28</id><summary type="html">&lt;p class="first last"&gt;I might be way more burnt out than I think I feel.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm ready to start writing stuff up, but in order to do that, I'm going to need to feel motivated to actually use my laptop for more time than it takes to write up these entries.
I'm trying to figure out what I need to feel a little better and more motivated, and I just don't know.
I need to have some time to rest, I guess, and also, crucially, to actually use that time in a restful manner.&lt;/p&gt;
&lt;p&gt;Speaking of which, I should get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2026-03-27</title><link href="https://mwchase.neocities.org/diary-2026-03-27" rel="alternate"></link><published>2026-03-27T04:00:00-04:00</published><updated>2026-03-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-03-27:/diary-2026-03-27</id><summary type="html">&lt;p class="first last"&gt;Bluh. No reason not to skip.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm dealing with some nonsense right now, but I am gradually refining the parameters of the solo RP campaign.
Before I jump into the briefing for the first mission, I'm refreshing my memory and filling in gaps in my knowledge about the setting.&lt;/p&gt;
&lt;p&gt;I got distracted reading, and I should get to bed now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2026-03-26</title><link href="https://mwchase.neocities.org/diary-2026-03-26" rel="alternate"></link><published>2026-03-26T04:00:00-04:00</published><updated>2026-03-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-03-26:/diary-2026-03-26</id><summary type="html">&lt;p class="first last"&gt;Well, I don't say &lt;em&gt;nothing&lt;/em&gt; in this entry, but I also don't say much.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Working on the first mission for solo stuff.
I've got a couple worldbuilding questions I want to check the book for (like &amp;quot;How much 'stealth in space' does Lancer have?&amp;quot;), and I want to refine the stakes a little (I have determined that my goal is to retrieve... something), but then I should be ready to go, at which point I just need the energy and focus to get started and keep going.&lt;/p&gt;
&lt;p&gt;Anyway, with that said, I really shouldn't be working on any part of this any more tonight.
It's late, I'm tired, really there's no reason to draw this entry out any further.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2026-03-25</title><link href="https://mwchase.neocities.org/diary-2026-03-25" rel="alternate"></link><published>2026-03-25T04:00:00-04:00</published><updated>2026-03-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-03-25:/diary-2026-03-25</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;It's a starting loadout, how much could there be to keep track of? ... Oh no.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Every time I estimate how many puzzles there must be in Artisan of Glimmith, I fall short.
Anyway.&lt;/p&gt;
&lt;p&gt;After dinking around in COMP/CON for a bit, I've got my character, and my mech, and everything's named.
Big issue currently is that I followed my heart a little when it came to mech and pilot loadout, and either I need to roll things back a little, or my first mission is going to be in zero-G to justify the systems and gear I took.
I guess my impulse is to try it out, and give myself a mulligan if it's just totally unworkable to keep track of combat in those conditions.&lt;/p&gt;
&lt;p&gt;So, the thing to work on now is to take a look at the solo resource I'm trying to use this time; I have others to fall back on if it doesn't work out, but I'm curious whether the one I'm looking at now (&amp;quot;Invisible Game Master&amp;quot;) represents a minor tweak to something like Mythic, or if it's going to be qualitatively different.
That's not happening tonight, though.
I've already gotten distracted and need to wrap things up half an hour ago.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2026-03-24</title><link href="https://mwchase.neocities.org/weekly-roundup-2026-03-24" rel="alternate"></link><published>2026-03-24T04:00:00-04:00</published><updated>2026-03-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-03-24:/weekly-roundup-2026-03-24</id><summary type="html">&lt;p class="first last"&gt;My plan to deliberately procrastinate is bearing even less fruit than it sounds like it would.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I came up with some new plans for Impliciula.&lt;/li&gt;
&lt;li&gt;Thursday: I realized that my plans broke 1ML. Again.&lt;/li&gt;
&lt;li&gt;Friday: I decided to take a break from programming and mess with solo roleplay.&lt;/li&gt;
&lt;li&gt;Saturday: I was sick, but then I was less sick, but I still didn't get as much done with solo roleplay as I would have liked.&lt;/li&gt;
&lt;li&gt;Sunday: Vibeo ganes.&lt;/li&gt;
&lt;li&gt;Monday: Movie.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to really try to get further with the solo RP.
I mean it.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category></entry><entry><title>Diary 2026-03-23</title><link href="https://mwchase.neocities.org/diary-2026-03-23" rel="alternate"></link><published>2026-03-23T04:00:00-04:00</published><updated>2026-03-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-03-23:/diary-2026-03-23</id><summary type="html">&lt;p class="first last"&gt;I feel like I might have underpaid for this amount of content?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;No end in sight with Artisan of Glimmith.
I'm actually feeling maybe a little worried on behalf of the devs.
Like, how long did they spend on this?&lt;/p&gt;
&lt;p&gt;Anyway, between that and traveling and movies, I didn't get anything done on character creation, and now it's time for bed, so I guess this entry is another dud.&lt;/p&gt;
&lt;p&gt;Got to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2026-03-22</title><link href="https://mwchase.neocities.org/diary-2026-03-22" rel="alternate"></link><published>2026-03-22T04:00:00-04:00</published><updated>2026-03-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-03-22:/diary-2026-03-22</id><summary type="html">&lt;p class="first last"&gt;I made an astounding amount of progress in Artisan of Glimmith and Piece By Piece, but as far as what I meant to do...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, so.
I meant to come up with a name and callsign for my RP character.
Then I got distracted with video games and videos and such.
If I tried to get &lt;em&gt;something&lt;/em&gt; done now, it would be bad.&lt;/p&gt;
&lt;p&gt;Best to just wrap up and take things easy.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2026-03-21</title><link href="https://mwchase.neocities.org/diary-2026-03-21" rel="alternate"></link><published>2026-03-21T04:00:00-04:00</published><updated>2026-03-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-03-21:/diary-2026-03-21</id><summary type="html">&lt;p class="first last"&gt;Was it burnout, or was I just a little sick? Was it both?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I seemed to be getting sick earlier today, but I think my condition is improving.
I played around some with Lancer character building.
I'm about ready to start putting the mech together, at which point I will have to work on the question of just what is happening to start with.
It is a little frustrating to be going so slowly, but I'm going to have to just focus on, I'm doing things, and I shouldn't have any specific expectation of what I accomplish.&lt;/p&gt;
&lt;p&gt;For now, I'm going to wind down and play video games.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2026-03-20</title><link href="https://mwchase.neocities.org/diary-2026-03-20" rel="alternate"></link><published>2026-03-20T04:00:00-04:00</published><updated>2026-03-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-03-20:/diary-2026-03-20</id><summary type="html">&lt;p class="first last"&gt;Safe to skip, unless this, like, goes anywhere.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm trying to shift gears away from Impliciula for a bit, because I'm not feeling great.
I'm looking into trying out solo roleplaying again.
I'm right now seeing just how far I can get with Lancer before getting totally overwhelmed.
I'm assuming not far, but maybe I'll surprise myself.
I've just gotten started, but I'm done for tonight.
Tomorrow, I'll need to figure out how I want to record things and take notes.&lt;/p&gt;
&lt;p&gt;But yeah, for now, I should get to bed and wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2026-03-19</title><link href="https://mwchase.neocities.org/coding-2026-03-19" rel="alternate"></link><published>2026-03-19T04:00:00-04:00</published><updated>2026-03-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-03-19:/coding-2026-03-19</id><summary type="html">&lt;p class="first last"&gt;With greater understanding comes new, advanced forms of confusion.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, now that I'm figuring out how 1ML actually works, I'm seeing how I messed up in my attempt to bidirectionalize it.
I'm fairly sure that the way I was thinking of implementing function application would have done it in a way not visible to the type system, which defeats the point.&lt;/p&gt;
&lt;p&gt;So, to try to make things work properly, I'm going to put together some requirements that my version of elaboration has to satisfy:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Synthesizing judgments should produce identical types and elaborations&lt;/li&gt;
&lt;li&gt;Checking judgments should accept the same types, and &amp;quot;pure&amp;quot; judgments should be extended to impure judgments in the obvious way, given an abstracted type.&lt;/li&gt;
&lt;li&gt;Because checking can't jump into the middle of the subclassing machinery, this has to be accomplished by destructuring and reworking the elaborations from checking terms.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Efun&lt;/tt&gt; will require some minor improvements to handle abstraction.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Eapp&lt;/tt&gt; will need a comprehensize overhaul to &amp;quot;fake&amp;quot; accessing the type substitutions.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Eseal&lt;/tt&gt; might be fine, but need to check.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Ewrap&lt;/tt&gt; cannot replicate its semantics unless it keeps on using the full sugar; unclear whether this is a problem.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Eunw&lt;/tt&gt; &lt;em&gt;should&lt;/em&gt; be fine if &lt;tt class="docutils literal"&gt;Eseal&lt;/tt&gt; is fine.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Actually, let's see if I'm getting &lt;tt class="docutils literal"&gt;Ewrap&lt;/tt&gt; right.
To actually replicate the semantics, we'd need to accept &lt;em&gt;abstracted&lt;/em&gt; value wrapper types, and the abstractions would allow us to interact with the wrapped expression as if it had a concrete type, by, um, hm.
Quite aside from the fact that my current draft of the elaboration has some trivial issues I can fix up, for the rest of it, I really need to consider just how load-bearing the precise semantics are, because I've thoroughly confused myself at this point.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Given that I'm already carving out an exception for if expressions to match what refinement types want, I don't feel bad saying that &lt;tt class="docutils literal"&gt;Ewrap&lt;/tt&gt; keeping the old semantics is on the table, even if it does make the bidirectionalization in that context a little pointless.&lt;/p&gt;
&lt;p&gt;So, where things stand now is, I &lt;em&gt;could&lt;/em&gt; work on cleaning this all up, but I feel like I really need to take a break for a few days.
Not sure how I'll accomplish that, but I feel it's what I need to do.&lt;/p&gt;
&lt;p&gt;First thing I can do in service of that is finishing up this entry on a reasonable time frame.
No reason to draw it out further.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category></entry><entry><title>Coding 2026-03-18</title><link href="https://mwchase.neocities.org/coding-2026-03-18" rel="alternate"></link><published>2026-03-18T04:00:00-04:00</published><updated>2026-03-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-03-18:/coding-2026-03-18</id><summary type="html">&lt;p class="first last"&gt;Running through some basic examples in my head has finally clarified how some very basic things are supposed to work.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, let's take stock.
I'm improving my understanding of 1ML, and I'm getting a general handle on refinement types, and that's making me think that it might make sense to work on refinement types before algebraic effects.
This is because algebraic effects (or at least the implementation I'm looking at) want sum types to exist, but don't really have strong constraints on the design, while refinement types have a bunch of things to say about sum types, some things that I don't yet fully understand...&lt;/p&gt;
&lt;p&gt;I've got some things that I'm pondering about refinement types in general.
It's talking about stuff like the type of an ordered list, and I'm wondering if it's possible to express &amp;quot;is an ordered list&amp;quot; as a predicate using the grammar specified in this tutorial, because I think I would prefer &amp;quot;refinement of generic type&amp;quot; to &amp;quot;bespoke type that happens to have the same representation&amp;quot;.&lt;/p&gt;
&lt;p&gt;Anyway, some stuff that I've been thinking about but haven't written down.
Of the expression elaboration rules in 1ML, the big ones to make sure I haven't broken them in my attempts to bidirectionalize are &lt;tt class="docutils literal"&gt;Eapp&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;Eseal&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;Ewrap&lt;/tt&gt;, and &lt;tt class="docutils literal"&gt;Eunw&lt;/tt&gt;.
In each case, there is a variable (two, in the case of &lt;tt class="docutils literal"&gt;Eapp&lt;/tt&gt;) that I'm replacing with an expression.
This removes the implicit binding that was putting the rest of the program or module inside the existential.
At a glance, the effects of this look mostly safe, though I need to take another look at &lt;tt class="docutils literal"&gt;Eseal&lt;/tt&gt;.
But &lt;tt class="docutils literal"&gt;Eapp&lt;/tt&gt;...&lt;/p&gt;
&lt;p&gt;Existential types on the &amp;quot;function&amp;quot; type in &lt;tt class="docutils literal"&gt;Eapp&lt;/tt&gt; shouldn't be a big deal, but the problems come in when I tried to replace explicit subtyping with a checking judgment.
It looks to me like one of the consequences of this is that abstract types on the &amp;quot;argument&amp;quot; get bound &amp;quot;inside&amp;quot; the function call, rather than &amp;quot;before&amp;quot; it, which I don't &lt;em&gt;think&lt;/em&gt; really matters, but it is a difference.
The big difference that has me questioning things is that I guessed(?) that the way to handle universal types was to convert them to an abstraction attached to the parameter type; the argument is then checked against this new type, creating an expression of the new type, which encodes type information from the argument, in a form that should be accessible to the rest of the function application.&lt;/p&gt;
&lt;p&gt;The main thing I'm now understanding is that, unlike how I was thinking of things, the structure of a function really does determine how it has to be called, so that (at least in the context of the explicit version of 1ML), generic functions need to be called with proper type arguments, so that the first argument to a polymorphic identity function has to be a type to specify which type it is the identity of.
If I'm going to figure out a way to make this nicer, it's going to be solely within the realm of 1ML, since algebraic effects don't have any bearing on this, and in this context, the refinement types paper I'm reading explicitly does not specify how types should be inferred.&lt;/p&gt;
&lt;p&gt;Anyway, I'm still not totally sure my ideas for function application are valid, and I'll be legitimately surprised if I've written the correct elaboration for them, but if this works, I can finish specifying things, and then either work on phase polymorphism, or investigating whether I want to beef up type inference in some manner.&lt;/p&gt;
&lt;p&gt;For now, though, I'm sleepy and want to wind down, um, a few minutes ago.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category></entry><entry><title>Weekly Roundup 2026-03-17</title><link href="https://mwchase.neocities.org/weekly-roundup-2026-03-17" rel="alternate"></link><published>2026-03-17T04:00:00-04:00</published><updated>2026-03-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-03-17:/weekly-roundup-2026-03-17</id><summary type="html">&lt;p class="first last"&gt;I'm starting to actually understand stuff about the higher level systems here. It's a weird feeling.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I thought I'd found a problem with my implementation.&lt;/li&gt;
&lt;li&gt;Thursday: I realized that the problem was in my mind, not in my implementation (which, to be fair, &lt;em&gt;is&lt;/em&gt; mostly in my mind at this point).&lt;/li&gt;
&lt;li&gt;Friday: I decided to take another shot at understanding refinement types.&lt;/li&gt;
&lt;li&gt;Saturday: I concluded that I should stop looking at pure sealing for now, and started thinking about how best to get feedback on this stuff.&lt;/li&gt;
&lt;li&gt;Sunday: Following some technical difficulties in the morning, I got back to getting things ready for feedback.&lt;/li&gt;
&lt;li&gt;Monday: I continued drafting my writeups, and didn't do much worth writing up &lt;em&gt;on the blog&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to keep on writing stuff up until I've got enough rough drafts to properly refine.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category></entry><entry><title>Coding 2026-03-16</title><link href="https://mwchase.neocities.org/coding-2026-03-16" rel="alternate"></link><published>2026-03-16T04:00:00-04:00</published><updated>2026-03-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-03-16:/coding-2026-03-16</id><summary type="html">&lt;p class="first last"&gt;Pretty much safe to skip.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I've got more stuff drafted to go on the wiki.
I'll try to get more drafted and entered into the wiki, and hopefully I'll be ready to take it public soon.&lt;/p&gt;
&lt;p&gt;For now, I'm sort of taking things easy, and I'm not going to try too hard to have a full-sized entry.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-03-15</title><link href="https://mwchase.neocities.org/coding-2026-03-15" rel="alternate"></link><published>2026-03-15T04:00:00-04:00</published><updated>2026-03-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-03-15:/coding-2026-03-15</id><summary type="html">&lt;p class="first last"&gt;Feeling a lot better about today than I was this morning...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I rescued my laptop's input system from my own weird mistakes, and now I can type without text fields freezing up.&lt;/p&gt;
&lt;p&gt;What have I done with this?
Frankly, not much.
I've figured out which host I want to use for a wiki, and I'm drafting pages right now.
I want to have something up soon, but right now is probably not a good idea.&lt;/p&gt;
&lt;p&gt;What I'm working on right now is a high-level introduction to Impliciula, and later I hope to write up what I've actually accomplished and put it up in a somewhat digestible format.
Right now, though, I want to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-03-14</title><link href="https://mwchase.neocities.org/coding-2026-03-14" rel="alternate"></link><published>2026-03-14T04:00:00-04:00</published><updated>2026-03-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-03-14:/coding-2026-03-14</id><summary type="html">&lt;p class="first last"&gt;Figuring out how to get eyes on this...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, let's see what I've been thinking of.&lt;/p&gt;
&lt;p&gt;On reflection, pure sealing is probably too big of a risk to mess with, unless it proves to actually somehow be necessary.
(This is because I'm planning to have sealing play a bigger role in &amp;quot;bidirectional 1ML&amp;quot;, and making it pure would have adverse effects on the semantics of other nodes.
I think.)&lt;/p&gt;
&lt;p&gt;With that said, I'm trying to figure out what I want to do to have all of these concepts somewhere where people can look at them and discuss.
The archives of this blog aren't great for that, for a few reasons.
Ideally, I'd have a wiki that supports the same LaTeX packages I'm using for my current notes.
That works for getting &amp;quot;definitive&amp;quot; writeups of the concepts involved, but I want to be messaging them out and discussing them somewhere.
For messaging them out, my existing social media accounts should work.
For discussion, wikis have discussion features, but they're a little weird.
I'd at least like the discussion to be more public than &amp;quot;join our discord server&amp;quot;, but I'm not up for moderating my own forum.
Need to see what kinds of communities are out there that I can join and work with.&lt;/p&gt;
&lt;p&gt;Anyway, I'm tired, and in a weird state of mind, so I'm going to go get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-03-13</title><link href="https://mwchase.neocities.org/coding-2026-03-13" rel="alternate"></link><published>2026-03-13T04:00:00-04:00</published><updated>2026-03-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-03-13:/coding-2026-03-13</id><summary type="html">&lt;p class="first last"&gt;I may be trying to noclip through burnout...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm not really in a space for... accomplishing things, currently.
Even so, I really do want to make some progress.
I was just taking some notes on what I expect Impliciula to look like after I smush all of the features together.&lt;/p&gt;
&lt;p&gt;Now that I have a general idea of how 1ML works, and a vague idea of how to integrate effects, I want to try and really sink my teeth into refinement types.
Not happening now, and not sure if it's happening tomorrow, but soon.
Right now, though, bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-03-12</title><link href="https://mwchase.neocities.org/coding-2026-03-12" rel="alternate"></link><published>2026-03-12T04:00:00-04:00</published><updated>2026-03-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-03-12:/coding-2026-03-12</id><summary type="html">&lt;p class="first last"&gt;I figured some things out! Hooray!&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, the bad news is that I got distracted playing video games and I'm writing this up as fast as I can, late.&lt;/p&gt;
&lt;p&gt;The good news is, I read over the various papers, and understand things well enough now, to be &lt;em&gt;pretty sure&lt;/em&gt; that my laziness-motivated subtyping in System Fω shouldn't cause any serious issues.
Basically, the generative/applicative distinction is driven by the behavior of &lt;em&gt;binding&lt;/em&gt; an abstracted value.&lt;/p&gt;
&lt;p&gt;Of course, now that I understand how purity interacts with functors, I want to take another crack at understanding pure sealing, although I really should prioritize effect polymorphism over pure sealing.&lt;/p&gt;
&lt;p&gt;Anyway, it's late, better wrap up quick quick quick.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-03-11</title><link href="https://mwchase.neocities.org/coding-2026-03-11" rel="alternate"></link><published>2026-03-11T04:00:00-04:00</published><updated>2026-03-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-03-11:/coding-2026-03-11</id><summary type="html">&lt;p class="first last"&gt;I have achieved net zero thought on this matter.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't think as hard about this as I might have liked, due to circumstances, but I believe that the semantics of my System Fω variant will break the generative/applicative distinction in 1ML.
Fortunately, it's a simple fix in terms of changes to core code; the tricky bit is going to be rewriting the test helpers.&lt;/p&gt;
&lt;p&gt;(The fix is &amp;quot;You know all of that fancy subtyping stuff? Don't do that.&amp;quot;)&lt;/p&gt;
&lt;p&gt;Before I touch anything, let's make sure I've got a handle on how all of this is supposed to work.
Because now that I'm looking at this again, I think I might have thought about this wrong.
What I need to do is, ignoring the semantics of my System Fω variant, figure out what 1ML &amp;quot;wants&amp;quot; to have happen with existential types.&lt;/p&gt;
&lt;p&gt;I'm getting tired so I'm going to try to wrap things up, but my impression is that I should expect fundamentally incompatible return values from a pure function from a type to itself, and two invocations of an impure function from a type to itself.
If this is right, then I just need to take some time to confirm that it works as expected/desired, and that it requires certain guarantees that my code doesn't currently provide.
Anyway, tired, losing track of time.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2026-03-10</title><link href="https://mwchase.neocities.org/weekly-roundup-2026-03-10" rel="alternate"></link><published>2026-03-10T04:00:00-04:00</published><updated>2026-03-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-03-10:/weekly-roundup-2026-03-10</id><summary type="html">&lt;p class="first last"&gt;I'm getting a better understanding of these concepts, which sadly means I have a lot more to be uncertain about.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I started to get a better handle on how things should work for semantic types and elaborations.&lt;/li&gt;
&lt;li&gt;Thursday: I skipped ahead a little in planning, to try to avoid painting myself into a corner.&lt;/li&gt;
&lt;li&gt;Friday: I got LaTeX basically working, although there were some... issues.&lt;/li&gt;
&lt;li&gt;Saturday: I attempted to work out the implications of the changes I'm making to 1ML, and concluded that they're probably fine.&lt;/li&gt;
&lt;li&gt;Sunday: Nevertheless, I did have to put a little more thought into things, because the elaborations are more annoying than the types (they kind of have to be, since working out the types without the elaborations is workable-ish, but vice-versa is either difficult or literally impossible).&lt;/li&gt;
&lt;li&gt;Monday: I started thinking that the ideas I had for expressing purity notations really didn't make sense, and I should try doing it the paper's way for now.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, maybe I keep with this, maybe I find something else to focus on.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category></entry><entry><title>Coding 2026-03-09</title><link href="https://mwchase.neocities.org/coding-2026-03-09" rel="alternate"></link><published>2026-03-09T04:00:00-04:00</published><updated>2026-03-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-03-09:/coding-2026-03-09</id><summary type="html">&lt;p class="first last"&gt;Just spam packs and unpacks everywhere, it'll probably work out.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, let's see.
I've got rough drafts of all of the basic expression typing rules.
Convincing myself that I've got convincing typing rules is a lot easier than getting the elaborations to look good.
It's also been a pattern that the bidirectionalized &lt;em&gt;typing&lt;/em&gt; can look more elegant by some standards, but the resulting elaboration is more of a mixed bag.&lt;/p&gt;
&lt;p&gt;The big thing missing is a proper re-interpretation of the purity annotations.
The more I think about it, the more the whole thunk-return instead of record thing just seems like stubbornness.
I'll have to consider whether I keep on with that, or just do what the paper says.
Of course, it is possible that the real answer is &amp;quot;just focus on the monad behavior, and the actual implementation is just a detail&amp;quot;.&lt;/p&gt;
&lt;p&gt;Regardless, I let it get late, and I have to go to bed.
I'll maybe take a break from this for a few days; we'll see.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-03-08</title><link href="https://mwchase.neocities.org/coding-2026-03-08" rel="alternate"></link><published>2026-03-08T05:00:00-04:00</published><updated>2026-03-08T05:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-03-08:/coding-2026-03-08</id><summary type="html">&lt;p class="first last"&gt;Good old realizing I'm wrong about something as a result of trying to explain it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't get quite as far as I might have liked today.
I copied over the binding elaborations unchanged, because I just don't think there's a good way to bidirectionalize them.
Then I started on the expression elaborations, did a few, and then decided to skip ahead to rules for wrapped values so I don't forget them.
In working on this, I found some potential issues that I &lt;em&gt;think&lt;/em&gt; I addressed, but I'm frankly not really sure.&lt;/p&gt;
&lt;p&gt;Basically, doing bidirectionalization means replacing a lot of &lt;tt class="docutils literal"&gt;X&lt;/tt&gt; nodes in expressions with &lt;tt class="docutils literal"&gt;E&lt;/tt&gt; nodes, because variables are synthesizing, and the syntactic sugar for using expressions instead of variables is &lt;em&gt;also&lt;/em&gt; synthesizing, so if I want a term to check, it has to use expressions &amp;quot;natively&amp;quot;.
This sometimes results in different typing behavior from the syntactic sugar version, I think always involving existential types.
For if nodes, I think there isn't a major difference, but I had to think a bit for function, application, and sealing nodes.
Basically, bidirectionalized application needs more information in the function type, compared to the sugared version; this is because the argument type can carry more information.
A similar story holds for sealing.&lt;/p&gt;
&lt;p&gt;Now, unwrapping got weird for a similar but more involved reason.
As before, the &lt;tt class="docutils literal"&gt;X&lt;/tt&gt; is replaced with &lt;tt class="docutils literal"&gt;E&lt;/tt&gt;, but then the &lt;em&gt;type&lt;/em&gt; must be unwrapped, and used to generate a coercion function.
Now, if we're working with an expression, then the type must handle being abstracted, which means that there could be a bunch of existential types outside the wrap type, and therefore the value could have a bunch of pack nodes, and by describing this, I've decided that my original implementation was probably wrong, but I've come up with something that I think has a colorable argument for being closer to right.&lt;/p&gt;
&lt;p&gt;The current solution is, get all of the existential type variables, bind them, determine the coercion function between the wrapped type and the checked type, then generate an expression that unpacks every existential type variable from the wrapped expression, and only then applies the coercion function.&lt;/p&gt;
&lt;p&gt;If this actually works, and I can keep on applying it, I should be able to get somewhere.
Now, next thing to consider: hey, how should I implement union types and case expressions?&lt;/p&gt;
&lt;p&gt;For now, I'm going to get to bed, since it's super late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-03-07</title><link href="https://mwchase.neocities.org/coding-2026-03-07" rel="alternate"></link><published>2026-03-07T05:00:00-05:00</published><updated>2026-03-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-03-07:/coding-2026-03-07</id><summary type="html">&lt;p class="first last"&gt;Informal analysis, or lazy rationalization? Who can say?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I'm back to thinking about bidirectionalization.
Basically, there are several rules from 1ML that I want to bidirectionalize, and I'm not totally sure whether that's actually workable.
The rules are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Eif; I want to make it checking instead of containing an ascription&lt;/li&gt;
&lt;li&gt;Efun; I want to make it checking&lt;/li&gt;
&lt;li&gt;Eapp; I want to make it operate on expressions, and make the argument checking&lt;/li&gt;
&lt;li&gt;Eseal; I want to make it operate on an expression, and make that expression checking&lt;/li&gt;
&lt;li&gt;Ewrap; I want to make it operate on expressions, and make both the overall node and the argument checking&lt;/li&gt;
&lt;li&gt;Eunw; I want to make it operate on expressions, but only the overall node can be made checking; the argument actually has to synthesize&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And, like, I could just &lt;em&gt;do&lt;/em&gt; this, but switching from sugar to &amp;quot;the node actually contains expressions&amp;quot; has consequences for typing that I'm not sure of the impact of.
And these consequences only manifest in the context of &amp;quot;doing something with modules&amp;quot;.
Basically, in the context of the 1ML sugar, if an expression has existential type, then the pack statements get wrapped around the node's type, whereas with what I'm trying to make work, type checking doesn't send the packing back up, which I think means that stuff like sealing has to &amp;quot;know&amp;quot; about existential types which would simply be inferred under the pure synthesis paradigm.
&lt;em&gt;If&lt;/em&gt; I'm understanding this correctly, I'm then not sure about the actual consequences that this has for usability.
Basically, how much of a pain is it to type functors in this paradigm?&lt;/p&gt;
&lt;p&gt;Or, I guess, it's a matter of questions of usability, but also whether there are inferrable types that cannot be expressed explicitly?
Well, always, the only way to introduce an existential type is through the type type.
Now, I think for an expression to supertype a type involving an existential type, in the context of synthesis, the expression would have to reference the variable bound to the existential type itself.
So, if we move the expression out of the existential, then it basically needs to just duplicate the relevant existential bindings.
If I'm thinking about this right, it doesn't seem too onerous.&lt;/p&gt;
&lt;p&gt;Well, that was some good thinking.
I'll try to make more updates to my notes tomorrow, but right now I just want to take things easy.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-03-06</title><link href="https://mwchase.neocities.org/coding-2026-03-06" rel="alternate"></link><published>2026-03-06T05:00:00-05:00</published><updated>2026-03-06T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-03-06:/coding-2026-03-06</id><summary type="html">&lt;p class="first last"&gt;Getting far enough along to wonder if I'm totally undermining the theory of how this stuff works.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I asked around, and got some advice, and then, after subjectively &lt;em&gt;far&lt;/em&gt; too much messing around, managed to get LaTeX producing broadly acceptable output.
With this, and the advanced technique of &amp;quot;reading the paper&amp;quot;, I've managed to produce my own version of all of the basic 1ML typing rules, including &lt;em&gt;somewhat&lt;/em&gt; understanding where-types.&lt;/p&gt;
&lt;p&gt;At this point, I'm ready to take notes on all of the changes I want to attempt, and then I can work out the proper file layout for implementing the basic level of syntax.&lt;/p&gt;
&lt;p&gt;For now, though, I'm really out of it and want to take things easy.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-03-05</title><link href="https://mwchase.neocities.org/coding-2026-03-05" rel="alternate"></link><published>2026-03-05T05:00:00-05:00</published><updated>2026-03-05T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-03-05:/coding-2026-03-05</id><summary type="html">&lt;p class="first last"&gt;Just shoving absolutely everything into function types, it'll be fine.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't have as much focus as I would have liked, but I'm making a little progress thinking about what I'm going to do for semantic types.&lt;/p&gt;
&lt;p&gt;The change I'm thinking about right now is extending semantic types to handle algebraic effects.
It looks like I just need to say &amp;quot;okay, in the result type of functions, in addition to indicating the purity, there's going to be another function that maps an evidence vector to a 'control monad'&amp;quot;.
Now, the control monad is going to require an amazing amount of effort to parse, it looks like, but it does appear parseable.&lt;/p&gt;
&lt;p&gt;Let's think a little about the refinement types stuff.
I haven't properly read over much of that paper, but I see that it will probably take some changes; constructing the constraints involves running backwards through the construction of the environment.
Not particularly challenging to support, but it's definitely going to be an implementation change.
Furthermore, some modifications will need to be made to subtyping.
All of these papers want to do different things to functions, and right now I can only hope that these things can be made compatible.
Since 1ML does a bunch of stuff with existential types already, I could consider using them for synthesis in the context of applications, but that's probably not a good idea in the face of 1ML's small/large types distinction.&lt;/p&gt;
&lt;p&gt;Anyway, it's late again.
I'll see how much focus I can give this tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-03-04</title><link href="https://mwchase.neocities.org/coding-2026-03-04" rel="alternate"></link><published>2026-03-04T05:00:00-05:00</published><updated>2026-03-04T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-03-04:/coding-2026-03-04</id><summary type="html">&lt;p class="first last"&gt;Avoiding old mistakes, and probably making new ones.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's kind of start over with my ideas about semantic types.&lt;/p&gt;
&lt;p&gt;For now, I divide them into pure values and computations, and impure values and computations.
Pure values are the simplest representation of the type, and computation types are simply returning the corresponding value type.
This means that base values are now &lt;em&gt;directly&lt;/em&gt; the pure type, and abstracted or function values are thunks.
For now, impure values are simply pure values wrapped in a thunk-return.
We consider semantic types in general, separately from semantic types with purity annotations, even though general semantic types and pure values have the same representation.&lt;/p&gt;
&lt;p&gt;The contexts where these different representations matter are that variables are bound with purity annotations, and the result type of functions is a computation with a purity annotation.
Hopefully, it is then possible to ensure that all expressions infer or check annotated types.&lt;/p&gt;
&lt;p&gt;Looking over the expressions to be synthesized, I now suspect the correct interpretation is that expressions are typed with annotated values types, but the synthesized expressions are computations corresponding to returning a value of that type.&lt;/p&gt;
&lt;p&gt;This all &lt;em&gt;seems&lt;/em&gt; reasonable.
Past experience tells me that now is the time to step back and let this percolate for a bit.
If it still seems sensible after that, I'll start filling in notes.
Until then, I'm going to read up on refinement types to see if my ideas about how to incorporate them into purity annotations make sense.&lt;/p&gt;
&lt;p&gt;For the immediate term, though, I'm going to try wrapping up this entry before it's suddenly midnight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category></entry><entry><title>Weekly Roundup 2026-03-03</title><link href="https://mwchase.neocities.org/weekly-roundup-2026-03-03" rel="alternate"></link><published>2026-03-03T05:00:00-05:00</published><updated>2026-03-03T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-03-03:/weekly-roundup-2026-03-03</id><summary type="html">&lt;p class="first last"&gt;In theory, there's no difference between theory and practice...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I tried to nail down the interaction between 1ML effects, and algebraic effects.&lt;/li&gt;
&lt;li&gt;Thursday: I put together an attempt at a plan for getting this together.&lt;/li&gt;
&lt;li&gt;Friday: I experimented with taking notes in LaTeX, unsuccessfully.&lt;/li&gt;
&lt;li&gt;Saturday: I finally stopped misreading part of the 1ML paper.&lt;/li&gt;
&lt;li&gt;Sunday: I tried to sketch out what my implementation of all of this is going to have to do, in concrete terms.&lt;/li&gt;
&lt;li&gt;Monday: I took another crack at it, and challenged some of my assumptions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to read up on refinement types for planning purposes, and have a long think about whether the way I'm thinking about &amp;quot;purity&amp;quot; makes any actual sense.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category></entry><entry><title>Coding 2026-03-02</title><link href="https://mwchase.neocities.org/coding-2026-03-02" rel="alternate"></link><published>2026-03-02T05:00:00-05:00</published><updated>2026-03-02T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-03-02:/coding-2026-03-02</id><summary type="html">&lt;p class="first last"&gt;It's amazing what you can accomplish with good time management, or at least strategically bad time management.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, so.
I guess what I realized while I was asleep is, I appear to have made a bad assumption about how semantic types work, which was making everything more complicated than it needed to be.
Let's start over and see if I can get to a better place.&lt;/p&gt;
&lt;p&gt;Where I believe I went wrong was in assuming that the elaboration rules were outputting complete programs.
This led to a profusion of thunk-return wrapping, and more importantly, made it impossible to express certain function types in my fiddly System Fω variant.
So, let's instead assume that they're outputting &lt;em&gt;values&lt;/em&gt;, and the whole program is implicitly wrapped in a top-level &lt;tt class="docutils literal"&gt;Return&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;This means that base types now just correspond directly to themselves, and many elaboration rules are now wrapped in a thunk.
Anyway, let's try reworking the stuff I dashed out last night.&lt;/p&gt;
&lt;p&gt;The pure identity is now of type &lt;tt class="docutils literal"&gt;FuncType(bool_, ReturnType(bool_))&lt;/tt&gt;.
The impure identity is now of type &lt;tt class="docutils literal"&gt;FuncType(bool_, &lt;span class="pre"&gt;ReturnType(ThunkType(ReturnType(bool_))))&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;The inner coercion functions &lt;tt class="docutils literal"&gt;f1&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;f2&lt;/tt&gt; are now of identical type to the pure identity, and the outer coercions are now of type:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;pure-pure: &lt;tt class="docutils literal"&gt;FuncType(ThunkType(FuncType(bool_, &lt;span class="pre"&gt;ReturnType(bool_))),&lt;/span&gt; ReturnType(ThunkType(FuncType(bool_, &lt;span class="pre"&gt;ReturnType(bool_)))))&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;pure-impure: &lt;tt class="docutils literal"&gt;FuncType(ThunkType(FuncType(bool_, &lt;span class="pre"&gt;ReturnType(bool_))),&lt;/span&gt; ReturnType(ThunkType(FuncType(bool_, &lt;span class="pre"&gt;ReturnType(ThunkType(ReturnType(bool_)))))))&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;impure-impure: &lt;tt class="docutils literal"&gt;FuncType(ThunkType(FuncType(bool_, &lt;span class="pre"&gt;ReturnType(ThunkType(ReturnType(bool_))))),&lt;/span&gt; ReturnType(ThunkType(FuncType(bool_, &lt;span class="pre"&gt;ReturnType(ThunkType(ReturnType(bool_)))))))&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let's try expressing this stuff in a code block, so I can have nice things like... indentation.
Now, I've got to remember the rules.
First, &lt;tt class="docutils literal"&gt;f1&lt;/tt&gt; applies to &lt;tt class="docutils literal"&gt;y&lt;/tt&gt;.
Then &lt;tt class="docutils literal"&gt;x&lt;/tt&gt; applies to the result of that.
Then &lt;tt class="docutils literal"&gt;f2&lt;/tt&gt; applies to the result of that.
Then the purity coercion is applied.
Maybe those last two go in the other order?&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# General code:&lt;/span&gt;
&lt;span class="n"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# ReturnType(bool_)&lt;/span&gt;
&lt;span class="n"&gt;Sequence&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;y2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Force&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;y2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# Depends on purity of x&lt;/span&gt;

&lt;span class="c1"&gt;# Sorry to ramble in the middle of the code block, but this is really the crux of it all.&lt;/span&gt;
&lt;span class="c1"&gt;# The type of that sequence is going to be the same as the result type of the inner...&lt;/span&gt;
&lt;span class="c1"&gt;# I&amp;#39;ve been calling them identities, but they could be inverters or constants.&lt;/span&gt;
&lt;span class="c1"&gt;# Anyway, once we have either ReturnType(bool_) or ReturnType(ThunkType(ReturnType(bool_)))&lt;/span&gt;
&lt;span class="c1"&gt;# we need to apply f2, which, remember, is always of type FuncType(bool_, ReturnType(bool_))&lt;/span&gt;
&lt;span class="c1"&gt;# In the pure case, we can (probably) sequence the result directly through f2,&lt;/span&gt;
&lt;span class="c1"&gt;# giving us a ReturnType(bool_), which can be left alone,&lt;/span&gt;
&lt;span class="c1"&gt;# or sequenced through Abstraction(z, Return(Thunk(Return(z)))).&lt;/span&gt;
&lt;span class="c1"&gt;# (Or the whole thing could be wrapped in a Return(Thunk(...))?)&lt;/span&gt;
&lt;span class="c1"&gt;# Alternatively, we could be in the impure case, which means we have a&lt;/span&gt;
&lt;span class="c1"&gt;# ReturnType(ThunkType(ReturnType(bool_))), and we want to apply f2 in a way that gets us another&lt;/span&gt;
&lt;span class="c1"&gt;# ReturnType(ThunkType(ReturnType(bool_))).&lt;/span&gt;
&lt;span class="c1"&gt;# This will look like&lt;/span&gt;
&lt;span class="c1"&gt;# Sequence(x_res, v1, Sequence(Force(v1), v2, Application(f2, v2))) but with return-thunk wrapping... somewhere.&lt;/span&gt;

&lt;span class="c1"&gt;# pure-pure&lt;/span&gt;
&lt;span class="n"&gt;Ascription&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;Abstraction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Return&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Thunk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;Abstraction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;Sequence&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="n"&gt;Sequence&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                        &lt;span class="n"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                        &lt;span class="n"&gt;y2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="n"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Force&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;y2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                    &lt;span class="p"&gt;),&lt;/span&gt;
                    &lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;FuncType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;ThunkType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FuncType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bool_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ReturnType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bool_&lt;/span&gt;&lt;span class="p"&gt;))),&lt;/span&gt;
        &lt;span class="n"&gt;ReturnType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ThunkType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;FuncType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;bool_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;ReturnType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bool_&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Looking over this, I believe the core of the purity coercion has to focus on the line&lt;/span&gt;
&lt;span class="c1"&gt;# Application(f2, v1)&lt;/span&gt;
&lt;span class="c1"&gt;# In the pure-impure case, this can be Return(Thunk(Application(f2, v1))).&lt;/span&gt;
&lt;span class="c1"&gt;# In the impure-impure case, this can be Sequence(Force(v1), v2, Return(Thunk(Application(f2, v2))))&lt;/span&gt;
&lt;span class="c1"&gt;# I think.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Okay, I've got a sketch of the concrete implementation (if we ignore type variables), but I think it would genuinely help at this point to think about monads.
I now kind of see that the idea is, I think, to treat pure values as regular things, and impure values as a basic monad.
To bring a value into the monad, it gets wrapped in a &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Thunk(Return(...)))&lt;/span&gt;&lt;/tt&gt;, and if &lt;tt class="docutils literal"&gt;f&lt;/tt&gt; is a function of the appropriate type, then the binding operation on &lt;tt class="docutils literal"&gt;x&lt;/tt&gt; looks like &lt;tt class="docutils literal"&gt;Abstraction(x, Abstraction(f, Sequence(Force(x), x2, Return(Thunk(Application(f, &lt;span class="pre"&gt;x2))))))&lt;/span&gt;&lt;/tt&gt;, maybe.&lt;/p&gt;
&lt;p&gt;What I'm getting now is that the particular monad implementation is, well, it's still important, but what I really need is a framework for working with arbitrary monads.&lt;/p&gt;
&lt;p&gt;Now, when you get right down to it, the identity operator for proper types is technically a monad.&lt;/p&gt;
&lt;p&gt;Anyway, I'm not sure if I'm looking at this stuff right.
Like, for sure, pure-impure does a unit, and impure-impure does bind and unit.
But ultimately, what is happening is that we have two monads, and three maps between them.
So, given that, I want to step back from this again, and figure out how these monad types are supposed to interact when there's more going on.&lt;/p&gt;
&lt;p&gt;My gut feeling is that, if I'm to get effects working at compile time, then the &amp;quot;purity&amp;quot; annotation has to go around everything else.
(That's a load-bearing &amp;quot;if&amp;quot;.)&lt;/p&gt;
&lt;p&gt;Anyway, that's about enough for tonight.
I'm going to wrap up early and ponder this stuff some more.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category></entry><entry><title>Coding 2026-03-01</title><link href="https://mwchase.neocities.org/coding-2026-03-01" rel="alternate"></link><published>2026-03-01T05:00:00-05:00</published><updated>2026-03-01T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-03-01:/coding-2026-03-01</id><summary type="html">&lt;p class="first last"&gt;Not feeling super-confident here, but fundamentally, I &amp;quot;just&amp;quot; need to balance out all of the call-by-push-value bookkeeping, and figure out where it wants annotations.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, it's really late, but let's see if I can work something out.
I'm right now looking into the coercion between the pure and impure functions from bool to bool.
For various reasons, I believe the types of these functions in System Fω would be &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;FuncType(ThunkType(ReturnType(bool_)),&lt;/span&gt; ReturnType(bool_))&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;FuncType(ThunkType(ReturnType(bool_)),&lt;/span&gt; &lt;span class="pre"&gt;ReturnType(ThunkType(ReturnType(bool_))))&lt;/span&gt;&lt;/tt&gt;, respectively.&lt;/p&gt;
&lt;p&gt;Let's start by checking pure to pure, just to make sure we actually get a reasonable identity function.&lt;/p&gt;
&lt;p&gt;Now, the coercion function in this case &lt;em&gt;probably&lt;/em&gt; has type &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;FuncType(ThunkType(FuncType(ThunkType(ReturnType(bool_)),&lt;/span&gt; &lt;span class="pre"&gt;ReturnType(bool_))),&lt;/span&gt; &lt;span class="pre"&gt;ReturnType(ThunkType(FuncType(ThunkType(ReturnType(bool_)),&lt;/span&gt; &lt;span class="pre"&gt;ReturnType(bool_)))))&lt;/span&gt;&lt;/tt&gt;, assuming I didn't get distracted while typing all that.
The outermost layer of wrapping in the result type may be unnecessary, but I'm not currently sure how to evaluate that.&lt;/p&gt;
&lt;p&gt;Anyway, to inhabit this, we need an &lt;tt class="docutils literal"&gt;Abstraction(x, Return(Thunk(Abstraction(y, &lt;span class="pre"&gt;...))))&lt;/span&gt;&lt;/tt&gt;
I'm not getting the inside of that right in my head.
I'll just note that both of the internal coercion functions have type &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;FuncType(ThunkType(ReturnType(bool_)),&lt;/span&gt; &lt;span class="pre"&gt;ReturnType(ThunkType(ReturnType(bool_))))&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;I'll also note that the outermost layer of wrapping does appear necessary, and it should go around the type abstractions, if any.
Anyway, let's see if I can sketch out what has to happen here.
The coercion function can apply directly to &lt;tt class="docutils literal"&gt;y&lt;/tt&gt;, so then we have a return-thunk-return, which is sequenced into &lt;tt class="docutils literal"&gt;x&lt;/tt&gt;, producing a return, which seems like it will cause problems.&lt;/p&gt;
&lt;p&gt;I'm not going to look into it right now, but perhaps the coercion functions have to be pure identities rather than impure identities.
That doesn't quite feel right, because then the function arguments all kind of run together.
If the impure identity works, then we need to first thunk the entire computation up through sequencing into &lt;tt class="docutils literal"&gt;x&lt;/tt&gt;, pass that to the coercion function, and then... sequence it into a force?
That's either the obvious solution, or it won't work at all.
I'll try to figure out which in the morning.&lt;/p&gt;
&lt;p&gt;Either way, if this all works, then the pure to impure version would need to wrap the whole thing in a return-thunk, and the impure to impure... we'll see.&lt;/p&gt;
&lt;p&gt;Anyway, I spent long enough on this, time to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category></entry><entry><title>Coding 2026-02-28</title><link href="https://mwchase.neocities.org/coding-2026-02-28" rel="alternate"></link><published>2026-02-28T05:00:00-05:00</published><updated>2026-02-28T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-02-28:/coding-2026-02-28</id><summary type="html">&lt;p class="first last"&gt;Finally, this research is getting somewhere.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;We'll see about actually taking proper notes tomorrow, but I have at least finally figured out how to read some of the paper correctly.
I might as well lay that out, since I don't know what else I would write this entry about.&lt;/p&gt;
&lt;p&gt;Here's the deal: 1ML's elaboration is divided into several parts, and the part that I think will end up changing the least as a result of my syntax/semantics changes is the subtyping system.
Now, subtyping works on what are called semantic types, which are a subset of System Fω types.
(I'm right now planning to represent them using helper classes that can convert back and forth between actual types, for various practical reasons.)
In the 1ML papers, subtyping relates two semantic types (and sometimes a sequence of &amp;quot;paths&amp;quot;, which are a particular kind of semantic type), and produces two pieces of information that are required for the elaboration: a sequence of type variable substitutions, and a coercion function in System Fω.
The substitutions should be safe to use as presented, and the coercion function requires some light modification.&lt;/p&gt;
&lt;p&gt;Basically, because I'm messing with call-by-push-value, I need to have the coercion function wrap a &lt;tt class="docutils literal"&gt;ReturnType&lt;/tt&gt; around the, uh, return type.
Then, the nested calls the paper gives can be replaced with sequencing.&lt;/p&gt;
&lt;p&gt;Now, the part I'd been missing was how the substitutions are created, because I'd been misreading one of the rules.
All substitutions ultimately derive from the &amp;quot;Sforget&amp;quot; rule, which equates a &lt;em&gt;very specific&lt;/em&gt; form of path with a &amp;quot;small&amp;quot; type.
The substitution given in the rule involves a type operation, and it wasn't until today that I realized that the type operation was inside the subsitution, rather than the other way around.
Minutes of reading could have saved me hours of confusion.
Anyway, the meaning of it was &amp;quot;So, you have a type variable that takes some number of types as arguments, here represented by type variables specifically; to unify this whole expression with a small type, replace the outermost type variable with a type function that takes all of those other type variables as arguments, and returns the small type&amp;quot;.
This substitution acts on the supertype, to make it compatible with the subtype.&lt;/p&gt;
&lt;p&gt;Looking over what remains, I'm still not quite sure how &amp;quot;Sstr&amp;quot; divides up the path sequences, and I'm going to need to do some worked examples of effect subtyping, because effect encoding is something I intend to do differently than the paper, and it's going to need some form of coercion that I'll have to do some worked examples of, even though there are only three possible things that can even happen.
Hopefully I'll have enough pep to work on that tomorrow.&lt;/p&gt;
&lt;p&gt;Anyway, it's late, although not extremely late, and I want to go lie down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category></entry><entry><title>Coding 2026-02-27</title><link href="https://mwchase.neocities.org/coding-2026-02-27" rel="alternate"></link><published>2026-02-27T05:00:00-05:00</published><updated>2026-02-27T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-02-27:/coding-2026-02-27</id><summary type="html">&lt;p class="first last"&gt;I don't want to buckle down and just work on stuff, which is unfortunate, because that's exactly what I need to do for this project to get anywhere.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got four pages from the various 1ML papers printed out, and I'm trying to turn them into notes.
Trying to use LaTeX for this was confusing and unpleasant, so unless I find some other math typesetting system to use, I guess I just need to fully commit to doing this all on paper for now.
I kind of didn't want to, because I was thinking of how nice it would be to have TeX markup ready to drop into the docstrings, but there's no point to that if it's going to look awful.&lt;/p&gt;
&lt;p&gt;So, I guess I'll try to work on that tomorrow or the day after.
Today, I played video games.
And now, I go to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-02-26</title><link href="https://mwchase.neocities.org/coding-2026-02-26" rel="alternate"></link><published>2026-02-26T05:00:00-05:00</published><updated>2026-02-26T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-02-26:/coding-2026-02-26</id><summary type="html">&lt;p class="first last"&gt;Look, I didn't get hardly &lt;em&gt;anything&lt;/em&gt; done today, and this is no exception.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I let time get away from me again, but hopefully not as badly this time.
Having reviewed the literature on extensions to 1ML, and implementing algebraic effects, I've reaffirmed that there's no good way to skip ahead in implementing things.&lt;/p&gt;
&lt;p&gt;Here's my current short-term plan:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Rewrite the 1ML elaboration rules in a form that does more to permit/require bidirectionalization.&lt;/li&gt;
&lt;li&gt;Specialize the semantic types to my weird finicky System Fω variant.&lt;/li&gt;
&lt;li&gt;Implement it all.&lt;/li&gt;
&lt;li&gt;Write tests based on all applicable code snippets.&lt;/li&gt;
&lt;li&gt;Given what I've learned from this, plan out the next steps.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For now, I need to get to bed and hope I'm better rested tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-02-25</title><link href="https://mwchase.neocities.org/coding-2026-02-25" rel="alternate"></link><published>2026-02-25T05:00:00-05:00</published><updated>2026-02-25T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-02-25:/coding-2026-02-25</id><summary type="html">&lt;p class="first last"&gt;Entry delayed by watching stream vods to drown out the voices.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's see if I can take some notes quickly.
I'm working from the algebraic effects technical report, as well as the effect polymorphism and extended writeups of 1ML.&lt;/p&gt;
&lt;p&gt;Both of these three papers have a mapping from higher-level types to lower-level types.
The mapping I will end up with will draw a lot from 1ML, but will draw from alebraic effects, in that effects beyond the basics will have additional effects on the return types of functions.
Basically, I think I need to figure out how to combine the two monads that the different papers are talking about, which is annoying in general, but hopefully doing it in a sort of specific context like this will make things not too bad.&lt;/p&gt;
&lt;p&gt;Before anything else (and with not much after it, because I spaced out and it's super late), let's see if I can figure out what the signature of a map function looks like.&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;map : (a : type) &lt;span class="pre"&gt;-&amp;gt;p&lt;/span&gt; (b : type) &lt;span class="pre"&gt;-&amp;gt;p&lt;/span&gt; (m : effect) &lt;span class="pre"&gt;-&amp;gt;p&lt;/span&gt; ((a) &lt;span class="pre"&gt;-&amp;gt;m&lt;/span&gt; b) &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; (list a) &lt;span class="pre"&gt;-&amp;gt;m&lt;/span&gt; (list b)&lt;/tt&gt;
Or something like that.&lt;/p&gt;
&lt;p&gt;Now, here's what I know very offhand:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;1ML syntax manipulations should handle a lot of this even before I get algebraic effects in the mix, and they shouldn't make too much of a difference to the implementation.&lt;/li&gt;
&lt;li&gt;I definitely want to make sure that the type and effect arguments can generally be inferred.&lt;/li&gt;
&lt;li&gt;My big concern is how to handle &amp;quot;oh yeah, sometimes the function type is wrapped in existential types, sometimes it isn't&amp;quot; from 1ML.
I don't see how to do that, unless actually I'm wrapping the entire function type in a bunch of alternatives.&lt;/li&gt;
&lt;li&gt;Regardless, the play looks to be &amp;quot;how do I integrate 'wrap this type in a monad' with 1ML's weird bespoke polymorphism?&amp;quot;
Part of that question is &amp;quot;1ML semantic types have a lot of pieces; at what level does the monad wrapping go?&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, I'll try to come up with an answer to those at a not-messed-up time of day, later, since it's way too late to do it now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2026-02-24</title><link href="https://mwchase.neocities.org/weekly-roundup-2026-02-24" rel="alternate"></link><published>2026-02-24T05:00:00-05:00</published><updated>2026-02-24T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-02-24:/weekly-roundup-2026-02-24</id><summary type="html">&lt;p class="first last"&gt;Figuring out how to implement this stuff is kind of painful, but it's not like I can make someone else put in the work.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I made some initial attempts at a plan for updating the semantics of Impliciula.&lt;/li&gt;
&lt;li&gt;Thursday: I may or may not have been overcomplicating things. Legitimately not sure yet.&lt;/li&gt;
&lt;li&gt;Friday: Oof, these are hard to read back. I get that math terminology is weird for taking an everyday term and giving it a very specific technical meaning, but I think &amp;quot;give the exact same term different definitions in different contexts&amp;quot; is worse.&lt;/li&gt;
&lt;li&gt;Saturday: I redid the planning, with a better understanding of &lt;em&gt;what any of this stuff is actually supposed to do&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Sunday: I tried to figure out what's going to happen with effects, and didn't really make much progress.&lt;/li&gt;
&lt;li&gt;Monday: I switched gears slightly to pre-planning for algebraic effects. My hope is that this will be a not-too-extreme extension to 1ML with effect polymorphism.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to balance figuring stuff out here with not burning myself out.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category></entry><entry><title>Coding 2026-02-23</title><link href="https://mwchase.neocities.org/coding-2026-02-23" rel="alternate"></link><published>2026-02-23T05:00:00-05:00</published><updated>2026-02-23T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-02-23:/coding-2026-02-23</id><summary type="html">&lt;p class="first last"&gt;I have no idea what I'm doing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I'm over-engineering my efforts to tweak the 1ML elaboration, so let's put that down for a bit.
Let's take a look at algebraic effects in a non-ML context.&lt;/p&gt;
&lt;p&gt;I'm right now working from Appendix C of &lt;em&gt;Generalized Evidence Passing for Effect Handlers&lt;/em&gt;.
This presents an elaboration to some form of System F, and hey, I've implemented some form of System F!
Probably not the same form, but I'm having some trouble parsing out the fine details, currently.&lt;/p&gt;
&lt;p&gt;In any case, let's go through the rules and see how much I'll mess with them.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;var&lt;/tt&gt; synthesizes the type&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;abs&lt;/tt&gt; is on the one hand straightforward (check the type, bind the variable, check the body against the result type and effect to elaborate out the body, presumably wrap the result in an ascription that contains the transformed function type, which requires the same junk that has me stuck on 1ML, transforming a function type to reflect the effect of the effect), but on the other hand, reveals some differences with my own &amp;quot;some form of System F&amp;quot;.
Specifically, the expression/value distinction here is between introduction forms and elimination forms, with a &amp;quot;value&amp;quot; expression to implicitly bridge between them.
My gut reaction is to treat computations the way this appendix treats &amp;quot;expressiona&amp;quot;, and basically have introduction computations unify their effect with the empty row.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;val&lt;/tt&gt; would correspond to the &lt;tt class="docutils literal"&gt;Return&lt;/tt&gt; node under this system; possibly the other introductory computations could be wrapped in a thunk?&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;tabs&lt;/tt&gt;... the type-level distinction will have to be collapsed in some way when it comes to integrating this with 1ML; I'm not going to think about this too hard, but I am going to think about it.
Things of note: apparently labels are the equivalent of a large type in 1ML, and also this translation barely does anything, which I'm going to hope is a good sign.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;app&lt;/tt&gt; has some confusing bits, but the key thing to keep in mind is that the elaborated code has a bunch of monadic binds, which are going to require that I support enums/unions/whatever.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;tapp&lt;/tt&gt; looks innocent until the elaboration, which, let's see, monadic bind, monadic translation, &lt;em&gt;probably&lt;/em&gt; fine.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;perform&lt;/tt&gt; looks like it needs to synthesize, and it needs &lt;tt class="docutils literal"&gt;op&lt;/tt&gt; to synthesize, I think.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;ops&lt;/tt&gt; has an unmatched brace in the elaboration that I think goes somewhere near the beginning (or maybe it should just be deleted).
My gut impression looking at this is that it should be checking.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;handler&lt;/tt&gt; &lt;em&gt;might&lt;/em&gt; be synthesizing.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;prompt&lt;/tt&gt; needs to synthesize from &lt;tt class="docutils literal"&gt;h&lt;/tt&gt;, then has enough information to check &lt;tt class="docutils literal"&gt;e&lt;/tt&gt; and synthesize overall.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;yieldb&lt;/tt&gt; has to synthesize from &lt;tt class="docutils literal"&gt;f&lt;/tt&gt;, and then it either checks overall and &lt;tt class="docutils literal"&gt;k&lt;/tt&gt;, or it does all synthesis and some unification; let's see if the former can work.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;under&lt;/tt&gt;, I'm not sure what to think; it's capable of synthesizing almost everything, but that's a load-bearing &amp;quot;almost&amp;quot;.
No matter what it does, there's going to be some kind of unification.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No telling whether I'll end up making use of any of these notes.
I'm going to try to step away, and then investigate whether the monadic translation from page 22 of the technical report can be made compatible with 1ML semantic types.
Right now, I really need to stop looking at screens.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-02-22</title><link href="https://mwchase.neocities.org/coding-2026-02-22" rel="alternate"></link><published>2026-02-22T05:00:00-05:00</published><updated>2026-02-22T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-02-22:/coding-2026-02-22</id><summary type="html">&lt;p class="first last"&gt;Progress, to be sure, but very slow.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Slight update to yesterday:
&amp;quot;Wait, 1ML sealing is pure under many circumstances, so there's a chance I don't need to try to get it pure in every circumstance.&amp;quot;&lt;/p&gt;
&lt;p&gt;In any case, now I'm trying to go through the elaboration judgments and modify and bidirectionalize them, and one of the early-on judgments is for function types, which ended up getting me distracted thinking about how to handle effects.
My hunch currently is that I want to have two total rows instead of just one; one for &amp;quot;pure&amp;quot; and one for &amp;quot;impure&amp;quot;.
Although, this could lead to some weird issues, so I'm not committed to it.
Another possibility is simply that purity and other effects are simply tracked in the same data structure, but in separate fields.
The key thing is the semantics of effects, which must somehow make various changes to a function type.&lt;/p&gt;
&lt;p&gt;I've been struggling to understand this better and have something else to say, but it's late, I'm tired, and I don't think I'm going to get any further tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-02-21</title><link href="https://mwchase.neocities.org/coding-2026-02-21" rel="alternate"></link><published>2026-02-21T05:00:00-05:00</published><updated>2026-02-21T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-02-21:/coding-2026-02-21</id><summary type="html">&lt;p class="first last"&gt;Is this right? I think this is right. We'll see.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I didn't take any notes or touch any code, but I've got a working hypothesis about how the stuff I've been thinking about fits together:&lt;/p&gt;
&lt;p&gt;Ascription in the 1ML sense is irrelevant to bidirectional typing, but not a big deal to implement.
Furthermore, transparent sealing is also irrelevant, and confusing to implement, and also I'm still a little confused what the distinction is between transparent sealing and ascription.
Anyway—oh.
Okay, that's not transparent sealing, that's pure opaque sealing.
That might be worth looking into later.
Regardless, I can get by for now with impure opaque sealing, and that should fulfill the role of ascription in bidirectional typing.
That said, pure sealing does sound good to look into later, in case I run into issues with function purity.
Hard to guess whether I'll run into problems.&lt;/p&gt;
&lt;p&gt;Anyway, reading over stuff about refinement typing has given me some things to keep in mind for choosing nodes, so here's my plan:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Get a fresh set of notes on node syntax.&lt;/li&gt;
&lt;li&gt;Note likely changes to support algebraic effects.&lt;/li&gt;
&lt;li&gt;Review refinement typing.&lt;/li&gt;
&lt;li&gt;Decide whether to start with impure sealing, or to jump straight to pure sealing.&lt;/li&gt;
&lt;li&gt;Wait, dangit, if sealing is impure, and I'm doing bidirectional stuff, then all of the function definitions are going to be impure, probably.&lt;/li&gt;
&lt;li&gt;That's bad.&lt;/li&gt;
&lt;li&gt;Okay, anyway, if that reasoning holds, then I'm going to need to properly understand the principles of pure sealing.
Reading about &amp;quot;Skolemization&amp;quot; always freaks me out a little, until I realize I somehow did it by accident.&lt;/li&gt;
&lt;li&gt;Anyway, I'm going to need to understand the nature of the pure sealing rewrite, because literally every new node I come up with is going to need to support it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here's how things look now:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;For each node, determine the types of the fields.&lt;/li&gt;
&lt;li&gt;For each expression-typed field, determine the typing direction.&lt;/li&gt;
&lt;li&gt;Determine the typing direction of all expressions.&lt;/li&gt;
&lt;li&gt;Bidirectionalize and work out pure sealing, in some order.&lt;/li&gt;
&lt;li&gt;Effect polymorphism.&lt;/li&gt;
&lt;li&gt;Algebraic effects.&lt;/li&gt;
&lt;li&gt;Refinement types.&lt;/li&gt;
&lt;li&gt;Front-end syntax.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, I desperately need to get to bed, so I'll get back to this at some point in the next few days.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-02-20</title><link href="https://mwchase.neocities.org/coding-2026-02-20" rel="alternate"></link><published>2026-02-20T05:00:00-05:00</published><updated>2026-02-20T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-02-20:/coding-2026-02-20</id><summary type="html">&lt;p class="first last"&gt;If all of this pain turns out to have hinged on subtle terminology mismatches...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've come to the conclusion that I was probably misinterpreting &lt;em&gt;something&lt;/em&gt; in the last post, but I'm not totally sure what.
I'm seeing that it could be that some of the stuff I thought was true about sealing in 1ML was a result of the syntactic sugar, rather than an inherent quality of sealing versus ascription.
Unfortunately, this means I'm back to not being sure what the difference between sealing and ascription &lt;em&gt;is&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I'm reading over a bunch of stuff, but it's not making things clearer, and some of it looks really scary to implement.&lt;/p&gt;
&lt;p&gt;Let's take one last stab at this before I get ready for bed...&lt;/p&gt;
&lt;p&gt;The difference would &lt;em&gt;seem&lt;/em&gt; to matter in the context of a structure containing a type variable, and another type derived from that variable.
If ML ascription and bidirectional ascription are the same thing, and distinct from sealing (I'm starting to feel very skeptical of this), then we have...
I got the context wrong.
If we have a functor, let's say that takes a type, and returns a record type, which we use ascription to coerce to type type.
Does such a coercion result in inferring impure type for the functor?
I believe I understand why sealing results in an impure type in this context.
Sort of.
And the sugar version of ascription produces a pure function which is instantiated with the relevant types, and, hm.
That is indeed a pure function that somehow &amp;quot;exposes&amp;quot; the argument.&lt;/p&gt;
&lt;p&gt;What it comes down to, then, is the question of whether I need sealing for semantics, and ascription for bidirectional typing, or if a slightly modified version of sealing would handle both use cases.
One thing that complicates the question is that they have the same behavior on concrete types, so asking questions about how to handle weird type constructs is &lt;em&gt;required&lt;/em&gt; to develop a proper idea of what's going on.&lt;/p&gt;
&lt;p&gt;Anyway, it's late and I'm probably confused about something.
I'm going to go lie down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-02-19</title><link href="https://mwchase.neocities.org/coding-2026-02-19" rel="alternate"></link><published>2026-02-19T05:00:00-05:00</published><updated>2026-02-19T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-02-19:/coding-2026-02-19</id><summary type="html">&lt;p class="first last"&gt;Ah yes, tridirectional typing...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I took a closer look at the problems I was seeing with my modifications to 1ML, and found... more problems.
The top-level goal is, I want bidirectional typing because, as I understand things, that will help support refinement types.
My initial plan was to &amp;quot;just&amp;quot; bidirectionalize 1ML elaboration, but it turns out that before I do that, I need to render it bidirectionalizable.&lt;/p&gt;
&lt;p&gt;Here's what I mean: 1ML defines most of its expression nodes using variables rather than expressions, and provides syntactic sugar to implement ascription, and versions of nodes with expressions instead of variables.
This is problematic for bidirectionalization because it limits the opportunities for checking; my general goal was to replace explicit subtyping checks with checking-based elaboration.&lt;/p&gt;
&lt;p&gt;Now, my original plan was to make all of the changes I thought I needed, but that turns out to be difficult, because expressions and variables kind of behave differently.
Or rather, some expressions type &amp;quot;like variables&amp;quot;, and some don't.
See, one of the distinctions that 1ML draws between types is &amp;quot;abstracted&amp;quot; versus &amp;quot;concrete&amp;quot; (I'm not sure if the paper uses &amp;quot;concrete&amp;quot; in this sense; it's been... a while since I read the whole thing closely).
Variables and a few other expressions have &amp;quot;concrete&amp;quot; types, while generic expressions may have &amp;quot;abstracted&amp;quot; types.
The difference is that &amp;quot;abstracted&amp;quot; types associate some number of existentially quantified type variables to a &amp;quot;concrete&amp;quot; type.
This means that, when replacing a variable with a generic expression, in an elaboration rule, this means that suddenly there are a bunch of extra type variables that need to be accounted for.&lt;/p&gt;
&lt;p&gt;For an example of this, &lt;em&gt;if&lt;/em&gt; I'm understanding things properly, the major difference in behavior between ascription and sealing is that ascription entirely replaces the existential quantifications in the wrapped value, while sealing combines all of the existential quantifiers from the value and the type.&lt;/p&gt;
&lt;p&gt;This kind of thing happens in a few other contexts, and seems to mean that I want to find some way of having a term synthesize its existential quantifiers, but check its concrete type.
Now, it does look like I also want to be checking full abstract types in other contexts, so it kind of looks like I want three methods instead of two, maybe.&lt;/p&gt;
&lt;p&gt;So, in order to have bidirectional elaboration, I first need to define the purely synthesizing elaboration for the nodes that I want to have.
Then, I can figure out how to reverse some of the arrows.
I could do that right now, but I don't feel like it, so I'm going to wrap up and find something else to do before bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-02-18</title><link href="https://mwchase.neocities.org/coding-2026-02-18" rel="alternate"></link><published>2026-02-18T05:00:00-05:00</published><updated>2026-02-18T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-02-18:/coding-2026-02-18</id><summary type="html">&lt;p class="first last"&gt;To nobody's surprise, trying to write LaTeX off-the-cuff for this didn't work out.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, so, I'm trying to work on notes because I know if I just type in more code now, it'll be chaos, but I'm having trouble getting things formatted nicely; like, am I going to have to just take pictures of handwritten notes?
Either way, I'm trying to avoid any large leaps, so here's the deal:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;To start with, the 1ML syntax from the paper.&lt;/li&gt;
&lt;li&gt;Plus support for first-class modules.&lt;/li&gt;
&lt;li&gt;Now, adapt this to bidirectional typing, with some variables replaced with expressions, and note where using expressions complicates the elaboration logic (Eapp and Eseal, principally).&lt;/li&gt;
&lt;li&gt;Now, make the changes required to support effect polymorphism, &lt;em&gt;but not&lt;/em&gt; defining arbitrary effects.&lt;/li&gt;
&lt;li&gt;Add the nodes and updates needed for algebraic effects.
Note that aesthetics/symmetry indicate that it &lt;em&gt;may&lt;/em&gt; be meaningful to speak of &amp;quot;large&amp;quot; vs &amp;quot;small&amp;quot; effects.
At this point, I want to figure out whether any more work is required to support modular implicits, or if it's possible to support them via effectful functors.&lt;/li&gt;
&lt;li&gt;Add or update as needed to support refinement types.
Getting basic functionality is hopefully sufficient to replace the concept of &amp;quot;unsafe&amp;quot;, but I also want to know whether the type-directed aspects of elaboration can create specializations of functions that explicitly lack effects, based on some kind of annotation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I think in order to make progress here, I need to devote more work on Impliciula fully to taking notes and planning, and switch to another project when I want to actually write code.
(Perhaps I could get back to increasingly-delayed Conlang Year?)&lt;/p&gt;
&lt;p&gt;Anyway, I need to wind down now, so I'll call things here and try to get something more satisfying done later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2026-02-17</title><link href="https://mwchase.neocities.org/weekly-roundup-2026-02-17" rel="alternate"></link><published>2026-02-17T05:00:00-05:00</published><updated>2026-02-17T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-02-17:/weekly-roundup-2026-02-17</id><summary type="html">&lt;p class="first last"&gt;It's been many months working on this, and I can tell it's going to be many more...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I decided to start reorganizing modules.&lt;/li&gt;
&lt;li&gt;Thursday: I had some aspirational ideas about eventually improving the documentation...&lt;/li&gt;
&lt;li&gt;Friday: I got far enough into the refactor to ponder pulling in more libraries to make the ergonomics nicer.&lt;/li&gt;
&lt;li&gt;Saturday: I finished the refactor, and then moved on to 1ML instead of cleaning up what I've got.&lt;/li&gt;
&lt;li&gt;Sunday: I started thinking in earnest about semantic types, and came up with some ideas that seem interesting, but may or may not work.&lt;/li&gt;
&lt;li&gt;Monday: Not fully done with semantic types, I started poking more vigorously at elaboration.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to lay out the progression of things to work on; I've been sketching out how to get algebraic effects working, but I really shouldn't try to put any of this into the code yet, since it's only more moving parts, and I've got plenty of things to make sure I have working already.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category></entry><entry><title>Coding 2026-02-16</title><link href="https://mwchase.neocities.org/coding-2026-02-16" rel="alternate"></link><published>2026-02-16T05:00:00-05:00</published><updated>2026-02-16T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-02-16:/coding-2026-02-16</id><summary type="html">&lt;p class="first last"&gt;Need to figure out how to just get this done.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm getting started on the elaboration logic.
One thing that I'm not sure about yet is how I'm going to do stuff like signal failure.&lt;/p&gt;
&lt;p&gt;Let's run through how things could go wrong, and see what it would produce.&lt;/p&gt;
&lt;p&gt;Suppose a have a value of &lt;tt class="docutils literal"&gt;unit&lt;/tt&gt; type, and I attempt to coerce it to &lt;tt class="docutils literal"&gt;bool&lt;/tt&gt; with a type ascription.
Fundamentally, that's going to manifest as attempting a subtyping relationship between incompatible base types.
The easy solution is for that to fail immediately.
More involved would be for it to somehow embed information about the 1ML code into a coercion function that deliberately fails type checking.&lt;/p&gt;
&lt;p&gt;Thinking about it rationally, I crowbarred in more advanced type-checking code after-the-fact in the IR layer, so there's no reason I can't focus this pass on ease of implementation, and then fix up the ergonomics after-the-fact, but I would like to have some idea of what interface I'm going to try to implement, at some point.&lt;/p&gt;
&lt;p&gt;Anyway, it's late and I should wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-02-15</title><link href="https://mwchase.neocities.org/coding-2026-02-15" rel="alternate"></link><published>2026-02-15T05:00:00-05:00</published><updated>2026-02-15T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-02-15:/coding-2026-02-15</id><summary type="html">&lt;p class="first last"&gt;I've thought about this enough; it's time to get started.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I've got a lot of work to do to get the 1ML layer up and running.
So, I decided to just jump in.
I'm trying to put together some kind of rough draft for the semantic types.&lt;/p&gt;
&lt;p&gt;The main obstacle here is that I've only got so much of an idea of how to get subtyping working, which is going to be the bulk of the work.
It looks like I want to have distinct implementations for abstracted and concrete signatures, where concrete signatures can take arbitrarily many path arguments, for... reasons.
The main obstacles I'm seeing here is that I'm only &lt;em&gt;pretty&lt;/em&gt; sure that the correct implementation of the identity function (for base and path subtyping) is with &lt;tt class="docutils literal"&gt;Force&lt;/tt&gt; instead of &lt;tt class="docutils literal"&gt;Return&lt;/tt&gt;, and I'm not quite sure how to implement the type operators(?) that remap variables in some contexts.&lt;/p&gt;
&lt;p&gt;I'm tired, so I'm going to stop writing about this, although I am going to keep thinking about it.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-02-14</title><link href="https://mwchase.neocities.org/coding-2026-02-14" rel="alternate"></link><published>2026-02-14T05:00:00-05:00</published><updated>2026-02-14T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-02-14:/coding-2026-02-14</id><summary type="html">&lt;p class="first last"&gt;It's done. Sort of.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I went into a fugue state, and now the refactoring is done.
I haven't decided yet whether to go for the lazy loading stuff, and I'd rather move forward with other tasks, before coming back to this and making the call one way or the other.&lt;/p&gt;
&lt;p&gt;Still need to work on linting, but I'm not feeling up for it right now.
In the name of getting something done, I'll work on the stubs for 1ML.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, that's done, and I don't want to do anything else tonight.
Better wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-02-13</title><link href="https://mwchase.neocities.org/coding-2026-02-13" rel="alternate"></link><published>2026-02-13T05:00:00-05:00</published><updated>2026-02-13T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-02-13:/coding-2026-02-13</id><summary type="html">&lt;p class="first last"&gt;Adding more tasks in the middle...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm not done moving stuff around, but I did end up upgrading the helper methods, although I mostly didn't update the tests to use the new capabilities.
(This is partially because it's not clear to me how much I'll actually use the helper methods; I see much more obvious utility from the wrapper classes I wrote to support them.)
Then I cleaned up the mess I made of the imports by going &amp;quot;Well, as long as the tests pass.&amp;quot;&lt;/p&gt;
&lt;p&gt;What I'm realizing now is that, although I kind of need to actually define stuff in a bunch of small modules, unless I switch to one huge one, handling the imports like that is actually kind of obnoxious, so now I'm looking into the lazy-loader project for a way to create lower-in-the-tree &amp;quot;facade&amp;quot; modules to give me nicer imports, that coincidentally would also remove a bunch of import-time dependencies between modules.
I believe I should try to get through the rearrangement before setting up lazy loading, because I want to make sure I pull everything into the facade modules.
Also because I definitely want to rearrange things, but I'm still not totally sure I want to set up the facades.&lt;/p&gt;
&lt;p&gt;In any case, I did all that, and now it's late.
Better get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-02-12</title><link href="https://mwchase.neocities.org/coding-2026-02-12" rel="alternate"></link><published>2026-02-12T05:00:00-05:00</published><updated>2026-02-12T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-02-12:/coding-2026-02-12</id><summary type="html">&lt;p class="first last"&gt;It continues...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm still reorganizing everything.
Once I have everything in the right place, I'll work on improving the ergonomics of the helper methods, then bringing the documentation back up to some kind of standard.
At that point, I'll be ready to prep the labels and variables to support 1ML elaboration, and I'll hopefully be able to start implementing 1ML nodes.&lt;/p&gt;
&lt;p&gt;For now, I need to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-02-11</title><link href="https://mwchase.neocities.org/coding-2026-02-11" rel="alternate"></link><published>2026-02-11T05:00:00-05:00</published><updated>2026-02-11T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-02-11:/coding-2026-02-11</id><summary type="html">&lt;p class="first last"&gt;By this project's standards, I was overdue for a big, awkward refactor.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was running into some typing issues, but I've resolved them.
I decided that I'm ready to start pulling modules into the package skeleton I put together.
This promises to be a bit of a long process, because I don't just have to move the modules, I have to split some of them up, and of course I have to update the imports every time I move something.&lt;/p&gt;
&lt;p&gt;Once I have this together (which will probably take a few days), then I'm ready to start prototyping the 1ML layer.
Which will prompt me to finally rework labels and variables, but I want to work from a nicer layout than what I initially ended up with.&lt;/p&gt;
&lt;p&gt;Anyway, I let it get really late while I was fixing type errors, so I need to wrap up now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2026-02-10</title><link href="https://mwchase.neocities.org/weekly-roundup-2026-02-10" rel="alternate"></link><published>2026-02-10T05:00:00-05:00</published><updated>2026-02-10T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-02-10:/weekly-roundup-2026-02-10</id><summary type="html">&lt;p class="first last"&gt;Week cut into pieces because internet randomly went out.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I pondered how to reconcile 1ML with the syntax I want to compile it to.&lt;/li&gt;
&lt;li&gt;Thursday: I took some notes on areas I want to focus on.&lt;/li&gt;
&lt;li&gt;Sunday: I came up with an idea, which I haven't yet tried, for translating 1ML expressions to call-by-push-value terms.&lt;/li&gt;
&lt;li&gt;Monday: I took some notes on changes I want to make, and sketched out a skeleton of new modules to fit my existing code into.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to fill in that skeleton, and maybe have another crack at some Python-level typing issues I'm hitting.
The point is, soon I'll be ready to prototype the 1ML translation.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category></entry><entry><title>Coding 2026-02-09</title><link href="https://mwchase.neocities.org/coding-2026-02-09" rel="alternate"></link><published>2026-02-09T05:00:00-05:00</published><updated>2026-02-09T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-02-09:/coding-2026-02-09</id><summary type="html">&lt;p class="first last"&gt;Preparing to shake everything up.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;There are still some ways in which I don't understand 1ML subtyping as well as I'd like, but I think it's at the point where I just have to try to implement it to have any idea of what's up.
I've taken some notes on my proposed modifications to the syntax, and I'm not sure I can do more to figure out what I need to know, beyond just trying to write the code.
My barrier to that is, I want to fix up the code organization before it gets any more convoluted and arbitrary.&lt;/p&gt;
&lt;p&gt;Let's run through my thoughts and see what I can get to make sense.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I want to move a lot of the existing &amp;quot;node&amp;quot; modules into an &lt;tt class="docutils literal"&gt;ir&lt;/tt&gt; package, and within that, I want to divide them by feature.&lt;/li&gt;
&lt;li&gt;So, we have the abstract classes (and putting them in a module called &lt;tt class="docutils literal"&gt;abc&lt;/tt&gt; gets confusing when I want to work with the stdlib &lt;tt class="docutils literal"&gt;abc&lt;/tt&gt; module at the same time), which need access to the &lt;tt class="docutils literal"&gt;Failure&lt;/tt&gt; feature, which therefore needs to be importable without importing the module that defines the failure classes.&lt;/li&gt;
&lt;li&gt;Some of the base classes require instances of the other base classes to function properly, so it would make sense to split up the base class definitions, as well.
And the convenience method definitions would make more sense as class members, so that's another module for abstract classes; not sure what to call all of these.&lt;/li&gt;
&lt;li&gt;Due to the way 1ML and other extensions interact with variables and labels, those should live outside the &lt;tt class="docutils literal"&gt;ir&lt;/tt&gt; module.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Writing all of that out inspired me to put together a skeleton of where I think everything should go, but before I move things into place, I want to get the helper classes a little better behaved.
I have some ideas there, but it's too late at night to try them out now.
I need to wrap up as soon as I can.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-02-08</title><link href="https://mwchase.neocities.org/coding-2026-02-08" rel="alternate"></link><published>2026-02-08T05:00:00-05:00</published><updated>2026-02-08T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-02-08:/coding-2026-02-08</id><summary type="html">&lt;p class="first last"&gt;Time to do what I do best: read a detailed tutorial and do something totally different from what it's saying.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't have proper internet for about two days there, so I've been closely reading over the 1ML paper.
My goal was to create a blueprint for a 1ML-like language that fits naturally on top of the somewhat idiosyncratic version of System Fω I've been building up.
This means supporting bidirectional typing, which is straightforward in some respects, but getting it right will require a better understanding of 1ML subtyping than I currently have.
It also means supporting call-by-push-value, with the restriction of type variables to ranging over value types.
I think if I can get that restriction working in this context, then I have a good chance of carrying it forward into the planned semantics.&lt;/p&gt;
&lt;p&gt;My ideas for how to resolve this may break something, so let's try to pin down exactly what I have in mind here.&lt;/p&gt;
&lt;p&gt;The obvious difficulty in reconciling 1ML with call-by-push-value is that 1ML terms are in some ways obviously values, and in other ways obviously computations, sometimes containing both conclusions in a single node.
Call-by-push-value should have something to do with &amp;quot;purity&amp;quot;, but the encoding of purity in the context of elaborating 1ML, using record types with reserved labels, to me just further obscures what this should represent.&lt;/p&gt;
&lt;p&gt;So, I intend to try replacing these record types with specific transformations in the context of call-by-push-value.
The key thing that rests at the center of my approach is noting that 1ML programs must elaborate to complete call-by-push-value programs; in other words, computations, not values.
At the same time, the semantic types that guide the elaboration are associated with variables in the environment, which strongly suggests that they should be value types.
Furthermore, many semantic types involve computation types, so the obvious resolution is to do something with thunk types.&lt;/p&gt;
&lt;p&gt;Now, what makes this interesting is to notice the parts of the elaboration that definitely correspond to computation purity.
These represent some but not all of the contexts where the type &amp;quot;should&amp;quot; represent a computation instead of a value.
There are two purity annotations (pure and impure), and two &amp;quot;obvious&amp;quot; ways to convert a value to a computation (return and force).&lt;/p&gt;
&lt;p&gt;What got this to make sense to me was to consider the pure and impure function types, and what their usage should correspond to in call-by-push-value.
In 1ML, a multi-parameter function corresponds to several chained pure functions, ultimately returning either an impure function, or a pure function returning a base value.
In call-by-push-value, a multi-parameter function corresponds to functions reducing to functions, until it reduces to a return type.
What this suggests to me is that &amp;quot;purity&amp;quot; corresponds to forcing a thunk, and &amp;quot;impurity&amp;quot; to returning, and that the representation of a base type is a thunk of a return of a base type.&lt;/p&gt;
&lt;p&gt;This all feels like it will accomplish something, but there are various questions that I haven't addressed yet, such as:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;What's the proper semantic type representation for nested universal types?&lt;/li&gt;
&lt;li&gt;What about record types?&lt;/li&gt;
&lt;li&gt;Should I be working with higher-level representations of semantic types, or could it work to manipulate System Fω types directly?
One point of confusion here is looking at limitations of the representation, and distinguishing bugs from features.
Like, I can't convert a type variable into a pure computation in the context of typing; but is that a problem, or something I shouldn't even be trying to do?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, rather than try to write more, I'm going to publish this early and take another shot at understanding subtyping.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category></entry><entry><title>Coding 2026-02-05</title><link href="https://mwchase.neocities.org/coding-2026-02-05" rel="alternate"></link><published>2026-02-05T05:00:00-05:00</published><updated>2026-02-05T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-02-05:/coding-2026-02-05</id><summary type="html">&lt;p class="first last"&gt;Trying to walk back some of my less sensible plans.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, let's see where I am:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Removed explicit type variable construction, replaced it all with callbacks.&lt;/li&gt;
&lt;li&gt;The type annotations are out of control again; I need to figure out how to shorten them.&lt;/li&gt;
&lt;li&gt;Still haven't had the focus to rework variables and labels to work with 1ML.&lt;/li&gt;
&lt;li&gt;Missing several node types required to implement algebraic effects.&lt;/li&gt;
&lt;li&gt;1ML appears to require boolean types and associated nodes.&lt;/li&gt;
&lt;li&gt;Refinement typing needs integer types, at least to get started with.&lt;/li&gt;
&lt;li&gt;My fingers are still crossed that modular implicits will basically just fall out of combining 1ML and algebraic effects.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My plan is to alternate between refining the current implementation, and planning out what extensions I need to add these other capabilities.
I'm intending to implement each one separately, ideally as a higher-level language that produces well-typed trees of the current implementation.
I'm going to do them separately because jumping the gun in combining them won't make things any easier, theoretically or practically, and I want as few confounding factors as possible when things inevitably go off the rails.&lt;/p&gt;
&lt;p&gt;I'm a little sleepy right now, so I'm going to wrap things up, take care of some chores, and then try to refresh my memory on all of these different theoretical frameworks.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-02-04</title><link href="https://mwchase.neocities.org/coding-2026-02-04" rel="alternate"></link><published>2026-02-04T05:00:00-05:00</published><updated>2026-02-04T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-02-04:/coding-2026-02-04</id><summary type="html">&lt;p class="first last"&gt;It turns out PL research is hard!&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got distracted from improving the code, by the question &amp;quot;Hey, what obstacles are there to using this implementation as a substrate for all of the higher-level features I want?&amp;quot;
Right now, I'm focusing on the module language, because that's directly based on System Fω, and my implementation of it is... eccentric.
As I recall, refinement typing is going to somehow tie into bidirectional typing, and algebraic effects is &lt;strong&gt;somehow&lt;/strong&gt; going to come from call by push-value, and I've got those, so the major question is whether the tweaks that those two inspired me to make to System Fω will be a problem or not.&lt;/p&gt;
&lt;p&gt;Ultimately, I've got a mixture of concrete goals and open-ended questions.
Concrete goals include:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Provide additional implementations of &lt;tt class="docutils literal"&gt;Variable&lt;/tt&gt;, in order to represent higher-level identifiers.&lt;/li&gt;
&lt;li&gt;Provide additional implementations of &lt;tt class="docutils literal"&gt;Label&lt;/tt&gt;, in order to represent variables.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Open-ended questions include:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The core semantics I want differ from traditional ML.
Does this present any problems for adapting 1ML?
Is there any chance this makes the implementation easier?&lt;/li&gt;
&lt;li&gt;My implementation of System Fω is &lt;em&gt;sort of&lt;/em&gt; impredicative.
Is this enough for F-ing Modules?&lt;/li&gt;
&lt;li&gt;The 1ML paper combines elaboration and typing; what does an implementation of this look like, especially given that I'd ideally like to still be emitting constraints?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I want to get a better grasp on the open questions, before working on the concrete goals, which should be pretty simple.
I'm going to get off my laptop and try to make some progress there.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2026-02-03</title><link href="https://mwchase.neocities.org/weekly-roundup-2026-02-03" rel="alternate"></link><published>2026-02-03T05:00:00-05:00</published><updated>2026-02-03T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-02-03:/weekly-roundup-2026-02-03</id><summary type="html">&lt;p class="first last"&gt;When I was in a better position to explain what I'm doing, I realized I should check whether the explanation actually pans out.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I started to get a better understanding of all of this code that I wrote.&lt;/li&gt;
&lt;li&gt;Thursday: I speculated about how birds would divide up their higher-dimensional color space.&lt;/li&gt;
&lt;li&gt;Friday: I thought a lot about how to name a new utility function that I decided I needed.&lt;/li&gt;
&lt;li&gt;Saturday: I broke everything, but in a &amp;quot;something stronger will rise from the ashes&amp;quot; kind of way.&lt;/li&gt;
&lt;li&gt;Sunday: I got into an argument with the type checker.&lt;/li&gt;
&lt;li&gt;Monday: I've got an outline of an explanation of the typing concepts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm actually going to try to switch to looking into F-ing modules, to see whether the restrictions I'm currently placing on System F make it unsuitable as a substrate for the module system.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category></entry><entry><title>Coding 2026-02-02</title><link href="https://mwchase.neocities.org/coding-2026-02-02" rel="alternate"></link><published>2026-02-02T05:00:00-05:00</published><updated>2026-02-02T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-02-02:/coding-2026-02-02</id><summary type="html">&lt;p class="first last"&gt;So many notes.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right.
We were on the road a bunch today, and I ended up not on my laptop much, but I did put together an outline of an explanation of what's going on with typing, which I can use to validate the implementation.
That's going to have to wait a day or two, because I need to wind down right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-02-01</title><link href="https://mwchase.neocities.org/coding-2026-02-01" rel="alternate"></link><published>2026-02-01T05:00:00-05:00</published><updated>2026-02-01T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-02-01:/coding-2026-02-01</id><summary type="html">&lt;p class="first last"&gt;Pressing keys until the tests come back green... yup...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;A bit out of it and distracted today, but I &lt;em&gt;did&lt;/em&gt; fix the tests that I broke in very strange ways, and got the tests &lt;em&gt;most&lt;/em&gt; of the way to type checking.
The exceptions are... obnoxious.&lt;/p&gt;
&lt;p&gt;Basically, it made sense to turn a bunch of these helper methods I added into generic decorators, and to provide decorator-specific overloads to deal with the extra arguments.
However, these arguments generally have related types, and it turns out that, if I don't actually &lt;em&gt;use&lt;/em&gt; all of the functionality in the decorator arguments that I use in the function, then the returned decorator gets specialized with types that are &lt;em&gt;subtypes&lt;/em&gt; of what I want them to be.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Got it.
Very strange fix, but if it works, it works.&lt;/p&gt;
&lt;p&gt;Anyway, I was able to apply this fix (adding an extra type variable to a specific overload) to some of the methods, but not all of them, so before I move on, I want to figure out what's going wrong with the functions where it doesn't work, because that's annoying, and I don't want to get a repeat of this when I start writing existential tests.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Well, I just did what &lt;em&gt;should&lt;/em&gt; work, and slapped an ignore on it to deal with it later.
The next obvious change to make is to update the existential helper methods, and that's going to be... interesting.&lt;/p&gt;
&lt;p&gt;Any, right now I have to get to sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-01-31</title><link href="https://mwchase.neocities.org/coding-2026-01-31" rel="alternate"></link><published>2026-01-31T05:00:00-05:00</published><updated>2026-01-31T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-01-31:/coding-2026-01-31</id><summary type="html">&lt;p class="first last"&gt;I have unleashed chaos and everything is in shambles. This is progress.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I used a not-very-good name, just to get things moving, and then I implemented a bunch of improvements, and then some tests started failing, so I reworked one little bit of the typing logic in universal and existential types, several times.
Once that was done, I was able to write helper methods that introduce fresh type variables for universal types, which on the one hand allowed me to cut down on some test code, but involved a truly horrifying set of type annotations, and also some of the tests are no longer valid, and more will be broken by future updates.
There's so much to do to pick up the pieces here:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Figure out how to salvage the tests that will be broken by upcoming changes.&lt;/li&gt;
&lt;li&gt;Update the existential helper methods to make those changes possible.&lt;/li&gt;
&lt;li&gt;Make some non-destructive changes to the universal helper methods.&lt;/li&gt;
&lt;li&gt;Document the assumptions going into all of this, especially the typing code that I updated to &lt;em&gt;hopefully&lt;/em&gt; match the subsumption code.&lt;/li&gt;
&lt;li&gt;Update the test code to take full advantage of the updated helper methods.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, I have to get to bed now.
It's so late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-01-30</title><link href="https://mwchase.neocities.org/coding-2026-01-30" rel="alternate"></link><published>2026-01-30T05:00:00-05:00</published><updated>2026-01-30T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-01-30:/coding-2026-01-30</id><summary type="html">&lt;p class="first last"&gt;What's in a name? Kind of a lot, okay?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay.
So.&lt;/p&gt;
&lt;p&gt;I've got a sufficient plan for implementing subsumption checking, with just one tiny obstacle: I'm not sure what to name the function that handles this.&lt;/p&gt;
&lt;p&gt;The requirements I'm working with are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Failure nodes subsume and are subsumed by all corresponding nodes.
(Aside: for the same reason that I have this requirement, coercion failure should not emit an instance constraint when coercing a failure node.)&lt;/li&gt;
&lt;li&gt;Otherwise, nodes of different types have no subsumption relationship.&lt;/li&gt;
&lt;li&gt;Finally, any given class of node needs to implement custom logic, which may recursively check for subsumption of specific fields.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The way I decided makes sense to implement this is to define a protocol with a method that takes an argument of type &lt;tt class="docutils literal"&gt;Self&lt;/tt&gt;, and define a top-level function that performs the required instance checks, then delegates to the protocol method.
The protocol method, meanwhile, is free to call back into the top-level function.
This top-level function takes two arguments that both implement the protocol, and returns true if the second argument subsumes the first, and false otherwise.&lt;/p&gt;
&lt;p&gt;There are some other details that will make implementing other improvements nicer, but fundamentally, the important thing right now is that I'm not sure what to name the function.
I could just name it &lt;tt class="docutils literal"&gt;is_subsumed_by&lt;/tt&gt; or something, but I'd like something that's a &lt;em&gt;little&lt;/em&gt; &amp;quot;happier&amp;quot; appearing in prefix position, rather than infix.&lt;/p&gt;
&lt;p&gt;Once I have something I'm okay with, I can get to work on the implementation, and knock it out pretty quickly.&lt;/p&gt;
&lt;p&gt;For now, I need to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Diary 2026-01-29</title><link href="https://mwchase.neocities.org/diary-2026-01-29" rel="alternate"></link><published>2026-01-29T05:00:00-05:00</published><updated>2026-01-29T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-01-29:/diary-2026-01-29</id><summary type="html">&lt;p class="first last"&gt;I may have to redo a bunch of this, but I think the vibes are &lt;em&gt;basically&lt;/em&gt; right.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I &lt;em&gt;believe&lt;/em&gt; I fixed some latent bugs and inconveniences with Impliciula, but the next thing to focus on requires a lot more thought to get right, or even tolerably wrong, so I'm going to &lt;em&gt;try&lt;/em&gt; to shift focus a bit.&lt;/p&gt;
&lt;p&gt;So, tetrachromatic vision.
Looking over the sources I'm skimming suggests to me that I'm missing some important nuances, but I'm going to just forge ahead for now.
In at least some birds, the discrimination between blue and green is weaker than the discrimination between red and yellow.
This is similar to humans, and suggests to me that &amp;quot;blue and green&amp;quot; could be one of the later categories of color to be discriminated for birds, just like is the case for humans.&lt;/p&gt;
&lt;p&gt;Thus, I imagine a progression from &amp;quot;light and dark&amp;quot; to &amp;quot;black, white, and other&amp;quot; where shades and tints are part of black and white, and blue-green is generally lumped into black, yellow to yellow-red into white, and &amp;quot;other&amp;quot; is a continuum between red and ultraviolet, with ultraviolet being &amp;quot;fuzzier&amp;quot;.
I want to say the yellows and oranges get broken out next, followed by separating red from ultraviolet, then finally separating blue-green from black.
Next, dividing up the fuzzy area around ultraviolet into distinct colors, in the order of an intermediate red-ultraviolet, followed by yellow-ultraviolet, then blue-green-ultraviolet, then dividing up yellow-ultraviolet more finely.&lt;/p&gt;
&lt;p&gt;This is all working off of vibes, and isn't taking some things into account, so I think I need to work out the divisions of hue space graphically, at some point.&lt;/p&gt;
&lt;p&gt;Anyway, that's all I have focus for tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="worldbuilding"></category><category term="I guess"></category><category term="short post"></category></entry><entry><title>Coding 2026-01-28</title><link href="https://mwchase.neocities.org/coding-2026-01-28" rel="alternate"></link><published>2026-01-28T05:00:00-05:00</published><updated>2026-01-28T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-01-28:/coding-2026-01-28</id><summary type="html">&lt;p class="first last"&gt;If those are bugs, I wasn't even really looking for them...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;As I said yesterday, I decided to actually properly implement subsumption.
This will allow me to do stuff like avoid cascading errors when a coercion fails, so the user can focus on whatever caused the coercion to fail.&lt;/p&gt;
&lt;p&gt;Now, this isn't really a snap-my-fingers deal.
What I'm very confident of is as follows:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The parameter type of a function type is contravariant.&lt;/li&gt;
&lt;li&gt;Most other types are covariant, &lt;em&gt;probably&lt;/em&gt; including universal and existential.&lt;/li&gt;
&lt;li&gt;Some types are &lt;em&gt;apparently&lt;/em&gt; invariant, but I'm a little confused there.&lt;/li&gt;
&lt;li&gt;Kinds don't have variance, so call them invariant.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, subsumption, in terms of the behavior of my code, is only relevant when a synthesizing node is checked.
In the default implementations I wrote, the synthesizing node synthesizes, and then we check that the passed-in value subsumes the synthesized value.
Currently, both of these values could contain or be failing node, just according to the Python-level type annotations.
Let's see if we can find examples of both possibilities.
Hm.
If a function node is checked against an incompatible type, the body will definitely be checked against a failing node, and may synthesize a failing node.
And if a node synthesizes a failing node, and is wrapped in an ascription, then it's the other way around.
Well, that's inconclusive.&lt;/p&gt;
&lt;p&gt;Anyway, there's some other things I wanted to check.
Because of ascriptions, synthesis has to happen before reduction.
This is only relevant for higher-kinded types.
As it stands, this means that synthesizing the kind of an operator application may fail if it's partially reduced before synthesis, but, um, partial reduction indicates that typing failed, so the biggest concern here is whether the failure message ends up being confusing.
In general, I believe we want to always check kinds before performing type reduction, so the question is whether I hold to that.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;I do not.
So, first major question: &lt;strong&gt;Should I be checking type kinds before performing reduction?&lt;/strong&gt;
If the answer is yes, it appears I only need to edit the base classes.&lt;/p&gt;
&lt;p&gt;In any case, the other major question I have is whether I properly understand the operator types and kinds.
Now, kinds can only subsume by equality, so that's nice and easy.
What I need to figure out is, have I properly grasped the subsumption/&amp;quot;subtyping&amp;quot; behavior for the relevant types?
In other words, is it possible that some kind of compound value type can result in subsumption checks between two non-proper types?
Let's check the reference on bounded quantification.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Not sure.
Let's check the code.&lt;/p&gt;
&lt;p&gt;The type must be synthesized from a value, so the overall value type is proper.
To contain further structure, it must be a thunk type.
The only computation types that can be well-kinded despite dealing with non-proper types are universal and existential types.
Maybe just existential types.&lt;/p&gt;
&lt;p&gt;So, an existential type consists of a type parameter, a kind, and a type that ideally has the type parameter as a free variable.
We need that this type is proper, if the type variable is bound to the specified kind.&lt;/p&gt;
&lt;p&gt;So, it could be the case that the value type is of the form &lt;tt class="docutils literal"&gt;list[T]&lt;/tt&gt;, which might have a structure very much like an operator application around an ascription around an operator.
(Operators would only be strictly necessary if it were doing something like passing in different container types for the variable, and applying them to a constant type.)
The structure could be arbitrarily obfuscated.
What I want is that if, for all T, the existential types under consideration evaluate the value types to compatible types, then the subsumption holds.&lt;/p&gt;
&lt;p&gt;Now, once we get here, we're guaranteed that the types have been reduced before we do any checks for subsumption.
(This sounds like it goes against what I was saying before, but that was about kinding; this is about typing.)
It should be the case that the only subsumption checks we care about between operator types are for the operator type itself, though we can throw in operator application checking as a treat.&lt;/p&gt;
&lt;p&gt;In fact, it may be necessary, because the only way I see to handle existential types, universal types, and operators, is to substitute the type parameter with a fresh type variable, and covariantly check for subsumption.&lt;/p&gt;
&lt;p&gt;In the end, I've got a few things to look into:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Am I doing reduction and kind checking in the wrong order in the base classes?&lt;/li&gt;
&lt;li&gt;Do I have the right approach for subsumption checks between types with type parameters?&lt;/li&gt;
&lt;li&gt;Is there a good way to force subsumption to succeed if either type/kind is a failure node?&lt;/li&gt;
&lt;li&gt;Failing that, is there a direction for checking subsumption that makes much more sense than the alternative?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, it's late and I need to get to bed half an hour ago.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category></entry><entry><title>Weekly Roundup 2026-01-27</title><link href="https://mwchase.neocities.org/weekly-roundup-2026-01-27" rel="alternate"></link><published>2026-01-27T05:00:00-05:00</published><updated>2026-01-27T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-01-27:/weekly-roundup-2026-01-27</id><summary type="html">&lt;p class="first last"&gt;Only working on this because I'm incapable of focusing on anything else.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I made some progress on Impliciula, and also on other things, but there were some issues I didn't see a way around.&lt;/li&gt;
&lt;li&gt;Thursday: I described the state of another project, which I'll try to come back to at some point.&lt;/li&gt;
&lt;li&gt;Friday: I made a little more progress on Impliciula.&lt;/li&gt;
&lt;li&gt;Saturday: I fixed most of the problems I was running into with Impliciula, thereby allowing me to run into exciting new problems.&lt;/li&gt;
&lt;li&gt;Sunday: I made slow and steady progress on Impliciula.&lt;/li&gt;
&lt;li&gt;Monday: I ran into an ergonomics issue, and wasn't sure whether to try to fix it by implementing subsumption or overriding equality.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to implement subsumption.
This is going to require some care, because it involves every type and kind, and potentially every type checking method.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category></entry><entry><title>Coding 2026-01-26</title><link href="https://mwchase.neocities.org/coding-2026-01-26" rel="alternate"></link><published>2026-01-26T05:00:00-05:00</published><updated>2026-01-26T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-01-26:/coding-2026-01-26</id><summary type="html">&lt;p class="first last"&gt;Oh boy, how fun this all is...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hm.&lt;/p&gt;
&lt;p&gt;Hm.&lt;/p&gt;
&lt;p&gt;Hmmm.&lt;/p&gt;
&lt;p&gt;I'm running into some issues here that I'm not totally sure what to do about.
Basically, I came up with this whole fancy &amp;quot;pass a function to handle fresh variable bindings&amp;quot; thing for the helper functions for basic simply-typed lambda calculus.
It would be really nice to do something similar with the various types introduced by quantification, but right now, that doesn't work, because the type variables being used are part of the type.
Due to the way the universal and existential types are defined, right now the types have to match up completely.
Where I currently do an equality check, it would be pretty much trivial to perform a substitution, though I'd also need to make sure to make sure that the type variable I'm substituting in isn't a free variable of the existential/universal type.&lt;/p&gt;
&lt;p&gt;However, if I want to go this route, then I need to actually implement subsumption, because suddenly these types are &amp;quot;equivalent&amp;quot; without being literally the same.&lt;/p&gt;
&lt;p&gt;Although...&lt;/p&gt;
&lt;p&gt;Since what I'm going for currently is actually completely symmetric, I could also keep on calling it &amp;quot;equality&amp;quot;, and simply redefine equality and hashes in some way...
Not a big deal for equality, potentially somewhat cursed for hashing.&lt;/p&gt;
&lt;p&gt;Also, I'm currently in the middle of rewriting the universal types tests; if I'm going to have any confidence that I'm updating it correctly, I need to do things in the order of:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Finish updating tests&lt;/li&gt;
&lt;li&gt;Update equality, hashing, and type inference/checking&lt;/li&gt;
&lt;li&gt;Once the tests are passing, it's time to update them again.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In any case, whether I do the later steps or not, I do have to finish the first one, so let's see about that.
Later, since it's late now and I need to wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category></entry><entry><title>Coding 2026-01-25</title><link href="https://mwchase.neocities.org/coding-2026-01-25" rel="alternate"></link><published>2026-01-25T05:00:00-05:00</published><updated>2026-01-25T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-01-25:/coding-2026-01-25</id><summary type="html">&lt;p class="first last"&gt;It'd be nice to just be done with this stuff, but I think rushing through it would be bad.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right.
I was kind of taking things easy today, so I didn't do much.
I just now updated a few more tests, and then cleared up some verbosity in the main code.&lt;/p&gt;
&lt;p&gt;It's good that I'm chipping away at this stuff, though not very interesting, and right now, like right this moment, I really need to get ready for bed, because it's late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-01-24</title><link href="https://mwchase.neocities.org/coding-2026-01-24" rel="alternate"></link><published>2026-01-24T05:00:00-05:00</published><updated>2026-01-24T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-01-24:/coding-2026-01-24</id><summary type="html">&lt;p class="first last"&gt;I don't want to trade one set of ergonomics issues for another, but maybe I'm trading for a smaller set?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay.
So.&lt;/p&gt;
&lt;p&gt;I'm midway through making a change to the codebase, and I need to slow down a bit and see if I should make any course corrections.
Basically, here's what happened:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I made a few base classes covariant, which allowed me to delete a bunch of code and addressed some problems I was anticipating with my efforts to rework the modules representing the different parts of the lambda cube.&lt;/li&gt;
&lt;li&gt;That rework has several prongs.
One is that I want to encode the node typing directionality into the type system, even though that can't be part of the syntax tree itself.
Another is that I want to make it a little easier to work with variables.
Finally, at least for now, I'm doing this in the form of static methods on helper classes, so I can reuse them via subclassing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I've got the helper classes together, but I'm not totally happy with the way this is requiring the tests to be updated.
I think some of the changes are improvements, but I'm not sure how to do some of the updates.
The big user-facing change is that nodes with a variable binding are created by taking a function as an argument, that accepts a variable and returns the scope where the binding is live.
This means that the user doesn't need to juggle the different data types to set things up for these nodes.&lt;/p&gt;
&lt;p&gt;Anyway, I don't have anything else to consider or talk about right now, so I'm going to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-01-23</title><link href="https://mwchase.neocities.org/coding-2026-01-23" rel="alternate"></link><published>2026-01-23T05:00:00-05:00</published><updated>2026-01-23T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-01-23:/coding-2026-01-23</id><summary type="html">&lt;p class="first last"&gt;This was all I could really think about today, so I guess it made sense to do it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm poking gingerly at the idea of making helper classes for constructing nodes that I can use as mixins.
There are two basic issues that I'm aware of right now:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;How do I get the correct type onto base values and types (that is, the correct set of features)?&lt;/li&gt;
&lt;li&gt;How best to make some of these helper functions usable as decorators?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I've got some stuff I'm trying for the latter, though I need to wrap up for now and get back to it later.
Some ideas for the former as well, but they don't feel fully baked yet.&lt;/p&gt;
&lt;p&gt;Anyway, really need to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Diary 2026-01-22</title><link href="https://mwchase.neocities.org/diary-2026-01-22" rel="alternate"></link><published>2026-01-22T05:00:00-05:00</published><updated>2026-01-22T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-01-22:/diary-2026-01-22</id><summary type="html">&lt;p class="first last"&gt;A fun, or at least engaging/distracting, side project.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm poking a little at Impliciula, but not sure whether I'm doing things right, so I'm going to just trundle along at it, not rushing.&lt;/p&gt;
&lt;p&gt;So, the other thing I mentioned thinking about.&lt;/p&gt;
&lt;p&gt;I've been watching some videos on tetrachromacy, and it inspired me to investigate the vision of natural tetrachromats, specifically birds (and most specifically some hummingbirds, I guess).
Judging by the diagrams I'm looking at, which may be somewhat schematic, bird cone cells have more evenly spaced peaks of activation than human cone cells, and possibly narrower ranges of activation?
Experimental evidence, (and some extremely simplified toy models I sketched up), supports the hypothesis that these hummingbirds, at least, perceive tetrachromatic colors.&lt;/p&gt;
&lt;p&gt;Now, some of the videos I watched concerned efforts to devise color names for the various non-spectral colors that the research featured in those videos are supposed to make possible, but I wondered, if a bird were to devise color terms, and gradually, rather than all at once, what would it look like?&lt;/p&gt;
&lt;p&gt;I've just scratched the surface in thinking about this so far, and I definitely need to come at it more systematically, but what I have so far is, I believe it's plausible that the first color term beyond black and white would correspond to red, ultraviolet, the colors in between (a sort of un-blue ultra-magenta), as well as some colors around red, and a broader halo of colors around ultraviolet.
My basis for this is that both colors have very significant meanings for birds, and the non-spectral combination appears to be one possible coloration for flower petals.&lt;/p&gt;
&lt;p&gt;Because the tetrachromatic hue space has a different structure than trichromatic, I'm not sure how best to divide it up further, or even how to make sure that I'm getting everything.
I can consider, for example, the equivalent of the CMYK system, but I'm more interested in the more ad-hoc earlier systems, stuff that relates to the values of a hypothetical bird-people society, rather than &amp;quot;here are the five colors of ink that they need for their printers, when (if) they invent printers&amp;quot;.&lt;/p&gt;
&lt;p&gt;Anyway, that's all I've got for now.
Going to sleep, and see if I come up with any more ideas or thoughts on... like, anything.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="worldbuilding"></category><category term="I guess"></category></entry><entry><title>Coding 2026-01-21</title><link href="https://mwchase.neocities.org/coding-2026-01-21" rel="alternate"></link><published>2026-01-21T05:00:00-05:00</published><updated>2026-01-21T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-01-21:/coding-2026-01-21</id><summary type="html">&lt;p class="first last"&gt;Very excited to talk at length about this other project. Very not ready yet.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've been putting most of my mental energy into things other than Impliciula or conlanging, but I don't have the time or focus to write that up right now, so I'm going to jot some quick notes on what I've done and where I'm going with Impliciula.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I created a module containing a wrapper class with an additional parameter to track type inference direction.
(To get this to work, I had to specify the variance manually, which now has me paranoid about where else the variance inference could be wrong.)&lt;/li&gt;
&lt;li&gt;I was briefly imagining using this class to define helper functions in the same modules as the different node classes, but I've decided this would be frustrating, on account of how I'm no longer importing variable nodes, but I am importing variables.&lt;/li&gt;
&lt;li&gt;Perhaps what would make sense would be to add constructor methods to the different node classes, that use the wrapper class, and then elsewhere have the helper methods that do stuff like synthesize variable nodes to pass into a function mapping variable nodes to computations.&lt;/li&gt;
&lt;li&gt;I'm still not totally sure what is the best way to package up these helpers for reuse.
I keep thinking that multiple inheritance in a mixin kind of mode should work, but then I get caught up trying to figure out the type variables, and I'm just not sure.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Oh well, I can at least do some of this, incrementally, and it will function as nice documentation, if nothing else.&lt;/p&gt;
&lt;p&gt;For now, it is super late and I need to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2026-01-20</title><link href="https://mwchase.neocities.org/weekly-roundup-2026-01-20" rel="alternate"></link><published>2026-01-20T05:00:00-05:00</published><updated>2026-01-20T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-01-20:/weekly-roundup-2026-01-20</id><summary type="html">&lt;p class="first last"&gt;This was a weird week. Even though I made good progress on code quality, I don't like where I ended up emotionally.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I made no progress on the conlang code, and some progress on Impliciula.&lt;/li&gt;
&lt;li&gt;Thursday: About the same.&lt;/li&gt;
&lt;li&gt;Friday: I finished one bit of work on Impliciula, and prepared to pick up another.&lt;/li&gt;
&lt;li&gt;Saturday: I got tangled up in a weird Mypy bug that I think is actually somehow several smaller bugs in a trenchcoat.&lt;/li&gt;
&lt;li&gt;Sunday: I finished another bit of work on Impliciula, then decided to try and reorient a bit.&lt;/li&gt;
&lt;li&gt;Monday: In an effort to get inspiration for Impliciula's code, I tried to work on its documentation. Things did not go as planned.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I may need to drastically change direction to get my brain feeling better.
I am aware that this will further distance my Conlang Year stuff from anything resembling a &amp;quot;year&amp;quot;, but I need to work with the brain I've got, not the brain I want.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category></entry><entry><title>Coding 2026-01-19</title><link href="https://mwchase.neocities.org/coding-2026-01-19" rel="alternate"></link><published>2026-01-19T05:00:00-05:00</published><updated>2026-01-19T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-01-19:/coding-2026-01-19</id><summary type="html">&lt;p class="first last"&gt;Intellectually, I made progress. Emotionally...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I didn't make any progress on Conlang Year.
Instead, I ended up trying to document Impliciula('s IR) in an effort to get an idea of how the code should be laid out.
The result of this so far is a &lt;em&gt;really bad&lt;/em&gt; effort to cover a graduate course in computer science, &lt;em&gt;really quickly&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I need to get some downtime somehow, both in the sense of getting to bed once this publishes, and in the sense of switching gears to something that doesn't stress me out so much.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-01-18</title><link href="https://mwchase.neocities.org/coding-2026-01-18" rel="alternate"></link><published>2026-01-18T05:00:00-05:00</published><updated>2026-01-18T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-01-18:/coding-2026-01-18</id><summary type="html">&lt;p class="first last"&gt;Hopefully tomorrow I'll be able to focus on conlangs again.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got a messed-up Mypy bug in, and people can have fun with that.&lt;/p&gt;
&lt;p&gt;After I got some sleep, I realized that the way I'd written the code to hit the bug was a lot of extra effort for no gain; so I unwound all of the &amp;quot;clever&amp;quot; stuff, and the code got a lot shorter.&lt;/p&gt;
&lt;p&gt;I spaced out a bit on writing this entry after that sentence, so let's try to get it together and write something up quick.&lt;/p&gt;
&lt;p&gt;So, I have an intuition that it would be nice to define function nodes by passing a constructor a lambda that maps a fresh variable to a computation.
(This is in some ways problematic, because, following f-ing modules, the variables don't freshen.)&lt;/p&gt;
&lt;p&gt;The other side of things, which I hadn't thought about for a bit, is that it would be nice to represent typing directionality in a builder context (since reduction doesn't preserve typability), so there would need to be some kind of wrapper class to represent that.
Given the experiences I literally just had with prematurely implementing things, I definitely at least need to sleep on this.&lt;/p&gt;
&lt;p&gt;Since it's late anyway, I'm going to just post this, and for now just write up the directionality of all of the relevant attributes; this should illuminate something or other without committing to any specific code change just yet.&lt;/p&gt;
&lt;p&gt;Better wrap up after that.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-01-17</title><link href="https://mwchase.neocities.org/coding-2026-01-17" rel="alternate"></link><published>2026-01-17T05:00:00-05:00</published><updated>2026-01-17T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-01-17:/coding-2026-01-17</id><summary type="html">&lt;p class="first last"&gt;Nothing to make the brain feel better quite like &amp;quot;Expected [long type string], got [exactly the same long type string]&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I just switched on the usage of the &lt;tt class="docutils literal"&gt;Failure&lt;/tt&gt; feature, and it was certainly... an experience.
I ended up pulling out a lot of &lt;tt class="docutils literal"&gt;# type: ignore&lt;/tt&gt;s, some of them seemingly for a bug in Mypy, which I'm going to have to figure out how to minimize.&lt;/p&gt;
&lt;p&gt;So:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Isolate Mypy bug.&lt;/li&gt;
&lt;li&gt;Create DSL classes to hopefully make imports less obnoxious in tests.&lt;/li&gt;
&lt;li&gt;Write more tests.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Probably in that order.&lt;/p&gt;
&lt;p&gt;Anyway, bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-01-16</title><link href="https://mwchase.neocities.org/coding-2026-01-16" rel="alternate"></link><published>2026-01-16T05:00:00-05:00</published><updated>2026-01-16T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-01-16:/coding-2026-01-16</id><summary type="html">&lt;p class="first last"&gt;Rewriting several hundred lines of code only fried my brain a &lt;em&gt;little&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay.
So.
I just finished up with the big changes to the node definitions.
Things are generally simpler, although there are a few unresolved questions kicking around.
I believe my next step is to tag the failure nodes with the failure feature, which will cause a bunch of things to break, and when that breakage is resolved, I'll be ready to consider questions like &amp;quot;Okay, seriously, how should these modules be laid out on disk?&amp;quot;&lt;/p&gt;
&lt;p&gt;But there's no way I'm considering any of this tonight, so let's wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-01-15</title><link href="https://mwchase.neocities.org/coding-2026-01-15" rel="alternate"></link><published>2026-01-15T05:00:00-05:00</published><updated>2026-01-15T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-01-15:/coding-2026-01-15</id><summary type="html">&lt;p class="first last"&gt;I wonder if I totally broke any of the code that doesn't have tests yet.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, still pondering the right way to handle the conlang stuff; I know I shouldn't rush ahead, because I'm still refining stuff.&lt;/p&gt;
&lt;p&gt;On the Impliciula side, I finished teasing apart some things that shouldn't have been together, and removed a bunch of weirdly-placed imports; getting rid of the remainder will take some very specific choices of layout.&lt;/p&gt;
&lt;p&gt;I want to keep going on any of this, but it's late, so I'm going to wind down.
Reluctantly.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-01-14</title><link href="https://mwchase.neocities.org/coding-2026-01-14" rel="alternate"></link><published>2026-01-14T05:00:00-05:00</published><updated>2026-01-14T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-01-14:/coding-2026-01-14</id><summary type="html">&lt;p class="first last"&gt;So many pieces to pick up...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, it's late, so, going through things quickly:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I haven't yet figured out the right way to encode paradigms to make agreement likely/feasible for fusions, so the conlang code is just kind of sitting there.&lt;/li&gt;
&lt;li&gt;I shaved off a few lines from Impliciula by converting some values to computations.&lt;/li&gt;
&lt;li&gt;I separated out variables and variable nodes, thereby unleashing absolute chaos.
I think I've improved the code, but I can't really establish that for sure until I fix all the tests that I just broke.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That's not happening now, because I should have gone to bed fifteen minutes ago.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2026-01-13</title><link href="https://mwchase.neocities.org/weekly-roundup-2026-01-13" rel="alternate"></link><published>2026-01-13T05:00:00-05:00</published><updated>2026-01-13T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-01-13:/weekly-roundup-2026-01-13</id><summary type="html">&lt;p class="first last"&gt;Oh boy, I'm working on the conlang code instead of using the conlang code, again.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I let out an anguished scream of incoherent rage, and stopped screaming afterwards, because constantly screaming is bad for your throat.&lt;/li&gt;
&lt;li&gt;Thursday: I tried to get back to my various current projects.&lt;/li&gt;
&lt;li&gt;Friday: I looked at Impliciula with fresh eyes, and didn't like what I saw, but there's definitely potential.&lt;/li&gt;
&lt;li&gt;Saturday: I did some more planning work on the projects.&lt;/li&gt;
&lt;li&gt;Sunday: I made plans to improve the Impliciula code by making it less clever.&lt;/li&gt;
&lt;li&gt;Monday: I figured out more work that I have to do on the conlang code, and I think after I published, I made some breakthroughs on Impliciula.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to put those breakthroughs into practice, and it's going to have so many weird cascading changes.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Conlang Year"></category><category term="Impliciula"></category></entry><entry><title>Coding 2026-01-12</title><link href="https://mwchase.neocities.org/coding-2026-01-12" rel="alternate"></link><published>2026-01-12T05:00:00-05:00</published><updated>2026-01-12T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-01-12:/coding-2026-01-12</id><summary type="html">&lt;p class="first last"&gt;Slow day, but I did do some stuff.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I made some localized improvements to the Impliciula code, and fixed saving in my editor by, um, upgrading my LSP?
Modern development is &lt;em&gt;weird&lt;/em&gt;.
Anyway, I'm having trouble figuring out what to work on next, because the code right now is a confusing mass of circular imports, and I don't see any way that my planned rewrites will improve the situation, so that's messing with my motivation a little.&lt;/p&gt;
&lt;p&gt;Given that, let's make some improvements to the conlang code.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, I've added a new field type possibility, written a deserializer for it, updated the existing deserializer, and now I need to work out how to process this new data in the fusion code.
The remaining work appears to all be in the innermost loop, for certain definitions of &amp;quot;loop&amp;quot; and &amp;quot;innermost&amp;quot;.&lt;/p&gt;
&lt;p&gt;However, to get this done well, I'd like to have some helper functions.
But it's a little hard to say exactly what these helper functions should look like.&lt;/p&gt;
&lt;p&gt;The highest-level function I need would take a mapping of lexicon entries, a part of speech, and either a root or a specific inflection.
If it's not a specific inflection, &lt;em&gt;and&lt;/em&gt; the part of speech matches, then it needs to iterate over the inflections present for that part of speech; otherwise it needs to return X copies of the given inflection, if any, or the bare root, where X is the number of inflections associated with the part of speech.&lt;/p&gt;
&lt;p&gt;Writing that out suggests that I should track inflections separately from any given entry.
That's another change to deserialization and serialization, and a slightly fiddlier one, so I'm going to make sure my current changes haven't broken anything, and come back to this later, since it's getting late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="Conlang Year"></category><category term="short post"></category></entry><entry><title>Coding 2026-01-11</title><link href="https://mwchase.neocities.org/coding-2026-01-11" rel="alternate"></link><published>2026-01-11T05:00:00-05:00</published><updated>2026-01-11T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-01-11:/coding-2026-01-11</id><summary type="html">&lt;p class="first last"&gt;This code is going to &lt;em&gt;pop off&lt;/em&gt; once I have a self-hosting compiler.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I mostly thought about stuff today.
Here's my current stumbling block:&lt;/p&gt;
&lt;p&gt;I want to statically prevent failure nodes from occurring in an AST.
(This may be infeasible.)
Currently, my solution to this is &amp;quot;Don't do that :)&amp;quot; and I'm having trouble improving on that.&lt;/p&gt;
&lt;p&gt;Basically, something in the current and planned implementations isn't quite right, but I'm not yet sure what.&lt;/p&gt;
&lt;p&gt;The general idea is that failure nodes are an expected consequence of the coercion mechanism, which means that they can arise in type checking, but I'd like to guarantee that they aren't in the syntax tree or inferred type, should type checking succeed.
The barrier I have to this, is how to properly represent failure nodes.
If I represent them as a &amp;quot;feature&amp;quot; (which is a streamlining of the current system, which works, but has amazingly bad ergonomics), then I need some higher-kinded-types magic, or possible generic associated types magic, in order to get the type I actually want.&lt;/p&gt;
&lt;p&gt;Before I distract myself thinking about what type magic I do have access to, let's consider how to simplify things.&lt;/p&gt;
&lt;p&gt;The most straightforward simplification would be to simply provide an argument to &lt;tt class="docutils literal"&gt;coerce&lt;/tt&gt; to tell it what to pass back.
This wouldn't be too big of an ergonomics hit, and it might allow for some improvements around record types.
So, let's say this is definitely on the table.&lt;/p&gt;
&lt;p&gt;The next issue is that there's a soundness hole in the current implementation, which allows for some bad casts.
Practically speaking, it would be very weird for this to actually be relevant, but it bothers me.
All the same, it seems likely that the correct solution is basically to slap a note on the function saying &amp;quot;if you call this function outside of some very specific contexts, that's on you&amp;quot;.&lt;/p&gt;
&lt;p&gt;That's definitely enough thinking for now, better actually wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-01-10</title><link href="https://mwchase.neocities.org/coding-2026-01-10" rel="alternate"></link><published>2026-01-10T05:00:00-05:00</published><updated>2026-01-10T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-01-10:/coding-2026-01-10</id><summary type="html">&lt;p class="first last"&gt;Doing what I can, which is mostly planning.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I think I've fixed the issues in my plan for fixing the conlang code, so I'm going to sleep, see if any more objections occur to me, then start updating the code.&lt;/p&gt;
&lt;p&gt;For now, I'm trying to give the same sort of treatment to my planned rewrite of Impliciula.
Here's what I'm thinking.
Sub-packages for STLC (always available), failure, universal, existential, operator, and record.
Each sub-package defines a marker class in a module with no dependencies, puts its nodes in as many modules as feels right, and provides a mixin class for constructing nodes without having to bring in the node classes.
Then, the different sets of allowable nodes can be specified just by combining the marker classes and mixins.&lt;/p&gt;
&lt;p&gt;The other side of this is, I feel like there has to be some way to parameterize the allowable scalar node types, but I could just be wrong about that.
I'm not currently doing it, and not trying would reduce the implementation effort, so...&lt;/p&gt;
&lt;p&gt;Anyway, I just noticed that one wrinkle is the typing around coercion.
I want to make failure types be distinct, which means that the &lt;tt class="docutils literal"&gt;Failing&lt;/tt&gt; protocol needs to somehow account for that, and how it can do that is not obvious to me at this time.&lt;/p&gt;
&lt;p&gt;By the way, &amp;quot;this time&amp;quot; is pretty late, and I should get to bed.&lt;/p&gt;
&lt;p&gt;(I think the answer for now is to just do a bunch of overloads or something like that.)&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="Conlang Year"></category><category term="short post"></category></entry><entry><title>Coding 2026-01-09</title><link href="https://mwchase.neocities.org/coding-2026-01-09" rel="alternate"></link><published>2026-01-09T05:00:00-05:00</published><updated>2026-01-09T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-01-09:/coding-2026-01-09</id><summary type="html">&lt;p class="first last"&gt;I will surely not regret rewriting Impliciula's node type variables, again.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I'm letting stuff for the conlanging code kind of just percolate.&lt;/p&gt;
&lt;p&gt;Let's take stock of Impliciula.
There's some functionality in here that got kind of messy, and it's clear that I didn't think through how it should be used.&lt;/p&gt;
&lt;p&gt;The basic idea is, there are different extensions to the simply-typed lambda calculus, and I managed to write code that can represent different extensions in a typed fashion.
So, like, it's possible to have basic simply-typed lambda calculus, system F, system F with existential types, etc.
Each node is only implemented once, and the specific combination of allowable nodes is handled in a module for the specific extension of the lambda calculus.
The problem I have right now is that I don't have a clear picture of what should be allowed by default.
Because the current state is so disordered, I'm going to try to lay out how things should work.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The base STLC is CBPV with bidirectional typing.
This means that it needs variables, thunks, forces, returns, sequencing, abstractions, applications, and ascriptions.
Furthermore, higher-level features require type variables and the kind of proper types, as well, and typing requires several &amp;quot;failed&amp;quot; nodes, which are in kind of a confusing place.&lt;/li&gt;
&lt;li&gt;In order to actually compute an externally useful value, basic scalar types are needed, at minimum.&lt;/li&gt;
&lt;li&gt;System F extends with type abstractions and type applications.&lt;/li&gt;
&lt;li&gt;Additionally, packing and unpacking.&lt;/li&gt;
&lt;li&gt;In order make use of packed values, record types and projections are needed.&lt;/li&gt;
&lt;li&gt;Lastly, type operators and operator applications are needed for System Fω.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The idea of breaking up the nodes into distinct features, suggests a means of streamlining the current implementation: instead of the current approach of enumerating all (most) nodes of interest, have a single type parameter that can be unioned with a marker type representing a constellation of related features.
This should simplify things; I'll need to make sure it doesn't somehow simplify &amp;quot;too much&amp;quot;.&lt;/p&gt;
&lt;p&gt;With this level of simplification, it could make sense to introduce more nuance into the base types.
Make a given syntax tree module specify a combination of features and base types.
Then the default can be CBPV and bidirectional typing, plus support for higher-level features, and the extensions can be base types, universal types, existential types, type operators, and record types.
The resulting syntax tree types should generally be parametric over base types, since they don't do anything &amp;quot;interesting&amp;quot; to tree structure.
Therefore, it could be clean to make this all a two-variable system, with one variable for node types, and one variable for base types.&lt;/p&gt;
&lt;p&gt;As I think about this, it also occurs to me that so many imports would be simplified if I were to put together some kind of subclassable builder class, like I've considered before.&lt;/p&gt;
&lt;p&gt;I think this is a promising direction to take the code, if a little obnoxious to do all of the updates.
I just need to give things a little more thought to make sure they all fit together.
(The current source of annoyance for me is, if typing fails, there could very well be a failed node somewhere in the result, but if it succeeds, then there shouldn't be a failed node.
Do I need to thread a result type through all of type inference to get the results I want?
I want the answer to be &amp;quot;no&amp;quot;...
All of this said, nothing in the &lt;em&gt;current&lt;/em&gt; types stops inference from returning garbage, so on the one hand, it could be defensible to do the updates I know how to do now, and the rest later, but on the other hand, I want to make sure I don't accidentally impede those later updates.
I've got to think...)&lt;/p&gt;
&lt;p&gt;Not going to get any further on this tonight, need to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Diary 2026-01-08</title><link href="https://mwchase.neocities.org/diary-2026-01-08" rel="alternate"></link><published>2026-01-08T05:00:00-05:00</published><updated>2026-01-08T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-01-08:/diary-2026-01-08</id><summary type="html">&lt;p class="first last"&gt;All of this automation is freeing me up to maintain the automation.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I'm... stabilizing.
Let's try to get back to other topics.&lt;/p&gt;
&lt;p&gt;Yesterday, I &lt;em&gt;did&lt;/em&gt; do the Conlang Year prompt.
Sort of.
And I've already done everything in today's prompt.
More or less.&lt;/p&gt;
&lt;p&gt;So, let's see what's next.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Well.
I'd already done pronouns.
However, I wouldn't be opposed to adding a formality distinction, now that I'm reading over this.&lt;/p&gt;
&lt;p&gt;Okay, like, even knowing that it's &lt;em&gt;extremely likely&lt;/em&gt; that this prompt is just for &lt;em&gt;thinking&lt;/em&gt; about what pronouns to have, I at least want to figure out a derivation for the formal version.
And that will perhaps take some thinking, because my first thought was to copy Spanish, which has its formal second-person forms derived from possessive phrases, and the possessives in this language are, special.
If I go this route, everything in this language that has declensions, will have regular declensions, except for this one pronoun, which will instead have a mess.&lt;/p&gt;
&lt;p&gt;For a bit of variety, let's make these changes in the Jackal lexicon rather than the Eagle lexicon.
This is early enough that the possessive preposition doesn't have its exact modern pronunciation, so there's a &lt;em&gt;chance&lt;/em&gt; that sound evolution will do something weird.
At the same time, it's not at the same time (as every other fusion I've done so far.)&lt;/p&gt;
&lt;p&gt;One thing to note, which shouldn't be a problem in this instance, but may in the future, is that I need to figure out how to select a particular inflection when fusing.
Actually, one thing that will be a problem is that I'm not propagating fusion changes to the children.
I'll have to fix that.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;That's not simple.
I think I'll write all of this up in my notes, and ponder this.
The big issue is really just getting the representation correct.
After that, I just need to create some helper functions and restructure the fusion logic a little.&lt;/p&gt;
&lt;p&gt;Anyway, I have to put this down for now, and get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Conlang Year"></category></entry><entry><title>Diary 2026-01-07</title><link href="https://mwchase.neocities.org/diary-2026-01-07" rel="alternate"></link><published>2026-01-07T05:00:00-05:00</published><updated>2026-01-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-01-07:/diary-2026-01-07</id><summary type="html">&lt;p class="first last"&gt;I'M NOT FINE!&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I started writing this shortly after the last entry because I couldn't get to sleep.
The Trump administration is doing things so nakedly imperialist that it feels absurd not to say anything, but I'm once again wary of speaking outside of my areas of something vaguely resembling expertise.
Counterpoint: I clearly have more grounded opinions than Chuck Schumer, so go off I guess.&lt;/p&gt;
&lt;p&gt;So much of existing in America is being confronted with countless wars that are forced to be nameless, or to bear euphemistic names.
Wars against people who were just minding their business, wars against people who are nominally American citizens, at least for now.
Wars, wars, wars, constantly and everywhere, but we just hear that everything is normal and functional.
Every predictable outcome of these wars is an unfortunate coincidence, or a clear consequence of poor moral character—and the victims must have poor moral character, for if such things were to happen to someone with good moral character, that would be monstrous, and we cannot be living in a world so unjust.
(Never mind that this is monstrous regardless of the moral character of the victims.)
Wars, wars, wars, attempting to wring out valor and glory, as though we could make something good or beautiful out of valor and glory, whatever they may be, however they are to be found in these daily atrocities, as if such absurd vanity, such poisonous fear of irrelevance, could bear wholesome fruit.&lt;/p&gt;
&lt;p&gt;Every year of my life, the gilt flaked off of the previous year's golden idealism, but another shining vision of tomorrow arose to replace it.
I have seen so many shining visions, I fear I'm going blind.
Perhaps that is why I cannot see the next.&lt;/p&gt;
&lt;p&gt;Not a reaction to a single event, but the inevitable consequence of &lt;em&gt;so many&lt;/em&gt; such events...&lt;/p&gt;
&lt;p&gt;I don't want glory.
I have too clear an image of the pathology of fame, one of many poisons that has been sold as a tonic.
I merely want the chance to create something that I can understand as good.
But how can I trust it to stay that way?
If I create art, will people I've never met nor heard of twist it to support new atrocities?
If I create tools, will they be turned against the biosphere in the name of profit?&lt;/p&gt;
&lt;p&gt;I know I can't give up, but right now, I can't see a clearer vision of moving forward than to simply continue, one step at a time, trusting my instincts to guide my path.
It doesn't feel &lt;em&gt;good&lt;/em&gt;, but it will have to be enough.&lt;/p&gt;
&lt;p&gt;By the way, you should definitely read what actually informed people have to say about our entire multi-century situation.
I'm writing totally off-the-cuff here, and I don't think any part of interacting with this blog post is praxis.
(But I could be wrong. Again, seek out relevant expertise.)&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2026-01-06</title><link href="https://mwchase.neocities.org/weekly-roundup-2026-01-06" rel="alternate"></link><published>2026-01-06T05:00:00-05:00</published><updated>2026-01-06T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-01-06:/weekly-roundup-2026-01-06</id><summary type="html">&lt;p class="first last"&gt;I'm fine. I'm fine. I'm fine.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I prepared to jump ahead on Conlang Year.&lt;/li&gt;
&lt;li&gt;Thursday: I started thinking about Impliciula again, and working on it some.&lt;/li&gt;
&lt;li&gt;Friday: I polished up the work I did on Impliciula.&lt;/li&gt;
&lt;li&gt;Saturday: Tired, but still got stuff done for Conlang Year, sort of.&lt;/li&gt;
&lt;li&gt;Sunday: A little more done on Conlang Year.&lt;/li&gt;
&lt;li&gt;Monday: Ugh. Come on. Just gotta get through it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to handle not being on vacation any more.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category><category term="Conlang Year"></category></entry><entry><title>Diary 2026-01-05</title><link href="https://mwchase.neocities.org/diary-2026-01-05" rel="alternate"></link><published>2026-01-05T05:00:00-05:00</published><updated>2026-01-05T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-01-05:/diary-2026-01-05</id><summary type="html">&lt;p class="first last"&gt;I know this process is giving good results, but constantly doing things out of order is disorienting.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, so, it's late and I don't have much time, which makes it convenient that I accidentally sort of already did the Conlang Year prompt I was planning for today.
I'll try to keep on with the subsequent days, because perhaps I want to change how I did things, but for now, I'm just going to write up the current state of things.
This is the stuff for demonstratives, by the way.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to wind down now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="Conlang Year"></category></entry><entry><title>Diary 2026-01-04</title><link href="https://mwchase.neocities.org/diary-2026-01-04" rel="alternate"></link><published>2026-01-04T05:00:00-05:00</published><updated>2026-01-04T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-01-04:/diary-2026-01-04</id><summary type="html">&lt;p class="first last"&gt;Give me a few days to hopefully get things normal...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I have completed a day of Conlang Year, by thinking about things a little, and then writing stuff down.
Good enough for me, and it would be wildly irresponsible to do anything more tonight, so I should stop doing things now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="Conlang Year"></category></entry><entry><title>Diary 2026-01-03</title><link href="https://mwchase.neocities.org/diary-2026-01-03" rel="alternate"></link><published>2026-01-03T05:00:00-05:00</published><updated>2026-01-03T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-01-03:/diary-2026-01-03</id><summary type="html">&lt;p class="first last"&gt;Step 1: Stuff happens. Step 2: ??? Step 3: Progress&lt;/p&gt;
</summary><content type="html">&lt;p&gt;We traveled a bunch today, and are wiped out.
I didn't work on anything, though I did check over exactly how much of Conlang Year I plan to skip.
I identified some stuff that I'd tried to avoid, but actually there wasn't really a point.
I could plan to do that tomorrow, or...&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Yeah, I can basically just do it.&lt;/p&gt;
&lt;p&gt;Although, I'm really tempted to mess around with the sound changes until a lot of what I did is just invalidated.&lt;/p&gt;
&lt;p&gt;Well, I'll try to hold off until tomorrow.
Right now, it's late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="Conlang Year"></category></entry><entry><title>Coding 2026-01-02</title><link href="https://mwchase.neocities.org/coding-2026-01-02" rel="alternate"></link><published>2026-01-02T05:00:00-05:00</published><updated>2026-01-02T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-01-02:/coding-2026-01-02</id><summary type="html">&lt;p class="first last"&gt;Shifting gears, but trying not to shift all the way out? This metaphor got overextended pretty much immediately.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay.
I kind of slacked on Conlang Year today because I already did the prompt.
Probably to get caught up on work put in, I should come up with a bunch of example sentences so I can lexicalize stuff.&lt;/p&gt;
&lt;p&gt;But for now, I mostly focused on Impliciula.
I documented the classes I added yesterday, so that's all set, and now I just need to dig myself out of the hole I just finished digging, coverage-wise.
I'm planning ahead some for testing existential types.
This will need yet another new set of nodes that I didn't realize I was going to need so soon, this time based around record types.&lt;/p&gt;
&lt;p&gt;Record types have been a bit of a bother to me, because I didn't quite understand why they have to be computations in CBPV, but simultaneously my implementation of CBPV plus bidirectional typing is pushing them to be computations for what can't be the same reasons.
My main concern with this, beyond, &amp;quot;I don't get it&amp;quot; is that I'm not sure what the representations of these things will look like, but potentially this is all just a matter of giving thunks a variety of representations, depending on what type they contain.&lt;/p&gt;
&lt;p&gt;Anyway, especially after last night, I really need to get some sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Conlang Year"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2026-01-01</title><link href="https://mwchase.neocities.org/coding-2026-01-01" rel="alternate"></link><published>2026-01-01T05:00:00-05:00</published><updated>2026-01-01T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2026-01-01:/coding-2026-01-01</id><summary type="html">&lt;p class="first last"&gt;For once, I'm posting this on the same day it says on the post. Not a good feeling.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I mostly just thought about stuff for Conlang Year, in an effort not to rush things.
So, what I was doing just now was fixing up the names in the syntax nodes for Impliciula, then I deliberately tanked my coverage numbers (at least to some degree) by implementing a draft of type operator support, even though I don't feel like writing the tests yet.
I do not feel 100% confident that I got everything right, but it must be pretty close.&lt;/p&gt;
&lt;p&gt;I need to get to bed soon, but I want to dash out some quick thoughts first.
I was mostly working with existential types today, and in order to test them, I'm going to need record types.
I'm going to need to check over some of the articles I'm basing this system off of, to see if there are any subtleties I should be aware of.
I need to check my sources to see if I have the string representations right.
Order of testing is, shore up any coverage not related to existentials or operators, implement record types and anything else I decide I need, write tests for existentials, write tests (and documentation) for operators, get coverage up, then do whatever tidying-up occurs to me, and work on the next layer up, which I have written in a notebook somewhere.&lt;/p&gt;
&lt;p&gt;Anyway, time is passing at a terrifying rate as I write this, so I'm going to stop now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Conlang Year"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Diary 2025-12-31</title><link href="https://mwchase.neocities.org/diary-2025-12-31" rel="alternate"></link><published>2025-12-31T05:00:00-05:00</published><updated>2025-12-31T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-12-31:/diary-2025-12-31</id><summary type="html">&lt;p class="first last"&gt;Maybe I'll end up doing all this in close to a year after all...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did Conlang Year stuff, and then took a break by looking at stuff for Impliciula, without actually touching the code.
Looking at the entry previews for the next week, um, I might have accidentally done a bunch of this already?
So, I'll try to get &lt;em&gt;something&lt;/em&gt; for Conlang Year done tomorrow, but I might end up skipping ahead.
Also, fixing attribute names in Impliciula.
Anyway, it's late again, so let's wrap things up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="Conlang Year"></category></entry><entry><title>Weekly Roundup 2025-12-30</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-12-30" rel="alternate"></link><published>2025-12-30T05:00:00-05:00</published><updated>2025-12-30T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-12-30:/weekly-roundup-2025-12-30</id><summary type="html">&lt;p class="first last"&gt;Finally back at it.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I got basically back in the saddle.&lt;/li&gt;
&lt;li&gt;Thursday: I made unimpressive but definite progress.&lt;/li&gt;
&lt;li&gt;Friday: I did a few days at once because I got tired of mixing up noun class and noun case.&lt;/li&gt;
&lt;li&gt;Saturday: I got going later than I'd like, so things were a bit rushed.&lt;/li&gt;
&lt;li&gt;Sunday: I fell agould of the fact that this project is kind of an enge-lang awkwardly disguised as an art-lang, so many things that you'd &lt;em&gt;think&lt;/em&gt; would be prepositions are actually verbs, or at least, they will be.&lt;/li&gt;
&lt;li&gt;Monday: I got basically caught up.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to stay on pace and avoid further overcomplicating things.
Maybe toss in some other projects.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Conlang Year"></category></entry><entry><title>Diary 2025-12-29</title><link href="https://mwchase.neocities.org/diary-2025-12-29" rel="alternate"></link><published>2025-12-29T05:00:00-05:00</published><updated>2025-12-29T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-12-29:/diary-2025-12-29</id><summary type="html">&lt;p class="first last"&gt;I did stuff, but I didn't really have anything to say about it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay.
Okay.&lt;/p&gt;
&lt;p&gt;I've put together a list of adposition and adposition-adjacent words to form, as well as planned roots for &lt;em&gt;most&lt;/em&gt; of them, aside from all of the verbs.
There's more work to be done, but there's also sleep to be slept, and so the balance tips towards &amp;quot;wrap it up ASAP and get to bed&amp;quot;.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="Conlang Year"></category></entry><entry><title>Diary 2025-12-28</title><link href="https://mwchase.neocities.org/diary-2025-12-28" rel="alternate"></link><published>2025-12-28T05:00:00-05:00</published><updated>2025-12-28T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-12-28:/diary-2025-12-28</id><summary type="html">&lt;p class="first last"&gt;This prompt must be so much nicer when you're not deliberately turning a dial all the way to one side.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I'm trying to figure out what prepositions I want.
A complication here is that a lot of obvious choices, I actually want to express with relative clauses or something like that.
The eng-lang side of this conlang is showing a bit.
While there are a few prepositions I've admitted I need, my notes now have a bunch of places where I decide that some concept &amp;quot;goes in the locative hole&amp;quot;.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;All right, I've decided that there are a few more candidates for prepositions, but I'm not done considering things, so I'm going to have to try to finish this up tomorrow, then do the next prompt.
It's later than I realized, better get things together.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="Conlang Year"></category></entry><entry><title>Diary 2025-12-27</title><link href="https://mwchase.neocities.org/diary-2025-12-27" rel="alternate"></link><published>2025-12-27T05:00:00-05:00</published><updated>2025-12-27T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-12-27:/diary-2025-12-27</id><summary type="html">&lt;p class="first last"&gt;It turns out I can't get much done if I just sit around all day...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I cleaned up the dictionary mostly, and what's left needs me to add some capabilities to the code.
To keep the momentum going, I'm going to try to cover adpositions tomorrow.&lt;/p&gt;
&lt;p&gt;I did think about it a bit more, and now I'm unsure whether one of the adpositions I have in mind is actually a preposition, or actually an article, or perhaps one of the articles is actually a preposition.
I think I can defend the distinctions I'm currently drawing, but the sentences I'm coming up with for that defense are... odd.&lt;/p&gt;
&lt;p&gt;Anyway, I don't want to stay up super late, again, so I'm going to wrap this up now, even though I didn't really post anything.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="Conlang Year"></category></entry><entry><title>Diary 2025-12-26</title><link href="https://mwchase.neocities.org/diary-2025-12-26" rel="alternate"></link><published>2025-12-26T05:00:00-05:00</published><updated>2025-12-26T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-12-26:/diary-2025-12-26</id><summary type="html">&lt;p class="first last"&gt;So there are a few bumps in the road...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I realized today that I was doing multi-part prompts out of order &lt;em&gt;again&lt;/em&gt;, so I did a bunch of prompts to my satisfaction just so I wouldn't be bothered by that for too long.
What I need to do next is to review all of my lexicon entries and ponder how I want to present them.
I've kind of cheated my way around a bunch of dictionary-related questions by avoiding thinking about presentation for now.
I'm not planning to lock down presentation or actually implement it, but I've got enough data in here that it would behoove me to have some idea of how I want to portray it.&lt;/p&gt;
&lt;p&gt;Anyway, let's see what I should consider, providing I turn on my laptop early enough tomorrow.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Fix short glosses: replace spaces with dashes, and generally move nuance into the long gloss&lt;/li&gt;
&lt;li&gt;Furthermore, some short glosses are in need of correction.
The demonstratives aren't marked as demonstratives, the locative copula isn't defined as the locative copula, and I haven't figured out what to call one of the pronouns, so the current gloss is just pretty wrong...&lt;/li&gt;
&lt;li&gt;I want to mark many nouns with a preferred measure word.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That last one, it probably makes sense to mark them after the measure words exist, which means I need to figure out how to do more sophisticated semantic drift operations.&lt;/p&gt;
&lt;p&gt;I really don't want to be awake too much longer, so I'm going to wrap this up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="Conlang Year"></category></entry><entry><title>Diary 2025-12-25</title><link href="https://mwchase.neocities.org/diary-2025-12-25" rel="alternate"></link><published>2025-12-25T05:00:00-05:00</published><updated>2025-12-25T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-12-25:/diary-2025-12-25</id><summary type="html">&lt;p class="first last"&gt;Still back at it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I took things a little easy and somewhat skimped on the prompt for today, but I did do it.&lt;/p&gt;
&lt;p&gt;I tried reading my example sentences out loud, which...&lt;/p&gt;
&lt;p&gt;I'm still the best person at speaking this language.
That's how this &lt;em&gt;works&lt;/em&gt;.
But hoo boy.&lt;/p&gt;
&lt;p&gt;Anyway, I want to wrap things up, because I think that will be better for me than obsessing over getting things just right.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="Conlang Year"></category></entry><entry><title>Coding 2025-12-24</title><link href="https://mwchase.neocities.org/coding-2025-12-24" rel="alternate"></link><published>2025-12-24T05:00:00-05:00</published><updated>2025-12-24T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-12-24:/coding-2025-12-24</id><summary type="html">&lt;p class="first last"&gt;Okay, I'm pretty much back at it, finally.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;When I was trying to squeeze in work on the conlang workflow around writing the roundup (it end up going the other way around), I knew I was working with untested draft code, so I was ready for anything.
Except for nothing.
There were an astonishing number of ways for my code to simply fail to have an effect, from applying the wrong drift lexicon, to using the wrong metadata, to failing to update metadata.&lt;/p&gt;
&lt;p&gt;Now that I've gotten through many issues (and I'm skeptical that I got all of them), the main thing I'm aware of is that the current design is super slow.
Basically, right now it fires up a separate sound change process for each noun, which means that there's a slowdown of at least an order of magnitude.
I can claw this back to almost the current speed using some kind of pooling mechanism, but this seems like scaling will overwhelm it.
I think the &amp;quot;right&amp;quot; solution is to figure out a reversible way to intersperse the morphologically derived sounds in with the base sounds, in such a way that the structure can be recovered following the sound change.
This could be done by putting the root pronunciations first, then traversing the children, and then using a custom iterator instead of &lt;tt class="docutils literal"&gt;zip&lt;/tt&gt;.
Let's see if I can throw this together quickly.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, I didn't &lt;em&gt;time&lt;/em&gt; it, but I remember it being much worse last night, and also the code is mostly clearer now, so let's move on.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, after a bunch of back-and-forth with Brassica, I've gotten sound changes that do &lt;em&gt;something&lt;/em&gt;.
Not quite enough for my taste, but I need to take a break from it for a bit.
So, let's try to remember where I was with the prompts.&lt;/p&gt;
&lt;p&gt;Ah, I was on day 52, and I was kind of laser-focused on the case stuff, which means that there's other stuff that I'm sort of behind on.
I'll have something workable to start with if I can fill out all of the roots I still need.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, the roots are filled out, but I forget what to do for the derivations.
I'm going to let this sit for a while tonight.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;All right, let's take a look at the current state of things.
I know that I'm deriving these different words from nouns, and I want to perform the derivations before the declensions, but after fusion.
With the current (dire) state of things, that means that I want to run a &amp;quot;particle filter&amp;quot; drift lexicon on &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;eagle-lexicon-combined.toml&lt;/span&gt;&lt;/tt&gt;, along with some form of erosion, creating &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;eagle-lexicon-particles.toml&lt;/span&gt;&lt;/tt&gt;, then include that into &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;eagle-lexicon-combined.toml&lt;/span&gt;&lt;/tt&gt; to create &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;eagle-lexicon-with-particles.toml&lt;/span&gt;&lt;/tt&gt;, which should be used as an argument where &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;eagle-lexicon-combined.toml&lt;/span&gt;&lt;/tt&gt; currently is.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;All right, I slapped on a low-effort word change, and it mostly worked, but I uncovered some more breakage in the existing sound changes, so now I have to fix that.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;All right, that's enough &amp;quot;all right&amp;quot;.
I patched up the sound change stuff, and there's more work to be done, but I'm well enough through day 52.
I peeked ahead to day 53, and I can do that tomorrow, except that the noun inflections are a little unpredictable, which was kind of the point, but it makes writing up the specific declensions hard.&lt;/p&gt;
&lt;p&gt;Anyway, I want to wrap this up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Conlang Year"></category></entry><entry><title>Weekly Roundup 2025-12-23</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-12-23" rel="alternate"></link><published>2025-12-23T05:00:00-05:00</published><updated>2025-12-23T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-12-23:/weekly-roundup-2025-12-23</id><summary type="html">&lt;p class="first last"&gt;The code's a disaster, but it (probably?) all works now.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I had a mix of solid and weird ideas.&lt;/li&gt;
&lt;li&gt;Thursday: I noticed that the stuff I'm trying to do requires &lt;em&gt;even more&lt;/em&gt; new code to be written.&lt;/li&gt;
&lt;li&gt;Friday: I updated the data format to accomodate my ideas. &lt;em&gt;Technically&lt;/em&gt; nothing should have changed, but it does serialize differently.&lt;/li&gt;
&lt;li&gt;Saturday: I didn't feel like touching code, but I was okay doing a little planning.&lt;/li&gt;
&lt;li&gt;Sunday: I started putting one of those ideas into effect, that of dividing the sound changes into named eras.&lt;/li&gt;
&lt;li&gt;Monday: I poked at the era stuff a bit more, and planned out the files I need to handle case endings.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, after spending an embarrassing amount of time getting the tech side of this working, I'm almost ready to get back to the prompts.
I just need to come up with some sound changes to cut down on how unwieldy the case endings currently are.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Conlang Year"></category></entry><entry><title>Coding 2025-12-22</title><link href="https://mwchase.neocities.org/coding-2025-12-22" rel="alternate"></link><published>2025-12-22T05:00:00-05:00</published><updated>2025-12-22T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-12-22:/coding-2025-12-22</id><summary type="html">&lt;p class="first last"&gt;Hopefully I'll be back on the prompts before the new year...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Once again, I mostly took things easy today, trying out a bunch of games from my backlog, but I did get the &amp;quot;era&amp;quot; divisions a little more done.
Just a little.
I don't feel like doing the rest of the changes right now, so I'm just going to reflect on what I know remains, and see whether I think it'd be enough.&lt;/p&gt;
&lt;p&gt;Hm.
Fundamentally, what's missing, and what I'm hoping the eras provide a baseline for, is a regular system for naming the different lexicons, rules, and input data files.
&amp;quot;Just make everything into a monolithic script&amp;quot; sidesteps this by having one unique file per era.&lt;/p&gt;
&lt;p&gt;But nothing is striking me as a satisfying solution to this yet, so let's just plan out the next steps in actually getting back to the prompts.&lt;/p&gt;
&lt;p&gt;I need additional lexicons between &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;eagle-lexicon-combined.toml&lt;/span&gt;&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;jackal-lexicon.toml&lt;/span&gt;&lt;/tt&gt;.
This is done by evolving &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;eagle-lexicon-combined.toml&lt;/span&gt;&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;eagle-lexicon-cases.toml&lt;/span&gt;&lt;/tt&gt;, via a set of sound changes that either shorten the roots, or do nothing at all, but filtering with &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;eagle-case-filter.toml&lt;/span&gt;&lt;/tt&gt;, which remaps the source roots to case markings, and I just realized that the paradigm implementation isn't fully ready yet, insofar as &amp;quot;how do you take stuff that already has a paradigm as input?&amp;quot;
Possibly the answer involves making drift stronger so it can &amp;quot;pick out&amp;quot; specific affixed forms.
Anyway, then &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;eagle-lexicon-combined.toml&lt;/span&gt;&lt;/tt&gt; has to be updated to &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;eagle-lexicon-declension-initial.toml&lt;/span&gt;&lt;/tt&gt; using &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;eagle-lexicon-cases.toml&lt;/span&gt;&lt;/tt&gt;, then updated to &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;eagle-lexicon-grammaticalized.toml&lt;/span&gt;&lt;/tt&gt; via &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;eagle-grammaticalize.bsc&lt;/span&gt;&lt;/tt&gt;.
This is the new input to forming the beginning of the jackal era.&lt;/p&gt;
&lt;p&gt;Since I don't even feel the urge to finish putting the rest of the stuff that I have into the era folders, clearly I need to put in more until it gets obnoxious enough for me to decide on a plan of action.&lt;/p&gt;
&lt;p&gt;Not happening tonight, though, and tomorrow is a bit busy.
I should wrap up quickly, for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Conlang Year"></category><category term="short post"></category></entry><entry><title>Coding 2025-12-21</title><link href="https://mwchase.neocities.org/coding-2025-12-21" rel="alternate"></link><published>2025-12-21T05:00:00-05:00</published><updated>2025-12-21T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-12-21:/coding-2025-12-21</id><summary type="html">&lt;p class="first last"&gt;I may not be doing the prompts, but at least I'm setting goals and working towards them.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't have much time to work on stuff today, but I was able to start doing the era naming, and splitting up sound changes.
Splitting up the sound changes was nice, because it meant I got to delete a bunch of categories (... after duplicating everything).
I just created the era folders; once I have the sound changes split up and the era-specific data all moved to its own folders, I can try to organize things better, and see if I have any ideas for improving the build pipeline.
One thing I'm wondering about is getting more structure under the build directory; I might need to improve the command-line argument handling to make that feasible.&lt;/p&gt;
&lt;p&gt;However, I should be focused on getting back to the prompts.
What's in the way of that?
Well, I feel bad about adding files to an undifferentiated mass, like a big junk drawer.
So, I should re-evaluate my feelings on this, once the eras have everything divided into several &lt;em&gt;little&lt;/em&gt; junk drawers.&lt;/p&gt;
&lt;p&gt;Anyway, it's late and I'm tired.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Conlang Year"></category><category term="short post"></category></entry><entry><title>Diary 2025-12-20</title><link href="https://mwchase.neocities.org/diary-2025-12-20" rel="alternate"></link><published>2025-12-20T05:00:00-05:00</published><updated>2025-12-20T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-12-20:/diary-2025-12-20</id><summary type="html">&lt;p class="first last"&gt;More. I need to zone out... more.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;This week was rough, so I'm just going to take things easy.&lt;/p&gt;
&lt;p&gt;As far as getting back to the conlang prompts goes, I don't have the repair strategies for forming the case endings ready, and before thinking about it, I want to figure out what to do to clean up the build process.&lt;/p&gt;
&lt;p&gt;The two options I have in mind currently are to do the &amp;quot;eras&amp;quot; split like I've been planning, and to then consolidate all of the behavior and data flow into a single &amp;quot;era&amp;quot; script per era, which only works with lexicons.
The other option is to try to organize the source files and the intermediate files so that the relationships between them are clearer.&lt;/p&gt;
&lt;p&gt;The unfortunate conclusion is that, no matter what I do, the first step is the same, so there's no reason not to do it except that I don't &lt;em&gt;feel&lt;/em&gt; like putting in the work.&lt;/p&gt;
&lt;p&gt;I'd rather take things easy right now and try to get things together tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="Conlang Year"></category></entry><entry><title>Coding 2025-12-19</title><link href="https://mwchase.neocities.org/coding-2025-12-19" rel="alternate"></link><published>2025-12-19T05:00:00-05:00</published><updated>2025-12-19T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-12-19:/coding-2025-12-19</id><summary type="html">&lt;p class="first last"&gt;I guess all of the blank lines these changes added to the data files are load-bearing?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I've got a bit of time tonight, let's see what I can make of it.
The big issue right now is that I have a lot of code that's making assumptions about the in-memory representation of the lexicon, and that's going to need to change.
Currently, the values in the mapping are tuples of frozensets of pronuciations, and &amp;quot;metadata&amp;quot; objects.
Now, thinking about this, I may actually be able to avoid thinking about this, because the children certainly seem to be part of the metadata.
If there's metadata, there can be children, and covice coversa.&lt;/p&gt;
&lt;p&gt;Currently, the children mapping goes from gloss extensions to pronunciation sets, but just to make sure I've future-proofed this, let's look ahead.
In the event that a derivation creates &amp;quot;sort of a new word&amp;quot;, then the choice of type &lt;em&gt;consistent&lt;/em&gt; with current usage would be... a tuple of pronunciation sets and metadata.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, I've updated metadata serialization and deserialization, and now that part of it should just work.
Now I need to get the paradigm code working, because I've just thrown a big ol' wrench in all of that.
...
To be fair, I just realized this code was sort of buggy anyway.
Really buggy, actually.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;All right, I've updated the code.
I believe it works now, but I believed that before, and I was clearly wrong, so I'm going to wrap things up for tonight, and make sure I'm well-rested when I have to debug this nonsense.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Conlang Year"></category></entry><entry><title>Coding 2025-12-18</title><link href="https://mwchase.neocities.org/coding-2025-12-18" rel="alternate"></link><published>2025-12-18T05:00:00-05:00</published><updated>2025-12-18T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-12-18:/coding-2025-12-18</id><summary type="html">&lt;p class="first last"&gt;These half-baked ideas are entirely orthogonal to yesterday's half-baked ideas.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Oh boy.
After I published the last entry, I realized there's way more that I'm doing wrong.
In particular, currently I have a separate lexicon entry for each specific gloss.
And I'm applying semantic drift, which changes the glosses.
Which is going to get &lt;em&gt;extremely messy&lt;/em&gt; once I start generating declensions.
I'm not going to make four or five versions of every word in the drift lexicon.&lt;/p&gt;
&lt;p&gt;The way that I think makes sense to deal with this is to create a trie-like structure representing derivational morphology.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Given an uninflected gloss, you have the pronunciations, the long gloss, the part of speech, and the tags.&lt;/li&gt;
&lt;li&gt;Additionally, you have a map of gloss inflections; these can minimally just contain pronunciations.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;However&lt;/em&gt;, if we have a derivation that makes it &amp;quot;sort of a new word&amp;quot;, then under that inflection, we have the pronunciations, the long gloss (important for clearing up subtleties in the derivation), the part of speech, and the tags, as well as the appropriate derivations for that part of speech.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One obvious question is where to stop, and I think that has to be decided on a case-by-case basis.
If a particular derivation is not used much, then it can be omitted from the lexicon proper, and derived via regular processes when needed.
One of the processes needed here is to &amp;quot;re-parent&amp;quot; a sub-trie to the top level, if the derived form takes on an independent identity.
Thinking about the right way to use these capabilities, my sense is that even one extra level of nesting should be used sparingly, but I'll have an idea of when it's needed.
At the same time, the prompts aren't &lt;em&gt;covering&lt;/em&gt; these kinds of derivations yet, so it may be a sensible use of my time to only implement enough to handle declension and conjugation.
Although, I would like to make sure that I don't somehow make it hard to implement.&lt;/p&gt;
&lt;p&gt;Fundamentally what we have here is a structure of nodes and leaves, where nodes and leaves contain data, but different data types.
For serializing the data, we can have a field specifically for containing the children, which maps representations of inflections to the required data.
I can implement a simple object layout that serializes identically to the more advanced possibilities.
So, I've got a plan.
What I don't have is any more time tonight.
I'm going to wind down now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Conlang Year"></category></entry><entry><title>Coding 2025-12-17</title><link href="https://mwchase.neocities.org/coding-2025-12-17" rel="alternate"></link><published>2025-12-17T05:00:00-05:00</published><updated>2025-12-17T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-12-17:/coding-2025-12-17</id><summary type="html">&lt;p class="first last"&gt;I can't create man-made horrors beyond my comprehension! How would I maintain them?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, so.
I was playing user-created level packs for Gentoo Rescue.
So I didn't actually get anything done here.
Let's quickly catch up on the state of things.&lt;/p&gt;
&lt;p&gt;I've come up with the idea of dividing the linguistic evolution into &amp;quot;eras&amp;quot;, and my sense is that it would make it easier on me if there were some kind of shorthand way to represent them, and my idea there is inspired by reading about BASIC as a child, but using words instead of numbers.
So I could have eras like &amp;quot;eagle, jackal, orangutan, tapir&amp;quot;, and then I can slot in more between them in alphabetical order if I need to.
I don't know why I made them animal-themed.
Anyway, each era would contain various folders, and I think if I'm going to have a good time here, I need to figure out how to make the file structure totally regular and consistent, because my gut says I'll have a terrible time if I try to generate my build file based on the shape of the directory tree.&lt;/p&gt;
&lt;p&gt;Perhaps the dynamic structure needs to live in the data files themselves?
This would represent two things: yet another rearchitecture, and specifically storing the sound changes in TOML, which is somehow less cursed than it sounds, but only a little.&lt;/p&gt;
&lt;p&gt;Right now, I'm pondering the idea of writing a stack-based language that reads commands in the form of a TOML array, and that sounds cursed enough that I definitely need to take some time to think about this, rather than rush to prototype.
I guess one question is whether I can just take my existing Python code and call it from scripts as a module.
That shouldn't be too much worse to use, and it's less bad to implement, I think.&lt;/p&gt;
&lt;p&gt;Definitely don't rush to implement, but do rush to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Conlang Year"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-12-16</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-12-16" rel="alternate"></link><published>2025-12-16T05:00:00-05:00</published><updated>2025-12-16T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-12-16:/weekly-roundup-2025-12-16</id><summary type="html">&lt;p class="first last"&gt;Shambling through the implementation.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I made some progress on conlang tooling.&lt;/li&gt;
&lt;li&gt;Thursday: I tried to make some progress, but eh.&lt;/li&gt;
&lt;li&gt;Friday: I worked out more of the code, and presumably wrote something, based on the category I put it in.&lt;/li&gt;
&lt;li&gt;Saturday: I worked out the broad strokes of how I plan to do sound changes with affixes, and therefore got some idea of how to implement the relevant commands.&lt;/li&gt;
&lt;li&gt;Sunday: I figured out exactly the command implementation I want, so, like, why not write the code?&lt;/li&gt;
&lt;li&gt;Monday: My build system code is bad, so I really want to fix it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, we'll see what I manage.
I'm so tired right now, and it's not even dinnertime yet, so this week is already off to quite a start.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Conlang Year"></category></entry><entry><title>Coding 2025-12-15</title><link href="https://mwchase.neocities.org/coding-2025-12-15" rel="alternate"></link><published>2025-12-15T05:00:00-05:00</published><updated>2025-12-15T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-12-15:/coding-2025-12-15</id><summary type="html">&lt;p class="first last"&gt;I think my build system workflow shouldn't be creating file names that look like the fifth final revision of a presentation.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I just quickly typed out build rule generators for paradigm calls, and now I'm staring at the existing rules like, okay, I &lt;em&gt;have&lt;/em&gt; to come up with more structure for this, my filenames are just nonsense.&lt;/p&gt;
&lt;p&gt;If I were to push ahead with this, I would need to filter and rename from &lt;tt class="docutils literal"&gt;build/proto lexicon fused final.toml&lt;/tt&gt;, and then use the resulting affix lexicon to create an &amp;quot;initial&amp;quot; lexicon file, then apply a new set of sound changes to create the &amp;quot;final&amp;quot; lexicon file.
When I work on aspect markers, that's just another paradigm step; it can just go before or after setting up the case markers, and then everything can get sound changed.&lt;/p&gt;
&lt;p&gt;Now, while I'm planning ahead, one of the other things I want to support is converting nouns to prepositions.
This is done via change + drift + filter, then loan back in.&lt;/p&gt;
&lt;p&gt;It's late, so I don't want to touch the code any more tonight, and I need to sketch out some potential directory structures, because I'm having trouble developing the ideas entirely in my head.&lt;/p&gt;
&lt;p&gt;For now, got to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Conlang Year"></category><category term="short post"></category></entry><entry><title>Coding 2025-12-14</title><link href="https://mwchase.neocities.org/coding-2025-12-14" rel="alternate"></link><published>2025-12-14T05:00:00-05:00</published><updated>2025-12-14T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-12-14:/coding-2025-12-14</id><summary type="html">&lt;p class="first last"&gt;Proceeding by not knowing when to quit. (It is so late at night.)&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I'm writing late again, so let's see if I can bang something out quickly.&lt;/p&gt;
&lt;p&gt;My hope is to get something for this paradigm stuff, and I want to avoid thinking too hard about what features I could possibly have for it, so let's look at the immediate stuff.
I think it's reasonable to call case and aspect markers a part of speech, so the combination here boils down to selecting two parts of speech.
Like, a noun and a case marking.
I'd been thinking of doing this with multiple lexicons, but now that I'm thinking about it, I'm a little unsure how this should look.
There's a main lexicon that gets updated, and any number of auxiliary lexicons to add more stuff, and selectors, which right now are any part of speech.
If I &lt;em&gt;do&lt;/em&gt; add them right back into the output lexicon along with everything else, then I just need to make sure that any post-processing only operates on the word boundaries.
Adding them back does make sense, because in some cases, the original root will be removed.&lt;/p&gt;
&lt;p&gt;Okay, in talking this out, and thinking some about other things, I've put together a formidable set of command-line options.
Let's see how to use them together.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The input and auxiliary lexicons are scanned for instances of the &lt;tt class="docutils literal"&gt;affix&lt;/tt&gt; part of speech, resulting in a lexicon containing a single part of speech.&lt;/li&gt;
&lt;li&gt;Each gloss is validated to either start or end with a hyphen.&lt;/li&gt;
&lt;li&gt;A method is called on the input lexicon, with arguments of the affix lexicon, the root part of speech, and whether to remove the matching roots.&lt;/li&gt;
&lt;li&gt;The resulting lexicon is written to file.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I think I see how to wrangle this, the question is, do I feel like doing that right now?
Not... really.
Well, I'll see about filtering and validating.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, the validating is kind of overly clever, but I can just print the entire lexicon if something goes wrong, so I'm safe to just do the stuff I'm doing.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;All right, I got carried away and coded the whole thing, really jankily.
It's probably embarrassingly broken, but instead of thinking about that or trying it out, I'm going to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Conlang Year"></category></entry><entry><title>Diary 2025-12-13</title><link href="https://mwchase.neocities.org/diary-2025-12-13" rel="alternate"></link><published>2025-12-13T05:00:00-05:00</published><updated>2025-12-13T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-12-13:/diary-2025-12-13</id><summary type="html">&lt;p class="first last"&gt;So tired. &lt;em&gt;So&lt;/em&gt; tired.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hoo boy.&lt;/p&gt;
&lt;p&gt;Rough end to a rough week.
I didn't touch any code or other text, so I'm just going to jot down some thoughts on what I want to do next.&lt;/p&gt;
&lt;p&gt;I'm trying to figure out the right way for me to handle affixes.
In writing erosion rules for compound words, I tried to spread the deletions out evenly, but my impression for affixes is that I want the root to not be too changed.
So, like, assimilation rather than deletion, but the affix is fine to reduce, as long as different affixes still contrast.
Now, one of the wrinkles here is that I want some of the aspect markers to be prefixes, and some of them to be suffixes.
I think it seems brittle and unpleasant to construct and simplify two related sets of affixes in parallel like this, so I think what I want to do when generating affixed forms is to, at the word boundaries, mark the affix vs the root.
There's a section in the Brassica documentation on how to do stuff like this; it seems pretty simple.
With that marking in place, I can restrict changes to apply to only the end of a prefix or the beginning of a suffix, or whatever.&lt;/p&gt;
&lt;p&gt;I'll see if I still believe this in the morning.
For now, I'd better wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="Conlang Year"></category></entry><entry><title>Coding 2025-12-12</title><link href="https://mwchase.neocities.org/coding-2025-12-12" rel="alternate"></link><published>2025-12-12T05:00:00-05:00</published><updated>2025-12-12T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-12-12:/coding-2025-12-12</id><summary type="html">&lt;p class="first last"&gt;See, when I make a horrible mess in the code, it's usually not a &lt;em&gt;surprise&lt;/em&gt; to me later.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I've got a weird and tangled mess of files that produce adequate pronouns.
And maybe I'm going to put an animacy distinction in the pronouns?
I kind of don't want to...&lt;/p&gt;
&lt;p&gt;Anyway, that produces most of the &lt;em&gt;data&lt;/em&gt; that I need to create case endings, but I don't have any of the code.
I kind of want to force all of this into being, both so I can see the case endings in practice, and also so I have an idea of the full scope of Things That Will Be Going On In Code, because wow it just keeps getting messier.
And if I have the machinery around for creating case markings, that should give me enough information about how it needs to be possible to lay stuff out.&lt;/p&gt;
&lt;p&gt;For now, though, I'm going to accumulate tech debt, and then try to balance dealing with it, with Actually Doing The Prompts Again.&lt;/p&gt;
&lt;p&gt;For now, I need to get ready for bed, and get one day closer to dealing with this awful week.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Conlang Year"></category><category term="short post"></category></entry><entry><title>Diary 2025-12-11</title><link href="https://mwchase.neocities.org/diary-2025-12-11" rel="alternate"></link><published>2025-12-11T05:00:00-05:00</published><updated>2025-12-11T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-12-11:/diary-2025-12-11</id><summary type="html">&lt;p class="first last"&gt;Moving slowly.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Ugh.&lt;/p&gt;
&lt;p&gt;Not a productive day today.
I can see exactly the steps I need to polish the pronouns in the proto-language, and I'm currently running on zero inspiration for the sound changes.
Like, all I've got is &amp;quot;better delete stuff&amp;quot;.
I think I'm going to need to take some time (which I currently don't have) to just say these words over and over and figure out what kinds of changes I want.&lt;/p&gt;
&lt;p&gt;(I mean, with just three words, I &lt;em&gt;could&lt;/em&gt; just specify new pronunciations by fiat, but I'm going to want something very like these changes to form the case markers, so it's vaguely justifiable to try to get some general principles.)&lt;/p&gt;
&lt;p&gt;Anyway, spaced out too much, sleep now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="Conlang Year"></category></entry><entry><title>Coding 2025-12-10</title><link href="https://mwchase.neocities.org/coding-2025-12-10" rel="alternate"></link><published>2025-12-10T05:00:00-05:00</published><updated>2025-12-10T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-12-10:/coding-2025-12-10</id><summary type="html">&lt;p class="first last"&gt;Soon™&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, let's see where I am.
I've got a bunch of compound roots that I need to fill in, grammaticalization to do, and some disappointing stuff so far.
Let's try tweaking a root just to make stuff happen...&lt;/p&gt;
&lt;p&gt;Okay, I got a little irregularity from a tiny tweak.
Let's avoid iterating on that for now, and focus on the fundamentals.
I need to form some of these roots, even if my plan is to immediately subject them to grammaticalization.
All right, here's the sequence:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Form personal pronouns, and shorten them&lt;/li&gt;
&lt;li&gt;Now, select out the roots for affixes, and create new glosses with shortened versions of them.&lt;/li&gt;
&lt;li&gt;Now, implement procedural combination&lt;/li&gt;
&lt;li&gt;That produced two-word entries, fuse them&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are some problems here that need to be addressed, and I haven't decided what's the best way to handle them.
Basically, right now, compounding roots (which is how the pronouns are formed) &amp;quot;have to&amp;quot; go back in the full lexicon, so to apply changes exclusively to them, I need to either remove them from the lexicon, or allow overwriting...
I think I prefer overwriting.&lt;/p&gt;
&lt;p&gt;All right, I've got a plan, and I've got code.
I don't have the sound changes.
I'm going to try to take things easy, and wrap up for today.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Conlang Year"></category></entry><entry><title>Weekly Roundup 2025-12-09</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-12-09" rel="alternate"></link><published>2025-12-09T05:00:00-05:00</published><updated>2025-12-09T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-12-09:/weekly-roundup-2025-12-09</id><summary type="html">&lt;p class="first last"&gt;At this point, it's probably going to take longer than a year, but whatever.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I collated some information for conlanging.&lt;/li&gt;
&lt;li&gt;Thursday: I planned the code side of things for what the prompts are asking for.&lt;/li&gt;
&lt;li&gt;Friday: I fixed the data format that I'm storing the lexicons in. Again.&lt;/li&gt;
&lt;li&gt;Saturday: Didn't get much done.&lt;/li&gt;
&lt;li&gt;Sunday: I realized that I'd been doing prompts out of order, but, like, it's fine probably.&lt;/li&gt;
&lt;li&gt;Monday: I stopped touching the prompts in favor of getting my code working.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to finish writing the code that I need right now, then iterate on the lexicon and sound changes a bit.
The results from the code I've got written right now are pretty lackluster, which isn't what I want from the sources for case endings, I don't think.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Conlang Year"></category></entry><entry><title>Coding 2025-12-08</title><link href="https://mwchase.neocities.org/coding-2025-12-08" rel="alternate"></link><published>2025-12-08T05:00:00-05:00</published><updated>2025-12-08T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-12-08:/coding-2025-12-08</id><summary type="html">&lt;p class="first last"&gt;Attempting to stave off burnout by writing barely anything in these posts.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The prompts are paused while I try and shore up my root generation and sound changes.
I've got an initial shot at overhauling the generation, and the sound changes are a little frightening to me.
I think I'll post now, and try to wrangle with it later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Conlang Year"></category><category term="short post"></category></entry><entry><title>Diary 2025-12-07</title><link href="https://mwchase.neocities.org/diary-2025-12-07" rel="alternate"></link><published>2025-12-07T05:00:00-05:00</published><updated>2025-12-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-12-07:/diary-2025-12-07</id><summary type="html">&lt;p class="first last"&gt;I really hope to have something interesting to say soon, but I don't yet.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, so.
I realized today that I got a little confused with some of the prompts, and did stuff out of order.
Since I was so tired today, I'm going to not stress too much, and try to fill out a few words that I haven't settled on yet.
Afterwards, I'll get more done, but I just want to get this entry out of the way so I'm not worried about it.&lt;/p&gt;
&lt;p&gt;The sooner I can wrap things up, the better.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="Conlang Year"></category></entry><entry><title>Diary 2025-12-06</title><link href="https://mwchase.neocities.org/diary-2025-12-06" rel="alternate"></link><published>2025-12-06T05:00:00-05:00</published><updated>2025-12-06T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-12-06:/diary-2025-12-06</id><summary type="html">&lt;p class="first last"&gt;Weird day today. Very skippable.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm at least keeping pace in terms of designating roots, but I do still need to figure out the right format for the various recombinations I have in mind, and to come up with or generate roots.&lt;/p&gt;
&lt;p&gt;Going to go sleep now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="Conlang Year"></category></entry><entry><title>Coding 2025-12-05</title><link href="https://mwchase.neocities.org/coding-2025-12-05" rel="alternate"></link><published>2025-12-05T05:00:00-05:00</published><updated>2025-12-05T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-12-05:/coding-2025-12-05</id><summary type="html">&lt;p class="first last"&gt;I'm hoping this all ends up more streamlined the second time around.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right.
I just finished queueing up more word formation for my future self, so let's look at what I want to do before that.&lt;/p&gt;
&lt;p&gt;Aside from anything else, I'd like to rig up a generator for the simpler phonology I converted things to.&lt;/p&gt;
&lt;p&gt;But also, I've been considering &lt;em&gt;how&lt;/em&gt; I'm processing words at different times, and I think the current data layout is just wrong.
Right now, the primary key is the pronunciation, and the &amp;quot;short gloss&amp;quot; disambiguates below that.
This is something that kind of makes sense in the context of a dictionary, but when I'm doing evolution, and in particular, selecting particular words to combine in various ways, I think the &amp;quot;short gloss&amp;quot; should be the primary code word, for being generally stable across time, except when I explicitly alter it.
The structure for the lexicon is currently a map from pronunciation to a map from &amp;quot;short gloss&amp;quot; to &amp;quot;metadata&amp;quot;.
I think instead, it should be a map from &amp;quot;short gloss&amp;quot; to a pair of pronciation and &amp;quot;metadata&amp;quot;.
Then, the drift structure can &lt;em&gt;entirely ignore&lt;/em&gt; pronunciation, and also make changing the short gloss optional maybe.&lt;/p&gt;
&lt;p&gt;There are two independent strands to this.
On the one hand, the lexicon structure has to be updated, the serialization updated, and the deserialization partially updated, the proto lexicon, regenerated, and then the deserialization updated the rest of the way.
On the other hand, I'm going to have to update the drift file manually.&lt;/p&gt;
&lt;p&gt;The point of all of this is to enable further processing in a more resilient manner than what's currently possible.
I want to be able to filter lexicons by metadata, and write input files that concatenate specific words, as well as take products of lexicons.
Let's focus on making the required changes, first.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;It wasn't as simple as I'd hoped.
One of the things that Brassica does is handle sound changes that can result in multiple pronunciations.
If the short gloss is the primary key, then that means that there could be multiple associated pronunciations.
Now, it appears that Brassica properly handles &lt;em&gt;inputs&lt;/em&gt; with multiple pronunciations, so I don't need any special logic for applying the sound changes, except that I'd like to store the pronunciations separately and concatenate them only to apply sound changes.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;All right, I've got things going, and it seems to all be working.
I'm not going to try to do any more tonight, but here's what I'm missing that should now be easier:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Word formation via compounding&lt;/li&gt;
&lt;li&gt;Paradigm generation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I need to sketch out what the flow for that should look like, but also I can no longer sweep the state of the sund changes file under the rug; it &lt;em&gt;needs&lt;/em&gt; to be cleaned up for anything else to be possible.
(Also, once it's cleaned up, I should try using it as a template for making that other naming language that I want to use to disambiguate sounds that collide.)&lt;/p&gt;
&lt;p&gt;(Also also, there are some checks that I'm simply no longer doing, which I need to find some way to reintroduce.)&lt;/p&gt;
&lt;p&gt;In any case, I'm tired.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Conlang Year"></category></entry><entry><title>Coding 2025-12-04</title><link href="https://mwchase.neocities.org/coding-2025-12-04" rel="alternate"></link><published>2025-12-04T05:00:00-05:00</published><updated>2025-12-04T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-12-04:/coding-2025-12-04</id><summary type="html">&lt;p class="first last"&gt;Banking some tasks against the future...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I am not ready to set up grammaticalization in my pipeline, so I'm going to make sure I have all of the etymologies set up, and try to lay out what needs to happen.&lt;/p&gt;
&lt;p&gt;The missing etymology for cases is a case that I'm calling locative, but it's kind of broader.
I'm not totally happy with any etymology I've come up with yet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;From the future:&lt;/strong&gt; &amp;quot;grassland&amp;quot; would fit reasonably with the metaphor I have for the other cases&lt;/p&gt;
&lt;p&gt;So, for the moment, let's consider how I'm planning to handle erosion of grammatical cases.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Split the sound changes into before and after&lt;/li&gt;
&lt;li&gt;Combine any individual words that will need it into a &amp;quot;combined lexicon&amp;quot;&lt;/li&gt;
&lt;li&gt;Apply a small number of aggressive sound changes to create an &amp;quot;eroded lexicon&amp;quot;&lt;/li&gt;
&lt;li&gt;Combine words from the eroded lexicon with the main lexicon, to create a &amp;quot;grammaticalized lexicon&amp;quot;&lt;/li&gt;
&lt;li&gt;Apply the rest of the sound changes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, that's keeping things going well enough for my taste.
I'm getting tired, so I'll try to wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Conlang Year"></category><category term="short post"></category></entry><entry><title>Coding 2025-12-03</title><link href="https://mwchase.neocities.org/coding-2025-12-03" rel="alternate"></link><published>2025-12-03T05:00:00-05:00</published><updated>2025-12-03T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-12-03:/coding-2025-12-03</id><summary type="html">&lt;p class="first last"&gt;Stumbling before I can walk.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I've collected my notes on various prepositions, suffixes, and other sundry components of noun phrases.
Now, I wasn't doing what I was supposed to, as far as lexical roots, so I've got a bunch of TODOs to fill in, but at least they are all collected in one place, even if I'm absolutely not ready to fill them in right now.&lt;/p&gt;
&lt;p&gt;Aside from that, I'm trying to remember what the heck I was doing with Impliciula.
Unfortunately, I only got as far as wrangling Tox into &lt;em&gt;not breaking&lt;/em&gt;.
I'll try to get somewhere with it tomorrow, or later.&lt;/p&gt;
&lt;p&gt;For now, I have to get some rest.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Conlang Year"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-12-02</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-12-02" rel="alternate"></link><published>2025-12-02T05:00:00-05:00</published><updated>2025-12-02T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-12-02:/weekly-roundup-2025-12-02</id><summary type="html">&lt;p class="first last"&gt;Just got to make stuff that works, and keep making it a little better over time.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I switched the data format of my lexicon files.&lt;/li&gt;
&lt;li&gt;Thursday: I took that new data format, and updated it further.&lt;/li&gt;
&lt;li&gt;Friday: I thought I had everything I needed for representing semantic drift.&lt;/li&gt;
&lt;li&gt;Saturday: I realized I needed to tweak the data format for semantic drift.&lt;/li&gt;
&lt;li&gt;Sunday: So, I updated the code to process the data, but not the data itself.&lt;/li&gt;
&lt;li&gt;Monday: I finally updated the data file.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to see how much I can focus on other, unrelated code, while still following the prompts.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Conlang Year"></category></entry><entry><title>Coding 2025-12-01</title><link href="https://mwchase.neocities.org/coding-2025-12-01" rel="alternate"></link><published>2025-12-01T05:00:00-05:00</published><updated>2025-12-01T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-12-01:/coding-2025-12-01</id><summary type="html">&lt;p class="first last"&gt;It really didn't Just Work, but it wasn't too hard to fix.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I updated the data file, ran the code a few times, tweaked it until it seemed to work, and... I have notes.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The current flow is optimized around tweaking a specific gloss, not around adding or removing glosses.&lt;/li&gt;
&lt;li&gt;I suspect I'm permitting something bizarre around ordering, but I'm just not going to think too hard about that.&lt;/li&gt;
&lt;li&gt;My idea of what constitutes a &amp;quot;short&amp;quot; gloss is suspect.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Probably more things to fix up later, but I got distracted, so I should wrap up now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Conlang Year"></category><category term="short post"></category></entry><entry><title>Coding 2025-11-30</title><link href="https://mwchase.neocities.org/coding-2025-11-30" rel="alternate"></link><published>2025-11-30T05:00:00-05:00</published><updated>2025-11-30T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-11-30:/coding-2025-11-30</id><summary type="html">&lt;p class="first last"&gt;One time in high school, I printed out a paper minutes before it was due. &lt;em&gt;Totally not sure&lt;/em&gt; why I just remembered that.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;It's kind of late again, but I've got this.
I made the minimal changes required to rework the semantic drift deserialization.
Because it's late again, I haven't tested it, or indeed gotten the data file into a state where it can be tested, but hopefully all that's left now is a relatively mechanical process.&lt;/p&gt;
&lt;p&gt;Once I have this working, then I should be following up thus:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Take notes on how I think I'm going to implement grammaticalization.&lt;/li&gt;
&lt;li&gt;Clean up all of the Python code I've written to get this working.&lt;/li&gt;
&lt;li&gt;Figure out how to clean up and divide up the sound changes, so I can have the sound changes look like they weren't written by a bunch of enthusiastic raccoons with a surprising level of linguistic knowledge.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, I'll hopefully get to work on that in a day or two.
For now, bed is calling.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Conlang Year"></category><category term="short post"></category></entry><entry><title>Coding 2025-11-29</title><link href="https://mwchase.neocities.org/coding-2025-11-29" rel="alternate"></link><published>2025-11-29T05:00:00-05:00</published><updated>2025-11-29T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-11-29:/coding-2025-11-29</id><summary type="html">&lt;p class="first last"&gt;Oops.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, it's way too late, I did the brainstorm part of the Conlang Year prompt that I'm currently on, let's hook some stuff up in code so I don't have to recategorize this entry.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Crud.
The act of &lt;em&gt;actually just looking at the data file&lt;/em&gt; revealed that the lazy way of doing things doesn't work here, because it's not accounting for changing the short gloss.
This will need a different data layout, new deserialization, and different runtime logic.
That's not happening in the next fifteen minutes, so I'm cutting my losses for tonight, and hopefully getting this fixed up tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Conlang Year"></category><category term="short post"></category></entry><entry><title>Coding 2025-11-28</title><link href="https://mwchase.neocities.org/coding-2025-11-28" rel="alternate"></link><published>2025-11-28T05:00:00-05:00</published><updated>2025-11-28T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-11-28:/coding-2025-11-28</id><summary type="html">&lt;p class="first last"&gt;Keeping pace, for now.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm awake!
Somehow...&lt;/p&gt;
&lt;p&gt;Anyway, I got some roots chosen for the purposes of grammaticalizing later, but also providing other words.
Now, let's think about the bare minimum functionality required for representing semantic drift.&lt;/p&gt;
&lt;p&gt;First decision I want to lock in: it keys off of the post-sound-change pronunciation, because it makes more sense to me to say &amp;quot;when it's pronounced like this, it means this&amp;quot; than to say &amp;quot;first we change the meaning, then we change the sound&amp;quot;.
Next, key off the short gloss.
Then, have enough data for the full replacement.&lt;/p&gt;
&lt;p&gt;Now, if either the pronunciation or the short gloss aren't found, then something has gone wrong, and it needs to bail out with an error.&lt;/p&gt;
&lt;p&gt;Anyway, that format is interesting, because it's actually just a lexicon.
And something very similar could be implemented for loanwords.&lt;/p&gt;
&lt;p&gt;Okay, just bashed out some prototype code that looks really ugly, but I don't want to think about improving it right now.
Tomorrow, I'll check whether it even works.&lt;/p&gt;
&lt;p&gt;Anyway, that's everything I wanted done, so it's time to wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Conlang Year"></category><category term="short post"></category></entry><entry><title>Coding 2025-11-27</title><link href="https://mwchase.neocities.org/coding-2025-11-27" rel="alternate"></link><published>2025-11-27T05:00:00-05:00</published><updated>2025-11-27T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-11-27:/coding-2025-11-27</id><summary type="html">&lt;p class="first last"&gt;Really glad that I've managed to avoid totally botching things, codewise.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Thinking about coding the update logic for individual entries, and here's what I'm thinking: if two &amp;quot;homophones&amp;quot; have the same gloss, then are they really distinct words?
As such, I think it makes sense to switch from &amp;quot;array of definitions&amp;quot; to &amp;quot;nested table of definitions&amp;quot;.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, that was a little fiddly to update.
Probably there was a better way, but this worked.&lt;/p&gt;
&lt;p&gt;Anyway, the step to actually doing the updates is to figure out what updates look like.
Just for expressiveness, I kind of want the ability to add or partially replace stuff, but simply allowing for replacements of the gloss is technically sufficient.&lt;/p&gt;
&lt;p&gt;I'll think about that more later.&lt;/p&gt;
&lt;p&gt;Back to the actual prompts.
I've made some decisions about word boundaries, but there are plenty more to make when I've nailed down more of the grammar.&lt;/p&gt;
&lt;p&gt;Also, now that I've fixed up some expressiveness issues in the build system, I should see about breaking the sound change stuff into different eras, which is unfortunately going to lay bare just how much of a hack job the current state of the changes is.&lt;/p&gt;
&lt;p&gt;I just peeked ahead, and I have tomorrow's prompt basically already done.
If I have time tomorrow, I'll work on filling in the gaps that I've created in the lexicon.&lt;/p&gt;
&lt;p&gt;Anyway, I have more to do tonight, and I can't do it while I write this, so I'm going to wrap up for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Conlang Year"></category><category term="short post"></category></entry><entry><title>Coding 2025-11-26</title><link href="https://mwchase.neocities.org/coding-2025-11-26" rel="alternate"></link><published>2025-11-26T05:00:00-05:00</published><updated>2025-11-26T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-11-26:/coding-2025-11-26</id><summary type="html">&lt;p class="first last"&gt;Getting a bunch of small-ish things done.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I did the prompt for today, I think, so let's see about updating the lexicon representation.&lt;/p&gt;
&lt;p&gt;(Also I submitted a 200 Word RPG.
It's a very specific kind of generic, or possibly a generic kind of specific.)&lt;/p&gt;
&lt;p&gt;Anyway, let's crack open the tomlkit documentation and see how I want to serialize stuff.
I didn't have to think about this before, because the last project where I was doing something like this, I think I was only ever &lt;em&gt;entering&lt;/em&gt; data manually, so I only needed code for &lt;em&gt;deserialization&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;First up, it kind of bothers me to put the different keys directly at the top level, so I'm going to need to come up with a dummy table to contain them all.
So, we start with a &lt;tt class="docutils literal"&gt;TOMLDocument&lt;/tt&gt;, which maps a constant key to a &lt;tt class="docutils literal"&gt;table&lt;/tt&gt;, which maps pronunciations to &lt;tt class="docutils literal"&gt;aot&lt;/tt&gt;, where each &lt;tt class="docutils literal"&gt;table&lt;/tt&gt; therein has keys to string values, and an array of string values.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;All right, a little monkeying around with the regeneration command, and now we've got a data format that won't constantly mess up the line endings.
It is much longer, in terms of lines per entry, so maybe I want to look into making some kind of condensed version that can be generated from the TOML version.&lt;/p&gt;
&lt;p&gt;But the key thing to think about next is, what does it look like to represent changes to an entry?&lt;/p&gt;
&lt;p&gt;I'll see about that later, because now it's late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Conlang Year"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-11-25</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-11-25" rel="alternate"></link><published>2025-11-25T05:00:00-05:00</published><updated>2025-11-25T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-11-25:/weekly-roundup-2025-11-25</id><summary type="html">&lt;p class="first last"&gt;Completely lost track of time in all of this, oh well.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I attempted to reorient myself with the Conlang Year prompts.&lt;/li&gt;
&lt;li&gt;Thursday: I continued on trying to nail down sound changes.&lt;/li&gt;
&lt;li&gt;Friday: I thought I was done fixing mistakes in the sound changes.&lt;/li&gt;
&lt;li&gt;Saturday: I wrote up the phonotactics and drafted the romanization.&lt;/li&gt;
&lt;li&gt;Sunday: I considered some improvements I wanted to make to the code side of things.&lt;/li&gt;
&lt;li&gt;Monday: I made one of the improvements, but not the other.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to change the data format for the lexicon, and otherwise keep up with the prompts.
Also, I've got a 200 Word RPG draft to look over.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Conlang Year"></category></entry><entry><title>Coding 2025-11-24</title><link href="https://mwchase.neocities.org/coding-2025-11-24" rel="alternate"></link><published>2025-11-24T05:00:00-05:00</published><updated>2025-11-24T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-11-24:/coding-2025-11-24</id><summary type="html">&lt;p class="first last"&gt;Not quite as much progress as I wanted, but once again, &lt;em&gt;progress&lt;/em&gt;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I updated the build generator so I don't get an exponential explosion of rules, and fixed yet another sound change issue.
And another just now.
This is annoying and subtle.&lt;/p&gt;
&lt;p&gt;Anyway, I haven't yet committed to switching from TSV to TOML, though I'm &lt;em&gt;probably&lt;/em&gt; going to.
Let's take a look at tomorrow to see what kind of effort I'm dealing with next.
Oh, that won't be too much effort to write up.
Those are grammatical decisions that I've basically already made.&lt;/p&gt;
&lt;p&gt;Oh, also, even though I haven't yet made the changes to my sound change script to handle updating the lexicon, I did at least go through the current lexicon and do a vibe check on what semantic shifts I expect for each word.&lt;/p&gt;
&lt;p&gt;I'll hopefully be ready to come back to this in the morning.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Conlang Year"></category><category term="short post"></category></entry><entry><title>Coding 2025-11-23</title><link href="https://mwchase.neocities.org/coding-2025-11-23" rel="alternate"></link><published>2025-11-23T05:00:00-05:00</published><updated>2025-11-23T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-11-23:/coding-2025-11-23</id><summary type="html">&lt;p class="first last"&gt;Planning some more reworks of my janky, janky pipeline.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I touched up the romanization ideas a little, and now I need to go over how I plan to update definitions.
There are two basic questions I need to answer here: &lt;em&gt;how&lt;/em&gt; do I do this (what does the code look like?) and &lt;em&gt;when&lt;/em&gt; do I do this (where does this fit into the build specification?)&lt;/p&gt;
&lt;p&gt;It feels bad to me to construct a lexicon that has outdated glosses, and then a separate one with updated glosses, so I guess I need to add an option to the sound evolution command to take a file of glosses to update.
Then I need to add another bunch of functions to my build file generator, and ponder whether I'm doing things wrong in some way.
Like, right now, I'm adding new rules for every command-line flag, which is not sustainable; I &lt;em&gt;must&lt;/em&gt; be getting something wrong there.
After this, I need to consider changing the lexicon format, but let's consider this for a bit.
When I stored a filename in a variable, I needed to make sure it was quoted to stop it from expanding into multiple files.
So, I can store multiple things in a variable, space-separated.
This means I should be able to store the command-line arguments in one variable using shlex, which is a better idea all around anyway.
So, that's a solid plan for updating the build file generation.
If it's stupid, and it works, then it's not stupid.
However, it is about to stop working.
So, I'll have to work on that early tomorrow.&lt;/p&gt;
&lt;p&gt;Now, let's consider the lexicon format.
I had this idea that it would be cool to work with the lexicon in tabular format.
It's frankly kind of painful, and I'm currently considering switching it to TOML.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Yeah, at least you wouldn't be storing &lt;em&gt;coordinates&lt;/em&gt; in nested key names.
What &lt;em&gt;was&lt;/em&gt; that?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Well, it worked, so it wasn't stupid.&lt;/p&gt;
&lt;p&gt;Anyway, the current format is a tab-separated file alphabetized by the IPA representation of the words, with columns for &amp;quot;short gloss&amp;quot;, &amp;quot;long gloss&amp;quot;, &amp;quot;part of speech&amp;quot;, and &amp;quot;tags&amp;quot;.
Homophones get multiple entries.
Now, it wouldn't be too hard to have a similar set of tables in an array, to more closely match the run-time representation.
One of the things I need to consider, with a more flexible format, is whether I want to try fitting derivational tables into the lexicon.
The issue there is that it would be harder to make sure the data gets serialized and deserialized properly when applying sound changes, so I'm right now thinking I'd like to consider how the data gets from the file that works as input and output to sound changes, into a nicely-formatted document.&lt;/p&gt;
&lt;p&gt;(Let's also consider the possibility that I put all of the gloss changes in a separate file just to get things done with tomorrow, and actually integrate them later.)
Anyway, got to sleep on this.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Conlang Year"></category></entry><entry><title>Diary 2025-11-22</title><link href="https://mwchase.neocities.org/diary-2025-11-22" rel="alternate"></link><published>2025-11-22T05:00:00-05:00</published><updated>2025-11-22T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-11-22:/diary-2025-11-22</id><summary type="html">&lt;p class="first last"&gt;Efficiency!&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'd kind of forgotten how bite-sized the Conlang Year stuff is when I'm not flailing around with sound changes for, I think, longer than was intended, so I was able to do a quick writeup on modern consonants, vowels, and phonotactics.
There are some details in there that I didn't explain properly, or nail down, but I've got all of the stuff that was in my head written down, so let's go.&lt;/p&gt;
&lt;p&gt;Checking ahead, I see that tomorrow is considering romanization.
I can basically nail down what I think makes sense off the cuff:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;long vowels are simply doubled&lt;/li&gt;
&lt;li&gt;palatal approximant is y&lt;/li&gt;
&lt;li&gt;postalveolar fricatives are sh and zh&lt;/li&gt;
&lt;li&gt;postalveolar affricates are ch and j, but geminate as tch and dj&lt;/li&gt;
&lt;li&gt;otherwise gemination doubles the consonant, and specifically the first letter in a digraph&lt;/li&gt;
&lt;li&gt;coda nasals are represented as n&lt;/li&gt;
&lt;li&gt;other coda consonants are represented by &amp;quot;the same letter&amp;quot;&lt;/li&gt;
&lt;li&gt;coda consonants are followed by an apostrophe if the next letter is the same, a vowel, or an approximant&lt;/li&gt;
&lt;li&gt;Everything not mentioned just uses the same letter from the phonology, because all that's left is latin letters with straightforward readings.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That will be a system that is easy to type and read, at least for native English speakers.
There's definitely room for trying to be &amp;quot;more precise&amp;quot; or whatever, but I don't see a reason for me to do that besides trying to flex.
Which... who's going to care?&lt;/p&gt;
&lt;p&gt;Anyway, I let it get late, so time to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="Conlang Year"></category></entry><entry><title>Coding 2025-11-21</title><link href="https://mwchase.neocities.org/coding-2025-11-21" rel="alternate"></link><published>2025-11-21T05:00:00-05:00</published><updated>2025-11-21T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-11-21:/coding-2025-11-21</id><summary type="html">&lt;p class="first last"&gt;I really don't have clear memories of the last few days, but I apparently made stuff, so that's good.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, there are some weird cheats still hiding in the sound changes, but I've got some of the bugs that were lingering in there earlier sorted out.
At this point, I'm ready to move on, having completely lost track of where I'm &amp;quot;supposed to be&amp;quot;.&lt;/p&gt;
&lt;p&gt;There are a few things I can come back to:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I want to set up a parallel set of sound changes for choosing between proto-language roots that would become homophones.&lt;/li&gt;
&lt;li&gt;I haven't figured out the right way to split sound changes into stages in the context of my build system obsession, with the requirement that I also support the &amp;quot;shotgun testing&amp;quot; code I threw together just now.&lt;/li&gt;
&lt;li&gt;Something else I forgot about in between thinking about this entry, and writing this entry.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, yeah, ready to move on, but even more ready to sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Conlang Year"></category><category term="short post"></category></entry><entry><title>Coding 2025-11-20</title><link href="https://mwchase.neocities.org/coding-2025-11-20" rel="alternate"></link><published>2025-11-20T05:00:00-05:00</published><updated>2025-11-20T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-11-20:/coding-2025-11-20</id><summary type="html">&lt;p class="first last"&gt;Nearly there...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I thought I was going to have more time to reflect on the state of the process generally today, but I guess not.
Let's have a look at where I am specifically:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I need to do &lt;em&gt;something&lt;/em&gt; with coda fricatives. Maybe they can just undergo fortition to their corresponding stop?&lt;/li&gt;
&lt;li&gt;Speaking of which, I need to do &lt;em&gt;stuff&lt;/em&gt; with coda stops. Basically, they need to assimilate to a following consonant, or get dropped.&lt;/li&gt;
&lt;li&gt;Coda nasals go to small capital n or whatever, initial velar nasals do some vowel-influenced stuff.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Maybe I can do these quickly?&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, everything is done, &lt;em&gt;except&lt;/em&gt; that I haven't got the right behavior for certain approximants yet.
Once I've figured out what the right behavior &lt;em&gt;is&lt;/em&gt;, I can get it implemented.
Perhaps I will focus on evolving a related naming language first, because I kind of want that before I come up with many more roots.&lt;/p&gt;
&lt;p&gt;For now, though, I desperately need to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Conlang Year"></category><category term="short post"></category></entry><entry><title>Coding 2025-11-19</title><link href="https://mwchase.neocities.org/coding-2025-11-19" rel="alternate"></link><published>2025-11-19T05:00:00-05:00</published><updated>2025-11-19T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-11-19:/coding-2025-11-19</id><summary type="html">&lt;p class="first last"&gt;Not sure if everything I'm doing makes sense, but how will anyone be able to tell?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm still &amp;quot;behind&amp;quot; on Conlang Year, but I should be done with sound changes soon, and able to start catching up.
Actually, looking at the preview for the week, I might be slightly ahead?
I might have misinterpreted an entry and confused myself.
Either way, I'm done for tonight, so I'll read ahead a little later.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Actually, I just read, and honestly, the way I'm currently handling things, it makes the most sense to do what I'm doing, then fill in some nonce forms, then start Week 6 without caring about which specific day I'm on.&lt;/p&gt;
&lt;p&gt;Okay, so, what &lt;em&gt;did&lt;/em&gt; I do tonight?&lt;/p&gt;
&lt;p&gt;Well, I finally got Ninja calling Brassica, fixed a whole bunch of bugs and &amp;quot;features&amp;quot; in my wrapper code, then started learning Brassica as part of getting about halfway through my planned sound changes.
My big insight here is that my current proto-language inventory doesn't do anything too impressive with some of these rules; hopefully compounding them shows more promise, but I need to consider how to set up my code to test that.&lt;/p&gt;
&lt;p&gt;For now, I want to wrap up because I'm pretty tired.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Conlang Year"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-11-18</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-11-18" rel="alternate"></link><published>2025-11-18T05:00:00-05:00</published><updated>2025-11-18T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-11-18:/weekly-roundup-2025-11-18</id><summary type="html">&lt;p class="first last"&gt;No, hyperfixation, don't do &lt;em&gt;that&lt;/em&gt;!&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I started blogging about doing Conlang Year.&lt;/li&gt;
&lt;li&gt;Thursday: I threw together some code for the Conlang Year stuff.&lt;/li&gt;
&lt;li&gt;Friday: I was tired.&lt;/li&gt;
&lt;li&gt;Saturday: I decided to rework the stuff that I had for Conlang Year.&lt;/li&gt;
&lt;li&gt;Sunday: I played a puzzle game.&lt;/li&gt;
&lt;li&gt;Monday: I made some progress on the code.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I think I'm going to have to delay Conlang Year stuff a little, because, um, I kept on playing &lt;em&gt;14 Minesweeper Variants&lt;/em&gt;.
My goal for tomorrow is to read up on Brassica (the sound change applier) and draft some rules by hand over my lunch break.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Conlang Year"></category></entry><entry><title>Coding 2025-11-17</title><link href="https://mwchase.neocities.org/coding-2025-11-17" rel="alternate"></link><published>2025-11-17T05:00:00-05:00</published><updated>2025-11-17T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-11-17:/coding-2025-11-17</id><summary type="html">&lt;p class="first last"&gt;Oh man, things might end up happening soon.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, I made some progress.
I got ninja bootstrapped to build itself, and it should work on the evolution rules I wrote, but I haven't tested this.
I ended up needing to handle regenerating the proto-language lexicon in not the way I was envisioning, which is fine.
I've updated the documentation to reflect the new phonology and syllable structure.
I haven't fixed the generation code; I instead just used vibes to translate its output into something that fits with the new structure.
I added nonce forms directly to the lexicon to take up the new phonemes in different positions, and I'll figure out what they mean when I feel the inspiration or I really need a new root.&lt;/p&gt;
&lt;p&gt;I'm on track to follow with the prompts, although I am getting kind of antsy to explore the grammatical features that got me motivated in the first place.
Looks like I'll be moving towards that in a few weeks.&lt;/p&gt;
&lt;p&gt;For now, I want to wrap things up, and rest after going through the mental effort of stuff like &amp;quot;Remembering how my wrapper around my wrapper around &lt;em&gt;Google&lt;/em&gt;'s wrapper around Ninja works&amp;quot;.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Conlang Year"></category><category term="short post"></category></entry><entry><title>Diary 2025-11-16</title><link href="https://mwchase.neocities.org/diary-2025-11-16" rel="alternate"></link><published>2025-11-16T05:00:00-05:00</published><updated>2025-11-16T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-11-16:/diary-2025-11-16</id><summary type="html">&lt;p class="first last"&gt;I thought I was going to do stuff, and I didn't.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I ended up doing less than I planned because I got repeatedly distracted by &lt;em&gt;14 Minesweeper Variants&lt;/em&gt;, a game which I really would like to see a &lt;em&gt;Bombe&lt;/em&gt;-like of, because man that's a lot of different deduction frameworks to remember.
Maybe I'll get stuff done tomorrow, maybe not, we'll see.&lt;/p&gt;
&lt;p&gt;For now, I let things go way late and I need to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2025-11-15</title><link href="https://mwchase.neocities.org/coding-2025-11-15" rel="alternate"></link><published>2025-11-15T05:00:00-05:00</published><updated>2025-11-15T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-11-15:/coding-2025-11-15</id><summary type="html">&lt;p class="first last"&gt;It took really very little effort to update the lexicon, which I think is a sign the phonotactics were bad to begin with.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm still a bit out of sorts as far as following the prompts goes, but I'm trying.
At the very least, I've confirmed that my tossed-together Python code can apply sound changes to a &amp;quot;lexicon&amp;quot;.
I think this has enough for me to handle the &lt;em&gt;tech&lt;/em&gt; side of tracking the sound changes, so my focus now should be mostly on getting a better handle on sound changes.
As part of that, I redid my proto-lexicon with slightly more sensible-looking syllable structure.
Before I experiment with it, I'm going to have to audit all of my changes, so I'm not going to do anything with it just yet.
There's also the fact that I want to introduce a new stop series to make some of the changes I have in mind work, so I definitely shouldn't be rushing this.&lt;/p&gt;
&lt;p&gt;So, what needs to be done is:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Inventory the current syllable structures&lt;/li&gt;
&lt;li&gt;Redo the janky generation code to be a lot nicer (because I've switched to a simpler syllable structure)&lt;/li&gt;
&lt;li&gt;Alter existing entries to fill in gaps, or add new entries&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'll do that when I feel up for it.
For now, bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Conlang Year"></category><category term="short post"></category></entry><entry><title>Diary 2025-11-14</title><link href="https://mwchase.neocities.org/diary-2025-11-14" rel="alternate"></link><published>2025-11-14T05:00:00-05:00</published><updated>2025-11-14T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-11-14:/diary-2025-11-14</id><summary type="html">&lt;p class="first last"&gt;I was able to form a coherent sentence, but it's still definitely safe to skip this one.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm trying to keep up with Conlang Year, but I'm extremely tired right now, and I think I'll go lie down early for a bit, rather than push myself to do anything in particular.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2025-11-13</title><link href="https://mwchase.neocities.org/coding-2025-11-13" rel="alternate"></link><published>2025-11-13T05:00:00-05:00</published><updated>2025-11-13T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-11-13:/coding-2025-11-13</id><summary type="html">&lt;p class="first last"&gt;I'm not sure if I actually thought about some of this code enough beforehand, but I'll certainly be thinking about it later.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;It feels like I'm doing the Conlang Year stuff a little out of order, so I may need to take a day at some point to regroup and review the last few days.
I have put together a partial plan for sound changes, but a lot of it is riding on doing a bunch of stuff with vowels.&lt;/p&gt;
&lt;p&gt;In any case, let's see what I can do when it comes to implementing the code I want.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Well, I've got something that &lt;em&gt;looks&lt;/em&gt; pretty much like what I think I want, but I want to take things easy tonight, and not debug the no-doubt horrible problems with it just yet.&lt;/p&gt;
&lt;p&gt;I think I'll try to wrap up a little early and take things easy, like I said.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Conlang Year"></category><category term="short post"></category></entry><entry><title>Coding 2025-11-12</title><link href="https://mwchase.neocities.org/coding-2025-11-12" rel="alternate"></link><published>2025-11-12T05:00:00-05:00</published><updated>2025-11-12T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-11-12:/coding-2025-11-12</id><summary type="html">&lt;p class="first last"&gt;Kind of wondering what the point is of coming up with weird forms, and then immediately applying assimilatory sound changes to them, but maybe I'm misunderstanding something.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The generic enum code has no documentation and I suspect there are some subtle bugs waiting to be teased out, but I decided to just publish the code and stop waffling.
I'll cut a release when I find I need it.&lt;/p&gt;
&lt;p&gt;In other news, I've been doing Conlang Year prompts, nearly two years after they came out.
I have some serious reservations about the current state of my proto-language, but I'll need to get some proper experience with evolving it to know how real the problems are.
My intended phonology is Japanese-inspired, and the proto-language phonology is... not that, so I'm going to need a lot of changes to get there.&lt;/p&gt;
&lt;p&gt;Right now, I'm just trying to get ready to experiment with sound changes.
There might be a bit of a delay, since I'm trying to get automation set up.
Right now, I've got a hand-rolled format for the lexicon (as in, I've assigned specific meanings to five columns in a tsv file), and I'm writing code to manipulate it.
Step one, write a command to regenerate a lexicon file.
This lets me add entries whereever, and have them end up alphabetized.
Step two is a little more involved.
I need to actually write the code for applying sound changes; my hope is to outsource that to a CLI tool, but I haven't actually tested the tool that I have in mind yet.
None of this should be hard, it's just that I spent a bunch of mental energy tonight on stuff that was neither enjoyable nor blog-worthy.&lt;/p&gt;
&lt;p&gt;Since I didn't get the code written yet, I at least picked out some areas of the proto-lexicon where I could imagine a sensible sound change.
Once the code is up and running, I'll work on generalizing the changes that stuck out for me.&lt;/p&gt;
&lt;p&gt;Fingers crossed I get stuff properly implemented tomorrow.
For now, I really need to rest.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Conlang Year"></category></entry><entry><title>Weekly Roundup 2025-11-11</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-11-11" rel="alternate"></link><published>2025-11-11T05:00:00-05:00</published><updated>2025-11-11T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-11-11:/weekly-roundup-2025-11-11</id><summary type="html">&lt;p class="first last"&gt;Slow but definite progress.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I did some more work on planning repos to live off of GitHub.&lt;/li&gt;
&lt;li&gt;Thursday: I did a small amount more planning work, which is all I was up for.&lt;/li&gt;
&lt;li&gt;Friday: Still more planning work, and prioritization.&lt;/li&gt;
&lt;li&gt;Saturday: Nothing concrete to report, just more of the same.&lt;/li&gt;
&lt;li&gt;Sunday: I believe this was when I started actually touching code.&lt;/li&gt;
&lt;li&gt;Monday: I got most of the way through one of these repos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to work on documenting this code, and then actually push and publish it.
Also, the Other Project should start getting a little more interesting, so maybe I'll finally feel like discussing stuff.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2025-11-10</title><link href="https://mwchase.neocities.org/coding-2025-11-10" rel="alternate"></link><published>2025-11-10T05:00:00-05:00</published><updated>2025-11-10T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-11-10:/coding-2025-11-10</id><summary type="html">&lt;p class="first last"&gt;I decided to just do the thing. And ended up doing most of the thing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I'm pretty close to being ready to publish my work on generic enum stuff.
The big thing I haven't looked at at all is the quality of the documentation, and I'm still not quite understanding some code; I'm missing some mutation coverage.
The line in question is obviously correct, but I'm having trouble figuring out what goes wrong when the mutant in question is used instead.&lt;/p&gt;
&lt;p&gt;I don't know what I'll feel like poking at over the next few days, but right now I need to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2025-11-09</title><link href="https://mwchase.neocities.org/coding-2025-11-09" rel="alternate"></link><published>2025-11-09T05:00:00-05:00</published><updated>2025-11-09T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-11-09:/coding-2025-11-09</id><summary type="html">&lt;p class="first last"&gt;Maybe I should start posting stuff for the other project. Maybe.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm working on setting up a repository, but it's not there yet.
I did get a few things nailed down for this, but I also was working on The Other Project, so I'm not getting stuff done here, um, as fast as I could if that's where my focus was landing.
Like, I should have something ready in a day or two, but the virtue of these tiny Python libraries is more that it's something that's not too hard to work on, rather than any deep interest.
Anyway, it's late and I want to go read.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2025-11-08</title><link href="https://mwchase.neocities.org/coding-2025-11-08" rel="alternate"></link><published>2025-11-08T05:00:00-05:00</published><updated>2025-11-08T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-11-08:/coding-2025-11-08</id><summary type="html">&lt;p class="first last"&gt;Taking it easy, so this is safe to skip.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I'm not up for too much more tonight, but I'm making steady progress on the not-that-interesting-yet thing, and I've nailed down one of the technical decisions for the small Python libraries.&lt;/p&gt;
&lt;p&gt;I was pretty out of it this week, so I'm trying to take it easy until I've had more sleep.
I hope to have something worth showing off soon, but I'm not going to force anything.
Let's wind down...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2025-11-07</title><link href="https://mwchase.neocities.org/coding-2025-11-07" rel="alternate"></link><published>2025-11-07T05:00:00-05:00</published><updated>2025-11-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-11-07:/coding-2025-11-07</id><summary type="html">&lt;p class="first last"&gt;Soon. But not now. But soon.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm making decent progress on the other projects, so let's see if I have anything quick to do for the stuff I'm actually writing about.&lt;/p&gt;
&lt;p&gt;All right, so.
I have a bunch of candidates for code to factor out first.
In each case, I want to do some due diligence to figure out whether something already exists.
This already replaced some of my sketchy code with an extant library, so it's not out of the question.
The stuff that looks most like I'll need to publish something for it includes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Weird Enum Stuff&lt;/li&gt;
&lt;li&gt;As many terminal color scheme hex codes as I feel like&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;ContextVar&lt;/tt&gt; helper code&lt;/li&gt;
&lt;li&gt;Some funky metaprogramming based on type parameters&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I intend to work on this, or at least on &lt;em&gt;something&lt;/em&gt;, over the weekend, but right now I want to wind down.
Also, I need to think of names for these, and I'm not ready for that right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2025-11-06</title><link href="https://mwchase.neocities.org/coding-2025-11-06" rel="alternate"></link><published>2025-11-06T05:00:00-05:00</published><updated>2025-11-06T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-11-06:/coding-2025-11-06</id><summary type="html">&lt;p class="first last"&gt;I'm pretty sure I have to take things easy, grumble grumble.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was very out of it today, so I tried to take things easy and then do some constrained work.
On the side of stuff I'm currently talking about, I laid out a set of things I want in each of the small repos I'm planning to write, and picked out a few repos that look like reasonable starting points.&lt;/p&gt;
&lt;p&gt;I didn't actually start anything, because my brain has been fried all day.
I should sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2025-11-05</title><link href="https://mwchase.neocities.org/coding-2025-11-05" rel="alternate"></link><published>2025-11-05T05:00:00-05:00</published><updated>2025-11-05T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-11-05:/coding-2025-11-05</id><summary type="html">&lt;p class="first last"&gt;I mean, you can read this one if you want, but I won't mind if you don't.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Time is passing faster than I'd like, and I'm putting in thought to some side projects that I intend to talk about later, but I'd like to get &lt;em&gt;something&lt;/em&gt; done tonight.&lt;/p&gt;
&lt;p&gt;As such, I just transferred the notes I took last entry to an Obsidian note, where I'll be prioritizing, annotating, and checking them off.
I want to leave it there so I can spend some time thinking about that side project, so I'll end this entry now even though there isn't really anything here.
Make sure I'm not scrambling later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-11-04</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-11-04" rel="alternate"></link><published>2025-11-04T05:00:00-05:00</published><updated>2025-11-04T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-11-04:/weekly-roundup-2025-11-04</id><summary type="html">&lt;p class="first last"&gt;Pivoting in a somewhat confusing fashion, but it made sense to me.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I confirmed that the code I threw together for base stuff seems to work, and promptly didn't do anything with it.&lt;/li&gt;
&lt;li&gt;Thursday: I looked over the coverage misses in MOTR, and tried to figure out what to do about them.&lt;/li&gt;
&lt;li&gt;Friday: I drilled down into the design of the &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt; plugin, and rediscovered the various problems with it that I've just kind of been avoiding.&lt;/li&gt;
&lt;li&gt;Saturday: I ended up with a new project idea, not fully developed.&lt;/li&gt;
&lt;li&gt;Sunday: I figured out that some of the work I had in mind for that project was unneeded, which therefore meant I was closer to completion than I thought.&lt;/li&gt;
&lt;li&gt;Monday: I eliminated a bit more work, which meant moving onto the next phase: factoring out code from my hobby projects into a bunch of tiny, inscrutable libraries.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I need to nail down exactly which libraries I'm writing, their minimum supported Python version, and any enhancements I want to make to them.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="MOTR"></category></entry><entry><title>Coding 2025-11-03</title><link href="https://mwchase.neocities.org/coding-2025-11-03" rel="alternate"></link><published>2025-11-03T05:00:00-05:00</published><updated>2025-11-03T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-11-03:/coding-2025-11-03</id><summary type="html">&lt;p class="first last"&gt;Preparing to release like a dozen deeply confusing Python projects.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm right now very slightly leaning towards switching to Codeberg.
At first, I was looking into what it would take to migrate the one repository I think I care about, and then I kind of ended up going, like, do I actually care?
The one repository is a fork of flake8-html, that redoes some of the output.
Now, I'm not &lt;em&gt;totally&lt;/em&gt; migrated from flake8 to ruff in the projects where I've even tried to switch, but in those projects, ruff is pulling the vast majority of the weight.&lt;/p&gt;
&lt;p&gt;Rest assured, I didn't merely come up with reasons to not do work; I've got a Codeberg account now, thereby opening up new avenues of procrastination.
More seriously, here's how things look for projects I want to put up there:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;MOTR (split into three)&lt;/li&gt;
&lt;li&gt;Impliciula&lt;/li&gt;
&lt;li&gt;The base project&lt;/li&gt;
&lt;li&gt;Some of the code I wrote for various projects meant to track tabletop game stuff; this would be the support code, and nothing system-specific.
For example, I've got some code for Stars Without Number; I would, rather than anything system-specific, put up the code for mixing enum and attrs classes (actually, I'd use the version from the base project), to create generic enum types, to allow for empty final enums, to convert between different styles of name, the &amp;quot;generate BEM HTML from specially crafted Python objects&amp;quot; code (once I sort out some Jinja misuse), the colorscheme handling, the dice pool code, the funky logging code (unless I just switch to using an actual logger), and the contextvar contextmanager code that I always seem to be writing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, I &lt;em&gt;wanted&lt;/em&gt; to get more done, but I think I'm still recovering from that night of mostly not sleeping.
Nothing else I want to discuss right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2025-11-02</title><link href="https://mwchase.neocities.org/coding-2025-11-02" rel="alternate"></link><published>2025-11-02T04:00:00-05:00</published><updated>2025-11-02T04:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-11-02:/coding-2025-11-02</id><summary type="html">&lt;p class="first last"&gt;I eliminated some work for myself, which I think counts for something.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I took another look at the code that I'm currently installing from my own GitHub repos, and it looks like I should be able to stop doing that for two of them, which can only be an improvement.
The remaining one, I think I'm kind of stuck with, but oh well.&lt;/p&gt;
&lt;p&gt;I wasn't really focused on this today, so I am going to take it easy for tonight, and tomorrow, I'll either finish this train of thought, or I'll work on the base stuff wiki.
Maybe both.
For now, I need to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2025-11-01</title><link href="https://mwchase.neocities.org/coding-2025-11-01" rel="alternate"></link><published>2025-11-01T04:00:00-04:00</published><updated>2025-11-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-11-01:/coding-2025-11-01</id><summary type="html">&lt;p class="first last"&gt;Putting together yet another new plan.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Earlier, I did some investigation of the Mypy plugins I wrote for MOTR, and rediscovered some improvements that I want.
After that, I had a terrible night, and today...
You know how I sometimes complain about having had a really bad day?
So much worse.&lt;/p&gt;
&lt;p&gt;And the night that led to that day, it gave me some thoughts (instead of sleep, which is the big issue), and now I'm going to derive some plans from those thoughts.
The main thing I want to do is get set up on a code forge besides GitHub, and migrate my forks from GitHub to that forge, and start publishing my various hobby projects on it.
Alternatively, I could look into simply doing something equivalent to hg serve...&lt;/p&gt;
&lt;p&gt;All right, quick thoughts before I wrap up.
My goal here is to document and publish the process and ideas behind the projects I'm most passionate about.
For the purpose I have in mind, self-hosting doesn't quite make sense, so I need to pick a forge or hosting service, although I ultimately don't need too many features.&lt;/p&gt;
&lt;p&gt;I think that gives me enough to go on once I've had some actual sleep.
Which I should work on.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2025-10-31</title><link href="https://mwchase.neocities.org/coding-2025-10-31" rel="alternate"></link><published>2025-10-31T04:00:00-04:00</published><updated>2025-10-31T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-10-31:/coding-2025-10-31</id><summary type="html">&lt;p class="first last"&gt;I've forgotten so much about this project...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I thought I was going to get more done today, but whatever.
I did a deep dive on the &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt; plugin in MOTR, and realized that it's actually kind of broken in ways that haven't mattered to me.
If I &lt;em&gt;can&lt;/em&gt; fix this, the way to fix it is to find a set of type arguments to the origin of the instance type that cause it to unify with the target type.
(I wrote a comment to this effect, but I'd forgotten what I meant until this exact moment.)&lt;/p&gt;
&lt;p&gt;My plan here is to copy this code into a new project, touch it up, and publish it.&lt;/p&gt;
&lt;p&gt;Quick thoughts on how to implement what I was saying...
I guess I need to confirm that I have an &lt;tt class="docutils literal"&gt;Instance&lt;/tt&gt;, and create a version with synthetic type variables.
Can I do that?
Seems like a pain, but it looks like I can do stuff with &lt;tt class="docutils literal"&gt;TypeVarType&lt;/tt&gt;.
At that point, it &lt;em&gt;might&lt;/em&gt; be possible to pull code out of &lt;tt class="docutils literal"&gt;unify_generic_callable&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;It's not worth thinking about this any further tonight, but I can play with this in a day or two.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2025-10-30</title><link href="https://mwchase.neocities.org/coding-2025-10-30" rel="alternate"></link><published>2025-10-30T04:00:00-04:00</published><updated>2025-10-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-10-30:/coding-2025-10-30</id><summary type="html">&lt;p class="first last"&gt;Aaaaaghghaaahgghghaghaghagh...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't realize how rough of a day I was having until a few hours ago.
I tried to address the causes as best I can, but I still need at least one night's sleep to handle it.&lt;/p&gt;
&lt;p&gt;With just a little time to work on hobby stuff after I cooled off, I decided to see what kinds of fixes MOTR needs as a result of not looking at it for a while.
I ended up needing to update one test case, and delete a file that my NAS really wanted to keep around for some reason.&lt;/p&gt;
&lt;p&gt;With that out of the way, let's look at the coverage misses:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;There are a few lines in the &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt; plugin that aren't hit because I would need to break some assumptions of the plugin code to hit them.
Probably the strongest candidate for adding a no-cover pragma and not looking back.&lt;/li&gt;
&lt;li&gt;The coverage gaps in the &lt;tt class="docutils literal"&gt;type_func&lt;/tt&gt; (dependent mapping) plugin are actually kind of a bug that I should fix, but I don't want to right now.
Since the code should eventually change in the exact place that's not being covered currently, it does make sense to keep checking this.&lt;/li&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;cmd&lt;/tt&gt; module is missing coverage of &lt;tt class="docutils literal"&gt;EnvVar.concatenate&lt;/tt&gt;.
The natural way to get coverage is to pass an &lt;tt class="docutils literal"&gt;Invocation&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;Invocation.append&lt;/tt&gt; such that their &lt;tt class="docutils literal"&gt;env&lt;/tt&gt; attributes have overlapping keys.
This may require going through &lt;tt class="docutils literal"&gt;InvocationRelations.append&lt;/tt&gt;.
This is called from &lt;tt class="docutils literal"&gt;InvocationEnvironment.append&lt;/tt&gt;, which is called from... places.&lt;/li&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;command&lt;/tt&gt; module is missing coverage of &lt;tt class="docutils literal"&gt;Implicit&lt;/tt&gt; artifacts, as well as various error cases in a helper function that's ultimately called by &lt;tt class="docutils literal"&gt;Command.matrix&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Command.fill_in_module&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;invocation_environment&lt;/tt&gt; is missing a line that can only be hit if &lt;tt class="docutils literal"&gt;InvocationEnvironment.invocation_relations&lt;/tt&gt; contains an &lt;tt class="docutils literal"&gt;Executable&lt;/tt&gt; as a relation, and we get the &lt;tt class="docutils literal"&gt;facts&lt;/tt&gt;.
I don't remember what some of this means.&lt;/li&gt;
&lt;li&gt;I'm running out of steam, so I'll look over &lt;tt class="docutils literal"&gt;runner&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;matrix&lt;/tt&gt; later.&lt;/li&gt;
&lt;li&gt;That said, &lt;tt class="docutils literal"&gt;conftest&lt;/tt&gt; is also a case of &amp;quot;I'm not feeling worried about putting a pragma on this line, I just haven't done it yet&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For now, I really need to get some rest.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2025-10-29</title><link href="https://mwchase.neocities.org/coding-2025-10-29" rel="alternate"></link><published>2025-10-29T04:00:00-04:00</published><updated>2025-10-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-10-29:/coding-2025-10-29</id><summary type="html">&lt;p class="first last"&gt;It Just Works&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, here's how things are: the prototype code for generating tables in Wikidot syntax works fine.
As does the base conversion code.
The way I want to actually use this is to set aside pages just for tables, and use the include directive to put them into the actual &amp;quot;article&amp;quot; pages.
This way I can edit the table without worrying about accidentally deleting part of the page, for example.&lt;/p&gt;
&lt;p&gt;I want to wait a little before putting this stuff together; maybe work on it over the weekend.
Until then, I'll try to get back to other projects.
Perhaps make progress on Impliciula or remember what I was doing to MOTR.
For now, I need to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-10-28</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-10-28" rel="alternate"></link><published>2025-10-28T04:00:00-04:00</published><updated>2025-10-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-10-28:/weekly-roundup-2025-10-28</id><summary type="html">&lt;p class="first last"&gt;Well, I got stuff done, so I can't really &lt;em&gt;complain&lt;/em&gt;...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I cleaned up some of the base-processing code, and found an article to read.&lt;/li&gt;
&lt;li&gt;Thursday: I planned out representing different kinds of complex integer.&lt;/li&gt;
&lt;li&gt;Friday: I read enough of the article to not be totally sure that I want to implement it, but there's still some interesting stuff in there.&lt;/li&gt;
&lt;li&gt;Saturday: I poked further at the article, and got &lt;em&gt;most&lt;/em&gt; of complex base stuff implemented.&lt;/li&gt;
&lt;li&gt;Sunday: I implemented a bunch of random code, and then remembered that I intend to actually share this stuff, so it needs some manner of code to generate tables and charts.&lt;/li&gt;
&lt;li&gt;Monday: I got distracted and refactored the code a bunch.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, since I prototyped the table generation code before writing the roundup, I actually should be ready to start implementing stuff for the wiki.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category></entry><entry><title>Coding 2025-10-27</title><link href="https://mwchase.neocities.org/coding-2025-10-27" rel="alternate"></link><published>2025-10-27T04:00:00-04:00</published><updated>2025-10-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-10-27:/coding-2025-10-27</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Feels good to work on&amp;quot; isn't the same as &amp;quot;immediately useful&amp;quot;, even on what is arguably an art project.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Rather than address the fact that all of this base stuff needs to go on a website, I futzed around with the class hierarchy so that I can eventually support rational and complex bases.
There's also the proper jumping-off point for algebraic bases, but I'm still struggling with how to handle them in a generic fashion.&lt;/p&gt;
&lt;p&gt;Although I did a bunch of refactoring, I don't have much more to say about what I did, so I'll just note that I'm going to try to either focus on the table stuff, or switch projects for a bit.&lt;/p&gt;
&lt;p&gt;Going to try to wind down now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2025-10-26</title><link href="https://mwchase.neocities.org/coding-2025-10-26" rel="alternate"></link><published>2025-10-26T04:00:00-04:00</published><updated>2025-10-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-10-26:/coding-2025-10-26</id><summary type="html">&lt;p class="first last"&gt;Oh yeah, I wanted to put all this stuff on a website...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;My focus has been drifting from the base stuff a little, but I did still get some stuff done there.
I added boolean conversion (which I'd forgotten about before), and handwrote the enums for the balanced complex bases.
I just filled in a bunch of other stuff, including writing validators.
At this point, the ways forward (aside from polishing existing code) are to figure out what needs to happen to deal with base representations of complex numbers, and to implement more tests and procedures.&lt;/p&gt;
&lt;p&gt;Actually, since I brought that up, I just wrote a one-liner for determining whether a number is Harshad, and then realized I need to special-case when the digit sum is zero.
And when the number is zero.&lt;/p&gt;
&lt;p&gt;Anyway, thinking about this reminded me of one other thing I need to work on, and that's the table-generating code, now that I have enough code written to populate new tables, I just haven't bothered to toss together the generators.
That's something I should try to do tomorrow, in between the other things I'm working on, which I'm going to keep under wraps for now.
For the moment, I'd better get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2025-10-25</title><link href="https://mwchase.neocities.org/coding-2025-10-25" rel="alternate"></link><published>2025-10-25T04:00:00-04:00</published><updated>2025-10-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-10-25:/coding-2025-10-25</id><summary type="html">&lt;p class="first last"&gt;At some point, this really should have a package. And tests. And source control beyond &amp;quot;I'm pretty sure the NAS is backing it up&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right.
As I get a better grasp on what this article is saying, I'm further from sure that I can directly use it.
Basically, it defines two infinite families of algebraic numbers that are suitable as bases, but these families are not exhaustive.
For instance, if I'm understanding the families correctly, neither of them contain the plastic ratio, which &lt;em&gt;is&lt;/em&gt; suitable.
However, messing around with the families did reveal something interesting.&lt;/p&gt;
&lt;p&gt;&lt;span class="math"&gt;\(x^2 - 3x + 1 = 0\)&lt;/span&gt; has greater solution &lt;span class="math"&gt;\(\frac{3 + \sqrt{5}}{2}\)&lt;/span&gt;, which is between 2 and 3, so it uses ternary digits.
The carrying looks a little confusing, until you see that a value of three or above in a place carries both up and down at the same time.
Unless I'm missing something, there's no maximal version of this base, because there's no way to construct the equivalent of two consecutive ones in phinary.
My intuition is that the base isn't doesn't have a maximal version if the negative coefficients are all consecutive, and all of them are have magnitude equal to the highest digit in the base, except for the last one, which has magnitude equal to one more.&lt;/p&gt;
&lt;p&gt;Anyway, I don't have further ideas of what to do with all of this just yet.
While I was typing this up, I tried to implement complex integers.
There's a little work to do to get the display of them nice, but they should be ready to go for purposes of doing arithmetic to them, which means I can think about moving &lt;tt class="docutils literal"&gt;IntegerBase&lt;/tt&gt; code into a base class and extending it to work with complex bases.
I really should see about writing proper validators and invariant checkers, though...&lt;/p&gt;
&lt;p&gt;Oh well, none of that is happening right now, because it's late and I'm going to get ready for bed now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
&lt;script type='text/javascript'&gt;if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
    var align = "center",
        indent = "0em",
        linebreak = "false";

    if (false) {
        align = (screen.width &lt; 768) ? "left" : align;
        indent = (screen.width &lt; 768) ? "0em" : indent;
        linebreak = (screen.width &lt; 768) ? 'true' : linebreak;
    }

    var mathjaxscript = document.createElement('script');
    mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
    mathjaxscript.type = 'text/javascript';
    mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';

    var configscript = document.createElement('script');
    configscript.type = 'text/x-mathjax-config';
    configscript[(window.opera ? "innerHTML" : "text")] =
        "MathJax.Hub.Config({" +
        "    config: ['MMLorHTML.js']," +
        "    TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
        "    jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
        "    extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
        "    displayAlign: '"+ align +"'," +
        "    displayIndent: '"+ indent +"'," +
        "    showMathMenu: true," +
        "    messageStyle: 'normal'," +
        "    tex2jax: { " +
        "        inlineMath: [ ['\\\\(','\\\\)'] ], " +
        "        displayMath: [ ['$$','$$'] ]," +
        "        processEscapes: true," +
        "        preview: 'TeX'," +
        "    }, " +
        "    'HTML-CSS': { " +
        "        availableFonts: ['STIX', 'TeX']," +
        "        preferredFont: 'STIX'," +
        "        styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
        "        linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
        "    }, " +
        "}); " +
        "if ('default' !== 'default') {" +
            "MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
            "MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
        "}";

    (document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
    (document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
&lt;/script&gt;</content><category term="Coding"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2025-10-24</title><link href="https://mwchase.neocities.org/coding-2025-10-24" rel="alternate"></link><published>2025-10-24T04:00:00-04:00</published><updated>2025-10-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-10-24:/coding-2025-10-24</id><summary type="html">&lt;p class="first last"&gt;It's a little late to say this, but I swear it's not a pun whenever I say &amp;quot;base&amp;quot; or &amp;quot;based&amp;quot; and it's not referring to a numeric representation.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I'm not feeling great today, but I managed to skim that article on algebraic bases, and I'm not sure how much I'll be willing to apply from it.
If I'm understanding the article correctly, it establishes by an inductive argument that bases of a particular form have terminating integer representations.
However, it appears that, if I base things off of the constructions in the article, then actually obtaining those terminating constructions is going to be linear in the magnitude of the integer.
I suppose I could get that to work &amp;quot;better&amp;quot; by caching the conversions, but I'd feel better if I could figure out, say, both incrementing and doubling to construct digit sequences.
That way I could ask for, say, one million in phinary, and it would take something like thirty &amp;quot;operations&amp;quot; rather than a million.&lt;/p&gt;
&lt;p&gt;So, for sure, it's good to have a restriction on the algebraic bases I want to consider, but I think I'm going to need to do some more research or experimentation.
I don't know if this is totally off base (or if I maybe already said something like this before), but the conversion between &amp;quot;base representation and polynomial function of lower degree&amp;quot; feels analogous to the Fourier transform, or inverse Fourier transform, according to my intuition.
Just got to... invert an infinite-dimensional matrix?
To produce a vector that is sparse in non-zero entries, drawn from a subset of the integers?
This idea is &lt;em&gt;not&lt;/em&gt; baked all the way.&lt;/p&gt;
&lt;p&gt;Anyway, it's late, and I need to sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2025-10-23</title><link href="https://mwchase.neocities.org/coding-2025-10-23" rel="alternate"></link><published>2025-10-23T04:00:00-04:00</published><updated>2025-10-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-10-23:/coding-2025-10-23</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Hey, I just got done undoing a bunch of premature architecture weirdness. Let's do more of that.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I didn't have much time to post today, so I'm going to try to lay out some work I need to do on the base stuff.&lt;/p&gt;
&lt;p&gt;For now, I'm not considering algebraic numbers.
Just integers (built in) and complex integers.
For complex integers of either kind, I want:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Add instances of a type to each other.&lt;/li&gt;
&lt;li&gt;Subtract instances of a type from each other.&lt;/li&gt;
&lt;li&gt;Add and subtract integers.&lt;/li&gt;
&lt;li&gt;Divide instances by each other, which requires:&lt;/li&gt;
&lt;li&gt;Take complex conjugate of instances&lt;/li&gt;
&lt;li&gt;Multiply instances by each other&lt;/li&gt;
&lt;li&gt;Convert real-valued instances to ints&lt;/li&gt;
&lt;li&gt;Divide instances by ints&lt;/li&gt;
&lt;li&gt;Also, checking divisibility of instances by each other, so, taking the modulus I guess?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm probably also going to want to figure out stuff like &amp;quot;hey, is this instance an exact power of another instance&amp;quot;, which is going to be... interesting.
(Wait, multiply by conjugate and check power; there might be some false positives from this, not sure.)&lt;/p&gt;
&lt;p&gt;Anyway, it's late and the melatonin is kicking in, so I'm not going to try to do any of this now, but this all feels like something I could throw together with an abstract base class and a bit of elbow grease.&lt;/p&gt;
&lt;p&gt;In any case, I need to get ready for bed &lt;em&gt;now&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2025-10-22</title><link href="https://mwchase.neocities.org/coding-2025-10-22" rel="alternate"></link><published>2025-10-22T04:00:00-04:00</published><updated>2025-10-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-10-22:/coding-2025-10-22</id><summary type="html">&lt;p class="first last"&gt;If you can get rid of some metaprogramming without breaking things, you &lt;em&gt;probably&lt;/em&gt; should at least try.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm not planning to do too much today (I got seriously messed up by the sun), but I can explain more of what I did yesterday, and what I plan to do later.&lt;/p&gt;
&lt;p&gt;Yesterday, I realized that having digit sequences as instances of base-specific classes didn't make sense to me, so I created a bunch of generic digit-sequence classes, which implemented stuff like digit sums, and will also implement stuff like palindromes.
With this, I was able to convert the integer base class from a base class that must be subclassed, to just a class that must be instantiated.
By messing with this, I was able to create an implementation of digital roots that is probably robust enough to go on a currently-hypothetical base class of bases.
This robustness is not guaranteed by the fact that it seems to work on optionally-balanced integer bases, because in bases like maximal phinary, some small numbers are less than their own digit sum.
I believe this still converges, but I've neither put in the work to establish that, nor checked whether anyone else has.
And the current implementation will just OoM if I manage to come up with a sufficiently pathological base, so I guess I just shouldn't do that.&lt;/p&gt;
&lt;p&gt;Anyway, I stumbled across a paper from thirty years ago that purports to explain which polynomials have roots that are nicely-behaved as a base, which I'm grateful for, since I've experimented with various polynomials, metallic means, and Pisot numbers, and some of them are just not well-behaved.
From looking over the beginning of this paper, it looks to be saying that particular classes of polynomials will be well-behaved and usable, irrespective of degree.
So that's actually very exciting; it's just too bad that sometimes it uses words that I have literally never heard before.&lt;/p&gt;
&lt;p&gt;Anyway, let's see what I've got to work on as I feel like (which right now, I do not):&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Read the article, sketch out ideas.&lt;/li&gt;
&lt;li&gt;Clean up existing code (document assumptions and potential points of failure, add validation logic)&lt;/li&gt;
&lt;li&gt;Extend the code with new calculations.&lt;/li&gt;
&lt;li&gt;Implement conversion logic for new bases (rational with number of digits equal to numerator, Gaussian, Eisenstein, algebraic)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Okay, that's about the state of things, at least, things that I feel like mentioning.
I'm going to wrap things up early and watch funny videos.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category></entry><entry><title>Weekly Roundup 2025-10-21</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-10-21" rel="alternate"></link><published>2025-10-21T04:00:00-04:00</published><updated>2025-10-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-10-21:/weekly-roundup-2025-10-21</id><summary type="html">&lt;p class="first last"&gt;More done this week than lately. Hoping this is sustainable.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I put out a bunch of ideas for the Weird Base Stuff project.&lt;/li&gt;
&lt;li&gt;Thursday: I considered more ideas, some of them kind of... not good.&lt;/li&gt;
&lt;li&gt;Friday: I worked with a few more ideas, but got kind of stuck on the fact that I don't fully grasp the mechanics or broader implications of the Abel-Ruffini theorem, no matter how many explainer videos I watch.&lt;/li&gt;
&lt;li&gt;Saturday: Although I found out about more weird base systems, I did at least try to write some prototypes.&lt;/li&gt;
&lt;li&gt;Sunday: I made a little progress on Impliciula, and a little progress on this other project.&lt;/li&gt;
&lt;li&gt;Monday: I described roughly how I wanted the prototype to look in some areas, and that was the push I needed to work on it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to refine and expand on these prototypes.
(I've already reversed some bad decisions that were over-complicating things.)&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category></entry><entry><title>Coding 2025-10-20</title><link href="https://mwchase.neocities.org/coding-2025-10-20" rel="alternate"></link><published>2025-10-20T04:00:00-04:00</published><updated>2025-10-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-10-20:/coding-2025-10-20</id><summary type="html">&lt;p class="first last"&gt;Accidentally making progress on the prototype.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm still feeling a little bit iffy today, so I'm once again going to try to wrap things up quickly and put down the screen, before I end up feeling worse.&lt;/p&gt;
&lt;p&gt;Here's the deal with the base stuff that I'm currently considering: there is some form of class factory that takes as parameters the base, and whether it should be balanced.
The idea is that instances of the class will have a sign attribute and one or more digits, with no base point.
There will be a constructor classmethod that takes an integer argument and processes it into an instance, and the first thing it needs to determine is whether to set the sign attribute.
Three things need to be true for it to be necessary to set the sign attribute:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The input number is negative.&lt;/li&gt;
&lt;li&gt;The base is positive.&lt;/li&gt;
&lt;li&gt;The base is not positive.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And I just meant to get some stuff planned, but I've just thrown together a very rough prototype.
A lot of the validation logic is either not written, or temporarily commented out because it was breaking things, but I believe there's enough functionality in this now to think about questions like &amp;quot;no, really, what interface to this actually makes sense?&amp;quot;&lt;/p&gt;
&lt;p&gt;Really not ready to consider that right now, though, so let's wrap this up and switch to paper or e-ink or something for the rest of the night.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2025-10-19</title><link href="https://mwchase.neocities.org/coding-2025-10-19" rel="alternate"></link><published>2025-10-19T04:00:00-04:00</published><updated>2025-10-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-10-19:/coding-2025-10-19</id><summary type="html">&lt;p class="first last"&gt;Deleting the Bad Code and writing the Good (Or At Least, Not As Bad) Code&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got &lt;em&gt;really&lt;/em&gt; exhausted today, and I feel like getting food after that kind of reset me.
I made some progress on Impliciula, but any further progress is, I think, going to require some feedback.
One positive thing is that in the Mypy release (over a month ago?) they added a feature that is specifically useful for the weird stuff I'm doing in this project, so I got to remove like twenty type-ignore comments.&lt;/p&gt;
&lt;p&gt;Aside from that, I was thinking more about the base representation project
I got enough together to generate the data required for various kinds of integer base, and it &lt;em&gt;should&lt;/em&gt; be ready for me to bash together a prototype that can actually handle the conversions, but I need to think more about what I want the actual interface to look like.
Things to ponder include &amp;quot;only unbalanced positive bases need to represent sign separately, and phrased like that, it &lt;em&gt;sounds&lt;/em&gt; like a corner case, but really, those are the standard bases&amp;quot;.&lt;/p&gt;
&lt;p&gt;Anyway, I don't want to agonize over trying to get more meat into this post, especially not at this time of night, so let's wrap it up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-10-18</title><link href="https://mwchase.neocities.org/coding-2025-10-18" rel="alternate"></link><published>2025-10-18T04:00:00-04:00</published><updated>2025-10-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-10-18:/coding-2025-10-18</id><summary type="html">&lt;p class="first last"&gt;I do not want to let myself get derailed, but honestly I probably should?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I keep on finding out about more base systems to try out, but I am making efforts to put together prototypes.
I've created a helper method to generate basic enums of &lt;tt class="docutils literal"&gt;Glyph&lt;/tt&gt; objects, and, in the process, found a problem with my attrs + enum wrapper that I think was easier to fix with aspectlib than it would have been with unittest.mock, so I guess switching was the right call.&lt;/p&gt;
&lt;p&gt;I'm a little unfocused right now (in part because I had &lt;em&gt;more&lt;/em&gt; sickness-adjacent things happening, which, uugh).
I did just throw together a stub of Gaussian integers, but what I actually need to be working on is creating the various integer bases that I basically know how to put together.&lt;/p&gt;
&lt;p&gt;But that comes &lt;em&gt;after&lt;/em&gt; I get some dang rest.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2025-10-17</title><link href="https://mwchase.neocities.org/coding-2025-10-17" rel="alternate"></link><published>2025-10-17T04:00:00-04:00</published><updated>2025-10-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-10-17:/coding-2025-10-17</id><summary type="html">&lt;p class="first last"&gt;Making some weird problems for myself by refusing to consider approximate solutions.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Let's see what I'm thinking...
The bases I'm considering have two basic options for digit sets.
Almost everything works with the &amp;quot;standard&amp;quot; option of starting with 0, and next most common is the &amp;quot;standard&amp;quot; balanced option, which just requires an odd number of digits.
I also came up with two balanced sets of digits for complex numbers, and these sets of digits significantly constrain the bases that they can be used for.&lt;/p&gt;
&lt;p&gt;Something to look into: some complex bases don't work; why?
Is it having a positive real part?
Does doing a &amp;quot;standard&amp;quot; balanced base fix the issue for complex bases that normally wouldn't work?&lt;/p&gt;
&lt;p&gt;In any case, I'm getting some ideas for how to represent linear transformations more compactly.
Basically...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;For a one-element vector, there's nothing that needs to be done.&lt;/li&gt;
&lt;li&gt;For vectors representing complex integers, it suffices to simply represent the complex factors as a fixed vector, and similarly-ish for the shear transformation.
(Actually, because the real numbers have to be unchanged, the shear transformation is technically just a scaling factor for the non-real coordinate.)&lt;/li&gt;
&lt;li&gt;For vectors representing powers of (ideally) a Pisot number, all we actually need to know is the coefficients of the minimal polynomial.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Given these representations, we can then derive the digits required for a base:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The funky balanced complex bases should just be a bunch of hardcoded choices.&lt;/li&gt;
&lt;li&gt;Generic complex bases have a digit cardinality equal to the square of the magnitude.&lt;/li&gt;
&lt;li&gt;Real integer bases have a digit cardinality equal to the absolute value of the base.&lt;/li&gt;
&lt;li&gt;Working things out for the algebraic numbers seems potentially trickier.
The questions I need to ponder are, at what degree does it become infeasible to calculate the &lt;em&gt;ceiling&lt;/em&gt; of the largest root, and is comparing a sum of powers of that root against that root morally the same as finding that root, or can the relevant symbolic manipulation be pushed to quintics or beyond?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I assume the answers to those questions are actually either obvious, or have straightforward writeups if I knew what to look for.&lt;/p&gt;
&lt;p&gt;I mean, I can of course hardcode this for some things, and it doesn't look horribly infeasible to automate some of the calculations for quadratics, but I want an actual sense here of &amp;quot;what will work&amp;quot; vs &amp;quot;what will horribly suck&amp;quot; vs &amp;quot;haha, no&amp;quot;.&lt;/p&gt;
&lt;p&gt;Anyway, I think I'm going to need to prototype this some before I can articulate what I need to know, well enough to understand the answers.
Maybe I'll have time for that in the next few days, maybe not.
Either way, better sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category></entry><entry><title>Coding 2025-10-16</title><link href="https://mwchase.neocities.org/coding-2025-10-16" rel="alternate"></link><published>2025-10-16T04:00:00-04:00</published><updated>2025-10-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-10-16:/coding-2025-10-16</id><summary type="html">&lt;p class="first last"&gt;In the &amp;quot;planning for an arbitrary amount of time&amp;quot; stage again...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm poking at the &amp;quot;glyph&amp;quot; implementation; my current plan is to represent negation with an overbar, and complex conjugate with a superscript asterisk.
For &lt;tt class="docutils literal"&gt;i&lt;/tt&gt;, where both do the same thing, I think I'll use the overbar.&lt;/p&gt;
&lt;p&gt;With that decided, I'm next pondering the &amp;quot;vector and matrix&amp;quot; concept.
Basically, I want to represent various kinds of, I believe the term I'm looking for is algebraic integer, using small vectors of integers (and sometimes rationals), which can be scaled up or down by the base by multiplying them by matrices of integers (and sometimes rationals).
Furthermore, in the complex case, some calculations will require an inner product of the vector of interest, and a base-dependent vector.
All of that's as may be, from a theoretical perspective, but I'm not sure what kind of implementation would be useful.
One problem is my urge to make everything general, when &lt;em&gt;none&lt;/em&gt; of the bases I'm currently considering would require vectors with more than three elements.
One thought I have here is that it's not the specific matrix representations I care about, it's the linear transformations for shrink, grow, shear, etc.
These transformations are specific to a particular base (even if the vector is in the same form for different bases, like Gaussian or Eisenstein integers).&lt;/p&gt;
&lt;p&gt;As I think about this, I find myself thinking about creating classes, and composition versus inheritance.
Perhaps I can sketch out the relationships between the different bases, and figure out what would best represent that.
(I think tossing everything together into inheritance would probably work, but I've got a good feeling about defining new class keyword arguments.)
But I can't trust myself to get this right unless I actually have some notes, instead of just keeping everything in my head.
I think I'll publish this and grab my notebook and try to get stuff together.&lt;/p&gt;
&lt;p&gt;But for sure, I need to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category></entry><entry><title>Coding 2025-10-15</title><link href="https://mwchase.neocities.org/coding-2025-10-15" rel="alternate"></link><published>2025-10-15T04:00:00-04:00</published><updated>2025-10-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-10-15:/coding-2025-10-15</id><summary type="html">&lt;p class="first last"&gt;I'm not afraid of giving away my secrets, because I'm skeptical this makes any sense if you didn't already know it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm on a bit of a time crunch because I took a melatonin ten minutes ago, so let's see if I can get some thoughts down really quickly.&lt;/p&gt;
&lt;p&gt;If you're converting an integer to a natural number base, you can either start generating digits from the least significant digit (modular arithmetic and division), or the most significant digit (divide it until it is less than the base, then determine the current digit, then multiply).
For algebraic bases, the most-significant-digit method seems easier to implement, because you're usually not going to know which digit is the least significant.
For complex bases, the least-significant-digit method seems easier to implement, because it seems that complex bases have fractal boundaries between digits, instead of, like, points.
I think using least-significant-digit for real integer bases seems somewhat more elegant, just because it's all remainder-less division, rather than dividing to create a fraction, then multiplying it back out.&lt;/p&gt;
&lt;p&gt;I've worked out a few bits of information to account for:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;When a maximal version of a base exists (which will be algebraic, and therefore use msd), the &amp;quot;width&amp;quot; of the interval to divide to fit in is one plus the base, rather than the base.&lt;/li&gt;
&lt;li&gt;Positive non-balanced bases use the half-open interval from 0 to the width.&lt;/li&gt;
&lt;li&gt;Balanced real bases (because complex bases don't use the width) use the open interval from minus half the width, to half the width.&lt;/li&gt;
&lt;li&gt;Negative non-balanced bases use a few easily-calculated functions of the base which I don't have my notes for in front of me.&lt;/li&gt;
&lt;li&gt;Numbers in real integer bases may be represented by a one-element vector.&lt;/li&gt;
&lt;li&gt;Numbers in complex integer bases may be represented by a two-element vector.&lt;/li&gt;
&lt;li&gt;Numbers in real algebraic bases may be represented by a vector with the same number of elements as the degree of the polynomial.&lt;/li&gt;
&lt;li&gt;The complex vector can be sheared into the real numbers and then worked with modulo the number of digits in the base.&lt;/li&gt;
&lt;li&gt;The algebraic vectors can &lt;em&gt;probably&lt;/em&gt; be manipulated to determine exactly whether specific thresholds are crossed, without relying on floating point.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And I'm also trying to hammer out some ideas for dealing with stuff like &amp;quot;a bunch of these bases have the same digits, but the vector representations are completely different, but in some way related to the specific digits&amp;quot;.&lt;/p&gt;
&lt;p&gt;I don't know exactly when I'll have time to really thoroughly work on this, but at least I managed to rewrite my code to patch attrs class magic methods so they can be used as an enum base class, to use &lt;tt class="docutils literal"&gt;aspectlib&lt;/tt&gt; instead of &lt;tt class="docutils literal"&gt;unittest.mock&lt;/tt&gt;.
Like, that's probably better, right?&lt;/p&gt;
&lt;p&gt;Anyway, I'm loopy now, so let's wrap this up and get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category></entry><entry><title>Weekly Roundup 2025-10-14</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-10-14" rel="alternate"></link><published>2025-10-14T04:00:00-04:00</published><updated>2025-10-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-10-14:/weekly-roundup-2025-10-14</id><summary type="html">&lt;p class="first last"&gt;Not a straightforward path. Nothing about this was quite straightforward.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I made a little progress on Impliciula.&lt;/li&gt;
&lt;li&gt;Thursday: I pushed myself a little harder than I could actually handle.&lt;/li&gt;
&lt;li&gt;Friday: I discussed an idea for yet another new project.&lt;/li&gt;
&lt;li&gt;Saturday: I put together a site for that project, and didn't accomplish much else.&lt;/li&gt;
&lt;li&gt;Sunday: I filled in a table manually for that project, and decided not to keep doing that.&lt;/li&gt;
&lt;li&gt;Monday: I started pondering &lt;em&gt;how&lt;/em&gt; to automate table generation and base conversion.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'll hopefully get something together on some project or other.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category></entry><entry><title>Coding 2025-10-13</title><link href="https://mwchase.neocities.org/coding-2025-10-13" rel="alternate"></link><published>2025-10-13T04:00:00-04:00</published><updated>2025-10-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-10-13:/coding-2025-10-13</id><summary type="html">&lt;p class="first last"&gt;And it's my college classes with the steel chair!&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's see how today is going.
I was kind of out of it for some reason.&lt;/p&gt;
&lt;p&gt;After last night, I want to figure out whether it's feasible to automate some of the work in doing weird base-dependant stuff.
So far, I've got a sketch of table generation, but I can't really use that unless I figure out how to automate base representation.
This isn't too hard for natural bases, but the whole point of this project is to mess around with stuff that's &lt;em&gt;un&lt;/em&gt;-natural.&lt;/p&gt;
&lt;p&gt;Let's see.
I want to work with real algebraic bases, real integer bases, complex integer bases, and balanced versions of both.&lt;/p&gt;
&lt;p&gt;Complex bases can be an issue due to moderately strange carries, algebraic bases can be an issue due to &lt;em&gt;really&lt;/em&gt; strange carries and the minimal/maximal distinction (which totally changes the behavior of digital roots, at least in base phi), and anything long-division-like runs into some snags both in balanced bases, and I think in any base below phi.
Although I'm mildly curious how other Pisot number bases work, I think I have to dial my initial expectations down to designing and using a toolbox, rather than getting it all to work perfectly for arbitrary bases.
That said...&lt;/p&gt;
&lt;p&gt;If a base is a root of a polynomial, it seems to me that representing a specific number should involve a Laurent polynomial that is a product of the base polynomial, provided that, if the target number is added to both sides, all of the coefficients are from the set of allowed digits.
Or something like that.
I'm not sure whether bringing in theory like this will make the implementation any easier, so I may just need to consider formal manipulations.&lt;/p&gt;
&lt;p&gt;The naive implementation would be to repeatedly add one to the representation, but as I think about it, I wonder whether constructing the base representation from binary, by multiplying by two and adding one as needed, would be workable.
The basic thing missing there for algebraic bases is how to canonicalize the representation.
The multiplication and adding would potentially produce arbitrary digits, in addition to disallowed digit sequences.
Waiting until the end to canonicalize would simply defer all of the actual work to the canonicalization step, so let's suppose we canonicalize early and canonicalize often.
The problem I have visualizing this is that algebraic bases don't seem to have an obvious direction to work in, since triggering a carry will change &lt;em&gt;less&lt;/em&gt; significant digits as well as more.
Another possibility would be...&lt;/p&gt;
&lt;p&gt;So, until the target number differs from a product of the base by one of the allowed digits, multiply the target number by the base.
Then, do long division from the least significant digit, like something with p-adics.
Getting this to work requires something like a vector representation of arbitrary digit sequences in the chosen base, along with matrix representations of multiplication and division by the base.
I haven't done the legwork, so I'm going to just kind of hope that all of the bases I'm interested in have a diagonalizable matrix, although I'm not actually sure how helpful that would be; it just seems probably helpful.&lt;/p&gt;
&lt;p&gt;I don't have a sense for how this would go in code, so I'm going to have to experiment with it by hand for a bit.
(Maybe it needs normal long division, if I can somehow tell that there's no more division to do.)&lt;/p&gt;
&lt;p&gt;Anyway, I want to wrap up and wind down.
Maybe later I'll have some more ideas for this.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category></entry><entry><title>Diary 2025-10-12</title><link href="https://mwchase.neocities.org/diary-2025-10-12" rel="alternate"></link><published>2025-10-12T04:00:00-04:00</published><updated>2025-10-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-10-12:/diary-2025-10-12</id><summary type="html">&lt;p class="first last"&gt;I sure hope I didn't make any typos filling in hundreds of cells.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I took things easy today, but I did make a little progress on a wiki.
I didn't do things in quite the way I was thinking yesterday, but I did lay out some tables.
That was obnoxious enough that I think I need to look into writing code to generate them.&lt;/p&gt;
&lt;p&gt;Anyway, I let things go late again, so I'm going to wrap up now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2025-10-11</title><link href="https://mwchase.neocities.org/diary-2025-10-11" rel="alternate"></link><published>2025-10-11T04:00:00-04:00</published><updated>2025-10-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-10-11:/diary-2025-10-11</id><summary type="html">&lt;p class="first last"&gt;I wasn't feeling great, so I kind of had to let this entry be a dud.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I decided to take things easy today, so I have nothing to write about.
I did start up a wiki for that project I mentioned, but it's private and doesn't have any actual content yet.
I think what I'm going to need to do for this wiki projects I have lying around is, go over what I have, and focus on identifying problems before articulating solutions.
Shift mental gears less, stuff like that.
Not doing that right now, though.&lt;/p&gt;
&lt;p&gt;I'd better wrap things up, because it's already late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2025-10-10</title><link href="https://mwchase.neocities.org/diary-2025-10-10" rel="alternate"></link><published>2025-10-10T04:00:00-04:00</published><updated>2025-10-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-10-10:/diary-2025-10-10</id><summary type="html">&lt;p class="first last"&gt;Feel free to attempt your own take on this idea. Some of the bases I have in mind are &lt;em&gt;gnarly&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Going to dash off a quick entry, because my focus/energy is still kind of... not what I want it to be.&lt;/p&gt;
&lt;p&gt;One thing that I've been pondering in the last week is the idea of a recreational math project themed around bases.
Like, you know how there's base-independent recreational math, like amicable numbers or perfect numbers, and there's base-dependent stuff, like palindromes, digit sums, that kind of thing?
Well, there are also efforts to develop various &amp;quot;weird&amp;quot; bases, and I wondered what it would look like to analyze the base-dependent properties and concepts in the context of &amp;quot;weird&amp;quot; bases.&lt;/p&gt;
&lt;p&gt;Right now, I'm trying to figure out how I'd want to present it.
I guess I'm currently trying to figure out what would have an engaging presentation, but not be too onerous to edit.
Is it going to be a wiki?
It might be a wiki.&lt;/p&gt;
&lt;p&gt;Anyway, I should get to bed now, and continue this line of thought later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2025-10-09</title><link href="https://mwchase.neocities.org/diary-2025-10-09" rel="alternate"></link><published>2025-10-09T04:00:00-04:00</published><updated>2025-10-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-10-09:/diary-2025-10-09</id><summary type="html">&lt;p class="first last"&gt;Oh man, I'm not yet operating at full capacity, this sucks.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Oh boy.
I ramped things up today, tried to get a bit more done than I did while I was sick, and now I'm just, so tired.
Feet sore.
Back hurting or something.
Eyes operating at somewhat diminished capacity.&lt;/p&gt;
&lt;p&gt;I'm just going to get ready for bed as soon as possible.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2025-10-08</title><link href="https://mwchase.neocities.org/coding-2025-10-08" rel="alternate"></link><published>2025-10-08T04:00:00-04:00</published><updated>2025-10-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-10-08:/coding-2025-10-08</id><summary type="html">&lt;p class="first last"&gt;Slow progress, but progress nonetheless.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I decided the simple solution was good enough, and named the &lt;tt class="docutils literal"&gt;Sequence&lt;/tt&gt; attributes &lt;tt class="docutils literal"&gt;initial_comp&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;binding&lt;/tt&gt;, and &lt;tt class="docutils literal"&gt;final_comp&lt;/tt&gt;, instead of *mumble mumble mumble*.&lt;/p&gt;
&lt;p&gt;I'm about ready to poke at the type attributes, but I'm really leery of trying to &amp;quot;just one more thing&amp;quot; this work right now.&lt;/p&gt;
&lt;p&gt;I don't have anything else in mind to do right now, so I'm just going to take things easy.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-10-07</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-10-07" rel="alternate"></link><published>2025-10-07T04:00:00-04:00</published><updated>2025-10-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-10-07:/weekly-roundup-2025-10-07</id><summary type="html">&lt;p class="first last"&gt;I'm back! I'd better not immediately burn back out.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I recovered a little, but not much.&lt;/li&gt;
&lt;li&gt;Thursday: Again.&lt;/li&gt;
&lt;li&gt;Friday: Again.&lt;/li&gt;
&lt;li&gt;Saturday: I played Kaizen and had some thoughts on it.&lt;/li&gt;
&lt;li&gt;Sunday: I played Strange Jigsaws and had some thoughts on it.&lt;/li&gt;
&lt;li&gt;Monday: I started poking at Impliciula again.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to keep doing stuff, even if I do seem to have some lingering illness still.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category></entry><entry><title>Coding 2025-10-06</title><link href="https://mwchase.neocities.org/coding-2025-10-06" rel="alternate"></link><published>2025-10-06T04:00:00-04:00</published><updated>2025-10-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-10-06:/coding-2025-10-06</id><summary type="html">&lt;p class="first last"&gt;Now that I can focus, it's time to get to work. Very slowly.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm methodically working through the different node types, and seeing if there are any changes I can make in the name of clarity.
So far, I've made some changes to the function nodes (abstraction and application) and I know I need to change the attribute names in the sequence node somehow, but I don't know to what.&lt;/p&gt;
&lt;p&gt;What we have in the sequence node is &lt;em&gt;an initial computation&lt;/em&gt;, which should return a value, which is substituted for &lt;em&gt;a variable&lt;/em&gt; in &lt;em&gt;the subsequent computation&lt;/em&gt;.
I have &lt;em&gt;pretty bad&lt;/em&gt; names for these, and I'm trying to come up with better ones.&lt;/p&gt;
&lt;p&gt;Right now, though, it's late, and I should get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Diary 2025-10-05</title><link href="https://mwchase.neocities.org/diary-2025-10-05" rel="alternate"></link><published>2025-10-05T04:00:00-04:00</published><updated>2025-10-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-10-05:/diary-2025-10-05</id><summary type="html">&lt;p class="first last"&gt;Another video game post. Maybe I'll work my way up to something else tomorrow. We'll see.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I kind of zoned out all day, appreciating how it &lt;em&gt;mostly&lt;/em&gt; doesn't hurt to breathe.&lt;/p&gt;
&lt;p&gt;While I zoned out, I bought and beat &lt;a class="reference external" href="https://store.steampowered.com/app/2702170/Strange_Jigsaws/"&gt;Strange Jigsaws&lt;/a&gt;.
Fun little afternoon diversion, though I did get randomly stuck on one of the puzzles, I want to say near the midpoint, but I'm not really sure.
Strange Jigsaws is accurately named, so if it sounds interesting, go for it.&lt;/p&gt;
&lt;p&gt;Anyway, it's late and I should keep getting rest.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2025-10-04</title><link href="https://mwchase.neocities.org/diary-2025-10-04" rel="alternate"></link><published>2025-10-04T04:00:00-04:00</published><updated>2025-10-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-10-04:/diary-2025-10-04</id><summary type="html">&lt;p class="first last"&gt;I've been playing games recently; why not talk about one of them?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Kaizen Kaizen Kaizen.&lt;/p&gt;
&lt;p&gt;Yeah, we all thought that wasn't ever going to happen again.
But I finally took the new not-Zachtronics game for a spin, and just-one-more-leveled my way through a good portion of the early game.&lt;/p&gt;
&lt;p&gt;My general impressions thus far are that this is probably the most approachable zachlike I've tried (synthesis, not coding; no transmutation; square grid; tracks don't turn; only have to handle one cycle (which also allows for a live preview of what happens); there's a limited and global bank of instruction slots; welding happens without an explicit instruction, but only where the player specifies; no player intervention is needed to output the product; I haven't needed to make use of a wildly specialized control scheme to play it on the Deck, and it should work equally well with just mouse), although I can guess at some of the tools that could show up if, as I assume, the back half of the game introduces some new tools.
(To be clear, &amp;quot;approachable&amp;quot; is not a pejorative.
If I want to get seriously challenged so I can show off my leet zachlike skillz, TIS-100 is still there for me.
Waiting.
Watching.
Mocking.)
Anyway, the core puzzle stuff feels nice, but the bundled solitaire game (it really is a not-Zachtronics game!) is beyond my comprehension and patience right now.&lt;/p&gt;
&lt;p&gt;And those are my initial impressions from playing the early stuff while mostly not sick.
It feels like it could be a solid introduction to the genre, which seems backwards, but oh well.&lt;/p&gt;
&lt;p&gt;Anyway, it's late now, and I'm going to wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2025-10-03</title><link href="https://mwchase.neocities.org/diary-2025-10-03" rel="alternate"></link><published>2025-10-03T04:00:00-04:00</published><updated>2025-10-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-10-03:/diary-2025-10-03</id><summary type="html">&lt;p class="first last"&gt;All of the really interesting stuff is going on at a microscopic level that I don't have the facilities to look at currently.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;My condition continues to improve, though I'm pretty sure I haven't gotten all the way back to my normal capabilities, even discounting that my throat is still messed up.
I'd like to get back into the swing of things, but I think that won't be possible or even truly desirable, until I &lt;em&gt;actually&lt;/em&gt; get all the way better.&lt;/p&gt;
&lt;p&gt;Not sure what else I could say for now.
Better wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2025-10-02</title><link href="https://mwchase.neocities.org/diary-2025-10-02" rel="alternate"></link><published>2025-10-02T04:00:00-04:00</published><updated>2025-10-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-10-02:/diary-2025-10-02</id><summary type="html">&lt;p class="first last"&gt;This better not suddenly reverse.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I feel things clearing up.
Not all the way recovered, for sure, but definitely improving.&lt;/p&gt;
&lt;p&gt;The quality of stuff to write about, however, is not.
I'm going to wrap things up and try to get slightly better sleep than in the past week.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2025-10-01</title><link href="https://mwchase.neocities.org/diary-2025-10-01" rel="alternate"></link><published>2025-10-01T04:00:00-04:00</published><updated>2025-10-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-10-01:/diary-2025-10-01</id><summary type="html">&lt;p class="first last"&gt;Here's hoping I can at least manage to enjoy the weekend.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I sort of assumed I'd get something done to write about today, and I honestly cannot account for how I thought that.
I think my health did somewhat improve over the course of the day, going from slowly eating breakfast because I figured I'd regret not eating breakfast, to eating as much dinner as I could manage, but at no point did I attain a level of health that I would describe as &amp;quot;good&amp;quot;.&lt;/p&gt;
&lt;p&gt;I'm going to go lie down, which, wow, what a change of pace.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-09-30</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-09-30" rel="alternate"></link><published>2025-09-30T04:00:00-04:00</published><updated>2025-09-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-09-30:/weekly-roundup-2025-09-30</id><summary type="html">&lt;p class="first last"&gt;I did my best not to over-exert myself in this state.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I laid out some ideas about making calendar calculations more straightforward, at least to implement in code.&lt;/li&gt;
&lt;li&gt;Thursday: I complained about, roughly speaking, the economy.&lt;/li&gt;
&lt;li&gt;Friday: I tried to put together plans for later.&lt;/li&gt;
&lt;li&gt;Saturday: I was sick.&lt;/li&gt;
&lt;li&gt;Sunday: I carried out those plans by rambling about hypothetical calendar systems for non-elliptical orbits.&lt;/li&gt;
&lt;li&gt;Monday: I was still sick.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, we'll see, since I'm currently still sick.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="calendars"></category></entry><entry><title>Diary 2025-09-29</title><link href="https://mwchase.neocities.org/diary-2025-09-29" rel="alternate"></link><published>2025-09-29T04:00:00-04:00</published><updated>2025-09-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-09-29:/diary-2025-09-29</id><summary type="html">&lt;p class="first last"&gt;Just sneezed all day. That's it, that's the post.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm now &lt;em&gt;less&lt;/em&gt; sick, but I'm definitely experiencing symptoms still.&lt;/p&gt;
&lt;p&gt;I don't remember doing anything today that I want to talk about.&lt;/p&gt;
&lt;p&gt;My head still feels funny.&lt;/p&gt;
&lt;p&gt;I'm going to wind down now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Tabletop Worldbuilding 2025-09-28</title><link href="https://mwchase.neocities.org/tabletop-worldbuilding-2025-09-28" rel="alternate"></link><published>2025-09-28T04:00:00-04:00</published><updated>2025-09-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-09-28:/tabletop-worldbuilding-2025-09-28</id><summary type="html">&lt;p class="first last"&gt;Tadpole orbits got short shrift, but that's in part because I was totally planning to read someone's thesis about them, and then I didn't.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;(This is getting away from the category name a bit, but it's in theme with the other entries, so... I'm just going to put off thinking about how to &amp;quot;fix&amp;quot; this until I forget that it's a thing.)&lt;/p&gt;
&lt;p&gt;Okay, I'm doing not-great, because it hurts to talk, but I'm still thinking about stuff, so let's get into it.&lt;/p&gt;
&lt;p&gt;I basically understand how to do year-related calculations for an Earth-like planet, in particular, one with a low orbital eccentricity, and nothing else in the vicinity strongly interfering with its orbit.
Anomalistic year combines with apsidal precession, giving mean sidereal year, which combines with axial precession to give the familiar tropical year.&lt;/p&gt;
&lt;p&gt;Suppose we have a planet with extreme orbital eccentricity.
In that case, the anomalistic year would be of primary concern (because part of the planet would be much warmer at pericenter), with the tropical year being secondary or irrelevan­t.
If the apsidal and axial precessions did not cancel, then there would also be a long-term cycle of libration of the warmest latitude at pericenter, oscillating between the tropics.
Things get confusing if the seasonal cycle is still relevant, because being near pericenter speeds up the sidereal and tropical years.&lt;/p&gt;
&lt;p&gt;What if the orbit weren't a straightforward ellipse?
What about tadpole orbits and horseshoe orbits?
Fair warning, I'm shooting from the hip here, because my attention span is not at my best right now.
The first thing I note is that &amp;quot;period in the rotating reference frame&amp;quot; takes the place of the anomalistic year, and &amp;quot;rotation of the reference frame&amp;quot; takes the place of apsidal precession.
For planets of comparable mass in a horseshoe orbit, this should be all that's needed for a decent mean sidereal year, which can then plug into everything else.
This is because the inner and outer orbits will have orbital periods within, say, two percent of each other, by Kepler's laws.
Although, given that I'm imagining someone on this hypothetical planet caring enough to get a calendar right, at some point someone will realize that the day length changes by like five seconds every thirty years or so, and this will &lt;em&gt;bother&lt;/em&gt; them.&lt;/p&gt;
&lt;p&gt;&amp;quot;Yes, yes, the other planet grew to the size of a second moon in the sky, then receded, but I'm more concerned about how all of my clocks are off by the same amount, and more every day. Wait, what if my &lt;em&gt;clocks&lt;/em&gt; are right and the &lt;em&gt;day&lt;/em&gt; is wrong?&amp;quot;&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;You're poised to corner the market on a &lt;em&gt;very&lt;/em&gt; specific sub-genre of science fiction.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Thank you.&lt;/p&gt;
&lt;p&gt;Anyway, now I'm trying to figure out what it would look like to have a very precise calendar with comparable masses, or a doesn't-get-extreme-anomaly calendar with different masses.
The first idea that comes to mind for me is to maintain two tropical calendars, one for each range of orbital distance, and somehow interpolate between. them.
However, since the switchover doesn't change the current season, there could be a &amp;quot;unified&amp;quot; calendar with a system of intercalation.
This would then leave the problem of how to determine when to switch, and how to keep the year right over long periods of time.&lt;/p&gt;
&lt;p&gt;However, I'm about done thinking about this for tonight, so I'll just let that question hang, and wrap things up for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Tabletop Worldbuilding"></category><category term="calendars"></category></entry><entry><title>Diary 2025-09-27</title><link href="https://mwchase.neocities.org/diary-2025-09-27" rel="alternate"></link><published>2025-09-27T04:00:00-04:00</published><updated>2025-09-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-09-27:/diary-2025-09-27</id><summary type="html">&lt;p class="first last"&gt;Siiiiiick&lt;/p&gt;
</summary><content type="html">&lt;p&gt;My throat has felt awful all day, and I've been dizzy and had trouble focusing, so I'm not even going to try to say anything interesting.
This weekend I'm going to be focusing on physical paper, when I'm not lying down waiting for my body to heal itself.
Uugh.&lt;/p&gt;
&lt;p&gt;No point in stretching this out.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2025-09-26</title><link href="https://mwchase.neocities.org/diary-2025-09-26" rel="alternate"></link><published>2025-09-26T04:00:00-04:00</published><updated>2025-09-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-09-26:/diary-2025-09-26</id><summary type="html">&lt;p class="first last"&gt;Something has to change.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Another day, another tenuous alignment between the things I'm &amp;quot;supposed to&amp;quot; be thinking about, the things that interest me, and actually putting anything into practice.
Let's lay stuff out so I can try to have a plan later:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Secret project that will never be elaborated upon here.&lt;/li&gt;
&lt;li&gt;Discussing Impliciula so I can refactor it a little.&lt;/li&gt;
&lt;li&gt;Various other Python projects, including MOTR and audio synthesis.&lt;/li&gt;
&lt;li&gt;The calendar stuff; I think what I need there is to focus on generating more tangible representations of this stuff.&lt;/li&gt;
&lt;li&gt;A confusing pile of writing projects. Perhaps I should just write &lt;em&gt;something&lt;/em&gt; and then figure out what it's &amp;quot;for&amp;quot; afterwards.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That's everything that's coming to mind right now.
I'll think it over in the morning.
Right now, I want to get to sleep, so I can hopefully avoid dealing with stuff like how messed up the skin on my hands is right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2025-09-25</title><link href="https://mwchase.neocities.org/diary-2025-09-25" rel="alternate"></link><published>2025-09-25T04:00:00-04:00</published><updated>2025-09-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-09-25:/diary-2025-09-25</id><summary type="html">&lt;p class="first last"&gt;I guess it's &amp;quot;swear in the blog&amp;quot; time again.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was wiped out like an hour ago, so I don't think I'm going to come up with anything big in the next half hour.&lt;/p&gt;
&lt;p&gt;I just...&lt;/p&gt;
&lt;p&gt;I'm so tired of listening to people talking about how we've got to be using The Slot Machine That Sometimes Induces Psychosis, because other people are using it &lt;em&gt;more&lt;/em&gt;, and we don't want to be using it &lt;em&gt;less&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;And meanwhile it makes statements that aren't even coincidentally correct.&lt;/p&gt;
&lt;p&gt;And meanwhile meanwhile, I remain gobsmacked by the implication that the thing holding back coding projects is the amount of code that can be produced, or rather, the rate of such production, or rather, &lt;em&gt;typing speed&lt;/em&gt;.
Perhaps such sentiments simply originate from not paying attention to how code is actually produced; from my &lt;em&gt;many&lt;/em&gt; project updates on this blog, I have simply started taking it as read that a novel design will take at least a week to flesh out, followed by a few hours of vigorous typing that will produce a rough artifact with a solid design, ready to refine along whatever metrics are desired.&lt;/p&gt;
&lt;p&gt;But ultimately, it keeps circling back to, why the &lt;em&gt;fuck&lt;/em&gt; is this being treated as an end in itself?
The time when &amp;quot;a computer made this&amp;quot; was a solid advertising gimmick was apparently from 1985 to 1988 (all right, perhaps &amp;quot;a computer &lt;em&gt;actually&lt;/em&gt; made this&amp;quot; had legs through the 90s), and if you want to claim some kind of productivity benefit, then &lt;em&gt;you'd better figure out how to measure productivity&lt;/em&gt;, hm?
Such knowledge will even be useful in a few years time when this whole thing messily implodes.&lt;/p&gt;
&lt;p&gt;I don't want to be complaining like this, but I think the blame has to go on the people who will not let us &lt;em&gt;stop thinking about this bullshit&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to try to sleep soon.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Tabletop Worldbuilding 2025-09-24</title><link href="https://mwchase.neocities.org/tabletop-worldbuilding-2025-09-24" rel="alternate"></link><published>2025-09-24T04:00:00-04:00</published><updated>2025-09-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-09-24:/tabletop-worldbuilding-2025-09-24</id><summary type="html">&lt;p class="first last"&gt;As far as units go, &amp;quot;hundreds of nanohertz&amp;quot; feels pretty cursed for how structurally simple it is.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;This post isn't too related to the specifics of this project, but I realized something recently and I want to see if it makes sense as a way to approach projects like this.
When it comes to developing a calendar, it's possible to end up considering multiple different kinds of day, month, and year, with intimidating-looking &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Sidereal_time#Sidereal_days_compared_to_solar_days_on_other_planets"&gt;formulas&lt;/a&gt; to convert between them.
Look at all of the nesting, and the subtraction hidden right in the middle.
But if we switch our perspective from &amp;quot;the duration of a celestial event&amp;quot; to &amp;quot;the frequency of changes between instances of the celestial event&amp;quot;, then the formula simplifies into a simple subtraction: the &amp;quot;solar day frequency&amp;quot; is equal to the &amp;quot;sidereal day frequency&amp;quot; minus the &amp;quot;orbital frequency&amp;quot;.
If we think entirely in terms of frequencies, then tidal locking results in a &amp;quot;solar day frequency&amp;quot; of 0, which feels a lot nicer to me than &amp;quot;the day length is... oops, divided by 0&amp;quot;.&lt;/p&gt;
&lt;p&gt;Looking at the various months associated with the moon, it's my impression that nearly every calculation involved in this can be simplified by considering the frequency instead of the period, and then not converting back until the end (when people would rather see &amp;quot;twenty-whatever days&amp;quot; than &amp;quot;four hundred-ish nanohertz&amp;quot;), or not even really then, simply dividing day frequency by month frequency, rather than month length by day length.&lt;/p&gt;
&lt;p&gt;I'm a little tempted to take this in a crank direction of, like, &amp;quot;why don't they put it in these terms?&amp;quot; but for one thing, reciprocal-based formulas do seem to be known, and for another, like, nobody has a reason to listen to me on this beyond &amp;quot;hey, let's try it out&amp;quot;, so, like, if you're doing calendar worldbuilding based on this kind of epicycle-inducing rotate-y stuff, give this a shot and see what you think.
I will say that this seems much more suited for spreadsheets or some other programming language, than for manual computation, but then, manually computing this stuff is kind of a chore if you're not doing the calculations for their own sake.&lt;/p&gt;
&lt;p&gt;Anyway, it's getting late and I should wrap up, just wanted to get some thoughts out.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Tabletop Worldbuilding"></category><category term="calendars"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-09-23</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-09-23" rel="alternate"></link><published>2025-09-23T04:00:00-04:00</published><updated>2025-09-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-09-23:/weekly-roundup-2025-09-23</id><summary type="html">&lt;p class="first last"&gt;A decent week, ruined by a faceful of dust or something, probably.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I started really looking at the &lt;tt class="docutils literal"&gt;ruff check&lt;/tt&gt; issues in my code, and disputed some of them.&lt;/li&gt;
&lt;li&gt;Thursday: I kept on with that, but I also found and fixed a weird bug in my code.&lt;/li&gt;
&lt;li&gt;Friday: I attempted malicious compliance with a lint error, which is not a good idea, and also brought in &lt;tt class="docutils literal"&gt;deal&lt;/tt&gt; as a dependency so you can't &lt;em&gt;tell&lt;/em&gt; I'm writing assert statements.&lt;/li&gt;
&lt;li&gt;Saturday: I began to realize that I was using an old version of &lt;tt class="docutils literal"&gt;ruff&lt;/tt&gt;, and way more lint errors appeared.&lt;/li&gt;
&lt;li&gt;Sunday: The lints are done, so, um, now what?&lt;/li&gt;
&lt;li&gt;Monday: Head feel bad.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to do more stuff away from my screen, whether that means putting down current projects, or figuring out how to get the pertinent details down on paper.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category></entry><entry><title>Diary 2025-09-22</title><link href="https://mwchase.neocities.org/diary-2025-09-22" rel="alternate"></link><published>2025-09-22T04:00:00-04:00</published><updated>2025-09-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-09-22:/diary-2025-09-22</id><summary type="html">&lt;p class="first last"&gt;Auuugh. Skip.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I thought I was doing all right today, but something is sapping my focus and making it hard to breathe, so, guess I didn't do anything worth writing about because my head hurt.&lt;/p&gt;
&lt;p&gt;Um, guess I'll go brush now, and go lie down until the hurting stops.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2025-09-21</title><link href="https://mwchase.neocities.org/coding-2025-09-21" rel="alternate"></link><published>2025-09-21T04:00:00-04:00</published><updated>2025-09-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-09-21:/coding-2025-09-21</id><summary type="html">&lt;p class="first last"&gt;Wow, I'm kind of tired after all that. What a surprise.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got linting to pass, partially by making principled changes in response to the reports, but mostly by disabling lints that I disagreed with.
(There was one that I disagreed with &lt;em&gt;a lot&lt;/em&gt;.)
Now, I can work on this Impliciula more, or pick up something else.
Let's see what I can do here...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I can work on increasing coverage, but writing tests for existentials requires first figuring out whether I need to implement new value types.&lt;/li&gt;
&lt;li&gt;I have a general idea for making test code shorter and a little less fiddly, but it needs a lot of planning and prep work to make sure it isn't a complete mess.&lt;/li&gt;
&lt;li&gt;I can try to improve documentation, but that also requires planning, and also some of my generated docstrings might be a little screwy, according to Sphinx.
And also there are just plainly some typos in this documentation because I tried to skimp on writing proper ReST.&lt;/li&gt;
&lt;li&gt;For that matter, my naming conventions are kind of bad, and also not really conventions.&lt;/li&gt;
&lt;li&gt;Trying to remember if there was anything else.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I definitely need a break now.
Going to wrap up early and try to zone out with something unrelated.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-09-20</title><link href="https://mwchase.neocities.org/coding-2025-09-20" rel="alternate"></link><published>2025-09-20T04:00:00-04:00</published><updated>2025-09-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-09-20:/coding-2025-09-20</id><summary type="html">&lt;p class="first last"&gt;Regretting the decisions of my various past selves.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm almost done resolving lint errors, and once I figure out how to deal with this last batch of them, I just... need to resolve a few more.
The &amp;quot;few more&amp;quot; are from pydoclint and—&lt;/p&gt;
&lt;p&gt;Aw heck, I just realized I was focusing on &lt;tt class="docutils literal"&gt;src&lt;/tt&gt;, and &lt;tt class="docutils literal"&gt;tests&lt;/tt&gt; has like a hundred more errors.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;I think it's time for another break.
I'll figure this stuff out later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-09-19</title><link href="https://mwchase.neocities.org/coding-2025-09-19" rel="alternate"></link><published>2025-09-19T04:00:00-04:00</published><updated>2025-09-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-09-19:/coding-2025-09-19</id><summary type="html">&lt;p class="first last"&gt;I'm still not sure some of these actually improved things.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm still grinding through the lint errors.
I ended up trying to go through all of the &amp;quot;missing docstring&amp;quot; errors on a per-function-name basis, because switching between them was too obnoxious, but that's left me in a state where I'm staring at a bunch of non-docstring errors and not quite sure what to do.&lt;/p&gt;
&lt;p&gt;It doesn't want me to rebind &lt;tt class="docutils literal"&gt;self&lt;/tt&gt;.
So I changed it to &lt;tt class="docutils literal"&gt;self_ = ...&lt;/tt&gt; and put a &lt;tt class="docutils literal"&gt;del self&lt;/tt&gt; line after the assignment.
This is better, I guess?&lt;/p&gt;
&lt;p&gt;Next up is the various places I used assert statements.
I'm trying to switch over to using &lt;tt class="docutils literal"&gt;deal&lt;/tt&gt;, but looking over this, I'm a little confused as to why I only did this precondition check on a small number of method implementations.
I'll have to think about this.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, I got more and more lints taken care of, and now I'm running into stuff like &amp;quot;how do I document a protocol that's just like, 'you need to have this one method'?&amp;quot;
I will try to figure this out later, because right now it is late and I need to sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-09-18</title><link href="https://mwchase.neocities.org/coding-2025-09-18" rel="alternate"></link><published>2025-09-18T04:00:00-04:00</published><updated>2025-09-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-09-18:/coding-2025-09-18</id><summary type="html">&lt;p class="first last"&gt;If the information in this post is useful to you, you have my condolences.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm still poking at lint errors, and making slow progress.
Part of the reason it wasn't faster was because I hit a bad interaction in all of the metaprogramming I'm doing.&lt;/p&gt;
&lt;p&gt;Basically, for some node types, there's an inherited public method that forwards to an overridden private method, right?
And I was trying to inject documentation from the private method into a copy of the public method.
But I was doing this in &lt;tt class="docutils literal"&gt;__init_subclass__&lt;/tt&gt;, which should have been fine, except that all of the leaf classes that need this are &lt;tt class="docutils literal"&gt;attrs&lt;/tt&gt; classes, which gets you two classes per class.
This is why all of my documentation was getting injected twice: first it gets injected in the non-slots class that is input to &lt;tt class="docutils literal"&gt;attrs.frozen&lt;/tt&gt;, then it gets injected again when the method is referenced in the new slots class in the output.&lt;/p&gt;
&lt;p&gt;I opted to fix this by simply keeping a list of private implementations on the public copy.
This seems to work, but maybe I'll notice something weird later.&lt;/p&gt;
&lt;p&gt;Anyway, it's late, gotta sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-09-17</title><link href="https://mwchase.neocities.org/coding-2025-09-17" rel="alternate"></link><published>2025-09-17T04:00:00-04:00</published><updated>2025-09-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-09-17:/coding-2025-09-17</id><summary type="html">&lt;p class="first last"&gt;Discussing this code with others got one function definition a &amp;quot;I'm not as upset as I expected I'd be if you showed me.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So.&lt;/p&gt;
&lt;p&gt;I got started late, and I've got melatonin about to kick in, because for a while last night I just... didn't sleep, and I didn't like that at all.&lt;/p&gt;
&lt;p&gt;Right now, I'm poking at all of the errors that &lt;tt class="docutils literal"&gt;ruff check&lt;/tt&gt; is reporting, and disagreeing with a bunch of them, from somewhat valid reasons like &amp;quot;I'm not going to explain what &lt;tt class="docutils literal"&gt;__str__&lt;/tt&gt; is for here and now&amp;quot; to &lt;em&gt;interesting&lt;/em&gt; reasons like &amp;quot;If I don't format the docstring in this bizarre way, it breaks the metaprogramming I just spent a few days on&amp;quot;.&lt;/p&gt;
&lt;p&gt;In any case, it's late, and I just got to &amp;quot;I feel like I have a very good reason to rebind &lt;tt class="docutils literal"&gt;self&lt;/tt&gt;, but at the same time, I kind of feel like maybe some of these &lt;tt class="docutils literal"&gt;noqa&lt;/tt&gt; comments need &lt;em&gt;some&lt;/em&gt; explanation in the code?&amp;quot;&lt;/p&gt;
&lt;p&gt;The most important thing is that it's late, and the melatonin has well and truly kicked in at this point.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-09-16</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-09-16" rel="alternate"></link><published>2025-09-16T04:00:00-04:00</published><updated>2025-09-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-09-16:/weekly-roundup-2025-09-16</id><summary type="html">&lt;p class="first last"&gt;Well, I got &lt;em&gt;something&lt;/em&gt; done. I feel like I use that for a summary a lot...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I wasn't really focused.&lt;/li&gt;
&lt;li&gt;Thursday: Same deal.&lt;/li&gt;
&lt;li&gt;Friday: I still wasn't really focused, but I sort of talked about some things.&lt;/li&gt;
&lt;li&gt;Saturday: I took some notes and made some plans for documentation-related metaprogramming in Impliciula.&lt;/li&gt;
&lt;li&gt;Sunday: I took some notes on very niche worldbuilding stuff.&lt;/li&gt;
&lt;li&gt;Monday: I put the metaprogramming into practice, and started addressing lint errors in Impliciula.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to keep on grinding out stuff for Impliciula, and probably do some writing that I may or may not post about.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category><category term="worldbuilding"></category></entry><entry><title>Coding 2025-09-15</title><link href="https://mwchase.neocities.org/coding-2025-09-15" rel="alternate"></link><published>2025-09-15T04:00:00-04:00</published><updated>2025-09-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-09-15:/coding-2025-09-15</id><summary type="html">&lt;p class="first last"&gt;I just did it. It's done. Now it's time to do everything else.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm getting an early start on the entry today, because writing the entry means I have to work on a project to have something to write about.
Anyway, here we go, documentation.&lt;/p&gt;
&lt;p&gt;Python docstrings are stored exactly as they are represented in source code, and, if I recall correctly, reformatted as part of displaying help.
This means that all of the &lt;tt class="docutils literal"&gt;__doc__&lt;/tt&gt; attributes I'm working with will have a trailing line of all whitespace, with no newline at the end.
And a leading line with no indentation, and, because I'm generating method documentation, the remaining lines start at eight spaces worth of indentation.&lt;/p&gt;
&lt;p&gt;Now, consider the parts of the docstring:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Short description&lt;/li&gt;
&lt;li&gt;Long description&lt;/li&gt;
&lt;li&gt;Parameter and return documentation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, the parameter and return documentation should be on the &amp;quot;template&amp;quot; docstring, which should also contain the short description.
Thinking more about the short description, I thought I wanted the name to be templated in, but I changed my mind.
(Not putting the class names back.)
This means I don't need to worry about the kinding helpers, and can focus on the typing code.&lt;/p&gt;
&lt;p&gt;I want the private implementation functions to just provide the long description.
If the implementations start with a blank line, have another blank line, and then the long description, then the &amp;quot;template&amp;quot; can simply interpolate the implementation documentation at the end of the first line, before the newline.
Checking the behavior of strings when I copy and paste around, the final blank line of the implementation should be removed.
(I suppose unless the template doesn't contain a newline, but it... should.)&lt;/p&gt;
&lt;p&gt;All right, I've written a helper function to interleave all of this stuff properly.
Now, I need to work out the &amp;quot;right&amp;quot; way to deep copy a function so I can give it a new docstring.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;I found something on StackOverflow; it's probably fine.&lt;/p&gt;
&lt;p&gt;The tests still pass, at least, although I did need to shove a bunch of typing ignores in.&lt;/p&gt;
&lt;p&gt;Anyway, I figured I'd try to grind through the lint errors for a bit, and I need to ponder some of them before I move on, so I'm going to wind down for now and see what I think when I get back to it.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category></entry><entry><title>Tabletop Worldbuilding 2025-09-14</title><link href="https://mwchase.neocities.org/tabletop-worldbuilding-2025-09-14" rel="alternate"></link><published>2025-09-14T04:00:00-04:00</published><updated>2025-09-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-09-14:/tabletop-worldbuilding-2025-09-14</id><summary type="html">&lt;p class="first last"&gt;To determine whether this post is for you, please consider whether &amp;quot;I did the octal conversions in my head, and got them right first try.&amp;quot; sounds bragworthy.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Let's just dump some notes on stuff in a category.&lt;/p&gt;
&lt;p&gt;I've got a few solo campaign ideas in different systems kicking around, and one place where I tend to go above and beyond the recommendations of the rules—&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Way too far, you mean.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;—is in designing calendars.
Dates, calendars, and holidays have always fascinated me and drawn my focus.
This is an artificial system to keep track of natural events, but it also reflects and influences our culture, and even the world around us.
I remember hearing about how some aspects of the weather are essentially on a seven-day cycle because they're influenced by human activity.&lt;/p&gt;
&lt;p&gt;So, although it &amp;quot;is easy to keep track of&amp;quot; and &amp;quot;legible to general audiences&amp;quot; to either avoid dates, or to provide a relex of &amp;quot;normal&amp;quot; (read &amp;quot;Gregorian or &lt;em&gt;maybe&lt;/em&gt; Julian&amp;quot;) calendars when it comes to physical worlds, I like to see something more involved, in part because it situates the cultures that devised the calendar in the reality of their world, but honestly it's probably mostly that I like messing with the numbers.&lt;/p&gt;
&lt;p&gt;With that background established, let's take some notes on the setting for a solo campaign that is... really not getting off the ground, for &lt;em&gt;mysterious reasons&lt;/em&gt;...&lt;/p&gt;
&lt;p&gt;(One brief disclaimer: none of this is admissable as a source for your homework or any other work; do your own research.)&lt;/p&gt;
&lt;p&gt;I wanted to set the campaign on an Earthlike planet, but instead of giving it one moon-size moon, it has three smaller moons in Laplace resonance.
The moons are all collinear once every sidereal month of the middle moon, so we ensure that it has an orbital period somewhat close to a month, to try to have something like spring tides.
(This doesn't work astoundingly well because spring tides just rely on the synodic month when there's one moon, but having moons in resonance like this means that the sidereal months matter; possibly to deal with this, I will at some point endeavor to construct a synodic/sidereal lunar calendar specifically for tracking tidal effects.)&lt;/p&gt;
&lt;p&gt;Because there are so many moons, and therefore also so many things that a moon could relate to, there are many possible options for calendars, moreso than the many options for calendars on Earth.
The two initial ideas I came up with were a synodic calendar based around the inner moon with eight-day weeks, and a solar calendar that relates in some way to the synodic cycle of the middle moon, with six-day weeks.
I haven't touched the latter in a while, and I've forgotten some of the details, so let's look at the former.&lt;/p&gt;
&lt;p&gt;The days on this planet are slightly longer than on Earth, but near enough that using a twenty-four hour day results in an hour basically comparable to our own.
This is what I call a concession to legibility.
(And human-like physiology.)
The long day just slightly overcorrects for a longer year, meaning that the tropical year of the planet is just over 361 and a third solar days.
The synodic months of the moons are not-quite-sixteen days, not-quite-thirty-three days, and not-quite-seventy-and-one-half days.&lt;/p&gt;
&lt;p&gt;So, each synodic month of the inner moon is just over two eight-day weeks.
The accumulated error is very close to one day after eight months.
To account for &amp;quot;sixteen days&amp;quot; sounding different from &amp;quot;a month&amp;quot;, I call these sixteen-day periods &amp;quot;hextnights&amp;quot;.
Because &amp;quot;sextnights&amp;quot; sounds like a drastically different thing.
I decide to have units of 8 hextnights called a &amp;quot;lunar season&amp;quot;, in which one hextnight (probably the last one) is shortened by a day to account for drift.&lt;/p&gt;
&lt;p&gt;Three lunar seasons is one or two hextnights longer than a tropical year, but I'd rather work with constant-length seasons, so I just accept that the lunar year is longer than it &amp;quot;could be&amp;quot;.
The lunar year is a decent approximation to the lunar cycle, requiring a further-shortened hextnight only around once every three hundred years.
(This allows me to create a completely unintuitive meaning for the idiom &amp;quot;once a fortnight&amp;quot;, and I'm very tempted to take that opportunity.)&lt;/p&gt;
&lt;p&gt;I like this lunar year as a basis for a liturgical calendar, but I also want to adapt it do a solar civil setup.
For this, I figured each solar year would be assigned 22 or 23 hextnights, depending on when the spring equinox falls relative to the full moon, and assigned a pair of numbers: 1 to 23 for the position in the year, and 1 to 8 for the position in the lunar season.&lt;/p&gt;
&lt;p&gt;Putting this all together, we could end up with a date like:
&amp;quot;CY 3307, Hx 13, 4/8, Waxing Week, Fifth Day (LY 4189, Fire Season)&amp;quot;
(Or, if we go hardcore on the octal, &amp;quot;CY 6353, Hx 15, 4/10, Waxing Week, Fifth Day (LY 10135, Fire Season)&amp;quot;)
And I think that's neat.&lt;/p&gt;
&lt;p&gt;Anyway, I spent way too long on this.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Tabletop Worldbuilding"></category><category term="calendars"></category><category term="lunar"></category><category term="solar"></category><category term="Laplace Resonance"></category></entry><entry><title>Coding 2025-09-13</title><link href="https://mwchase.neocities.org/coding-2025-09-13" rel="alternate"></link><published>2025-09-13T04:00:00-04:00</published><updated>2025-09-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-09-13:/coding-2025-09-13</id><summary type="html">&lt;p class="first last"&gt;Planning weird Python code in order to feel alive.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's see what I've got in the node classes.
There are three classes that have two methods of interest each.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;ValueType&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;CompTerm&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;ValueTerm&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each of them has a pair of inference/check methods, and the &lt;tt class="docutils literal"&gt;*Term&lt;/tt&gt; classes have the template pattern kind of deal where there's a private abstract method, with a public interface that calls the private method with some boilerplate.
In every case, there are predefined method implementations.&lt;/p&gt;
&lt;p&gt;In every case, I want to have some way to substitute the class name into the documentation for the predefined method.
And in the &lt;tt class="docutils literal"&gt;*Term&lt;/tt&gt; types, I want the &lt;em&gt;public&lt;/em&gt; documentation to reflect what's written on the private implementation.&lt;/p&gt;
&lt;p&gt;Before I think too hard about this, I'm going to make the change that this all suggests: properly naming all of the &lt;tt class="docutils literal"&gt;*Type&lt;/tt&gt; subclasses, rather than just relying on the fact that they're unique within their module and just calling them &amp;quot;&lt;tt class="docutils literal"&gt;Type&lt;/tt&gt;&amp;quot;.&lt;/p&gt;
&lt;p&gt;The next step, which I won't take tonight, is to write &lt;tt class="docutils literal"&gt;__init_subclass__&lt;/tt&gt; methods on the classes, and create copies of the public methods of interest, with updated documentation.
This is another case of &amp;quot;something I need to think carefully about&amp;quot;, so maybe I'll switch gears for a bit tomorrow.
We'll see.
For now, bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category></entry><entry><title>Diary 2025-09-12</title><link href="https://mwchase.neocities.org/diary-2025-09-12" rel="alternate"></link><published>2025-09-12T04:00:00-04:00</published><updated>2025-09-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-09-12:/diary-2025-09-12</id><summary type="html">&lt;p class="first last"&gt;I want more focus...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did some investigation into stuff I'll need for documenting Impliciula, but I didn't take any of the notes that I need to properly plan it.&lt;/p&gt;
&lt;p&gt;I did, however, mess around more with worldbuilding stuff.
I'm doing stuff with fictional calendars, and I've got a bunch of fictional but (probably) basically mathematically sound orbital parameters, and I'm using them to work out good patterns of intercalation.
I just now wrote some helper functions for dealing with continued fractions.
Now I need to work on getting a better idea of how good an approximation needs to be; I've got some approximations that are good in the short term, but start getting notably off after around 300 years, at which point the fact that they &lt;em&gt;used to&lt;/em&gt; be good is no consolation.&lt;/p&gt;
&lt;p&gt;If I have proper focus tomorrow, I can put in more work on one or both of these, or on one of the other projects I have drifting around.
For now, I really need to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2025-09-11</title><link href="https://mwchase.neocities.org/diary-2025-09-11" rel="alternate"></link><published>2025-09-11T04:00:00-04:00</published><updated>2025-09-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-09-11:/diary-2025-09-11</id><summary type="html">&lt;p class="first last"&gt;Nothing interesting here.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was pretty sore and unfocused today; I ended up just tracking down some old worldbuilding stuff that I want to mess with.
There's nothing much to say for now.&lt;/p&gt;
&lt;p&gt;I'm dragging my feet on getting ready for bed, but I should just do it.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2025-09-10</title><link href="https://mwchase.neocities.org/diary-2025-09-10" rel="alternate"></link><published>2025-09-10T04:00:00-04:00</published><updated>2025-09-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-09-10:/diary-2025-09-10</id><summary type="html">&lt;p class="first last"&gt;Probably you want to skip this.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was thinking about stuff to do for coding, but I ended up zoning out and taking things easy.
Maybe I'll work on things tomorrow, maybe I'll keep taking things easy.
Either way, I should wrap up now before I have problems.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-09-09</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-09-09" rel="alternate"></link><published>2025-09-09T04:00:00-04:00</published><updated>2025-09-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-09-09:/weekly-roundup-2025-09-09</id><summary type="html">&lt;p class="first last"&gt;Taking two projects, and procrastinating on each one with the other. Also I had a migraine or something. Ssh.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I didn't really do things, so I tried to &lt;em&gt;plan&lt;/em&gt; things.&lt;/li&gt;
&lt;li&gt;Thursday: I picked working on MOTR, and ended up just updating it to maintain Mypy compatibility.
I did figure out what I want to cover, but not how to cover it.&lt;/li&gt;
&lt;li&gt;Friday: I didn't do much, but I did write some stuff up that I didn't show off.&lt;/li&gt;
&lt;li&gt;Saturday: I did the easy test updates for simply-typed lambda calculus and system f in Impliciula.&lt;/li&gt;
&lt;li&gt;Sunday: I updated the remaining tests, and tried to work out how existential types do useful things.&lt;/li&gt;
&lt;li&gt;Monday: I hopefully fixed a bug around existential types, and tried to figure out what my next priority should be for Impliciula.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I will either endeavor to properly document Impliciula, figure out some aspect of what is going on with MOTR, or do something else entirely.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="MOTR"></category><category term="Impliciula"></category></entry><entry><title>Coding 2025-09-08</title><link href="https://mwchase.neocities.org/coding-2025-09-08" rel="alternate"></link><published>2025-09-08T04:00:00-04:00</published><updated>2025-09-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-09-08:/coding-2025-09-08</id><summary type="html">&lt;p class="first last"&gt;Getting ready to eat my vegetables...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I confirmed that I should have known about the issue I found with existential types, and put together a fix (untested) for it.
Now, I'm considering where to go next.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Well, it would be nice to get more coverage on the existential types module than just importing it.&lt;/li&gt;
&lt;li&gt;But, important question, can I get any meaningful tests written when I just have the unit type?&lt;/li&gt;
&lt;li&gt;If not, before writing more types, I want to actually try to dig myself out of the documentation hole I'm in.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I don't want to mess around with this right now, so I'm going to wind down now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-09-07</title><link href="https://mwchase.neocities.org/coding-2025-09-07" rel="alternate"></link><published>2025-09-07T04:00:00-04:00</published><updated>2025-09-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-09-07:/coding-2025-09-07</id><summary type="html">&lt;p class="first last"&gt;I think I read this already, and simply didn't understand it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The tests all pass, I've got 93% branch coverage and 85% mutation coverage, and, while there are various things that make sense to do, right now I'm focused on, what even &lt;em&gt;is&lt;/em&gt; the existential types code doing?
So, let's crack it open, and see if I can sort it out into something that makes sense to me.&lt;/p&gt;
&lt;p&gt;The existential types module defines three classes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Type&lt;/tt&gt;, a value type representing existential types.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Pack&lt;/tt&gt;, a value that can be checked against &lt;tt class="docutils literal"&gt;Type&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Unpack&lt;/tt&gt;, a computation that wraps a value.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let's start with &lt;tt class="docutils literal"&gt;Pack&lt;/tt&gt;.
An instance of &lt;tt class="docutils literal"&gt;Pack&lt;/tt&gt; is just a pair of a value type and a value.
The value type and value are not inherently related.&lt;/p&gt;
&lt;p&gt;Instead, given a &lt;tt class="docutils literal"&gt;Type&lt;/tt&gt;, which combines a type variable, the kind of that type variable, and a value type expression, the &lt;tt class="docutils literal"&gt;Pack&lt;/tt&gt; is an instance of the &lt;tt class="docutils literal"&gt;Type&lt;/tt&gt; if, when the &lt;tt class="docutils literal"&gt;Pack&lt;/tt&gt;'s wrapped value type is substituted for the &lt;tt class="docutils literal"&gt;Type&lt;/tt&gt;'s type variable in the &lt;tt class="docutils literal"&gt;Type&lt;/tt&gt;'s value type expression, the &lt;tt class="docutils literal"&gt;Pack&lt;/tt&gt;'s wrapped value can be checked against the resulting value type.
Clear as mud?&lt;/p&gt;
&lt;p&gt;Now, to actually use a &lt;tt class="docutils literal"&gt;Pack&lt;/tt&gt; in computation, we need an &lt;tt class="docutils literal"&gt;Unpack&lt;/tt&gt;, which has an absurd number of attributes.
The key thing is that it allows constructing a &lt;tt class="docutils literal"&gt;Type&lt;/tt&gt; (this differs from a pure type inference setup, in which the &lt;tt class="docutils literal"&gt;Pack&lt;/tt&gt; must specify its own type), has a variable associated with it, and contains a &lt;tt class="docutils literal"&gt;Pack&lt;/tt&gt;, as well as the actual computation, which has the variable and type variable free.
Evaluating the &lt;tt class="docutils literal"&gt;Unpack&lt;/tt&gt; involves substituting the &lt;tt class="docutils literal"&gt;Pack&lt;/tt&gt; values for the variables in the computation, and then evaluating &lt;em&gt;that&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;To make this of general interest, note that the contained &lt;tt class="docutils literal"&gt;Pack&lt;/tt&gt; can actually be a variable, in which case the &lt;tt class="docutils literal"&gt;Unpack&lt;/tt&gt; could be, for example, the body of a function, and then different behavior could be obtained by passing in different &lt;tt class="docutils literal"&gt;Pack&lt;/tt&gt; values, which are only constrained to match the &lt;tt class="docutils literal"&gt;Type&lt;/tt&gt; of the function argument; the packed values and types can vary freely as long as they conform to the &lt;tt class="docutils literal"&gt;Type&lt;/tt&gt;.
This is backed up by the fact that the inferred type of an &lt;tt class="docutils literal"&gt;Unpack&lt;/tt&gt; node is independent of the contents of the packed value.&lt;/p&gt;
&lt;p&gt;However, for the type inference to work, the &lt;tt class="docutils literal"&gt;Unpack&lt;/tt&gt;'s variable has to be bound to the value type expression without substituting any type for the type variable, and then the computation must infer a type that doesn't depend on the type variable, which... hm.
My code might be wrong?
But subtly.&lt;/p&gt;
&lt;p&gt;Figuring out what makes sense requires some kind of actual example.&lt;/p&gt;
&lt;p&gt;All right, let's suppose we have a &lt;tt class="docutils literal"&gt;p = Pack(unit, &lt;span class="pre"&gt;Thunk(Abstraction(Variable(&amp;quot;x&amp;quot;),&lt;/span&gt; &lt;span class="pre"&gt;Return(unit(None)))))&lt;/span&gt;&lt;/tt&gt;.
Among other &lt;tt class="docutils literal"&gt;Type&lt;/tt&gt;s, this satisfies &lt;tt class="docutils literal"&gt;Type(T, TYPE_KIND, ThunkType(FuncType(T, &lt;span class="pre"&gt;ReturnType(T))))&lt;/span&gt;&lt;/tt&gt;.
So we can have &lt;tt class="docutils literal"&gt;Unpack(T, TYPE_KIND, &lt;span class="pre"&gt;Variable(&amp;quot;f&amp;quot;),&lt;/span&gt; ThunkType(FuncType(T, &lt;span class="pre"&gt;ReturnType(T))),&lt;/span&gt; p, UMMMM)&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Okay, that didn't work, let's try again.
&lt;tt class="docutils literal"&gt;p = Pack(unit, &lt;span class="pre"&gt;Thunk(Abstraction(Variable(&amp;quot;x&amp;quot;),&lt;/span&gt; &lt;span class="pre"&gt;Return(bool(True)))))&lt;/span&gt;&lt;/tt&gt;.
&lt;tt class="docutils literal"&gt;Type(T, TYPE_KIND, ThunkType(FuncType(T, &lt;span class="pre"&gt;ReturnType(bool))))&lt;/span&gt;&lt;/tt&gt;.
&lt;tt class="docutils literal"&gt;Unpack(T, TYPE_KIND, &lt;span class="pre"&gt;Variable(&amp;quot;f&amp;quot;),&lt;/span&gt; ThunkType(FuncType(T, &lt;span class="pre"&gt;ReturnType(bool))),&lt;/span&gt; p, OKAY LOOK WE'RE GETTING CLOSER)&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Part of the stumbling block here is that I've been leaving record types as an exercise for my future self, so it's sort of hard to shove enough information into a &lt;tt class="docutils literal"&gt;Pack&lt;/tt&gt; with the tools I have currently.
So, let's try living in the future.&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;p = Pack(unit, {x: unit(None), f: &lt;span class="pre"&gt;Thunk(Abstraction(Variable(&amp;quot;x&amp;quot;),&lt;/span&gt; &lt;span class="pre"&gt;Return(bool(True))))})&lt;/span&gt;&lt;/tt&gt;.
&lt;tt class="docutils literal"&gt;Type(T, TYPE_KIND, {x: T, f: ThunkType(FuncType(T, &lt;span class="pre"&gt;ReturnType(bool)))}&lt;/span&gt;&lt;/tt&gt;.
&lt;tt class="docutils literal"&gt;Unpack(T, TYPE_KIND, &lt;span class="pre"&gt;Variable(&amp;quot;r&amp;quot;),&lt;/span&gt; {x: T, f: ThunkType(FuncType(T, &lt;span class="pre"&gt;ReturnType(bool)))},&lt;/span&gt; p, &lt;span class="pre"&gt;Application(Force(Attr(Variable(&amp;quot;r&amp;quot;),&lt;/span&gt; &lt;span class="pre"&gt;&amp;quot;f&amp;quot;)),&lt;/span&gt; &lt;span class="pre"&gt;Attr(Variable(&amp;quot;r&amp;quot;),&lt;/span&gt; &lt;span class="pre"&gt;&amp;quot;x&amp;quot;)))&lt;/span&gt;&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;So, the question is, ignoring that some of these nodes don't exist, can the &lt;tt class="docutils literal"&gt;Unpack&lt;/tt&gt; be successfully typed as &lt;tt class="docutils literal"&gt;ReturnType(bool)&lt;/tt&gt;?&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, it &lt;em&gt;looks&lt;/em&gt; like the typing should work, but I've just realized that my actual concern is around the determination of free type variables, and whether &lt;em&gt;that's&lt;/em&gt; an issue is a very definite maybe.&lt;/p&gt;
&lt;p&gt;Okay, here's what I think needs to happen: type inference of &lt;tt class="docutils literal"&gt;Unpack&lt;/tt&gt; must fail if the type of the computation has the type variable free.
This means I need a new constraint type.
Yaaaay.
I'll note this down in the code and then go to sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category></entry><entry><title>Coding 2025-09-06</title><link href="https://mwchase.neocities.org/coding-2025-09-06" rel="alternate"></link><published>2025-09-06T04:00:00-04:00</published><updated>2025-09-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-09-06:/coding-2025-09-06</id><summary type="html">&lt;p class="first last"&gt;That went faster than I expected, because even though the tests are really wordy, not much really had to change to get up to speed with the updates.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I ground through the tests in Impliciula, getting them to pass, although probably also making them not as good at catching mutations.
I'll work on that once I've managed to get the coverage up.
And I'll consider &lt;em&gt;that&lt;/em&gt; once I've updated the remainder of the tests.&lt;/p&gt;
&lt;p&gt;See, a bunch of the System F tests have this pattern of &amp;quot;check one expression against the inferred type of another&amp;quot;, and I need to take some time to decide whether to bash together a helper function to deal with the whole &amp;quot;they're generators now&amp;quot; thing, or to &amp;quot;simply&amp;quot; work out the actual type they should have, and check against both of them separately.&lt;/p&gt;
&lt;p&gt;I'm not going to make a decision right now, because I'm still really tired and stuff and I want to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Diary 2025-09-05</title><link href="https://mwchase.neocities.org/diary-2025-09-05" rel="alternate"></link><published>2025-09-05T04:00:00-04:00</published><updated>2025-09-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-09-05:/diary-2025-09-05</id><summary type="html">&lt;p class="first last"&gt;Uuugh. Skip.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today was &lt;em&gt;rough&lt;/em&gt; on me.
I thought some about worldbuilding, and also worked on character backstory for a Dungeons and Dragons campaign.&lt;/p&gt;
&lt;p&gt;I didn't do anything else that translates into &lt;em&gt;any&lt;/em&gt; kind of writeup, let alone one as detailed as I'd like.&lt;/p&gt;
&lt;p&gt;I'm going to try and get some rest and actually take things easy.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2025-09-04</title><link href="https://mwchase.neocities.org/coding-2025-09-04" rel="alternate"></link><published>2025-09-04T04:00:00-04:00</published><updated>2025-09-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-09-04:/coding-2025-09-04</id><summary type="html">&lt;p class="first last"&gt;Absolutely astonishing that I was able to remember anything. Maybe I should reread the previous posts in the tag...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, first off, it's late, and I'm going to try to make this quick.
And probably fail.&lt;/p&gt;
&lt;p&gt;Second off, I decided to take another look at MOTR.
In the intervening months since last time, Mypy made some bug fixes and improvements, and I had to update the code and tests to account for it.
Once that was out of the way, I took another look at the coverage stats, and I... do not remember what I was doing.
Something about needing to rewrite the wrapper code so that the module globals are changed to properties on a class, but first I need to get more test coverage... somewhere?
In particular, I need to make sure that each instance gets unique copies of the labels...
Looking at the uncovered lines, the most plausible thing is... the new &lt;tt class="docutils literal"&gt;matrix&lt;/tt&gt; code.
Oof.
That's going to take some careful study and review.
Definitely not happening right now.&lt;/p&gt;
&lt;p&gt;Got to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Diary 2025-09-03</title><link href="https://mwchase.neocities.org/diary-2025-09-03" rel="alternate"></link><published>2025-09-03T04:00:00-04:00</published><updated>2025-09-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-09-03:/diary-2025-09-03</id><summary type="html">&lt;p class="first last"&gt;Didn't have anything to say today, so tried to figure out what to say tomorrow.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm getting stuff done on different projects here and there, but once again, none of it is really adding up to something that feels worth a post.&lt;/p&gt;
&lt;p&gt;Let's see, do I want to commit to anything for tomorrow?&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;If I'm up for a straightforward grind, I can try to fix the current test suite for Impliciula.&lt;/li&gt;
&lt;li&gt;If I'm up for open-ended design work, mess with the synth code.&lt;/li&gt;
&lt;li&gt;If I want to wonder what the heck I was doing, pick MOTR back up I guess.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For now, I need to wrap up for the night.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-09-02</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-09-02" rel="alternate"></link><published>2025-09-02T04:00:00-04:00</published><updated>2025-09-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-09-02:/weekly-roundup-2025-09-02</id><summary type="html">&lt;p class="first last"&gt;I feel like I made some progress here in my head; need to see about getting it written down more later.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I mentioned a worldbuilding project I've been messing with.&lt;/li&gt;
&lt;li&gt;Thursday: I didn't have anything to say.&lt;/li&gt;
&lt;li&gt;Friday: I made a category for the worldbuilding project, and tried to describe it in a little more detail.&lt;/li&gt;
&lt;li&gt;Saturday: I played a bunch of Pipistrello and the Cursed Yoyo.&lt;/li&gt;
&lt;li&gt;Sunday: I started contemplating specific bits of technology that might exist in the setting.&lt;/li&gt;
&lt;li&gt;Monday: I thought some more about the potential evolutionary history of these weird guys I came up with.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm really not sure I'm over the migraine stuff from the past week, so I'll be trying and probably failing to take things easy.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="worldbuilding"></category></entry><entry><title>Blind Parasites Nesting in the Insensate Flesh of an Unthinking God 2025-09-01</title><link href="https://mwchase.neocities.org/blind-parasites-nesting-in-the-insensate-flesh-of-an-unthinking-god-2025-09-01" rel="alternate"></link><published>2025-09-01T04:00:00-04:00</published><updated>2025-09-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-09-01:/blind-parasites-nesting-in-the-insensate-flesh-of-an-unthinking-god-2025-09-01</id><summary type="html">&lt;p class="first last"&gt;I have to employ a measure of fudging in all of this, but I want to try to be aware of when I'm doing it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Wow, I really played myself by putting the full title in the filename, huh.&lt;/p&gt;
&lt;p&gt;Anyway, I'm slowing narrowing down what I expect out of the spec-evo side of this project.
Triploblasty seems reasonable, closely replicating the evolution of the spinal cord does not.
The selection pressures associated with cephalization currently &lt;em&gt;seem&lt;/em&gt; to me to be &lt;em&gt;weaker&lt;/em&gt;, which is not the same as &lt;em&gt;absent&lt;/em&gt;.
Unsure what kind of jaw structure is plausible.
I've got some weird ideas about manipulatory appendages that I don't know if they make sense.
The idea being to have hand-like structures, and &lt;em&gt;those&lt;/em&gt; have bones, but the &amp;quot;arms&amp;quot; have inflatable hydraulic chambers instead of bones, allowing them to switch between &amp;quot;flexible arm movement for propulsion&amp;quot; and &amp;quot;fine motor control and high leverage for manipulating objects&amp;quot;.
Probably need bones at the joints between chambers.
As I said, not sure if this all makes sense.
I don't know if it would plausibly evolve even if it did make sense in terms of fitness.&lt;/p&gt;
&lt;p&gt;Anyway, I don't want to think about it any more tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Blind Parasites Nesting in the Insensate Flesh of an Unthinking God"></category><category term="worldbuilding"></category><category term="short post"></category></entry><entry><title>Blind Parasites Nesting in the Insensate Flesh of an Unthinking God 2025-08-31</title><link href="https://mwchase.neocities.org/blind-parasites-nesting-in-the-insensate-flesh-of-an-unthinking-god-2025-08-31" rel="alternate"></link><published>2025-08-31T04:00:00-04:00</published><updated>2025-08-31T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-08-31:/blind-parasites-nesting-in-the-insensate-flesh-of-an-unthinking-god-2025-08-31</id><summary type="html">&lt;p class="first last"&gt;I just think they're neat.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I tried to take things easy today, with some... mixed success.
But I came up with some new thoughts about this setting, so I'm going to relate them in order to have something to talk about.&lt;/p&gt;
&lt;p&gt;I plan to make my first work in this setting a &amp;quot;translation&amp;quot; of an in-setting document, a bestiary, and that means that I need to ponder questions like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;What forms does communication take in a setting without air or light?&lt;/li&gt;
&lt;li&gt;For that matter, how does perception work?&lt;/li&gt;
&lt;li&gt;What kinds of vocalization could exist, and what would make sense for communication?&lt;/li&gt;
&lt;li&gt;How would writing develop under such constraints?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thinking about this, I ended up with the mental image of a writing system based on knots, like quipu, but going beyond &amp;quot;numbers and accounting, probably&amp;quot; to somehow convey thoughts more generally, and also the idea of physically connecting different strands; in other words, having the original format of this medieval-inspired bestiary be hypertext.
I've got the mental image of encyclopedias so big, that they have an architectural structure supporting and organizing them, and allowing authors, editors, and readers to swim around &lt;em&gt;inside&lt;/em&gt; the &amp;quot;book&amp;quot;.&lt;/p&gt;
&lt;p&gt;Nailing down a lot of these concepts, however, will require coming up with at-least-plausible-sounding answers to questions like &amp;quot;how do these different forms of... meat-protist actually develop their gross anatomy?&amp;quot;&lt;/p&gt;
&lt;p&gt;Anyway, it's late and I want to stop staring at this screen.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Blind Parasites Nesting in the Insensate Flesh of an Unthinking God"></category><category term="worldbuilding"></category><category term="short post"></category></entry><entry><title>Diary 2025-08-30</title><link href="https://mwchase.neocities.org/diary-2025-08-30" rel="alternate"></link><published>2025-08-30T04:00:00-04:00</published><updated>2025-08-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-08-30:/diary-2025-08-30</id><summary type="html">&lt;p class="first last"&gt;Travelled today, nothing worth mentioning.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So much Pipistrello today.&lt;/p&gt;
&lt;p&gt;I don't think I have anything else that I want to discuss right now, and it's late, so I'm going to wrap things up for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Blind Parasites Nesting in the Insensate Flesh of an Unthinking God 2025-08-29</title><link href="https://mwchase.neocities.org/blind-parasites-nesting-in-the-insensate-flesh-of-an-unthinking-god-2025-08-29" rel="alternate"></link><published>2025-08-29T04:00:00-04:00</published><updated>2025-08-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-08-29:/blind-parasites-nesting-in-the-insensate-flesh-of-an-unthinking-god-2025-08-29</id><summary type="html">&lt;p class="first last"&gt;Have a bit more information.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Oh wow, my text editor is not a fan of how long this title is.&lt;/p&gt;
&lt;p&gt;Anyway, this is a setting that I apparently came up with about a year ago, and shelved for a while, and I've been revisiting it recently.
The basic premise is that, in this setting, instead of stars surrounded by planets, there's just an endless expanse of flesh that lies dormant except in the vicinity of sun-sized hearts, which pump blood that gets filled with &amp;quot;life&amp;quot;.
This &amp;quot;life&amp;quot; is fed upon by a strange ecosystem that developed within one such circulatory system.
The basic idea is to do spec-evo/bio worldbuilding in a fantastical setting where everything is made at least a little out of meat.
I've got a very small idea of the kind of life that could exist in this context, but I'm having trouble figuring out how I want to convey it.
One idea that I'm looking into is, rather than a documentary/&amp;quot;scientific&amp;quot; perspective, present things as an in-universe document similar to a medieval bestiary.
However, I don't want to reinforce that it's a bestiary through the usage of affected antiquated language or spellings; I don't want to write stuff like &amp;quot;beeynge&amp;quot; or whatever.
I guess there are sites that rephrase and summarize bestiaries in contemporary language, so that seems reasonable as a thing to try.&lt;/p&gt;
&lt;p&gt;Anyway, I'm trying to take things easy right at the moment, so maybe I'll be up for trying that out in a few days.
For now, I need to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Blind Parasites Nesting in the Insensate Flesh of an Unthinking God"></category><category term="worldbuilding"></category><category term="short post"></category></entry><entry><title>Diary 2025-08-28</title><link href="https://mwchase.neocities.org/diary-2025-08-28" rel="alternate"></link><published>2025-08-28T04:00:00-04:00</published><updated>2025-08-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-08-28:/diary-2025-08-28</id><summary type="html">&lt;p class="first last"&gt;Please skip this, I don't say anything.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've been thinking more about different projects, but I haven't got enough done today to write anything up, and I don't have the focus to do so if I did.
I just so very much want and need to rest my eyes.&lt;/p&gt;
&lt;p&gt;Nothing else on my mind right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2025-08-27</title><link href="https://mwchase.neocities.org/diary-2025-08-27" rel="alternate"></link><published>2025-08-27T04:00:00-04:00</published><updated>2025-08-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-08-27:/diary-2025-08-27</id><summary type="html">&lt;p class="first last"&gt;Worldbuilding in an effort to avoid burning myself out on hobby coding.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I need to switch gears away from Impliciula for a bit, for my own good, but I'm not doing great at it.&lt;/p&gt;
&lt;p&gt;I tried to get to a worldbuilding project from a year ago, but we'll see how I do with that.
I'm right now just focusing on consolidating and polishing my notes, but there honestly aren't much in the way of notes, so I'm going to have to work on writing or drawing new stuff soon.
I'm going to need to figure out how to share that, or do something with it.&lt;/p&gt;
&lt;p&gt;For now, though, I've got to wind down and get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-08-26</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-08-26" rel="alternate"></link><published>2025-08-26T04:00:00-04:00</published><updated>2025-08-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-08-26:/weekly-roundup-2025-08-26</id><summary type="html">&lt;p class="first last"&gt;Not sure how many months it'll take before this all does something tangible...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I switched my focus back to Impliciula, and made some progress getting the new code to typecheck.&lt;/li&gt;
&lt;li&gt;Thursday: I had an idea for handling coercion.&lt;/li&gt;
&lt;li&gt;Friday: I had a better idea for handling coercion.&lt;/li&gt;
&lt;li&gt;Saturday: I made some more progress.&lt;/li&gt;
&lt;li&gt;Sunday: I got most of the way done with the typing side of things.&lt;/li&gt;
&lt;li&gt;Monday: I finished up the typing side of things (that is, making sure Mypy is happy), and decided I needed a break before trying to get the tests to pass.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I don't know, trying to actually sort of take things a little easy, I guess?&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category></entry><entry><title>Coding 2025-08-25</title><link href="https://mwchase.neocities.org/coding-2025-08-25" rel="alternate"></link><published>2025-08-25T04:00:00-04:00</published><updated>2025-08-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-08-25:/coding-2025-08-25</id><summary type="html">&lt;p class="first last"&gt;The problem with boiling the ocean is that when you're done, some jackass has gone and boiled the ocean.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, everything type-checks once again.
And by &amp;quot;everything&amp;quot;, I mean &amp;quot;everything in the &lt;tt class="docutils literal"&gt;src&lt;/tt&gt; directory&amp;quot;.
If I check the tests...&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;Found 150 errors in 2 files (checked 6 source files)&lt;/tt&gt;&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Is that bad?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Shut it.&lt;/p&gt;
&lt;p&gt;Anyway, while I could just barge in and start spot-fixing things until it passes and sort of makes sense, now would be a really excellent time to ponder the ergonomics of these syntax trees.
Things to ponder include:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I realized that requiring bidirectional typing to always be valid doesn't work under reduction (and, fair point, the paper stated this and I just ignored it until the pain was obvious), but... suppose I had a parallel set of types just for constructing the tree, which could then generate the tree meant for typing and reduction, and have it guaranteed that the tree would at least generate a specific error rather than just... giving up.&lt;/li&gt;
&lt;li&gt;Working in possibly the opposite direction, the syntax for constructing a tree right now is painfully verbose.
And I don't have a clear idea of what to do about that.&lt;/li&gt;
&lt;li&gt;If I do have two tree structures, perhaps I can generate one from the other somehow.&lt;/li&gt;
&lt;li&gt;Alternatively, I'm a little tempted to see if building the tree from a concatenative language would make things nicer, but I doubt it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, I took way longer with this writeup than I planned, so I've just got to cut it off now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-08-24</title><link href="https://mwchase.neocities.org/coding-2025-08-24" rel="alternate"></link><published>2025-08-24T04:00:00-04:00</published><updated>2025-08-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-08-24:/coding-2025-08-24</id><summary type="html">&lt;p class="first last"&gt;I was able to accomplish stuff despite my brain being mush. Should I have tried? That sounds like a question I'd need my brain not to be mush to answer.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Tired...&lt;/p&gt;
&lt;p&gt;Regardless, I have gotten most of the way through rewriting these modules, assuming I didn't mess things up with the more verbose style.
All that's left is to update things for universal types.&lt;/p&gt;
&lt;p&gt;I haven't done that yet because it looks like I need some new bundle methods to make it really work, and I only had the focus today to grind through the rest of the type errors, not to write a bunch of new code, even if it should be pretty trivial.&lt;/p&gt;
&lt;p&gt;If I have the focus for it tomorrow, my plan is to write up all of the methods I need to update, and figure out how to support them.
Right now, I need to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-08-23</title><link href="https://mwchase.neocities.org/coding-2025-08-23" rel="alternate"></link><published>2025-08-23T04:00:00-04:00</published><updated>2025-08-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-08-23:/coding-2025-08-23</id><summary type="html">&lt;p class="first last"&gt;Why are all of the errors I don't care about mega-verbose, and then when there's something I consider an urgent problem, the details are just like &amp;quot;Error: no&amp;quot;?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I tried to take things easy today, but I did get some code updated to do constraints-based typing.
And fixed the problem with the code I pasted yesterday.
(It should have emitted constraints, and didn't.)&lt;/p&gt;
&lt;p&gt;Other than &amp;quot;there were bugs, I fixed them&amp;quot;, I don't have anything terribly interesting to say about this code, besides that I ended up using &lt;tt class="docutils literal"&gt;with (yield from&lt;/tt&gt;, which sounds kind of fake to me right now.
Also, because I'm, like, making it more explicit what's happening with this code, it is getting &lt;em&gt;really&lt;/em&gt; verbose.&lt;/p&gt;
&lt;p&gt;I've got nothing else to say, so I'm going to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-08-22</title><link href="https://mwchase.neocities.org/coding-2025-08-22" rel="alternate"></link><published>2025-08-22T04:00:00-04:00</published><updated>2025-08-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-08-22:/coding-2025-08-22</id><summary type="html">&lt;p class="first last"&gt;It feels like the other approach should have worked, but I &lt;em&gt;suppose&lt;/em&gt; this is cleaner.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I know there are some typos in the code from last post, but the bigger issue is that typing descriptors is... frustrating, and I ended up going with a solution that was just simple enough that Mypy couldn't totally biff it:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Failing&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Protocol&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nd"&gt;@classmethod&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;failure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Self&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;coerce&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Failing&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;
    &lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Bundle&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Constraints&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Bundle&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt;
    &lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bundle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Bundle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bundle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;yield from&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;bundle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;failure&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;CoercionFailure&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;With this, I have what I need to be confident updating the rest of the nodes.
I think.&lt;/p&gt;
&lt;p&gt;Anyway, it's late and I'm tired.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-08-21</title><link href="https://mwchase.neocities.org/coding-2025-08-21" rel="alternate"></link><published>2025-08-21T04:00:00-04:00</published><updated>2025-08-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-08-21:/coding-2025-08-21</id><summary type="html">&lt;p class="first last"&gt;Grinding out some Quick and Questionable code.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, let's see about that descriptor concept.
It's going to look something like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@attrs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;frozen&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Coerce&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="n"&gt;ctor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__get__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;[,&lt;/span&gt; &lt;span class="n"&gt;Constraints&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Bundle&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]]]:&lt;/span&gt;
        &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;coerce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;type_bundle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Bundle&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Constraints&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Bundle&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt;
            &lt;span class="n"&gt;typ&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;type_bundle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;typ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Bundle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;typ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;type_bundle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;yield from&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;type_bundle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ctor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="n"&gt;CoercionFailure&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;coerce&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Okay, let's ponder this.
I'm feeling okay about this, but I'm assuming that I'd need to tweak this some to make it actually work with Mypy.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to sleep on this, and get to bed soon.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-08-20</title><link href="https://mwchase.neocities.org/coding-2025-08-20" rel="alternate"></link><published>2025-08-20T04:00:00-04:00</published><updated>2025-08-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-08-20:/coding-2025-08-20</id><summary type="html">&lt;p class="first last"&gt;And suddenly, I'm back over here.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I plinked away at the System F stuff in Impliciula for a little bit.
I've now got the existential module passing type checking, and I could move on to the function module, but I really want to get the generic coercion idea working, and I need to take some time to decide whether that's worth pursuing right now, or if I should just copy and paste the code, and change the one line that needs to change.&lt;/p&gt;
&lt;p&gt;For right now, I should get to bed, but it's nice to confirm that it actually is possible to get a file to pass type checking with all of the... stuff... that I'm doing to the code.
Oh, wait, I never did decide whether to include a coercion failure node.
Let's think about that some more while I get ready for bed.
Anyway, better move in that direction.
(Actually, I think I will do the coercion failure node real quick, while this publishes.)&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-08-19</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-08-19" rel="alternate"></link><published>2025-08-19T04:00:00-04:00</published><updated>2025-08-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-08-19:/weekly-roundup-2025-08-19</id><summary type="html">&lt;p class="first last"&gt;I worked on stuff. Just... stuff.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I put down some thoughts about synthesis, mostly additive synthesis.&lt;/li&gt;
&lt;li&gt;Thursday: I made a little progress on the lower-level stuff for Impliciula, and then ended up not too enthused about continuing just yet.&lt;/li&gt;
&lt;li&gt;Friday: At the last moment, I figured out how to get the synthesized sound to be more pleasant to me.&lt;/li&gt;
&lt;li&gt;Saturday: I made some progress, but the main thing I got was that my prototype synthesis code has some serious limitations.&lt;/li&gt;
&lt;li&gt;Sunday: Not much happened.&lt;/li&gt;
&lt;li&gt;Monday: I took a bunch of notes on how to improve things with the synthesizer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I will either figure out how to actually fix up the synthesizer code, or be up for continuing on Impliciula, or some other thing.
I dunno.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category><category term="music"></category></entry><entry><title>Diary 2025-08-18</title><link href="https://mwchase.neocities.org/diary-2025-08-18" rel="alternate"></link><published>2025-08-18T04:00:00-04:00</published><updated>2025-08-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-08-18:/diary-2025-08-18</id><summary type="html">&lt;p class="first last"&gt;Hooray, I've created an incomprehensible page of notes.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Little bit of a weird day today.
I had the time to sketch out high-level designs for the synthesizer stuff, but I don't feel like refining my notes into anything actionable yet.&lt;/p&gt;
&lt;p&gt;Basically, the code that currently exists doesn't really have a concept of &amp;quot;instrument&amp;quot; in a useful way, and can't meaningfully ornament notes.
I have a general plan for addressing these shortcomings, and trying to build up towards supporting higher-level ideas, like phrases.&lt;/p&gt;
&lt;p&gt;I'm going to wind down for now, and I don't have a good segue for that.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="music"></category><category term="short post"></category></entry><entry><title>Diary 2025-08-17</title><link href="https://mwchase.neocities.org/diary-2025-08-17" rel="alternate"></link><published>2025-08-17T04:00:00-04:00</published><updated>2025-08-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-08-17:/diary-2025-08-17</id><summary type="html">&lt;p class="first last"&gt;Please skip.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I kind of poked at stuff today, but mostly I ended up zoning out until just now, and realizing that I am up way late and I haven't written anything.
I won't accomplish anything if I try now, so I'll just post this.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2025-08-16</title><link href="https://mwchase.neocities.org/coding-2025-08-16" rel="alternate"></link><published>2025-08-16T04:00:00-04:00</published><updated>2025-08-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-08-16:/coding-2025-08-16</id><summary type="html">&lt;p class="first last"&gt;Just have to accept what I feel like working on.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I didn't have the focus to look at Impliciula-related stuff today, but I did mess around with coding related to audio processing.
I've managed to put together some stuff just by typing a lot, but there are some very obvious limitations in the interfaces I have currently, so I'm trying to figure out how to address them.&lt;/p&gt;
&lt;p&gt;The actual musical content is some xenharmonic nonsense that I might as well try to describe.
Basically, I've been reading about dissonance curves and thinking about the implications of them.
I realized that if the disonance minimum around the third is shallow instead of steep, then there won't be a strong draw to a precise value, which means that a spectrum that lacks fifth harmonics won't have a specific, preferred third, and would allow for neutral thirds; building a scale from neutral chords ends up suggesting 7TET instead of 12TET.
Now, I didn't really like the sound of &amp;quot;basically a sawtooth wave but with certain harmonics suppressed&amp;quot;, so I ended up switching to using undertones instead of overtones in my additive synthesis.
This results in a sound that... is a sound.
I like it, maybe I'll try messing with it a little later, but that's not the priority currently.
I slapped together an ADSR implementation, and, like most of this project, got Numpy to do the heavy lifting; I don't know if the parameters I'm currently using are the greatest, but I can mess with those some other time, as well.&lt;/p&gt;
&lt;p&gt;I initially assumed that the use of undertones in the synthesis meant I would need to put the melody in the bass and invert chords from 12TET (ignoring that it's not possible to make a 7TET chord sound &amp;quot;different&amp;quot;, per se), but putting the melody all in the bass was too subtle for my taste (or maybe just for my laptop speakers; it was fine-ish over headphones), so I switched everything back.&lt;/p&gt;
&lt;p&gt;At this point, I &lt;em&gt;technically&lt;/em&gt; have what I need to try out more ambitious compositions than &amp;quot;the 7TET chromatic scale&amp;quot; and &amp;quot;pop music loop but it sounds weird because all of the thirds are different and also the fifth is even flatter than 12TET, like by a decent amount&amp;quot;, but.
Important concepts like &amp;quot;an instrument&amp;quot; are not meaningfully surfaced, and I'm going to need to do something about that in order to have a chance of moving from &amp;quot;arduous copy and paste&amp;quot; to &amp;quot;handy functions&amp;quot; or even &amp;quot;algorithmic composition&amp;quot;.&lt;/p&gt;
&lt;p&gt;Anyway, my focus petered out there, so we're done for tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="music"></category></entry><entry><title>Diary 2025-08-15</title><link href="https://mwchase.neocities.org/diary-2025-08-15" rel="alternate"></link><published>2025-08-15T04:00:00-04:00</published><updated>2025-08-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-08-15:/diary-2025-08-15</id><summary type="html">&lt;p class="first last"&gt;Fixing the problem by doing the exact opposite of what I thought made sense.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I ended up messing with additive synthesis today, with an eye towards doing something xenharmonic with an instrument with a harmonic spectrum.
I got all of the technical stuff I wanted put together, and now I'm floundering with the fact that everything I've done with the spectrum results in a sound I would describe as &amp;quot;like a pipe organ, but a little more annoying&amp;quot;.
I've got a &lt;em&gt;lot&lt;/em&gt; to learn about controlling timbre, clearly.&lt;/p&gt;
&lt;p&gt;(Maybe I should just make it really inharmonic?)
(Huh, just going full negative harmonic gave me something nicer.
Good to know.)&lt;/p&gt;
&lt;p&gt;Anyway, I'd better wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2025-08-14</title><link href="https://mwchase.neocities.org/coding-2025-08-14" rel="alternate"></link><published>2025-08-14T04:00:00-04:00</published><updated>2025-08-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-08-14:/coding-2025-08-14</id><summary type="html">&lt;p class="first last"&gt;As I go to write this summary, I realize I missed a &amp;quot;failed&amp;quot; node type. I'll get it later, when I know I need it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've been messing with music stuff (and Pipistrello) most of the day, but I did just now hammer out a rough prototype for the placeholder, or &amp;quot;failed&amp;quot; node classes.
I defined the classes, and resolved some TODOs, and this has gotten me basically right up to the point last time where I said &amp;quot;and then I'm going to have to think about it&amp;quot;.&lt;/p&gt;
&lt;p&gt;There are basically a couple of things going on here.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Bonus thing: the more inference methods I write, the more boilerplate I notice, and wonder if they should be written slightly differently.&lt;/li&gt;
&lt;li&gt;The new &amp;quot;failed&amp;quot; nodes could in theory be inserted &amp;quot;manually&amp;quot; into the AST, which would break the preconditions for type checking and inference, but do I want to put in the effort to surface that this has happened?
What is a good/right way to handle this, in terms of generating constraint failures?&lt;/li&gt;
&lt;li&gt;I've got most of the infrastructure I need to create synthetic nodes when coercion fails, but do I want to insert a path segment to indicate the coercion?
To be clear, the success case doesn't have a new segment, and I think that is correct.&lt;/li&gt;
&lt;li&gt;Can I formalize any design constraints on how type constraints are generated?
Are there assumptions I can rely on about where different kinds of node came from?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Having written all of that down, I think the sensible way forward is to take a conservative approach, in various senses but not the political one, ew, cringe, and then, once I have a working prototype, start documenting and refining it.&lt;/p&gt;
&lt;p&gt;For now, I've got to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Diary 2025-08-13</title><link href="https://mwchase.neocities.org/diary-2025-08-13" rel="alternate"></link><published>2025-08-13T04:00:00-04:00</published><updated>2025-08-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-08-13:/diary-2025-08-13</id><summary type="html">&lt;p class="first last"&gt;There may have been a &lt;em&gt;lot&lt;/em&gt; of Pipistrello and the Cursed Yoyo going on...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I kind of expected that I was going to get more work done today, but it seems that my focus and motivation have been a bit low.&lt;/p&gt;
&lt;p&gt;As I mentioned, I have been looking into music and synthesis some, and I've got some notes on how to put stuff together:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Instruments aside from, like, pure percussion have a repeating steady-state.&lt;/li&gt;
&lt;li&gt;This means that they can be approximated with harmonic additive synthesis.&lt;/li&gt;
&lt;li&gt;But getting all of the higher harmonics right is a pain.&lt;/li&gt;
&lt;li&gt;There are two ways to nudge a waveform without disturbing the period:&lt;/li&gt;
&lt;li&gt;Phase modulation by a wave with the same period;&lt;/li&gt;
&lt;li&gt;Amplitude modulation by a wave with the same period.&lt;/li&gt;
&lt;li&gt;These can be done independently, and also waves with the same period can be linearly combined.&lt;/li&gt;
&lt;li&gt;I knew &lt;em&gt;of&lt;/em&gt; all of this in the context of the major synths, except I hadn't considered the stuff, which I'm still not totally sure I get, about coupling resolving inharmonicities.
Like, it would be nice if that were a thing, but if it were, why do pianos need to be tuned like that?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The thing to investigate is what subtle phase modulation does to a pure tone, and to see how things change with more harmonics.&lt;/p&gt;
&lt;p&gt;For now, once again, I've got to get ready to sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-08-12</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-08-12" rel="alternate"></link><published>2025-08-12T04:00:00-04:00</published><updated>2025-08-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-08-12:/weekly-roundup-2025-08-12</id><summary type="html">&lt;p class="first last"&gt;This week would have gone a lot better if I'd realized that my eyes were hurting more than a normal amount.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I put down some thoughts about Villeins of Tomorrow.&lt;/li&gt;
&lt;li&gt;Thursday: I collected published RPGs to look at. (I'm going to need to pick up some non-fiction stuff as well, but I haven't done that yet.)&lt;/li&gt;
&lt;li&gt;Friday: Migraine.&lt;/li&gt;
&lt;li&gt;Saturday: Migraine.&lt;/li&gt;
&lt;li&gt;Sunday: Poked a little at Impliciula.&lt;/li&gt;
&lt;li&gt;Monday: Researched music-related-stuff.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'll try to avoid backsliding on health, and secondarily make progress on other stuff.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Villeins of Tomorrow"></category><category term="Impliciula"></category></entry><entry><title>Diary 2025-08-11</title><link href="https://mwchase.neocities.org/diary-2025-08-11" rel="alternate"></link><published>2025-08-11T04:00:00-04:00</published><updated>2025-08-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-08-11:/diary-2025-08-11</id><summary type="html">&lt;p class="first last"&gt;Tantalizing hints of stuff I could be working on, but also, let's face it, very skippable.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I ended up taking things easy again today, so there's not much to talk about when it comes to code.
Or RPG concepts.&lt;/p&gt;
&lt;p&gt;I have been looking more into music-related stuff, and letting ideas percolate there.
Unless I get really inspired, I'm going to have to accept some actually very reasonable compromises, but I'm not ready yet.&lt;/p&gt;
&lt;p&gt;For now, I should wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2025-08-10</title><link href="https://mwchase.neocities.org/coding-2025-08-10" rel="alternate"></link><published>2025-08-10T04:00:00-04:00</published><updated>2025-08-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-08-10:/coding-2025-08-10</id><summary type="html">&lt;p class="first last"&gt;I had this locked and loaded for days, so it wasn't a big deal.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't have the focus for working on Villeins of Tomorrow today, so I ended up doing some quick work on Impliciula's System F layer.
My goal was just to implement type substitution for bundles, which allowed me to update more of the existential nodes to use bundles in type checking.&lt;/p&gt;
&lt;p&gt;I am too tired to properly explain what all of that meant.&lt;/p&gt;
&lt;p&gt;Anyway, the next step in updating is to finish implementing type coercion, that is, coercion between types that are different types.
That requires a few things:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Placeholder types to handle constructing a coerced type.&lt;/li&gt;
&lt;li&gt;Rework the equality constraint to consider placeholder types equal to everything, because, like, if you're comparing against a placeholder type, then that was generated from a constraint failure, so, like, you don't need more constraint failures.
I can hammer out the details later.&lt;/li&gt;
&lt;li&gt;See if I can make a dedicated descriptor for coercion, because it kind of seems like it should be possible to hardcode most of the behavior.
Just need to... construct a default value... from the class... that the descriptor is being defined on.
I'm pretty sure I can make this work somehow.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Well, that's a fun task that I just set for myself.
We'll see about that some other time.&lt;/p&gt;
&lt;p&gt;For now, sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Diary 2025-08-09</title><link href="https://mwchase.neocities.org/diary-2025-08-09" rel="alternate"></link><published>2025-08-09T04:00:00-04:00</published><updated>2025-08-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-08-09:/diary-2025-08-09</id><summary type="html">&lt;p class="first last"&gt;Uuuuuugh. Please skip.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I thought I was feeling better this morning, but either I was wrong, or work made me wrong.&lt;/p&gt;
&lt;p&gt;Didn't get anything done, going to go lie down now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2025-08-08</title><link href="https://mwchase.neocities.org/diary-2025-08-08" rel="alternate"></link><published>2025-08-08T04:00:00-04:00</published><updated>2025-08-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-08-08:/diary-2025-08-08</id><summary type="html">&lt;p class="first last"&gt;Real migraine hours (safe to skip).&lt;/p&gt;
</summary><content type="html">&lt;p&gt;My head hurts and I really don't want to prolong things tonight, so I'm going to wrap things up here and load up my Villeins of Tomorrow research on my e-reader so I can look at it without getting eyestrain.&lt;/p&gt;
&lt;p&gt;Nothing else to think about right now, so let's go.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Villeins of Tomorrow 2025-08-07</title><link href="https://mwchase.neocities.org/villeins-of-tomorrow-2025-08-07" rel="alternate"></link><published>2025-08-07T04:00:00-04:00</published><updated>2025-08-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-08-07:/villeins-of-tomorrow-2025-08-07</id><summary type="html">&lt;p class="first last"&gt;Not tossing stuff together, so I guess I'll try to do research.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was pretty tired and out-of-it today, so I ended up just trying to find sources of inspiration.
Everything I'd thought about offhand earlier, I was able to track down in my various libraries, so now I just need to ponder what else to look for, and look over what I have so far.&lt;/p&gt;
&lt;p&gt;I think the thing to do is to take notes, but I don't have the focus for it at the moment, so I'm going to wind down now and see how I feel tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Villeins of Tomorrow"></category><category term="short post"></category><category term="Villeins of Tomorrow"></category><category term="rpg design"></category></entry><entry><title>Villeins of Tomorrow 2025-08-06</title><link href="https://mwchase.neocities.org/villeins-of-tomorrow-2025-08-06" rel="alternate"></link><published>2025-08-06T04:00:00-04:00</published><updated>2025-08-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-08-06:/villeins-of-tomorrow-2025-08-06</id><summary type="html">&lt;p class="first last"&gt;I suspect some people will think I made up an absurd strawman. I did not.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Actually, you know what, let's actually go into some detail here before I throw myself into bed.&lt;/p&gt;
&lt;p&gt;With Villeins of Tomorrow, I'm trying to comment on or reframe a lot of the aspects of pulp science fiction that didn't age well.
To be a little more concrete than that, I am in favor, for now, of space battles where describing them sounds like being trapped in a kaleidoscope.
Not a fan of ancient eugenically-manipulated ancestral lines of ultimate space narcs.&lt;/p&gt;
&lt;p&gt;So I've got this idea of different factions representing different strands of pulp science fiction (construed somewhat broadly), and player characters who clash with these factions as a result of their weird, problematic aspects.
What I want to get a handle on right now is, what do the player characters &lt;em&gt;do&lt;/em&gt;?
Both in the sense of &amp;quot;what kinds of objectives do they pursue?&amp;quot; and &amp;quot;what tools are they given to pursue those objectives?&amp;quot;&lt;/p&gt;
&lt;p&gt;Putting it out like this, I guess the solution is to come up with a bunch of distinct character concepts, situate them within the pulp milieu, and see what feels right.
One thing that it occurs to me I'll be doing a lot is figuring out which &amp;quot;strengths&amp;quot; are actually weaknesses, and vice versa.&lt;/p&gt;
&lt;p&gt;Places to look for mechanical inspiration: &lt;em&gt;Apocalypse World&lt;/em&gt; and other PbtA games, &lt;em&gt;Blades in the Dark&lt;/em&gt; and other FitD games, and, uh, &lt;em&gt;Golden Sky Stories&lt;/em&gt;.
Trust me on this.&lt;/p&gt;
&lt;p&gt;Anyway, I can't pursue this any more tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Villeins of Tomorrow"></category><category term="short post"></category><category term="Villeins of Tomorrow"></category><category term="rpg design"></category></entry><entry><title>Weekly Roundup 2025-08-05</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-08-05" rel="alternate"></link><published>2025-08-05T04:00:00-04:00</published><updated>2025-08-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-08-05:/weekly-roundup-2025-08-05</id><summary type="html">&lt;p class="first last"&gt;The plan going forward is to take things easy. How much effort am I going to put into that?&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: Didn't get much done.&lt;/li&gt;
&lt;li&gt;Thursday: Still didn't get much done.&lt;/li&gt;
&lt;li&gt;Friday: I made some progress on my efforts to rework typing in the System F layer.&lt;/li&gt;
&lt;li&gt;Saturday: I managed to deal with the problems I was running into, so what's left now is to grind through all of the type errors.&lt;/li&gt;
&lt;li&gt;Sunday: Okay, so, grinding through the type errors is going to be more tedious than I expected.&lt;/li&gt;
&lt;li&gt;Monday: So, let's see about taking a break for a bit.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try and focus on &lt;em&gt;Villeins of Tomorrow&lt;/em&gt; for a bit.
I have some ideas for Impliciula, but they're not all-the-way baked yet.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category><category term="Villeins of Tomorrow"></category></entry><entry><title>Diary 2025-08-04</title><link href="https://mwchase.neocities.org/diary-2025-08-04" rel="alternate"></link><published>2025-08-04T04:00:00-04:00</published><updated>2025-08-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-08-04:/diary-2025-08-04</id><summary type="html">&lt;p class="first last"&gt;Any updates on this are going to be just &amp;quot;Yep, still working on it&amp;quot; for quite some time.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;As I said, I'm trying to focus on stuff besides Impliciula, because now that I've gotten past the blockage, I'm sort of feeling the strain from pushing.
As such, I've started working on yet another project.&lt;/p&gt;
&lt;div class="admonition smiley smiley-glitchy"&gt;
&lt;p class="first admonition-title"&gt;:) (glitchy)&lt;/p&gt;
&lt;p class="last"&gt;Of course you have.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Anyway, there will probably come a point where I decide to take a break from this new project as well, but that's maybe sort of the idea.&lt;/p&gt;
&lt;p&gt;This new project is called &lt;em&gt;Villeins of Tomorrow&lt;/em&gt;, and there are a few directions I could take it, but the plan right now is to make a PbtA game inspired by classic pulp science fiction; part of the idea here is to see what I even think of it once it comes together thematically.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Thematically?
You're going to make some people really angry, aren't you?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Don't worry, they deserve it.&lt;/p&gt;
&lt;p&gt;Anyway, I'm tired and I want to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="Villeins of Tomorrow"></category></entry><entry><title>Coding 2025-08-03</title><link href="https://mwchase.neocities.org/coding-2025-08-03" rel="alternate"></link><published>2025-08-03T04:00:00-04:00</published><updated>2025-08-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-08-03:/coding-2025-08-03</id><summary type="html">&lt;p class="first last"&gt;The rest of the owl is shaped &lt;em&gt;really weird&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was mostly focusing on stuff besides Impliciula today, which was... probably good.
However, I did just now take a look at the state of type errors with the rewrite, and I have found things that I was ignoring.
Basically, I didn't think too hard about how to translate various operations from purely node-based, to base on nodes and bundled metadata.
I'd sort of glossed over this with how part of inferring the type of an unpack operation involves synthesizing an existential type from various fields on the unpack node, because all of those fields were from the same node, so whatever.
(That previous sentence may have sounded weird. I will not be explaining further.)
But now I'm working on &lt;em&gt;checking&lt;/em&gt; the type of a &lt;em&gt;pack&lt;/em&gt; node, and suddenly I need to perform type substitution with values from two different bundles, and I'm unclear on what the desired semantics even is.
Like, do I define some kind of merge operation on paths, or is there some sense in which one of them &amp;quot;wins&amp;quot;?&lt;/p&gt;
&lt;p&gt;Thinking about how it'll be used, it's kind of as if the path needs to introduce a variable binding to the bundle that's substituted in?
After all, it would be good to know where the value came from, except that currently the substitution is so thorough that it's not obvious, except, except.
If the path description is good enough to follow through the nodes (this is a big assumption at present), then it will reach a variable, and if there is a binding to that variable, then there shouldn't be a problem, &lt;em&gt;per se&lt;/em&gt;, with using that binding to continue.&lt;/p&gt;
&lt;p&gt;So, we need the binding that reaches the variable, obviously, and we need the binding that reaches the value, do we need to track &amp;quot;why did we substitute that variable specifically&amp;quot;?
My gut feeling is that it would be very unwise to make a snap decision here, so I am going to try to wind down now, and focus on other stuff for a bit.
We'll see how that goes.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-08-02</title><link href="https://mwchase.neocities.org/coding-2025-08-02" rel="alternate"></link><published>2025-08-02T04:00:00-04:00</published><updated>2025-08-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-08-02:/coding-2025-08-02</id><summary type="html">&lt;p class="first last"&gt;There might be a way to make this code more concise, but right now I have to focus on getting it written.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right.
I figured out the answer to that protocol stuff: just give up and hard-code the possible types.
This is frustratingly inelegant, but I can't deny how much easier it was overall.&lt;/p&gt;
&lt;p&gt;I then ran into &amp;quot;my whole concept of reifying node transformations and bundling them with a path component, does not work, type system cannot handle it, totally breaks things&amp;quot;, and I figured out an acceptable alternative.
At that point, it actually became feasible to rewrite the implementations for the concrete node types.
And the code is totally normal and not-at-all-cursed.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Uh-huh.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;At this point, I'm making my way into &amp;quot;draw the rest of the owl&amp;quot; territory, which is actually an improvement, because where I was before was &amp;quot;all of your drawing implements got snapped in half&amp;quot;.
Now that I have means of handling all of the basic primitives, and it seems to be compatible with Mypy, there's less of a &amp;quot;mad scramble to fix things&amp;quot; vibe, and more of &amp;quot;so, out of various valid options, which do I prefer?&amp;quot;&lt;/p&gt;
&lt;p&gt;As such, I will be trying to take things easy, now that I've figured the big stuff out, and part of that is winding down now, even though Bandcamp Friday didn't go quite right.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-08-01</title><link href="https://mwchase.neocities.org/coding-2025-08-01" rel="alternate"></link><published>2025-08-01T04:00:00-04:00</published><updated>2025-08-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-08-01:/coding-2025-08-01</id><summary type="html">&lt;p class="first last"&gt;It's weird that it doesn't like the type, when it's entirely capable of figuring out the return type value.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right.
Here we go.&lt;/p&gt;
&lt;p&gt;I've figured out where some of the Mypy problems I was hitting were coming from, but I'm having trouble figuring out what to do about them.&lt;/p&gt;
&lt;p&gt;Basically, I'm creating a wrapper class that forwards some calls to its wrapped object, and this is made to typecheck by relying on explicit self annotations and protocols.
The problem I've run into is that typing a function with &lt;tt class="docutils literal"&gt;def my_func[T: &lt;span class="pre"&gt;Proto](self:&lt;/span&gt; Bundle[T], &lt;span class="pre"&gt;...)&lt;/span&gt; &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; ...&lt;/tt&gt; seems to work fine, but if the protocol is a little fancier, like &lt;tt class="docutils literal"&gt;Proto[T]&lt;/tt&gt;, then constraining the type variable doesn't seem to work, and the best I can do is &lt;tt class="docutils literal"&gt;def &lt;span class="pre"&gt;my_func[T](self:&lt;/span&gt; Proto[T], &lt;span class="pre"&gt;...)&lt;/span&gt; &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; ...&lt;/tt&gt;, which I thought this class was covariant, thought it would Just Work, but &lt;em&gt;evidently not&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I'm not going to figure this out tonight, so I'll just wait and see what I come up with.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Diary 2025-07-31</title><link href="https://mwchase.neocities.org/diary-2025-07-31" rel="alternate"></link><published>2025-07-31T04:00:00-04:00</published><updated>2025-07-31T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-07-31:/diary-2025-07-31</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Hey, this will be a day with something interesting to talk about!&amp;quot; *does nothing*&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I need to give myself something else to work or chew on, because fixing up type error reporting for Impliciula is just not happening.
And this should be the easy part!&lt;/p&gt;
&lt;p&gt;Let's see, I'm roughing out yet another setting to potentially do something in...
I'm trying to get a handle on phase modulation and potentially way overthinking things still...&lt;/p&gt;
&lt;p&gt;Maybe I'll have some time and focus to think about this tomorrow, but for now I have to take things easy.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2025-07-30</title><link href="https://mwchase.neocities.org/diary-2025-07-30" rel="alternate"></link><published>2025-07-30T04:00:00-04:00</published><updated>2025-07-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-07-30:/diary-2025-07-30</id><summary type="html">&lt;p class="first last"&gt;I am also disappointed that there's nothing to see here.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I had trouble getting to sleep last night, and then I had trouble focusing on anything today.
It would be a very bad idea to try to force anything, so I'm going to wrap things up and try to get to bed earlier.&lt;/p&gt;
&lt;p&gt;Can't think of anything else to say.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-07-29</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-07-29" rel="alternate"></link><published>2025-07-29T04:00:00-04:00</published><updated>2025-07-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-07-29:/weekly-roundup-2025-07-29</id><summary type="html">&lt;p class="first last"&gt;It feels like I'm not choosing between solutions, I'm choosing between problems resulting from solutions.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I ran into trouble with my first attempt at threading in context.&lt;/li&gt;
&lt;li&gt;Thursday: No energy.&lt;/li&gt;
&lt;li&gt;Friday: I gave up on some of the fancier ideas I was trying to make happen.&lt;/li&gt;
&lt;li&gt;Saturday: I ran into some issues implementing the &amp;quot;simplified&amp;quot; ideas.&lt;/li&gt;
&lt;li&gt;Sunday: I got some work done, and paved the way for more work.&lt;/li&gt;
&lt;li&gt;Monday: I tried to focus again on giving access to context when generating constraints, and ran into the problem that none of my ideas so far are really appealing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to find something I'm at least willing to try, and maybe try splitting focus between projects for a bit.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category></entry><entry><title>Coding 2025-07-28</title><link href="https://mwchase.neocities.org/coding-2025-07-28" rel="alternate"></link><published>2025-07-28T04:00:00-04:00</published><updated>2025-07-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-07-28:/coding-2025-07-28</id><summary type="html">&lt;p class="first last"&gt;Making a lot of progress at the last possible moment.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today, I forgot about how I wanted to get kind checking done right-er, and focused on nothing in particular, but I did just now try to update some of the code that I &lt;em&gt;maybe&lt;/em&gt; want to use to thread contexts through the typing code.
I'm thinking about that, and kind of vacillating between &amp;quot;Well, I need to try something.&amp;quot; and &amp;quot;I really don't want to try anything that I've considered so far.&amp;quot;&lt;/p&gt;
&lt;p&gt;So, once I have a bit more time and energy, I'm going to try to come up with more ideas.
For now, I've been too slow getting ready for bed.
I'll get on that now.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, I'll get on that &lt;em&gt;now&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-07-27</title><link href="https://mwchase.neocities.org/coding-2025-07-27" rel="alternate"></link><published>2025-07-27T04:00:00-04:00</published><updated>2025-07-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-07-27:/coding-2025-07-27</id><summary type="html">&lt;p class="first last"&gt;If it weren't for procrastination, I'd never get anything done.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;If I play my cards right, I'll get to bed at a somewhat more reasonable time.&lt;/p&gt;
&lt;p&gt;Today, I took things easy, and then focused on dealing with various papercuts I'd identified around the typing code.
I finished bidirectionalizing the kinding, and this dealt with a bunch of small annoyances.
Going from there, I &lt;em&gt;could&lt;/em&gt; take another crack at figuring out constraint contexts, but there are some bits of code that I haven't fully worked out what they &amp;quot;should&amp;quot; do, which are now a little bit easier to rewrite once I know what I want from them.&lt;/p&gt;
&lt;p&gt;So, my plan is to wrap up quickly, then review the sources I'm using while I wind down in bed.
Let's see about that... right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-07-26</title><link href="https://mwchase.neocities.org/coding-2025-07-26" rel="alternate"></link><published>2025-07-26T04:00:00-04:00</published><updated>2025-07-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-07-26:/coding-2025-07-26</id><summary type="html">&lt;p class="first last"&gt;Technically there was progress.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;It's late, so quick rundown of the state of things:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I rolled back to what I believe is the last version that type-checked.&lt;/li&gt;
&lt;li&gt;I reintroduced some of the typing improvements I made on what is now a weird offshoot.&lt;/li&gt;
&lt;li&gt;I'm trying to figure out the right way to signpost &amp;quot;some of these subclasses are just for ease of subclassing, do not annotate anything with them&amp;quot;.&lt;/li&gt;
&lt;li&gt;I'm still letting the question of how to associate this context data percolate in my mind.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I can't make much progress without having an answer to one of those questions, so I think I also need to be open to switching projects for a bit, if I'm really unsure.
Regardless, need to get to bed right now-ish.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-07-25</title><link href="https://mwchase.neocities.org/coding-2025-07-25" rel="alternate"></link><published>2025-07-25T04:00:00-04:00</published><updated>2025-07-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-07-25:/coding-2025-07-25</id><summary type="html">&lt;p class="first last"&gt;I forget how I even ended up focusing on this.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did a bunch of planning work elsewhere, so I'm going to try to quickly sum up my conclusions:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Drop the class distinction between inferring and non-inferring nodes; everything provides an inference method, it just might emit a constraint failure without actually doing any work&lt;/li&gt;
&lt;li&gt;Don't expect reduced trees to do anything useful in terms of typing&lt;/li&gt;
&lt;li&gt;Restore type inference to values where applicable&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of this will address the problems I was having with the current round of updates, so I'll either need to back those changes out, layer more changes on top of the half-done stuff in there currently, or put the work into figuring out how to fix it the rest of the way.&lt;/p&gt;
&lt;p&gt;In any case, it's late and I should get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Diary 2025-07-24</title><link href="https://mwchase.neocities.org/diary-2025-07-24" rel="alternate"></link><published>2025-07-24T04:00:00-04:00</published><updated>2025-07-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-07-24:/diary-2025-07-24</id><summary type="html">&lt;p class="first last"&gt;Time to be a blob indefinitely.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm trying to figure out what the right path forward is for this hobby coding stuff, but I used up all of my energy today on other things and I'm going to just go take things easy now.
Maybe I'll be ready to work on the stuff I want to in, like, a few days.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2025-07-23</title><link href="https://mwchase.neocities.org/coding-2025-07-23" rel="alternate"></link><published>2025-07-23T04:00:00-04:00</published><updated>2025-07-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-07-23:/coding-2025-07-23</id><summary type="html">&lt;p class="first last"&gt;I'm really curious what &amp;quot;normal&amp;quot; code that's supposed to accomplish this stuff looks like.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Ugh.
The code I wrote for paths and constraints feels terrible to work with, actually.&lt;/p&gt;
&lt;p&gt;I think there are two separate things I did wrong, and it's going to take me some time to figure out what I should be doing instead:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&amp;quot;I should make a path-like structure using &lt;tt class="docutils literal"&gt;__rtruediv__&lt;/tt&gt; on a base 'component' class to build things up.&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;I'm bundling together nodes and context; I should write methods with narrowed self types on the bundled class that just forward to the method implementation on the wrapped node.&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both of these seem to get &lt;em&gt;really&lt;/em&gt; unhappy in the context of my funky modular node types.
The method forwarding is also a bit questionable from an implementation standpoint, because I kept finding myself reassembling the bundle that destructured itself as part of the method forwarding.
Like, the stuff I thought was going to make things easier just kind of made it way fiddlier.&lt;/p&gt;
&lt;p&gt;I've got a few things I'm trying out now, but I'm going to need more time than I have right now to really evaluate them, so I'm going to wrap things up for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-07-22</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-07-22" rel="alternate"></link><published>2025-07-22T04:00:00-04:00</published><updated>2025-07-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-07-22:/weekly-roundup-2025-07-22</id><summary type="html">&lt;p class="first last"&gt;I probably shouldn't have powered through that headache at the end, but it was &lt;em&gt;really annoying me&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I made some progress related to type checking. (To be honest, my writeup is too vague for me to remember.)&lt;/li&gt;
&lt;li&gt;Thursday: I made a bit more progress, and identified some major stumbling blocks.&lt;/li&gt;
&lt;li&gt;Friday: I got some stuff working. I mentioned &amp;quot;typing&amp;quot; in the writeup, and I'm now realizing that was ambiguous between what I meant and what would have been nice. I got the Python code to typecheck.&lt;/li&gt;
&lt;li&gt;Saturday: I made something of a plan to move forward.&lt;/li&gt;
&lt;li&gt;Sunday: Tired.&lt;/li&gt;
&lt;li&gt;Monday: I tweaked the plan a little, and got the beginning of it taken care of; now it should just be a case of mopping up, with some minor new bits of code.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'll try to get all of this truly squared away, and maybe work on some other things as well.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category></entry><entry><title>Coding 2025-07-21</title><link href="https://mwchase.neocities.org/coding-2025-07-21" rel="alternate"></link><published>2025-07-21T04:00:00-04:00</published><updated>2025-07-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-07-21:/coding-2025-07-21</id><summary type="html">&lt;p class="first last"&gt;I couldn't see anything to do at this point besides the unpleasant part, so I guess I had to do that.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've updated the base node classes for the System F implementation, thereby breaking everything else.
I &lt;em&gt;should&lt;/em&gt; just need to keep iterating on this until I fix all of the Mypy errors, but I'm not going to do that right now, since it's late and my focus is going elsewhere.&lt;/p&gt;
&lt;p&gt;So, I'm not going to do any of this tonight, but here's what I think needs to happen:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Get the code to pass Mypy.&lt;/li&gt;
&lt;li&gt;Get the tests to pass Mypy.&lt;/li&gt;
&lt;li&gt;Get the tests to pass.&lt;/li&gt;
&lt;li&gt;Take a break.&lt;/li&gt;
&lt;li&gt;Audit the code organization; there is a lot of &amp;quot;this technically works, which is good enough for now&amp;quot;.&lt;/li&gt;
&lt;li&gt;Address test coverage gaps.&lt;/li&gt;
&lt;li&gt;Fix the many outstanding lints.&lt;/li&gt;
&lt;li&gt;Take another look at the documentation and try to make it nicer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For now, I'm going to wind down and doodle.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Diary 2025-07-20</title><link href="https://mwchase.neocities.org/diary-2025-07-20" rel="alternate"></link><published>2025-07-20T04:00:00-04:00</published><updated>2025-07-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-07-20:/diary-2025-07-20</id><summary type="html">&lt;p class="first last"&gt;Skip.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'd been hoping to get stuff done with coding today, but it wasn't to be.
I should have a chance tomorrow, which is very soon, so I won't have to wait too long to try things out.
Anyway, I absolutely should not be up any longer.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2025-07-19</title><link href="https://mwchase.neocities.org/coding-2025-07-19" rel="alternate"></link><published>2025-07-19T04:00:00-04:00</published><updated>2025-07-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-07-19:/coding-2025-07-19</id><summary type="html">&lt;p class="first last"&gt;Still just chipping away at this stuff.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I made some progress, but it's getting late, so I'm just going to plan things for later, because I think I'm ready to update type checking.
Here's how it should go:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Checking implementation for synthesizing comp terms needs to be updated to potentially generate a constraint; I need to figure out how to deal with the new &amp;quot;path&amp;quot; concept in this context.&lt;/li&gt;
&lt;li&gt;Divide value types into synthesizing and checking; implement checking on synthesizing types.&lt;/li&gt;
&lt;li&gt;Create a kind ascription type.&lt;/li&gt;
&lt;li&gt;Write a checking implementation for comp types.&lt;/li&gt;
&lt;li&gt;Actually update all of the method signatures.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At that point, I should get a giant pile of type errors out of Mypy.
Once I grind through all of those, I'll get a whole bunch more type errors checking against the test suite, and I can update everything, and then hopefully the tests will finally pass.&lt;/p&gt;
&lt;p&gt;For now, I'm going to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-07-18</title><link href="https://mwchase.neocities.org/coding-2025-07-18" rel="alternate"></link><published>2025-07-18T04:00:00-04:00</published><updated>2025-07-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-07-18:/coding-2025-07-18</id><summary type="html">&lt;p class="first last"&gt;Solid progress, but not terribly interesting. Safe to skip.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I threw together constraint implementations and got typing to kind of, sort of, work.
I think it should be ready for me to try stuff out, but I want to get some rest before I give it a shot.&lt;/p&gt;
&lt;p&gt;And I really tried to come up with something else to say, and failed.
I'd better get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-07-17</title><link href="https://mwchase.neocities.org/coding-2025-07-17" rel="alternate"></link><published>2025-07-17T04:00:00-04:00</published><updated>2025-07-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-07-17:/coding-2025-07-17</id><summary type="html">&lt;p class="first last"&gt;Code is a liability, so I'm writing just enough to hopefully get things working.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I believe I have all of the scaffolding set up to rewrite the type checking code.
There are a few shortcomings:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I haven't put together the majority of reporting-specific code.&lt;/li&gt;
&lt;li&gt;It's possible I'm missing one specialized class, that fortunately is trivial to write if I need it.&lt;/li&gt;
&lt;li&gt;The typing annotations are extremely rough, and I don't have a good intuition currently for how to shore them up.&lt;/li&gt;
&lt;li&gt;Some of this code is just kind of messed up, and I don't feel like fixing it right now.&lt;/li&gt;
&lt;li&gt;I need to decide whether constraints should work by explicitly calling a method, or coercing to bool.&lt;/li&gt;
&lt;li&gt;Constraints need to capture the environment, or lots of things won't really work.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I think I &lt;em&gt;need&lt;/em&gt; to get that last one squared away, and then I can chip away at the rest as I see fit.&lt;/p&gt;
&lt;p&gt;Maybe I'd have gotten more done if I wasn't playing Gentoo Rescue and watching videos about games I don't play.
Maybe not.
Technically, we'll never know.&lt;/p&gt;
&lt;p&gt;But I will try to get a bit more done tomorrow.
For now, once again, bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-07-16</title><link href="https://mwchase.neocities.org/coding-2025-07-16" rel="alternate"></link><published>2025-07-16T04:00:00-04:00</published><updated>2025-07-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-07-16:/coding-2025-07-16</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Yeah, sure, I'll rewrite the type checker. But first I have to move these penguins around in increasingly baroque ways.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've been messing with those code blocks from last time, and refining them.
I'm feeling pretty good about the state of the code, but it's only going to come together once I start making actual constraints, to replace the minimal stub I've created.&lt;/p&gt;
&lt;p&gt;Otherwise, I haven't thought too hard about this, because, again, Gentoo Rescue.&lt;/p&gt;
&lt;p&gt;At this point, it's late and I need to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-07-15</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-07-15" rel="alternate"></link><published>2025-07-15T04:00:00-04:00</published><updated>2025-07-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-07-15:/weekly-roundup-2025-07-15</id><summary type="html">&lt;p class="first last"&gt;It took some time and effort, but I've finally got something to work from.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I worked on generalizing the kinds of statements the type checker can make on failure.&lt;/li&gt;
&lt;li&gt;Thursday: I had some ideas for representing those statements as data.&lt;/li&gt;
&lt;li&gt;Friday: I preparation for this work, I wrote string representations of (most) types and terms.&lt;/li&gt;
&lt;li&gt;Saturday: I finished off the string representations, for now.&lt;/li&gt;
&lt;li&gt;Sunday: Zoned out.&lt;/li&gt;
&lt;li&gt;Monday: I finally wrote some decent draft code of this stuff.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to refine the draft code into something nice and streamlined to use.
Also, I'm going to look for other stuff to focus on as well.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category></entry><entry><title>Coding 2025-07-14</title><link href="https://mwchase.neocities.org/coding-2025-07-14" rel="alternate"></link><published>2025-07-14T04:00:00-04:00</published><updated>2025-07-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-07-14:/coding-2025-07-14</id><summary type="html">&lt;p class="first last"&gt;Finally, I have a somewhat concrete idea to weigh the pros and cons of.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I think if I'm going to get anywhere with this concept of a context, or a path, or whatever, I'm going to need to sketch things out before trying to create the classes.
Let's do this as a before-and-after.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_inferred_type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;abc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CompType&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;TY&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;TY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;K&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;K&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;TypeKind&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="n"&gt;func_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inferred_type&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Expected function, got &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rator&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; of type &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;func_type&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rand&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;check_type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func_type&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;func_type&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And the goal is something like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_inferred_type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Generator&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="n"&gt;Constraint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="n"&gt;abc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CompType&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;TY&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;TY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;K&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;K&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;TypeKind&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="n"&gt;func_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;type_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="k"&gt;yield from&lt;/span&gt; &lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;coerce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inferred_type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;AccessedFrom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;rator&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;yield from&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rand&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;check_type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;AccessedFrom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;rand&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;func_type&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;type_path&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;AccessedFrom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;from_&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;func_type&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;type_path&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;AccessedFrom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;to&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This should give me something to chew on, so far as coming up with proper interfaces.
I'm most interested in coming up with some way to cut down on the redundancy of generating the value and accessing the path.
As I said, something to chew on.
Anyway, I'm tired.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category></entry><entry><title>Diary 2025-07-13</title><link href="https://mwchase.neocities.org/diary-2025-07-13" rel="alternate"></link><published>2025-07-13T04:00:00-04:00</published><updated>2025-07-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-07-13:/diary-2025-07-13</id><summary type="html">&lt;p class="first last"&gt;Let's be real, I was watching game shows for like three hours.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I tried to rework stuff for Impliciula, and it didn't work out.
I also did other stuff today, but ultimately I got frustrated because I couldn't figure out the right way to associate more data with types as part of checking.&lt;/p&gt;
&lt;p&gt;Thinking about it, maybe I'll do better if I just try re-implementing the new system next to the old one, and see what I need to make it work.&lt;/p&gt;
&lt;p&gt;But that's definitely not happening right now.
Need sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2025-07-12</title><link href="https://mwchase.neocities.org/coding-2025-07-12" rel="alternate"></link><published>2025-07-12T04:00:00-04:00</published><updated>2025-07-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-07-12:/coding-2025-07-12</id><summary type="html">&lt;p class="first last"&gt;Incremental progress. Not very interesting.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm done with string representations for now, but I still managed to have kind of a rough day, so rather than necessarily trying to force implementing the new stuff I have planned tomorrow, I'm going to take things easy and see what I'm actually up for.&lt;/p&gt;
&lt;p&gt;No more sentences, it would take too long.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-07-11</title><link href="https://mwchase.neocities.org/coding-2025-07-11" rel="alternate"></link><published>2025-07-11T04:00:00-04:00</published><updated>2025-07-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-07-11:/coding-2025-07-11</id><summary type="html">&lt;p class="first last"&gt;I really need a good night's sleep...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm working on stringifying everything nicely.
I got a bunch of stuff done, including existentials, which are &lt;em&gt;probably&lt;/em&gt; right, but confusing.
I got to thunks, and then kind of zoned out for a few hours.
Once I figure out the right representation of thunks wait never mind, I got it, now all that's left is handling universal types and the associated terms.
That should be pretty quick once I've had some rest.&lt;/p&gt;
&lt;p&gt;Anyway, I'm not going to stay up much later, so I'll call this entry here.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-07-10</title><link href="https://mwchase.neocities.org/coding-2025-07-10" rel="alternate"></link><published>2025-07-10T04:00:00-04:00</published><updated>2025-07-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-07-10:/coding-2025-07-10</id><summary type="html">&lt;p class="first last"&gt;One step forward, two steps back.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've worked out that probably the sensible formulation is to have some kind of &amp;quot;provenance&amp;quot; that I can bundle up with nodes, different classes for each kind of constraint that I've thought of, with a constructor that takes bundled nodes and operates on just the node data, to determine whether the constraint is violated.
The problem is, I'm having trouble figuring out what the &amp;quot;provenance&amp;quot; should be, and what should be elided, and how.&lt;/p&gt;
&lt;p&gt;I think part of the problem could be that I'm unsure whether making the AST more expressive would help.
The problem there is that the plan has always been to compile down to this System F Omega stuff as a somewhat-intermediate representation, but until I have the higher-level data structures to compile down, the obvious way to construct these trees is going to be full-on artisanal.&lt;/p&gt;
&lt;p&gt;In the interest of making things work, I'm going to try the following in the next few days:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Come up with a stub string representation for all computation terms.&lt;/li&gt;
&lt;li&gt;Come up with proper string representations for all value terms.&lt;/li&gt;
&lt;li&gt;Actually, see if I can &lt;em&gt;somewhat&lt;/em&gt; present useful information for computation terms.&lt;/li&gt;
&lt;li&gt;Create a union type to represent provenance.&lt;/li&gt;
&lt;li&gt;Create a parametric bundling type.&lt;/li&gt;
&lt;li&gt;Write the different constraint classes.&lt;/li&gt;
&lt;li&gt;Try to give the resulting data a somewhat human-readable presentation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For now, I'm going to be getting ready for bed as quickly as possible, because I got distracted by Gentoo Rescue.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-07-09</title><link href="https://mwchase.neocities.org/coding-2025-07-09" rel="alternate"></link><published>2025-07-09T04:00:00-04:00</published><updated>2025-07-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-07-09:/coding-2025-07-09</id><summary type="html">&lt;p class="first last"&gt;Repeatedly reworking this information until it's suitably simplified.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've picked out seven basic structures of statement about relations between values and types, etc, in the System F code.
Once I've generalized those to kinds and computations, I should have all of the planning I need done to get back into the code.
No promises, though.&lt;/p&gt;
&lt;p&gt;I was once again focusing on other things today and sort of taking it easy, so I once again did that work in the space of a few minutes.
But I've got that information, and I can convert it into a checklist and start working through it.
Hopefully, I can get on that tomorrow, but if not, oh well.&lt;/p&gt;
&lt;p&gt;Anyway, I want to get to bed now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-07-08</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-07-08" rel="alternate"></link><published>2025-07-08T04:00:00-04:00</published><updated>2025-07-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-07-08:/weekly-roundup-2025-07-08</id><summary type="html">&lt;p class="first last"&gt;Gotta eat my vegetables...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: Oh no, bidirectional type checking is giving me different error messages when I check malformed syntax trees. Better think about this for over a week!&lt;/li&gt;
&lt;li&gt;Thursday: I came up with a plan/excuse for how emitting error messages is kind of like generating a constraint set.&lt;/li&gt;
&lt;li&gt;Friday: Felt bad, but had some ideas for how to handle these error messages in a more principled way than &amp;quot;it's strings!&amp;quot;&lt;/li&gt;
&lt;li&gt;Saturday: I tried to put together a list of everything that can go wrong for one of these syntax trees.&lt;/li&gt;
&lt;li&gt;Sunday: I took that list and tried to converge the phrasing so I can have half-a-dozen classes/helpers, instead of, like, twenty.&lt;/li&gt;
&lt;li&gt;Monday: &amp;quot;Hm, some of these messages kind of have to glom onto subsequent messages; I need to model that somehow.&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to take my message drafts and try to put them through a few rounds of prototyping.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category></entry><entry><title>Coding 2025-07-07</title><link href="https://mwchase.neocities.org/coding-2025-07-07" rel="alternate"></link><published>2025-07-07T04:00:00-04:00</published><updated>2025-07-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-07-07:/coding-2025-07-07</id><summary type="html">&lt;p class="first last"&gt;Clawing out progress, bit by bit.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I've drafted constraint descriptions, and I've got some ideas for creating classes based on common patterns in phrasing.
Once I'm feeling a little better, I'll hopefully have something prototyped to see whether I'm going in the right direction.&lt;/p&gt;
&lt;p&gt;I've got some idea that I'd like a kind of constraint description that just affixes onto a more specific one.
Not sure if it should be prefix or suffix.
I'll think about that while I wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-07-06</title><link href="https://mwchase.neocities.org/coding-2025-07-06" rel="alternate"></link><published>2025-07-06T04:00:00-04:00</published><updated>2025-07-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-07-06:/coding-2025-07-06</id><summary type="html">&lt;p class="first last"&gt;Had to unwind all day, couldn't actually make any progress here...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, here's the tack I'm taking.
I'm translating each of the possible constraints I developed into a short statement of that constraint, with placeholder values to be filled in.
From these, I intend to create classes representing the different constraints.&lt;/p&gt;
&lt;p&gt;The hope is that I can figure out some way to chain these constraints together to form some sort of causal narrative.
We'll see how that works out.
I kind of need sleep before I can make any meaningful progress.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-07-05</title><link href="https://mwchase.neocities.org/coding-2025-07-05" rel="alternate"></link><published>2025-07-05T04:00:00-04:00</published><updated>2025-07-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-07-05:/coding-2025-07-05</id><summary type="html">&lt;p class="first last"&gt;Making progress, and, unrelatedly, having a bad time.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I just put together a preliminary list of everything that can generate an error when checking/synthesizing types.
The next tasks are to figure out how and whether these all interact, and where to carry out some of the checks.&lt;/p&gt;
&lt;p&gt;After that I can work on stuff like building up error contexts.
I'd like to work on that now, but it's late and my focus is shot, so I'm going to try to get some rest and see if that addresses the various problems I'm having.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-07-04</title><link href="https://mwchase.neocities.org/coding-2025-07-04" rel="alternate"></link><published>2025-07-04T04:00:00-04:00</published><updated>2025-07-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-07-04:/coding-2025-07-04</id><summary type="html">&lt;p class="first last"&gt;Might have gotten more done today if I hadn't been tired since like 8 AM.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Oh wow.
On the one hand, I've made some progress planning things, but on the other hand I feel awful.
I'm going to try to quickly lay out a plan, and then get to sleep and hope my body recovers from whatever is happening.&lt;/p&gt;
&lt;p&gt;Long term, I want to be dealing with some kind of error object instead of strings, and such a thing can probably be broken down into two basic categories: triples of context, expected type, and actual type, and triples of context, expected kind, and actual kind.
Long term, I want to be yielding these from a generator, but for now, I can get tests working again if I simply use them to generate an error message.
I think I want the &amp;quot;context&amp;quot; templates to be available at the top level, so I can write tests for them withouth having to synthesize awkward syntax trees, but on the other hand, I want to make sure incorrect trees generate the right error messages, so I don't know, I'll have to think about it more.&lt;/p&gt;
&lt;p&gt;For now, I'm going to try to read and let my brain spin down a little.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-07-03</title><link href="https://mwchase.neocities.org/coding-2025-07-03" rel="alternate"></link><published>2025-07-03T04:00:00-04:00</published><updated>2025-07-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-07-03:/coding-2025-07-03</id><summary type="html">&lt;p class="first last"&gt;Defining &amp;quot;the thing I want to do&amp;quot; as a special case of &amp;quot;the thing I probably need to do&amp;quot; feels so nice and freeing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm still spitballing ideas for reworking error generation.
One thing that I'm kind of stuck on is that I'm fairly sure I'll want to do typing via constraint solving eventually, but do I want do try to get it working &lt;em&gt;right now&lt;/em&gt;?
And if I don't do constraint solving &lt;em&gt;right now&lt;/em&gt;, can I find some way to minimize the disruption of switching to something now, and then from that thing later?&lt;/p&gt;
&lt;p&gt;Alternatively, can the ideas I'm messing with currently grow to handle the stuff I think I'll need constraint solving for later?
Well, let's consider the &amp;quot;later&amp;quot;.
I'm going to want to check function bodies &amp;quot;in isolation&amp;quot;.
In other words, a given function's type ascription checks inward, and it can infer outward from any other ascription, (which points me towards some mild problems with how I'm doing bidirectional typing, and which may be the problem the paper was trying to warn me about), and I'm going to want to verify that the predicates from the refinement types hold.
Verifying this may involve the invocation of lemmas, and testing the subtype relation based on predicate implication.&lt;/p&gt;
&lt;p&gt;My gut and my heart tell me that this can be made to work in a syntax-directed fashion, but unless I can (figure out how to) prove this, I at least need a backup plan of some kind.
Okay, I see &amp;quot;Refinement types combine SMT decidable constraints with a compositional, syntax-directed type system&amp;quot;, but do I gotta bring in SMT?
Maybe I could conceptualize the current &amp;quot;error&amp;quot; plan as only emitting unsatisfiable constraints?
Error reporting would then notionally involve, for each constraint, finding the smallest set of other constraints that are satisfiable without it, but unsatisfiable with it, for some definition of &amp;quot;smallest&amp;quot;, and possibly &amp;quot;the&amp;quot;.&lt;/p&gt;
&lt;p&gt;With all of that in mind, I've got a fairly good idea of how I can proceed with this idea, but I want to take things slow, so I'll wrap this up for tonight and see if I feel ready to take it on tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category></entry><entry><title>Coding 2025-07-02</title><link href="https://mwchase.neocities.org/coding-2025-07-02" rel="alternate"></link><published>2025-07-02T04:00:00-04:00</published><updated>2025-07-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-07-02:/coding-2025-07-02</id><summary type="html">&lt;p class="first last"&gt;I'd feel slightly better about this problem if I'd anticipated it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, here's the deal.
I think I see how to recover something like the error reporting functionality I had in pure inference mode.
The current type-checking code is incapable of reconstructing the context available to the caller, which is where the error &lt;em&gt;used to&lt;/em&gt; be generated from.
So, if I want to replicate the same error information, then I need to build up some form of context object at the outermost layer of checking, and propagate it towards the leaf nodes.
From inspecting &lt;tt class="docutils literal"&gt;rg&lt;/tt&gt; output on my codebase, I can see that no method ever performs more than one check; the unimplemented nodes are &lt;em&gt;solely&lt;/em&gt; types, so that won't change anything.
However, I do kind of want to try making kinding bidirectional for the heck of it, which will result in type checking sometimes turning into kind checking, and will lead to some form of branching in the error message generation.
Currently, checking failure leads to an exception being raised, but I want to have the way open to generating typing constraints instead, which is going to be a Whole Thing, and means that every validation path will end up being taken...&lt;/p&gt;
&lt;p&gt;Convincing Python to suddenly be Prolog sounds like a project all its own.
The feeling I'm getting thinking about this is that I'm going to need to do some experimentation to figure out what this code should look like, and how many forms it's going to have to go through.&lt;/p&gt;
&lt;p&gt;One thought that comes to mind is that replicating the current behavior doesn't require an exception to be raised in a check function, only in the inference function that called it.
So, perhaps I could rework the check functions to return some form of problem report...&lt;/p&gt;
&lt;p&gt;Perhaps what is needed is some idea of how more featureful compilers report errors.
I'm going to need to track down some more papers, I guess.
And get back to taking notes.&lt;/p&gt;
&lt;p&gt;Anyway, I need to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category></entry><entry><title>Weekly Roundup 2025-07-01</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-07-01" rel="alternate"></link><published>2025-07-01T04:00:00-04:00</published><updated>2025-07-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-07-01:/weekly-roundup-2025-07-01</id><summary type="html">&lt;p class="first last"&gt;Yay, I made something.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I planned the layout of the cover for Way Too Fast!!&lt;/li&gt;
&lt;li&gt;Thursday: I carried out some of those plans, and gave up on others.&lt;/li&gt;
&lt;li&gt;Friday: I finished the cover, put together the PDF, and had [FUN] figuring out Itch.io's jam submission modal, which has what I would characterize as some rough edges.&lt;/li&gt;
&lt;li&gt;Saturday: I got back to Impliciula, tried to simplify the code, and failed, so I scaled back the planned simplification.&lt;/li&gt;
&lt;li&gt;Sunday: The planned simplification worked, so I planned further changes.&lt;/li&gt;
&lt;li&gt;Monday: I made those changes, to introduce bidirectional typing, and ran into a few issues.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to address those issues, and maybe work on a few other things.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category><category term="Way Too Fast!!"></category></entry><entry><title>Coding 2025-06-30</title><link href="https://mwchase.neocities.org/coding-2025-06-30" rel="alternate"></link><published>2025-06-30T04:00:00-04:00</published><updated>2025-06-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-06-30:/coding-2025-06-30</id><summary type="html">&lt;p class="first last"&gt;Maybe if I add custom checking logic to some of the synthesizing nodes...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got bidirectional typing set up.
Most things are still doing inference, though.
Functionally, what I have is &amp;quot;functions require ascriptions, and one of the tests is broken because I messed up error reporting&amp;quot;.
The former is a step forward, I think, and the latter...
I'm going to need to ponder hard how to fix this.
(It's possible that I'll try switching some things from synthesizing to checking, but right now the only reason I could think of to do so is if it would somehow improve error reporting.)&lt;/p&gt;
&lt;p&gt;I'll see what I come up with, but for now I'm going to take it easy.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-06-29</title><link href="https://mwchase.neocities.org/coding-2025-06-29" rel="alternate"></link><published>2025-06-29T04:00:00-04:00</published><updated>2025-06-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-06-29:/coding-2025-06-29</id><summary type="html">&lt;p class="first last"&gt;Preparing to make a bunch of onerous code changes.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, after a good but exhausting day, I've successfully culled the type variables in the trees down to &amp;quot;term, type, and kind&amp;quot;.
Now, the different sorts of term and type that I had before are distinguished by the specific class that they inherit from, not which type variable they are associated with.
This is a step forward, because now I can introduce more base classes into the node hierarchy without multiplying the number of type variables in play.&lt;/p&gt;
&lt;p&gt;And I want to do &lt;em&gt;that&lt;/em&gt; because I'm investigating bidirectional typing, which introduces a distinction in which all nodes can check types, but some nodes can also synthesize types, and I want to try encoding that distinction into the node types, such that, if a particular node type needs one of its children to synthesize a type, then that child will be able to synthesize, if a valid type exists.
In other words, the Python type system should be able to guarantee that all necessary type ascriptions are carried out.&lt;/p&gt;
&lt;p&gt;Now, one of the reasons I want to explore bidirectional typing is that I suspect it will improve some of the ergonomics around function typing; this justification is kind of just there to make me feel better about totally redoing the typing system in a way that will also break most of my tests.&lt;/p&gt;
&lt;p&gt;It's late, and I don't currently have the energy to evaluate two important questions:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Have I picked the right directions for everything, or should I make some fairly obvious tweaks?&lt;/li&gt;
&lt;li&gt;What do I want the new interface to look like?
I'm currently leaning toward an &amp;quot;&lt;tt class="docutils literal"&gt;inferred_type&lt;/tt&gt;&amp;quot; property and a &amp;quot;&lt;tt class="docutils literal"&gt;check_type&lt;/tt&gt;&amp;quot; method.&lt;/li&gt;
&lt;li&gt;The secret third question: is it possible to guarantee that a synthesizing node always reduces to a synthesizing node, and if so, what compromises are required?
(I mean, a synthesizing node knows its own type, by definition, so I guess it could just generate a possibly-redundant ascription node?
Or there could be methods on the relevant node types to say &amp;quot;given this type, return &lt;em&gt;some&lt;/em&gt; node that has the same behavior, and synthesizes the type, if it synthesizes at all&amp;quot;.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, that's a lot to think about, and there's no way I'm making any good decisions on it in the next half hour, so I'm going to wrap things up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category></entry><entry><title>Coding 2025-06-28</title><link href="https://mwchase.neocities.org/coding-2025-06-28" rel="alternate"></link><published>2025-06-28T04:00:00-04:00</published><updated>2025-06-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-06-28:/coding-2025-06-28</id><summary type="html">&lt;p class="first last"&gt;Even if it won't deal with everything, it should still cut down the cruft considerably.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I'm back to coding, and for my triumphant return, I... discover that my planned simplification to the node types simply does not work.
Fortunately for the code, there is a less ambitious change that should work, and still accomplish the improvement that I'm trying to get.&lt;/p&gt;
&lt;p&gt;Basically, before, I was trying to collapse every node type variable into one, and it turns out that going &lt;em&gt;that&lt;/em&gt; far breaks it, but I should be able to collapse the node type variables into kind, type, and term, and then freely subclass from those base classes.
I'll see if that all makes sense to me tomorrow, but I've got a good feeling about this new plan.&lt;/p&gt;
&lt;p&gt;Anyway, I really should get ready for bed now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>WTFJam 2025-06-27</title><link href="https://mwchase.neocities.org/wtfjam-2025-06-27" rel="alternate"></link><published>2025-06-27T04:00:00-04:00</published><updated>2025-06-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-06-27:/wtfjam-2025-06-27</id><summary type="html">&lt;p class="first last"&gt;Feels like I used up most of my brain on this last bit.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The cover is finalized, the PDFs are generated and combined, the document is apparently not C5 envelope sized but I have no idea what it is, but close enough.
Everything is done.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Except you haven't submitted it.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Itch?
Itch?!
What is the &lt;em&gt;problem&lt;/em&gt;?&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Some time has passed since the previous line, and we now understand everything.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Heeheehee, I missed the &amp;quot;submission&amp;quot; badge on the project page and the &amp;quot;submit&amp;quot; modal never told me that I already submitted something.&lt;/p&gt;
&lt;p&gt;I sleep now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="WTFJam"></category><category term="Way Too Fast!!"></category><category term="short post"></category></entry><entry><title>WTFJam 2025-06-26</title><link href="https://mwchase.neocities.org/wtfjam-2025-06-26" rel="alternate"></link><published>2025-06-26T04:00:00-04:00</published><updated>2025-06-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-06-26:/wtfjam-2025-06-26</id><summary type="html">&lt;p class="first last"&gt;On the final stretch...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've scaled back my ambitions for the cover of Way Too Fast!!, and taken a few hours to get more or less what said scaled-back ambitions call for.
My plan now is to sleep on this, and see how I feel about it tomorrow.
There is one tweak I might attempt, but I have to be willing to bail if it doesn't work out.&lt;/p&gt;
&lt;p&gt;Regardless, I hope to finalize the cover design tomorrow, do one more pass over the playset contents, and submit this, then be done with it.&lt;/p&gt;
&lt;p&gt;Anyway, I should get ready for bed now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="WTFJam"></category><category term="Way Too Fast!!"></category><category term="short post"></category></entry><entry><title>WTFJam 2025-06-25</title><link href="https://mwchase.neocities.org/wtfjam-2025-06-25" rel="alternate"></link><published>2025-06-25T04:00:00-04:00</published><updated>2025-06-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-06-25:/wtfjam-2025-06-25</id><summary type="html">&lt;p class="first last"&gt;Either this works out or it doesn't. It honestly seems like about fifty-fifty at this point.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I've sketched out all of the major elements of the Way Too Fast!! cover.
My plan for the next few days is to recreate my sketches as vector drawings, and hope they come together somewhat nicely.
I don't want to try to put that together right now, so I'll just note that it looks like the template I'm using is meant to be printed at a size of C5 Envelope, or 6.38 by 9.01 inches.
So, if I get the cover art to match that, hopefully it will all look good.&lt;/p&gt;
&lt;p&gt;I will try to see tomorrow whether it is feasible for me to put all of this together myself; if not, I'll probably just go for something rougher.&lt;/p&gt;
&lt;p&gt;Anyway, I let it get late, so let's wrap this up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="WTFJam"></category><category term="Way Too Fast!!"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-06-24</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-06-24" rel="alternate"></link><published>2025-06-24T04:00:00-04:00</published><updated>2025-06-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-06-24:/weekly-roundup-2025-06-24</id><summary type="html">&lt;p class="first last"&gt;In spite of various factors, I think I can stick the landing.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I got started on objects.&lt;/li&gt;
&lt;li&gt;Thursday: I got everything drafted, and decided to let things sit for a few days.&lt;/li&gt;
&lt;li&gt;Friday: I started messing with Impliciula again, and complained about the things I decided I needed to do.&lt;/li&gt;
&lt;li&gt;Saturday: I got done with the stuff I needed to do to Impliciula, but decided to hold off a few days before doing the stuff I &lt;em&gt;want&lt;/em&gt; to do.&lt;/li&gt;
&lt;li&gt;Sunday: I tried to take things easy and do some basic, undemanding tasks.&lt;/li&gt;
&lt;li&gt;Monday: I got those basic tasks done, while suffering.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to make a cover image for Way Too Fast!!, and get it in by the weekend.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Way Too Fast!!"></category><category term="Impliciula"></category></entry><entry><title>WTFJam 2025-06-23</title><link href="https://mwchase.neocities.org/wtfjam-2025-06-23" rel="alternate"></link><published>2025-06-23T04:00:00-04:00</published><updated>2025-06-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-06-23:/wtfjam-2025-06-23</id><summary type="html">&lt;p class="first last"&gt;Transcribing data to ignore the stomach cramps...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got most of the draft for Way Too Fast!! loaded into a (slightly janky) template, and now there are just two major things to work on:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Picking everything out for the quick setup recommendations&lt;/li&gt;
&lt;li&gt;Making a snazzy cover image&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm not totally sure I can put together what I have in mind for the cover, but I'll try for as long as I have time.&lt;/p&gt;
&lt;p&gt;For now, I had a rough day, and I need to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="WTFJam"></category><category term="Way Too Fast!!"></category><category term="short post"></category></entry><entry><title>Diary 2025-06-22</title><link href="https://mwchase.neocities.org/diary-2025-06-22" rel="alternate"></link><published>2025-06-22T04:00:00-04:00</published><updated>2025-06-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-06-22:/diary-2025-06-22</id><summary type="html">&lt;p class="first last"&gt;I was feeling lightly burnt out, so I tried to take things easy...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I made some light edits to Way Too Fast!!, and I plan to start getting the draft into the template soon.&lt;/p&gt;
&lt;p&gt;I'm making sure I'm comfortable with the next step to update Impliciula, and I've been rereading various papers to get some idea of the task that I've set for myself to incorporate the advanced features that are kind of the point of all of this.&lt;/p&gt;
&lt;p&gt;Anyway, it's late and I need to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="Way Too Fast!!"></category><category term="Impliciula"></category></entry><entry><title>Coding 2025-06-21</title><link href="https://mwchase.neocities.org/coding-2025-06-21" rel="alternate"></link><published>2025-06-21T04:00:00-04:00</published><updated>2025-06-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-06-21:/coding-2025-06-21</id><summary type="html">&lt;p class="first last"&gt;It's a little annoying that I haven't come up with tests that typecheck...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've managed to write tests to cover all of the code that I want to cover right now.
Rather than jumping right into refactoring the type annotations, I'm instead rehashing the problem and my intended solution, to try to be sure that I won't somehow make things worse.&lt;/p&gt;
&lt;p&gt;My plan right now is to get back to Way Too Fast!! in some capacity tomorrow, and work on this code as I see fit.
For now, I need to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-06-20</title><link href="https://mwchase.neocities.org/coding-2025-06-20" rel="alternate"></link><published>2025-06-20T04:00:00-04:00</published><updated>2025-06-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-06-20:/coding-2025-06-20</id><summary type="html">&lt;p class="first last"&gt;Kvetching.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was pretty tired today, so I ultimately ended up poking at Impliciula's code &lt;em&gt;a little&lt;/em&gt;, and making &lt;em&gt;some improvement&lt;/em&gt; to test coverage.
At this point, I believe the right thing to do is to make careful improvements to the method coverage for universal types.&lt;/p&gt;
&lt;p&gt;But what I &lt;em&gt;want&lt;/em&gt; to do is make some code changes that I haven't tested, but I'm pretty sure will work and dramatically cut down on the verbosity of the types I'm using to implement this.
That will then open up the potential to define more node types, which will enable me to totally rework type inference, in a way that's going to require updates to all of my tests...&lt;/p&gt;
&lt;p&gt;But no, the responsible thing to do is to get some form of coverage around stuff like weird nestings of type functions.
Ugh.&lt;/p&gt;
&lt;p&gt;Anyway, I spent long enough sloooowly typing this, I'd better wrap up and be ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>WTFJam 2025-06-19</title><link href="https://mwchase.neocities.org/wtfjam-2025-06-19" rel="alternate"></link><published>2025-06-19T04:00:00-04:00</published><updated>2025-06-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-06-19:/wtfjam-2025-06-19</id><summary type="html">&lt;p class="first last"&gt;Far enough ahead that I don't need to go fast any more.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got all 144 entries for Way Too Fast!! drafted, so I'm letting that sit for a day or two before I do an editing pass on it.
(Can you believe I thought I might be able to get two games done for this? Given the scale of the game I &lt;em&gt;didn't&lt;/em&gt; do, a ludicrous idea.)&lt;/p&gt;
&lt;p&gt;Anyway, I got back into working on Impliciula, and I've got to work out a better way to generate test cases, because what I have now?
Sucks.&lt;/p&gt;
&lt;p&gt;Anyway, let's wind down now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="WTFJam"></category><category term="Way Too Fast!!"></category><category term="short post"></category></entry><entry><title>WTFJam 2025-06-18</title><link href="https://mwchase.neocities.org/wtfjam-2025-06-18" rel="alternate"></link><published>2025-06-18T04:00:00-04:00</published><updated>2025-06-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-06-18:/wtfjam-2025-06-18</id><summary type="html">&lt;p class="first last"&gt;Not that fast, but fast enough.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm through with locations, and now I need to make more progress on objects.
I made a little progress today, but I need 26 more.
It shouldn't be a big deal, but I don't have the focus for it right now.&lt;/p&gt;
&lt;p&gt;I'm going to wrap this up for tonight and read stuff.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="WTFJam"></category><category term="Way Too Fast!!"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-06-17</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-06-17" rel="alternate"></link><published>2025-06-17T04:00:00-04:00</published><updated>2025-06-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-06-17:/weekly-roundup-2025-06-17</id><summary type="html">&lt;p class="first last"&gt;Probably fast enough.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I got the relationships for Way Too Fast!! &lt;em&gt;almost&lt;/em&gt; wrapped up.&lt;/li&gt;
&lt;li&gt;Thursday: I finished up the relationships, and started on the needs.&lt;/li&gt;
&lt;li&gt;Friday: I got to halfway through the needs.&lt;/li&gt;
&lt;li&gt;Saturday: I finished the needs.&lt;/li&gt;
&lt;li&gt;Sunday: I didn't have much to talk about.&lt;/li&gt;
&lt;li&gt;Monday: I got to halfway through locations.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'll try to wrap up locations, and work on items.
Hopefully that gets all done soon.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Way Too Fast!!"></category></entry><entry><title>WTFJam 2025-06-16</title><link href="https://mwchase.neocities.org/wtfjam-2025-06-16" rel="alternate"></link><published>2025-06-16T04:00:00-04:00</published><updated>2025-06-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-06-16:/wtfjam-2025-06-16</id><summary type="html">&lt;p class="first last"&gt;At a decent speed.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I think I'm about halfway done with locations.
If I keep the pace, I'll have everything drafted by the end of the week.
The big question is, once I have a draft, do I just send it to get the jam over with, or do I actually try to polish it any before publishing?&lt;/p&gt;
&lt;p&gt;The decision I make &lt;em&gt;may&lt;/em&gt; end up influenced by the fact that I'm itching to get back to futzing with the code that's supposed to eventually become Impliciula.&lt;/p&gt;
&lt;p&gt;Anyway, I should wrap up for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="WTFJam"></category><category term="Way Too Fast!!"></category><category term="short post"></category></entry><entry><title>Diary 2025-06-15</title><link href="https://mwchase.neocities.org/diary-2025-06-15" rel="alternate"></link><published>2025-06-15T04:00:00-04:00</published><updated>2025-06-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-06-15:/diary-2025-06-15</id><summary type="html">&lt;p class="first last"&gt;I actually don't know what to put here. Um, this isn't interesting, so don't feel compelled to click through?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;As I anticipated, I didn't have much time to work on Way Too Fast!! today, and I don't feel like talking about what I did do.&lt;/p&gt;
&lt;p&gt;I think I need to get away from this screen and zone out for a bit, so let's see about that.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>WTFJam 2025-06-14</title><link href="https://mwchase.neocities.org/wtfjam-2025-06-14" rel="alternate"></link><published>2025-06-14T04:00:00-04:00</published><updated>2025-06-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-06-14:/wtfjam-2025-06-14</id><summary type="html">&lt;p class="first last"&gt;Oh yes, it's all coming together.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Needs are drafted.
I'm kind of assuming tomorrow will be a wash, and I'm not too sure about the day after that, but my hope/assumption is that I can get something together for locations and objects next week.&lt;/p&gt;
&lt;p&gt;We shall see.&lt;/p&gt;
&lt;p&gt;For now, I should wrap up and be ready for tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="WTFJam"></category><category term="Way Too Fast!!"></category><category term="short post"></category></entry><entry><title>WTFJam 2025-06-13</title><link href="https://mwchase.neocities.org/wtfjam-2025-06-13" rel="alternate"></link><published>2025-06-13T04:00:00-04:00</published><updated>2025-06-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-06-13:/wtfjam-2025-06-13</id><summary type="html">&lt;p class="first last"&gt;Not as much progress as I'd like, but I feel like there's a path to achieving my goals.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Halfway through needs, and I need access to my notes to get much further, but it's late and I don't really want to get them right now.&lt;/p&gt;
&lt;p&gt;I'll try to wrap up needs tomorrow, or by the end of the weekend at the latest, then get to work in earnest.&lt;/p&gt;
&lt;p&gt;I'm going to wrap things up for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="WTFJam"></category><category term="Way Too Fast!!"></category><category term="short post"></category></entry><entry><title>WTFJam 2025-06-12</title><link href="https://mwchase.neocities.org/wtfjam-2025-06-12" rel="alternate"></link><published>2025-06-12T04:00:00-04:00</published><updated>2025-06-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-06-12:/wtfjam-2025-06-12</id><summary type="html">&lt;p class="first last"&gt;Could be faster.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The relationships table is now Good Enough.
I'm now working on coming up with some kind of categorization scheme for the draft needs, but it's slow going; I've currently got ten in two categories, and of course, I need thirty-six in six.&lt;/p&gt;
&lt;p&gt;Right now, I'm banking on the hope that I'll be able to grind through objects and locations &lt;em&gt;really quickly&lt;/em&gt;, and it makes sense to focus on needs, in order to shore up the foundation.
We shall see.&lt;/p&gt;
&lt;p&gt;Anyway, I'm out of focus for this for now, so I'll try to get some serious progress on this tomorrow.
For now, I've got to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="WTFJam"></category><category term="Way Too Fast!!"></category><category term="short post"></category></entry><entry><title>WTFJam 2025-06-11</title><link href="https://mwchase.neocities.org/wtfjam-2025-06-11" rel="alternate"></link><published>2025-06-11T04:00:00-04:00</published><updated>2025-06-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-06-11:/wtfjam-2025-06-11</id><summary type="html">&lt;p class="first last"&gt;Currently deciding whether to keep or try to replace &amp;quot;Twins (Normal)&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've assigned all of the draft relationships for Way Too Fast!! into sub-categories, and filled in &lt;em&gt;most&lt;/em&gt; of the blanks.
There are just a few blank entries left, and a few that I'd like to come up with something different for, and one sub-category that doesn't really make sense yet.
But just the one, so if I can square all of this away, that's relationships handled.&lt;/p&gt;
&lt;p&gt;Needs is going to be interesting, because I don't yet have a good grasp on what kind of sub-categories will fit the draft needs.&lt;/p&gt;
&lt;p&gt;Anyway, I tried to round out the relationships, but I'm not quite there yet.
Just a little more, but not right now; it's late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="WTFJam"></category><category term="Way Too Fast!!"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-06-10</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-06-10" rel="alternate"></link><published>2025-06-10T04:00:00-04:00</published><updated>2025-06-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-06-10:/weekly-roundup-2025-06-10</id><summary type="html">&lt;p class="first last"&gt;Looking good so far, but we'll see...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I had a few more thoughts on Impliciula.&lt;/li&gt;
&lt;li&gt;Thursday: I did some very basic planning for WTFJam.&lt;/li&gt;
&lt;li&gt;Friday: I somewhat acted on those plans.&lt;/li&gt;
&lt;li&gt;Saturday: I didn't get anything done that I wrote down.&lt;/li&gt;
&lt;li&gt;Sunday: I got to about a quarter done.&lt;/li&gt;
&lt;li&gt;Monday: I made some more progress.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to finish up relationships and needs, then work on locations and objects.
Whenever those are done, I'm unfortunately going to need to give relationships and needs a few more passes, because there are... issues.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category><category term="Way Too Fast!!"></category></entry><entry><title>WTFJam 2025-06-09</title><link href="https://mwchase.neocities.org/wtfjam-2025-06-09" rel="alternate"></link><published>2025-06-09T04:00:00-04:00</published><updated>2025-06-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-06-09:/wtfjam-2025-06-09</id><summary type="html">&lt;p class="first last"&gt;Progress, but not well-described.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm still super tired from yesterday, but we did discuss the core stuff for Way Too Fast!! earlier.
(I &lt;em&gt;also&lt;/em&gt; took a bunch of notes for Impliciula, which, if I'm going to do that, I guess I'm going to do that, but, like, the jam.
Got to jam.)
I'm actually getting this post written early, so I can try and get a bit more done tonight.&lt;/p&gt;
&lt;p&gt;And I spaced out for a bit to see if I'd come up with anything else to post, and I didn't.
So we're done for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="WTFJam"></category><category term="Way Too Fast!!"></category><category term="short post"></category></entry><entry><title>WTFJam 2025-06-08</title><link href="https://mwchase.neocities.org/wtfjam-2025-06-08" rel="alternate"></link><published>2025-06-08T04:00:00-04:00</published><updated>2025-06-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-06-08:/wtfjam-2025-06-08</id><summary type="html">&lt;p class="first last"&gt;Nothing terribly interesting, sad to say.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;We had plans for most of today, so I ended up not getting too much done, but I have gotten to approximately the halfway point on relationships and needs.
If I keep up this &amp;quot;pace&amp;quot;, then I should just barely have something to submit by the end of the month; I'd prefer to work a little faster.
We'll see how things work out tomorrow.
For now, I want to go lie down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="WTFJam"></category><category term="Way Too Fast!!"></category><category term="short post"></category></entry><entry><title>Diary 2025-06-07</title><link href="https://mwchase.neocities.org/diary-2025-06-07" rel="alternate"></link><published>2025-06-07T04:00:00-04:00</published><updated>2025-06-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-06-07:/diary-2025-06-07</id><summary type="html">&lt;p class="first last"&gt;So safe to skip.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was out of it today.
It was so hot...&lt;/p&gt;
&lt;p&gt;Let's see what I can accomplish tomorrow, or the day after that.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>WTFJam 2025-06-06</title><link href="https://mwchase.neocities.org/wtfjam-2025-06-06" rel="alternate"></link><published>2025-06-06T04:00:00-04:00</published><updated>2025-06-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-06-06:/wtfjam-2025-06-06</id><summary type="html">&lt;p class="first last"&gt;Some ideas are a bit high-concept, like &amp;quot;what if a particular character presented two sides of themself, so fundamentally at odds, that they got different endings?&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I put in the effort today to come up with relationships and needs at what felt like a decent pace.
I still don't have thirty-six of each, though, so I'm going to have to put in more focused effort over the next few days.&lt;/p&gt;
&lt;p&gt;For now, I'm going to wrap up and try to deal with how dang &lt;em&gt;hot&lt;/em&gt; it is.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="WTFJam"></category><category term="Way Too Fast!!"></category><category term="short post"></category></entry><entry><title>WTFJam 2025-06-05</title><link href="https://mwchase.neocities.org/wtfjam-2025-06-05" rel="alternate"></link><published>2025-06-05T04:00:00-04:00</published><updated>2025-06-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-06-05:/wtfjam-2025-06-05</id><summary type="html">&lt;p class="first last"&gt;Ironically, not fast enough.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, here's the idea.
I'm going to put together a Fiasco playset (first edition, since I never looked into second edition) about racing, as depicted in Speed Racer, perhaps Wacky Races, probably other things.&lt;/p&gt;
&lt;p&gt;To get it together, I'm going to need to come up with 144 different relationships, needs, locations, and objects.
Getting the relationships and needs right will determine whether I can get this to work, and the locations and objects will help convey the vibe.
I'm going to need to come up with several of these a day to be done within a month, and I think I'm currently not on that pace, so I'm going to try to get more done in the coming days.&lt;/p&gt;
&lt;p&gt;For now, I need to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="WTFJam"></category><category term="Way Too Fast!!"></category><category term="short post"></category></entry><entry><title>Coding 2025-06-04</title><link href="https://mwchase.neocities.org/coding-2025-06-04" rel="alternate"></link><published>2025-06-04T04:00:00-04:00</published><updated>2025-06-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-06-04:/coding-2025-06-04</id><summary type="html">&lt;p class="first last"&gt;Not pivoting hard enough.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I don't want to write up my WTFJam progress because there isn't much yet.
My goal is to come up with 144 entries for a Fiasco playset, and I've made some piecemeal progress on that, but I'm going to need to come up with many of these things a day to actually finish this in June.&lt;/p&gt;
&lt;p&gt;I ended up devoting more thought to subtyping in Impliciula.
The basic implementation of record subtyping shouldn't present too many theoretical hurdles, and I'm reading up on refinement types, but the crux of all of this is going to be the effect system.
The crucial interaction that will make programming in Impliciula the way I want to, like, even possible, will be that refining the arguments of a function to a subtype will sometimes make it possible to promote the function type to a supertype that lacks specific effects.&lt;/p&gt;
&lt;p&gt;(Actually, it occurs to me that function inlining could make record subtyping more tractable under some circumstances, but, oof, that feels like something that would have to be opt-in.)&lt;/p&gt;
&lt;p&gt;Anyway, I need to wrap up for today.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-06-03</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-06-03" rel="alternate"></link><published>2025-06-03T04:00:00-04:00</published><updated>2025-06-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-06-03:/weekly-roundup-2025-06-03</id><summary type="html">&lt;p class="first last"&gt;I'm glad I put the work in, but hoogh...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I had ideas about how to improve the Impliciula prototype.&lt;/li&gt;
&lt;li&gt;Thursday: I thought I was ready to implement type operators.&lt;/li&gt;
&lt;li&gt;Friday: But instead the refactors continued.&lt;/li&gt;
&lt;li&gt;Saturday: The refactors continued, and revealed a weird sharp edge in Mypy.&lt;/li&gt;
&lt;li&gt;Sunday: I looked over the current coverage deficit.&lt;/li&gt;
&lt;li&gt;Monday: I fixed up some areas of the code, and improved the typing situation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to stop touching the code, and focus instead on planning next steps, and working on other projects.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category></entry><entry><title>Coding 2025-06-02</title><link href="https://mwchase.neocities.org/coding-2025-06-02" rel="alternate"></link><published>2025-06-02T04:00:00-04:00</published><updated>2025-06-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-06-02:/coding-2025-06-02</id><summary type="html">&lt;p class="first last"&gt;The code is now a massive pile of annotations in front of simple method bodies; I consider this progress because I now (mostly) don't have to use &lt;tt class="docutils literal"&gt;# type: ignore&lt;/tt&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I found a paper on call-by-push-value that laid out how existential types should be set up, so I partially followed that, and this simplified the code a lot.
I'm still not totally vibing with the idea of type variables standing in for free-standing computations; I skimmed the paper, so I have no idea whether they did that out of a sense of symmetry, theoretical interest, or if sometimes you really do just have to parameterize by the sort of computation you're doing.&lt;/p&gt;
&lt;p&gt;Anyway, I figured out a major source of friction in modeling these recursive structures, so now I've got a weird template to follow for defining future nodes.
It would be interesting to jump right into doing that, but I want to at least try to increase the coverage and document the code first.
For documenting the code, I'm looking into embedding LaTeX, because honestly, I kind of don't want to use words to explain what these methods are doing.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;However&lt;/em&gt;, I feel like I should take a bit of a break from this, because I've been polishing this code &lt;em&gt;really hard&lt;/em&gt;.
So, I'm going to try to put together an entry or two for &lt;a class="reference external" href="https://itch.io/jam/wtfjam2025"&gt;WTFJam 2025&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But for right now, I need to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-06-01</title><link href="https://mwchase.neocities.org/coding-2025-06-01" rel="alternate"></link><published>2025-06-01T04:00:00-04:00</published><updated>2025-06-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-06-01:/coding-2025-06-01</id><summary type="html">&lt;p class="first last"&gt;Laboriously tracing the call graph of the code paths I want to hit...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;After a bunch of messing around, I've made some coverage improvements.
At this point, the lack of coverage is localized to five files, and can be traced to three basic areas:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Kind checks, which will require higher-kinded types to properly trigger.&lt;/li&gt;
&lt;li&gt;I haven't exercised a lot of the code I've written for universal types.&lt;/li&gt;
&lt;li&gt;I just don't have a good intuition for how to relate &amp;quot;how existential types are implemented&amp;quot; to &amp;quot;the stuff I find myself wanting to do with existential types&amp;quot;, so I'm a little scared to touch them.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hopefully, I can deal with the latter two soon.
I may need to take a break from this project in the near future, but we'll see.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-05-31</title><link href="https://mwchase.neocities.org/coding-2025-05-31" rel="alternate"></link><published>2025-05-31T04:00:00-04:00</published><updated>2025-05-31T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-05-31:/coding-2025-05-31</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;it runs indefinitely and tries to cook my laptop&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Oh boy, I sure was messing with this stuff today.
I got the nodes module filled up, then broken (mostly) apart.
Along the way, I found a really nasty condition in Mypy, that I assume everyone else's code is too normal to trigger.&lt;/p&gt;
&lt;p&gt;My plan at this point is to investigate just how much of the uncovered code, can easily become covered code.&lt;/p&gt;
&lt;p&gt;I'll see how that goes tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-05-30</title><link href="https://mwchase.neocities.org/coding-2025-05-30" rel="alternate"></link><published>2025-05-30T04:00:00-04:00</published><updated>2025-05-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-05-30:/coding-2025-05-30</id><summary type="html">&lt;p class="first last"&gt;Moving the code in a big circle to turn a dynamo or something.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;You might not think that I could keep on coming up with massive refactors, but you would be wrong.
My goal currently is to move the method implementations back to the nodes, and then break up the nodes module because it'll be over a thousand lines at that point, which is way too much.
What makes this state of affairs different than what came before is, I'm encoding more details about tree structure onto the nodes, so now, fingers crossed, I can statically... be sort-of-confident that I won't have stuff from higher levels &amp;quot;bleeding down&amp;quot; into lower levels, in terms of tree constituents during evaluation.&lt;/p&gt;
&lt;p&gt;I need to wind down for now, though.
I'll be messing with this more tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-05-29</title><link href="https://mwchase.neocities.org/coding-2025-05-29" rel="alternate"></link><published>2025-05-29T04:00:00-04:00</published><updated>2025-05-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-05-29:/coding-2025-05-29</id><summary type="html">&lt;p class="first last"&gt;This was all pretty boring and unpleasant, but soon, oh, soon...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I need to let the code base sit, at least for tonight.
I believe I've worked through all of the refactors I'm going to manage for now, and laid the groundwork for the next phase of all of this, implementing type operators.&lt;/p&gt;
&lt;p&gt;After that, I can either rush into adding row polymorphism, or I can focus on raising the coverage, which would be the responsible course of action.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;I'll try to be responsible.
And that starts with getting to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-05-28</title><link href="https://mwchase.neocities.org/coding-2025-05-28" rel="alternate"></link><published>2025-05-28T04:00:00-04:00</published><updated>2025-05-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-05-28:/coding-2025-05-28</id><summary type="html">&lt;p class="first last"&gt;Oh no, I messed up time management.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I had a bunch of thoughts about where to go next on Impliciula, but then I had some realizations about better ways to accomplish stuff currently, and so right now I'm rewriting various parts of it in preparation for those new ideas, and so it's just kind of a mess at the moment and I need to go sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-05-27</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-05-27" rel="alternate"></link><published>2025-05-27T04:00:00-04:00</published><updated>2025-05-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-05-27:/weekly-roundup-2025-05-27</id><summary type="html">&lt;p class="first last"&gt;In the space of a week, I went from &amp;quot;What am I doing?&amp;quot; to &amp;quot;What did I do?&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I was experiencing some difficulties implementing call-by-push-value.&lt;/li&gt;
&lt;li&gt;Thursday: I started some pretty extreme refactors to the Impliciula prototype code base.&lt;/li&gt;
&lt;li&gt;Friday: I tried to explain those refactors.&lt;/li&gt;
&lt;li&gt;Saturday: Things seemed to be working.&lt;/li&gt;
&lt;li&gt;Sunday: Things seemed to be working, but in a kind of unpleasant way.&lt;/li&gt;
&lt;li&gt;Monday: I got distracted from shoring up my test coverage by the siren song of more features.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to finish up the latest bout of feature nonsense, then actually write tests that are still based around directly manipulating syntax trees.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category></entry><entry><title>Coding 2025-05-26</title><link href="https://mwchase.neocities.org/coding-2025-05-26" rel="alternate"></link><published>2025-05-26T04:00:00-04:00</published><updated>2025-05-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-05-26:/coding-2025-05-26</id><summary type="html">&lt;p class="first last"&gt;Um, oops.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, I was totally planning to improve the test coverage for System F.
But instead, it seems I've added existential types.
With no tests.
And it's incredibly janky because I wasn't sure how to adapt it to call-by-push-value, and I figured I'd rather muddle through than look for a paper.
And I tried to pare back the bloated size of the different modules, and as a result I'm probably concealing many errors from Mypy by accident.&lt;/p&gt;
&lt;p&gt;I'm fairly sure this is recoverable.
I just need to go back to the basics of System F, and start testing.
Tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-05-25</title><link href="https://mwchase.neocities.org/coding-2025-05-25" rel="alternate"></link><published>2025-05-25T04:00:00-04:00</published><updated>2025-05-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-05-25:/coding-2025-05-25</id><summary type="html">&lt;p class="first last"&gt;I wish that could have somehow gone quicker, but okay.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I've got the System F prototype spun up and ready for testing, but it took me all day and the modules are hundreds of lines long.
(I didn't think to check the lengths before the five-or-so refactors necessary to reach this point.)
Hopefully extending System F will be quicker, when I'm ready for it, now that I've got some groundwork laid, but that remains to be seen, and I do not want to rush into that.&lt;/p&gt;
&lt;p&gt;For the near term, I'm going to have to find something a little less intensive to work on.
For the very near term, bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-05-24</title><link href="https://mwchase.neocities.org/coding-2025-05-24" rel="alternate"></link><published>2025-05-24T04:00:00-04:00</published><updated>2025-05-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-05-24:/coding-2025-05-24</id><summary type="html">&lt;p class="first last"&gt;No idea whether any part of this beyond what I read in the papers has been done before, but whatever, might as well keep winging it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Going to have to make this quick.
I'm in the middle of building up the System F implementation, but there are so many tiny methods to write.
I basically need to implement the evaluation rules for the lambda calculus again, but with types instead of values, and so this means that, not only do I need to write more implementations per method, but I need to write more methods overall.&lt;/p&gt;
&lt;p&gt;Where I stand with this is:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I've proved out the general idea of using singledispatchmethod and classmethod for holding the implementation, although I haven't yet tried to deduplicate the implementations between modules.&lt;/li&gt;
&lt;li&gt;I'm midway through writing these methods, but there's a bunch more to be done.&lt;/li&gt;
&lt;li&gt;I need to figure out some way to organize the class body; as far as &amp;quot;flat is better than nested&amp;quot; goes, this is going way too far.
Hopefully the deduplication efforts will make things behave somewhat better, but I can't try that until I figure out what it will look like, which is maybe a better use of my time right now than grinding through more method definitions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, I need to wrap things up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-05-23</title><link href="https://mwchase.neocities.org/coding-2025-05-23" rel="alternate"></link><published>2025-05-23T04:00:00-04:00</published><updated>2025-05-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-05-23:/coding-2025-05-23</id><summary type="html">&lt;p class="first last"&gt;... and that's why I'm going to create a module with like thirty classmethods at the top level.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, here's a little more detail on the state of things.&lt;/p&gt;
&lt;p&gt;My goal was to be able to represent, say, both the simply-typed lambda calculus, and System F, with as much code sharing as I can.
In particular, there is a lot of common structure between them, and a lot of common evaluation logic.
But the differences between them are problematic if they're represented in &amp;quot;normal-looking&amp;quot; code.
Because System F has more kinds of node than the simply-typed lambda calculus, not all valid System F expressions are valid expressions in the simply-typed lambda calculus.
If we figure that the expressions of simply-typed lambda calculus would make up a subset of the expressions of System F, then that means that the representation of System F must be a superclass of the representation of the simply-typed lambda calculus?
But &lt;em&gt;removing node types&lt;/em&gt; by subclassing is counter-intuitive, and if the evaluation logic is represented by methods (normal and obvious object-oriented practice), then subclassing in either direction introduces Liskov/variance issues.&lt;/p&gt;
&lt;p&gt;So, we're not going to be able to reuse that common evaluation logic or structure through subclassing.
What then?&lt;/p&gt;
&lt;p&gt;I'll be honest, this next part's a bit of a haze, and I went down some &lt;em&gt;weird&lt;/em&gt; dead ends, so let's skip ahead a little.&lt;/p&gt;
&lt;p&gt;Due to various paper-cuts, I ended up not trusting the individual nodes with any logic outside of, like, alternative constructors, attrs validators, and stringification.
Everything else, I converted from properties and methods to a bunch of singledispatch functions that all call each other recursively and interact with some global constants and functions.
So, this delivers the same functionality that I had before, and has made all of the node types lean, at least.
(Although, note that I've lost some type-checking robustness because it's not checking that all necessary types are registered.
It would be good to find some way to guarantee that...)
But how to allow for trees made up of different types?&lt;/p&gt;
&lt;p&gt;Well, here's my plan, which I haven't tried yet, but I'm pretty sure will work:&lt;/p&gt;
&lt;p&gt;I can define recursive type aliases, so what if I replace every union of node types in a node type definition, with a type variable?
Then, to restore the original tree structure, I create type aliases to the filled-in versions of the nodes, then union those aliases together to get the parameter to fill into the generic version.
To add more nodes, I simply add more types to the union.&lt;/p&gt;
&lt;p&gt;But now let's consider the evaluation code.
Sure, some evaluation code is now reusable, like determining the type information associated with a constant node, but most of these singledispatch functions refer back to each other in a recursive manner, that makes them unsuitable for reuse.
If only we could somehow defer the reference, via some form of late binding...&lt;/p&gt;
&lt;p&gt;It's a class.
I'm taking all of these singledispatch functions and global constants, and sticking them in a class and turning them into singledispatchmethod classmethods.&lt;/p&gt;
&lt;p&gt;Now, it'd be really neat if subclassing were practical &lt;em&gt;now&lt;/em&gt;, but it is, for a few reasons at different theoretical levels, not.
Instead, my current plan is to rewrite these functions to be generic, and then have the singledispatch machinery fill in the concrete types.
(I mean, assuming Mypy cares.
At runtime, this stuff is just all going to vibe.)
Then, I can just call the register methods inline instead of as decorators.
(I feel like this whole thing &lt;em&gt;should&lt;/em&gt; work, but I'm also acutely aware that Mypy's singledispatchmethod support has (or, hopefully, had) some weird and confusing sharp edges and holes.)&lt;/p&gt;
&lt;p&gt;Anyway, the basic idea for reuse is to define Protocols that lay out the methods and attributes that must exist on the concrete classes, parameterized of course.
Then, at long last, we actually have a situation in this project where subclassing is appropriate.&lt;/p&gt;
&lt;p&gt;Hopefully, I'll have the energy tomorrow to properly try this, but until then, I've at least got this stuff outlined.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category></entry><entry><title>Coding 2025-05-22</title><link href="https://mwchase.neocities.org/coding-2025-05-22" rel="alternate"></link><published>2025-05-22T04:00:00-04:00</published><updated>2025-05-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-05-22:/coding-2025-05-22</id><summary type="html">&lt;p class="first last"&gt;ssort's idea of an &amp;quot;intuitive&amp;quot; layout for code like this is frankly kind of terrifying.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Aside from some gaps in mutation coverage, I believe the code is in a good, if transitional, state.
Basically, I got the tests to a good state (aside from some gaps in mutation coverage), and then I refactored things so that there is &lt;em&gt;no&lt;/em&gt; behavior on syntax nodes, and instead all the behavior lives in singledispatch functions.
The goal here is to now parameterize the node types, and then only have the singledispatch functions be defined for specific type instances.&lt;/p&gt;
&lt;p&gt;My hope is that I can then reuse individual function implementations by making the signatures just permissive enough that I can register them in multiple places.&lt;/p&gt;
&lt;p&gt;If this works, it'll be great.
If it doesn't, then I just kind of exploded my code for no real benefit.&lt;/p&gt;
&lt;p&gt;You'll have to wait and see, because I'm definitely not trying anything else tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-05-21</title><link href="https://mwchase.neocities.org/coding-2025-05-21" rel="alternate"></link><published>2025-05-21T04:00:00-04:00</published><updated>2025-05-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-05-21:/coding-2025-05-21</id><summary type="html">&lt;p class="first last"&gt;So close... but that's also what I thought the last few times.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Just one more class bro.
Just one more class, and I'll have a correct implementation of call-by-push-value.&lt;/p&gt;
&lt;p&gt;Okay, technically, it's more that I implemented the class &lt;em&gt;probably&lt;/em&gt; correctly, but I haven't tested this, but I'm just... done for now.&lt;/p&gt;
&lt;p&gt;I'd like to believe there's a light at the end of the tunnel, but what I see of that light looks, to be frank, pretty weird.
For one thing, I'm still not sure how I'm going to handle creating and translating between these highly-similar languages.
For another, my goal with implementing call-by-push-value was to have a distinction between &amp;quot;pure&amp;quot; and &amp;quot;impure&amp;quot; computation ready to go when I manage to reach 1ML, but I don't understand the different parts of all of this well enough to grasp whether the &lt;tt class="docutils literal"&gt;FuncType | ReturnType&lt;/tt&gt; distinction I have manages to actually capture that.&lt;/p&gt;
&lt;p&gt;At least it hasn't been too hard to keep mutation coverage up.&lt;/p&gt;
&lt;p&gt;Anyway, I have nothing more to say, so I'm getting ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-05-20</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-05-20" rel="alternate"></link><published>2025-05-20T04:00:00-04:00</published><updated>2025-05-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-05-20:/weekly-roundup-2025-05-20</id><summary type="html">&lt;p class="first last"&gt;Okay, so I actually fixed the tests because I couldn't leave well enough alone, but there's still more to do.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I was tired and sickly.&lt;/li&gt;
&lt;li&gt;Thursday: I decided to try working on Impliciula.&lt;/li&gt;
&lt;li&gt;Friday: I made some progress on the prototype, and thought about taking it beyond a prototype.&lt;/li&gt;
&lt;li&gt;Saturday: I put together a lot of the scaffolding for working on Impliciula.&lt;/li&gt;
&lt;li&gt;Sunday: I worked on the actual code, and also more scaffolding.&lt;/li&gt;
&lt;li&gt;Monday: I maxed out the various metrics I'm taking, and pondered how to elaborate up to System F.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to be taking a little detour, because I decided to clarify the calling semantics of my simply-typed lambda calculus implementation, and I know without checking that the changes I made utterly cooked my test suite.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category></entry><entry><title>Coding 2025-05-19</title><link href="https://mwchase.neocities.org/coding-2025-05-19" rel="alternate"></link><published>2025-05-19T04:00:00-04:00</published><updated>2025-05-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-05-19:/coding-2025-05-19</id><summary type="html">&lt;p class="first last"&gt;I've written a bunch of tests for this code, and the main insight they're giving me is that I &lt;em&gt;really&lt;/em&gt; need some kind of good DSL for these types.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I got the simply-typed lambda calculus code up to snuff in terms of coverage and mutation coverage.
Unfortunately, I'm not ready to elaborate up to System F, because I'm not totally sure how I'd like to.&lt;/p&gt;
&lt;p&gt;See, the issue is that the elaborations, at least to start with, have lots of similar structure, just with More Stuff, and the way to fit the More Stuff in is... I think I see how I want to do it, but there are some complications to address.
Because suddenly it's possible to give expressions new kinds of types, and have new kinds of expression.
So, how to accommodate these extensions?
It sure seems like the way forward is to parameterize the types and expressions that are allowed, which &lt;em&gt;may&lt;/em&gt; push Mypy's support for recursive type expressions to the limit.
Something like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;type Type[T] = BaseType | FuncType[T] | T&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;type Expression[T, E] = Value[T, E] | Abstraction[T, E] | Application[T, E] | E&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;type STLCType = &lt;span class="pre"&gt;Type[Union[()]]&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;type STLCExpression = &lt;span class="pre"&gt;Expression[Union[()],&lt;/span&gt; &lt;span class="pre"&gt;Constant[Union[()],&lt;/span&gt; STLCExpression] | &lt;span class="pre"&gt;Operation[Union[()],&lt;/span&gt; STLCExpression]]&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;or maybe &lt;tt class="docutils literal"&gt;type STLCExpression[T, E] = Expression[T, Constant[T, STLCExpression[T, E]] | Operation[T, STLCExpression[T, &lt;span class="pre"&gt;E]]]&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'll have to think about this and experiment with it a bit.
Hopefully at a time when the internet isn't going up and down like a yoyo.&lt;/p&gt;
&lt;p&gt;Anyway, that's more than enough time writing, so let's wrap this up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-05-18</title><link href="https://mwchase.neocities.org/coding-2025-05-18" rel="alternate"></link><published>2025-05-18T04:00:00-04:00</published><updated>2025-05-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-05-18:/coding-2025-05-18</id><summary type="html">&lt;p class="first last"&gt;It sure seems easier to write code than to document it...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's see if I can go over this very quickly.&lt;/p&gt;
&lt;p&gt;I validated that Poodle was working, extended the scope of the ruff checks, set up pydoclint, activated a bunch of Ruff rules, deactivated a few Ruff rules, made a module for tracking typing contexts/environments, got the documentation from &amp;quot;not really working&amp;quot; to &amp;quot;sort of working&amp;quot;, and started copying over code from the prototype.
Oh, and I reorganized some minor bits of the repository a few times.&lt;/p&gt;
&lt;p&gt;The current slog I'm on of documenting the prototype is forcing me to revisit questions like &amp;quot;is there any point to writing a &lt;tt class="docutils literal"&gt;Returns&lt;/tt&gt; section for a property, is that not what the summary should be telling you?&amp;quot;&lt;/p&gt;
&lt;p&gt;In any case, now I've got something to work on, even if it kind of... sucks, and we'll see how things work out when I finally have enough stuff together to elaborate this from the simply-typed lambda calculus up to system f.&lt;/p&gt;
&lt;p&gt;Anyway, I really need to get to bed now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-05-17</title><link href="https://mwchase.neocities.org/coding-2025-05-17" rel="alternate"></link><published>2025-05-17T04:00:00-04:00</published><updated>2025-05-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-05-17:/coding-2025-05-17</id><summary type="html">&lt;p class="first last"&gt;To be fair, it is already prototyped...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I set up a repository for developing a Python-based interpreter for Impliciula.
I've got it set up with tox, running tests with pytest, with and without coverage, linting with ruff, doing type analysis with mypy, mutation testing with poodle, and building docs with sphinx.
At this point, all I need to do is write the code.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-05-16</title><link href="https://mwchase.neocities.org/coding-2025-05-16" rel="alternate"></link><published>2025-05-16T04:00:00-04:00</published><updated>2025-05-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-05-16:/coding-2025-05-16</id><summary type="html">&lt;p class="first last"&gt;I'm doing better, but still not as well as I'd like; still able to make some progress.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got a basic prototype of custom operations implemented.
What is left...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Move this code into a project so I can package and better organize it.&lt;/li&gt;
&lt;li&gt;Write tests.&lt;/li&gt;
&lt;li&gt;Run the tests automatically.&lt;/li&gt;
&lt;li&gt;Refresh my memory about how to get around the lambda cube, and to go beyond it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My hope is that that last bit won't be too hard to do, now that I have a baseline of &amp;quot;this is how we're handling the lambda calculus&amp;quot;.&lt;/p&gt;
&lt;p&gt;Anyway, better wrap things up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-05-15</title><link href="https://mwchase.neocities.org/coding-2025-05-15" rel="alternate"></link><published>2025-05-15T04:00:00-04:00</published><updated>2025-05-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-05-15:/coding-2025-05-15</id><summary type="html">&lt;p class="first last"&gt;Preparing to build on a tarpit&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, let's see what I did.
In between the last time I wrote about Impliciula and now, I concluded that I was making things too hard on myself by trying to target LLVM off the bat.
As such, I'm going to be focusing on implementing an interpreter for the simply-typed lambda calculus, and try to elaborate that until it can handle Impliciula code.&lt;/p&gt;
&lt;p&gt;Now, it seems I'd sort of started on this already, so I mainly focused on cleaning up and extending the Python code that I already had lying around.
At this point, it &lt;em&gt;probably&lt;/em&gt; works, but I'm pretty sure I need to figure out stuff like, some way of defining primitive operations.
Once I have that, I should be able to start elaborating.&lt;/p&gt;
&lt;p&gt;Probably something with Protocols or ABCs.
I'll think about it tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Diary 2025-05-14</title><link href="https://mwchase.neocities.org/diary-2025-05-14" rel="alternate"></link><published>2025-05-14T04:00:00-04:00</published><updated>2025-05-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-05-14:/diary-2025-05-14</id><summary type="html">&lt;p class="first last"&gt;Taking longer than I'd like to recover.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm still not ready to get back into my &amp;quot;main&amp;quot; projects.
Trying and failing to take things easy.&lt;/p&gt;
&lt;p&gt;I'll just leave things here for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-05-13</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-05-13" rel="alternate"></link><published>2025-05-13T04:00:00-04:00</published><updated>2025-05-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-05-13:/weekly-roundup-2025-05-13</id><summary type="html">&lt;p class="first last"&gt;I thought I had more in me than I actually did.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I made some progress on the conlanging stuff.&lt;/li&gt;
&lt;li&gt;Thursday: I explained &lt;em&gt;part of&lt;/em&gt; what I'm trying to do with that code, but I assume it didn't really make any sense.&lt;/li&gt;
&lt;li&gt;Friday: I thought some about where to go next with all of that.&lt;/li&gt;
&lt;li&gt;Saturday: But then I was tired.&lt;/li&gt;
&lt;li&gt;Sunday: And I still sort of had a migraine.&lt;/li&gt;
&lt;li&gt;Monday: And then I worked on private wiki stuff instead.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I dunno.
I've got stuff I want to work on, but also I am pretty tired...&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="conlanging"></category></entry><entry><title>Diary 2025-05-12</title><link href="https://mwchase.neocities.org/diary-2025-05-12" rel="alternate"></link><published>2025-05-12T04:00:00-04:00</published><updated>2025-05-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-05-12:/diary-2025-05-12</id><summary type="html">&lt;p class="first last"&gt;Stuff happening behind the scenes. Very slowly.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hm.
Still not much to write up.&lt;/p&gt;
&lt;p&gt;I'm drafting stuff for a wiki on Clifford worldbuilding stuff.
I'm not sure when I'll feel like it's ready to put out there, but hopefully I'll be ready before it's &amp;quot;done&amp;quot;.&lt;/p&gt;
&lt;p&gt;Anyway, I can try to get a bunch more written right now, but I really shouldn't, so let's call it here for tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2025-05-11</title><link href="https://mwchase.neocities.org/diary-2025-05-11" rel="alternate"></link><published>2025-05-11T04:00:00-04:00</published><updated>2025-05-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-05-11:/diary-2025-05-11</id><summary type="html">&lt;p class="first last"&gt;I think I'm feeling better now, but I don't want to try to actually do anything yet, so...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got nothing that I want to write up done today, because it turns out I've been still recovering from that migraine, and I'm kind of sensitive to light.
Which makes it kind of a problem to try to use my laptop.&lt;/p&gt;
&lt;p&gt;We'll see how things shake out over the next few days, but I think I just have to accept the possibility that I'm not going to be doing much.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2025-05-10</title><link href="https://mwchase.neocities.org/diary-2025-05-10" rel="alternate"></link><published>2025-05-10T04:00:00-04:00</published><updated>2025-05-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-05-10:/diary-2025-05-10</id><summary type="html">&lt;p class="first last"&gt;I didn't have to write this, so you don't have to read it. Or something. Point is, you won't mind not reading this.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I think I did stuff today, but I was too tired to work on what I wanted to, or to recount whatever it was I did.
I'm just going to see about wrapping things up nicely for myself.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2025-05-09</title><link href="https://mwchase.neocities.org/coding-2025-05-09" rel="alternate"></link><published>2025-05-09T04:00:00-04:00</published><updated>2025-05-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-05-09:/coding-2025-05-09</id><summary type="html">&lt;p class="first last"&gt;It would be nice if I could be a little more collected and articulate, but the trees have decided that I can't have nice things.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, the prototype code isn't any more &lt;em&gt;organized&lt;/em&gt;, but I am closing in on documenting some of the functionality that I haven't even tried to implement yet.
There are a few directions I can take this next, once I'm feeling a little less under-the-weather.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I can try to improve the organization and navigation of the notebook that I'm prototyping this all in.&lt;/li&gt;
&lt;li&gt;I can start moving things into modules and importing them.&lt;/li&gt;
&lt;li&gt;I can focus on improving the task runner capabilities for the as-yet barely touched original repo, so I can have assurance of test quality.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, I really need to rest my eyes, so let's see about wrapping this up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="conlanging"></category><category term="short post"></category></entry><entry><title>Coding 2025-05-08</title><link href="https://mwchase.neocities.org/coding-2025-05-08" rel="alternate"></link><published>2025-05-08T04:00:00-04:00</published><updated>2025-05-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-05-08:/coding-2025-05-08</id><summary type="html">&lt;p class="first last"&gt;Working on this, I managed to find bugs that may not be bugs. Either way, it wasn't too much effort to work around.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I got some stuff done today, and it's kind of too late for a detailed writeup, so let's see what I can manage without details.&lt;/p&gt;
&lt;p&gt;So, I've been focused on supporting user-defined taxonomies that may contain metadata fields.
I'm right now assuming that it's reasonable to require that parent relationships in the source file should point to earlier in the file, because that makes the implementation very simple (relatively speaking) and doesn't seem like an undue burden from an authoring perspective.
(And I can add the requirement to canonicalization, too.)&lt;/p&gt;
&lt;p&gt;One thought I had writing some of these methods is that I'd like to bring in &lt;tt class="docutils literal"&gt;deal&lt;/tt&gt; as well.
Maybe tomorrow.&lt;/p&gt;
&lt;p&gt;Anyway, the big problem right now is that this is kind of disorganized, and I am, on reflection, not sure if I want to keep going with some of the &amp;quot;neat ideas&amp;quot; I had.
I think the way forward at this point is to document what I'm trying to do, and to figure out what's missing relative to that plan.&lt;/p&gt;
&lt;p&gt;For now, I need to get ready for bed and wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="conlanging"></category><category term="short post"></category></entry><entry><title>Coding 2025-05-07</title><link href="https://mwchase.neocities.org/coding-2025-05-07" rel="alternate"></link><published>2025-05-07T04:00:00-04:00</published><updated>2025-05-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-05-07:/coding-2025-05-07</id><summary type="html">&lt;p class="first last"&gt;I had to complain about this a bunch to figure out what I was doing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The ideas I was trying to work out are developing, and things look generally promising.
There are a lot of TODOs remaining, some of which I'm just keeping track of in my head, so that's... not ideal.&lt;/p&gt;
&lt;p&gt;I'll try to write up the state of things tomorrow, because I ended up staying up way too late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="conlanging"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-05-06</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-05-06" rel="alternate"></link><published>2025-05-06T04:00:00-04:00</published><updated>2025-05-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-05-06:/weekly-roundup-2025-05-06</id><summary type="html">&lt;p class="first last"&gt;That could have gone better.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I tried to better document the relationship between the conlang grammar source file and the runtime representation.&lt;/li&gt;
&lt;li&gt;Thursday: Migraine.&lt;/li&gt;
&lt;li&gt;Friday: I made some progress on the code for conlanging stuff, but I also made some mistakes that kind of embarrassed me.&lt;/li&gt;
&lt;li&gt;Saturday: I was tired.&lt;/li&gt;
&lt;li&gt;Sunday: I was able to think about the conlang stuff again.&lt;/li&gt;
&lt;li&gt;Monday: I got most of the way towards figuring out what I want the source representation to look like, but I'm still not there when it comes to the runtime representation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to &lt;em&gt;try&lt;/em&gt; to update the runtime representations and write more structuring logic, but I can't promise it'll get anywhere anytime soon.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="conlanging"></category></entry><entry><title>Coding 2025-05-05</title><link href="https://mwchase.neocities.org/coding-2025-05-05" rel="alternate"></link><published>2025-05-05T04:00:00-04:00</published><updated>2025-05-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-05-05:/coding-2025-05-05</id><summary type="html">&lt;p class="first last"&gt;Waiting to see which widely-spoken language completely demolishes the ideas I'm developing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got a good idea of how I want to represent the different kinds of word taxonomy in the source file for this conlang grammar stuff, but I'm not quite there when it comes to the runtime representation.&lt;/p&gt;
&lt;p&gt;It's like, I'm dividing words into two kinds of taxa, and currently I believe one kind of taxa wouldn't have any metadata associated, but the other kind would, but also &lt;em&gt;validating&lt;/em&gt; (or, worse, &lt;em&gt;generating&lt;/em&gt;) that metadata requires reference to other parts of the taxonomy.
And this has to happen in, like, several orders.
And the root allows metadata that all other nodes do not.
I'm not totally sure how to force this all to work, and the weird relationships have me thinking that I probably &lt;em&gt;shouldn't&lt;/em&gt; try to force it together; I need some inspiration...&lt;/p&gt;
&lt;p&gt;Anyway, it's late and I need to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="conlanging"></category><category term="short post"></category></entry><entry><title>Coding 2025-05-04</title><link href="https://mwchase.neocities.org/coding-2025-05-04" rel="alternate"></link><published>2025-05-04T04:00:00-04:00</published><updated>2025-05-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-05-04:/coding-2025-05-04</id><summary type="html">&lt;p class="first last"&gt;The question is, am I inventing new problems for myself, or discovering them?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was tired, so I just had the focus to ponder some of the conlanging software design, and I'm worried that I'm taking things in an excessively complicated direction, but then again, languages often get complicated.&lt;/p&gt;
&lt;p&gt;Basically, there are different kinds of taxonomy that words can fit into.
We can consider the ending of verbs in Spanish, for example, or the animacy of nouns in Spanish.
The former case influences the realization of different conjugations, while the latter case influences inflection for gender.
Back to verbs, stuff like tense can affect what a verb conjugates for.&lt;/p&gt;
&lt;p&gt;What I'm trying to figure out is a non-onerous means of representing this stuff in the source file.
I'll see if something occurs to me soon, but if not, I'll have to switch gears.&lt;/p&gt;
&lt;p&gt;For now, though, I'm going to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="conlanging"></category><category term="short post"></category></entry><entry><title>Diary 2025-05-03</title><link href="https://mwchase.neocities.org/diary-2025-05-03" rel="alternate"></link><published>2025-05-03T04:00:00-04:00</published><updated>2025-05-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-05-03:/diary-2025-05-03</id><summary type="html">&lt;p class="first last"&gt;Safe to skip.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm doing better today, but I was &lt;em&gt;really tired&lt;/em&gt;.
I did have some thoughts about how to improve my code, but mostly I ended up trying to take things easy.&lt;/p&gt;
&lt;p&gt;And I'm going to continue with that, rather than trying to come up with something to say.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2025-05-02</title><link href="https://mwchase.neocities.org/coding-2025-05-02" rel="alternate"></link><published>2025-05-02T04:00:00-04:00</published><updated>2025-05-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-05-02:/coding-2025-05-02</id><summary type="html">&lt;p class="first last"&gt;I'm not sure just how much better I would have done at this if I were properly rested, but it definitely would have helped.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I spent a bunch of time customizing the structuring logic for the conlang toolkit stuff.
I've made some progress, but ultimately, I think I may have pushed myself too hard.
If I were in better shape, I think I would have noticed sooner that I was calling a method on the wrong cattrs converter; this sent me down a rabbit hole of wondering how it was that &lt;em&gt;no&lt;/em&gt; method was having any effect.
But at least now I've got the stuff that was broken there fixed forever.&lt;/p&gt;
&lt;p&gt;Anyway, I definitely shouldn't go over anything else right now, or stare at my screen any longer.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="conlanging"></category><category term="short post"></category></entry><entry><title>Diary 2025-05-01</title><link href="https://mwchase.neocities.org/diary-2025-05-01" rel="alternate"></link><published>2025-05-01T04:00:00-04:00</published><updated>2025-05-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-05-01:/diary-2025-05-01</id><summary type="html">&lt;p class="first last"&gt;This isn't funny, &lt;em&gt;fate&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Two nights ago, I realized some things about how I'm using my time.&lt;/p&gt;
&lt;p&gt;Last night, I committed to focusing on a broader range of hobbies.&lt;/p&gt;
&lt;p&gt;Tonight, I'm fighting off a migraine and I just want to curl into a ball.&lt;/p&gt;
&lt;p&gt;Fingers crossed I'll get something done tomorrow?&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2025-04-30</title><link href="https://mwchase.neocities.org/coding-2025-04-30" rel="alternate"></link><published>2025-04-30T04:00:00-04:00</published><updated>2025-04-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-04-30:/coding-2025-04-30</id><summary type="html">&lt;p class="first last"&gt;Figuring out how much work I've decided to make for myself...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm messing around with a bunch of things today, and planning to have things ramped up a bit, but I do have a little to write about quickly.&lt;/p&gt;
&lt;p&gt;I went over the TOML and attrs representations of the different parts of the grammar, and noted them next to each other.
This is necessary for figuring out what the structuring code is going to have to look like, since I'm trying to apply principles of ease-of-use to both representations, which, given the different underlying formats, means that they don't always match up very closely.
For now, I just focused on documenting the format; next, I can work on making sure that each class structures properly, starting from the leaves and working inward.&lt;/p&gt;
&lt;p&gt;The other thing I'll work on, once structuring appears okay (and I'm therefore confident that I've got a handle on the different representations), is the canonicalization process.
That'll be... something.&lt;/p&gt;
&lt;p&gt;Anyway, I should wrap things up now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="conlanging"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-04-29</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-04-29" rel="alternate"></link><published>2025-04-29T04:00:00-04:00</published><updated>2025-04-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-04-29:/weekly-roundup-2025-04-29</id><summary type="html">&lt;p class="first last"&gt;I need to find someone to explain some of this stuff to in excruciating detail.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I got a bit of work done on MOTR.&lt;/li&gt;
&lt;li&gt;Thursday: I got a bit more work done, and it revealed some fascinating bits of breakage.&lt;/li&gt;
&lt;li&gt;Friday: I did some small polish work on MOTR, then put it down for a bit.&lt;/li&gt;
&lt;li&gt;Saturday: I messed around with some code that, unlike MOTR, which I wish were already generally usable, is entirely a solution in search of a problem.&lt;/li&gt;
&lt;li&gt;Sunday: I switched gears to the grammar pipeline for my conlangs, and staked out some basic questions to answer.&lt;/li&gt;
&lt;li&gt;Monday: I worked on those questions, and ended up raising more, more complicated questions, and we'll see where this all ends up.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try get a handle on things in the grammar pipeline, and also I've been thinking more about music lately, so I'm thinking I'll try to do something with that.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="MOTR"></category><category term="conlanging"></category></entry><entry><title>Coding 2025-04-28</title><link href="https://mwchase.neocities.org/coding-2025-04-28" rel="alternate"></link><published>2025-04-28T04:00:00-04:00</published><updated>2025-04-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-04-28:/coding-2025-04-28</id><summary type="html">&lt;p class="first last"&gt;Taking the prototype for a spin, and finding some issues.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, here we go.&lt;/p&gt;
&lt;p&gt;First off, my prototype for the grammar source does appear to be syntactically valid TOML.
Good for me.
Secondly, the layout of what's there does look about right.
As to whether this all works, that remains to be seen, because I'm still working on some choices about the right way to model this stuff with custom classes.&lt;/p&gt;
&lt;p&gt;The big question that I have is whether it suffices to make the runtime representation closer to the output format (in particular, whether I &amp;quot;need&amp;quot; to have different classes for tables that have different representations in TOML), or whether I want the representation to be close enough to the file that it's possible to round-trip between &lt;tt class="docutils literal"&gt;tomlkit&lt;/tt&gt; classes and my own classes.&lt;/p&gt;
&lt;p&gt;And whether I care about round-tripping like that depends on whether the canonicalization logic I have in mind for the configuration file can be written purely in terms of the &lt;tt class="docutils literal"&gt;tomlkit&lt;/tt&gt; structures, or whether that represents a duplication of effort.
And I suppose that depends on whether I assume that I'm always unstructuring canonicalized data, or if it makes more sense to incorporate the canonicalization into the structuring process.
At the same time, I only need to worry about &lt;em&gt;un*structuring logic in the case that I *am&lt;/em&gt; canonicalizing via round-trip.
Either way, talking through this has gotten me to figure out a slightly better representation for some of this, so I'm going to go implement that quickly.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, back to &amp;quot;where do we canonicalize?&amp;quot;.
Thinking about this a little further, I don't want to have to be responsible for &lt;tt class="docutils literal"&gt;tomlkit&lt;/tt&gt; classes inside hypothetical unstructuring code, so let's see if pre-&lt;tt class="docutils literal"&gt;cattrs&lt;/tt&gt; canonicalization is feasible.
Canonicalization is partly a question of handling a default value for one content type, and getting the sorting of various parts of the file correct:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The sections list should match the ordering of the table of contents&lt;/li&gt;
&lt;li&gt;The lexicon should be alphabetized by stem&lt;/li&gt;
&lt;li&gt;A variety of things should have field orders matching their runtime definitions, except that whenever the &lt;tt class="docutils literal"&gt;spec&lt;/tt&gt; field appears, it should be first&lt;/li&gt;
&lt;li&gt;The cells of sparse tables should be sorted with the rows as the most significant radix, and the columns as the least.
(Technically, I guess this means that canonicalization has to involve some level of structuring, even if it's not returned anywhere, because sometimes the canonical order is specified elsewhere in the document.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Because that third bullet point seems pretty obnoxious to handle in the context of generated unstructuring hooks, let's assume that we're going with pre-unstructuring canonicalization.&lt;/p&gt;
&lt;p&gt;Actually, now that I look at this with slightly fresher eyes, I see that I need to reconsider one of my table definitions, and either change one that currently exists, or add a new one.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;I think I came to a reasonable decision, which I can always revisit as I tweak this stuff further.&lt;/p&gt;
&lt;p&gt;For now, I want to wind down for a bit.&lt;/p&gt;
&lt;p&gt;(Actually, I was thinking a bit more, and now I'm not totally sure how I want to handle some of these tables, so that's going to be, interesting.)&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="conlanging"></category></entry><entry><title>Coding 2025-04-27</title><link href="https://mwchase.neocities.org/coding-2025-04-27" rel="alternate"></link><published>2025-04-27T04:00:00-04:00</published><updated>2025-04-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-04-27:/coding-2025-04-27</id><summary type="html">&lt;p class="first last"&gt;I accidentally made a lot of this day the opposite of relaxing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I had kind of a rough week, so I ended up trying and failing to take things easy (hopefully I'll have an easier time of it tomorrow), but I did get some work done on prototyping the grammar for my Untitled Personal Conlang project.&lt;/p&gt;
&lt;p&gt;I think what I should focus on next is taking the current state of the prototyped source file, and check for things like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Is this actually syntactically valid?&lt;/li&gt;
&lt;li&gt;WHen I deserialize it, does it have the layout that I expect?&lt;/li&gt;
&lt;li&gt;Can I actually interact with the data in the way that I expect to be able to?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Those are all good questions, and they &lt;em&gt;should&lt;/em&gt; be possible to answer without any undue effort.
I'm not going to try right now, though, because it's late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="conlanging"></category><category term="short post"></category></entry><entry><title>Coding 2025-04-26</title><link href="https://mwchase.neocities.org/coding-2025-04-26" rel="alternate"></link><published>2025-04-26T04:00:00-04:00</published><updated>2025-04-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-04-26:/coding-2025-04-26</id><summary type="html">&lt;p class="first last"&gt;Spring pulled out all the stops...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I was out of it today, but I did make some improvements to the stuff I was messing with yesterday.&lt;/p&gt;
&lt;p&gt;A few weeks ago, I started implementing an &lt;tt class="docutils literal"&gt;int&lt;/tt&gt; subclass in Python that presents itself as balanced ternary instead of two's complement, using Kleene logic for the trit-wise operations.
Yesterday, I started implementing format spec extensions for it, to print it as trits instead of decimal digits or anything else.
Today, I cleaned up the way I parsed out format spec information to make things a little cleaner and simpler.&lt;/p&gt;
&lt;p&gt;I might come back to this more, but probably not right now.
What I'll work on next...
I don't know, we'll see.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2025-04-25</title><link href="https://mwchase.neocities.org/coding-2025-04-25" rel="alternate"></link><published>2025-04-25T04:00:00-04:00</published><updated>2025-04-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-04-25:/coding-2025-04-25</id><summary type="html">&lt;p class="first last"&gt;Most days I simply do not throw up. Today... I had to make a decision.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did the very obvious cleanup on MOTR, but I'm not going to push myself any further because the sun was bright and I had a rough afternoon as a result.&lt;/p&gt;
&lt;p&gt;Actually, I did just remember one other thing I was thinking about that could be a little amusing.
Let me see if I can do anything with that idea.
I will not be elaborating or reporting back.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2025-04-24</title><link href="https://mwchase.neocities.org/coding-2025-04-24" rel="alternate"></link><published>2025-04-24T04:00:00-04:00</published><updated>2025-04-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-04-24:/coding-2025-04-24</id><summary type="html">&lt;p class="first last"&gt;A comedy of errors.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I spent a good chunk of time getting my planned changes working, and in the end, I made a bunch of compromises because I want to do anything else with my time right now.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Expanded the types of a helper function so much that they crashed my plugin.
The correct course of action would be to create separate helper functions each specialized to the correct degree.
This would also allow me to have better error reporting, out of these functions that only exist to report errors.&lt;/li&gt;
&lt;li&gt;Some of the new &lt;tt class="docutils literal"&gt;Axes&lt;/tt&gt; methods have confusing names; I should try to address this.&lt;/li&gt;
&lt;li&gt;In the end, I concluded that some aspects of my reference implementation are &amp;quot;wrong&amp;quot;, and I slightly redid the filename generation in one wrapper under the assumption that the current behavior is &amp;quot;right&amp;quot;.
This raises two questions: can I &lt;em&gt;explain&lt;/em&gt; the current behavior, and does anything else need to be changed?&lt;/li&gt;
&lt;li&gt;Maybe there are other corners I cut.
I'm tired, okay?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm going to wrap this up now so I'm not tempted to poke at it any more than I already did while writing those points up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2025-04-23</title><link href="https://mwchase.neocities.org/coding-2025-04-23" rel="alternate"></link><published>2025-04-23T04:00:00-04:00</published><updated>2025-04-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-04-23:/coding-2025-04-23</id><summary type="html">&lt;p class="first last"&gt;A good... I don't know, it felt like ten minutes or so, work.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I have carried out the first part of the plan from two days ago (lightly modified), and it sure &lt;em&gt;seems&lt;/em&gt; to be working okay.
I had to rewrite a few tests for various reasons, and I think I'm missing coverage on the new validators I wrote.&lt;/p&gt;
&lt;p&gt;Regardless, this is a very good stopping point for now, and I'll see about making the rest of the changes tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-04-22</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-04-22" rel="alternate"></link><published>2025-04-22T04:00:00-04:00</published><updated>2025-04-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-04-22:/weekly-roundup-2025-04-22</id><summary type="html">&lt;p class="first last"&gt;Somehow sidetracked onto my nominal main project.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I &lt;em&gt;was&lt;/em&gt; making progress on the conlang stuff, and then I remembered that MOTR isn't generally usable yet, grr...&lt;/li&gt;
&lt;li&gt;Thursday: I did some work on MOTR, and also managed some conlang work still.&lt;/li&gt;
&lt;li&gt;Friday: I discovered that MOTR had some significant testing misses and stuff somewhere between &amp;quot;missing feature&amp;quot; and &amp;quot;serious bug&amp;quot;.&lt;/li&gt;
&lt;li&gt;Saturday: I started planning out how to get test coverage of this stuff, so it hopefully won't randomly regress.&lt;/li&gt;
&lt;li&gt;Sunday: I got some tests written, and pondered how to get them to pass.&lt;/li&gt;
&lt;li&gt;Monday: I did a bunch of planning for how to get the tests to pass, and I have... already decided to change some of those plans.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to carry out those plans, and we'll see if I change my mind further, or if anything goes wrong.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="conlanging"></category><category term="MOTR"></category></entry><entry><title>Coding 2025-04-21</title><link href="https://mwchase.neocities.org/coding-2025-04-21" rel="alternate"></link><published>2025-04-21T04:00:00-04:00</published><updated>2025-04-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-04-21:/coding-2025-04-21</id><summary type="html">&lt;p class="first last"&gt;Putting things together.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;As I alluded to in the summary, I'm intending to rework some of the &lt;tt class="docutils literal"&gt;Axes&lt;/tt&gt; fields.
The field in question is called &lt;tt class="docutils literal"&gt;box_labels&lt;/tt&gt;, and the plan is to supplement it with two additional fields.
These supplementary fields would be called something like &lt;tt class="docutils literal"&gt;defaultable_labels&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;defaulted_labels&lt;/tt&gt;, which satisfy &lt;tt class="docutils literal"&gt;box_labels &amp;gt;= defaultable_labels &amp;gt;= defaulted_labels&lt;/tt&gt;.
One of the key derived fields would have a value of &lt;tt class="docutils literal"&gt;box_labels - defaulted_labels&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;I'm currently looking over the usages of &lt;tt class="docutils literal"&gt;box_labels&lt;/tt&gt; to see what would need to change.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;defaultable_labels&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;selection_labels&lt;/tt&gt; must have an empty intersection.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;set_defaults_for_labels&lt;/tt&gt; must add any defaulted values in &lt;tt class="docutils literal"&gt;defaultable_labels&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;defaulted_labels&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;product&lt;/tt&gt; has to do a bunch of extra calculations that I've previously worked out.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;selections&lt;/tt&gt; must check in &lt;tt class="docutils literal"&gt;box_labels - defaulted_labels&lt;/tt&gt;, instead of just &lt;tt class="docutils literal"&gt;box_labels&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;draws_from_box&lt;/tt&gt; must set &lt;tt class="docutils literal"&gt;defaultable_labels&lt;/tt&gt; as well as &lt;tt class="docutils literal"&gt;box_labels&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;uses_own_defaults&lt;/tt&gt; requires a new &lt;tt class="docutils literal"&gt;Axes&lt;/tt&gt; method that I have previously worked out the behavior of.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once that's in and I've confirmed that everything still works, my next step is to convert the &lt;tt class="docutils literal"&gt;inputs&lt;/tt&gt; field from a &lt;tt class="docutils literal"&gt;Box&lt;/tt&gt; to a &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;DependentMapping[Callable[[Label[T]],&lt;/span&gt; tuple[T, &lt;span class="pre"&gt;Box]]]&lt;/span&gt;&lt;/tt&gt;, and make the following updates:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Wait hold on, I'm not sure if this fixes the problem I encountered.&lt;/li&gt;
&lt;li&gt;Hm.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Basically, I want to know the default values that are relevant for the calculation of a &lt;tt class="docutils literal"&gt;Matrix&lt;/tt&gt; associated with an &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt;.
Now, the &lt;tt class="docutils literal"&gt;Matrix&lt;/tt&gt; that goes into a &lt;tt class="docutils literal"&gt;PreInput&lt;/tt&gt; will carry some of that information, and it shouldn't be possible to get it wrong, per se.
What's missing is the defaults that got set after the &lt;tt class="docutils literal"&gt;PreInput&lt;/tt&gt; was generated.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Okay, this should work, actually.&lt;/li&gt;
&lt;li&gt;Basically, when calling &lt;tt class="docutils literal"&gt;Axes.set_defaults_for_labels&lt;/tt&gt;, it needs to now pass the entire &lt;tt class="docutils literal"&gt;Box&lt;/tt&gt;, not just the set of labels, and that &lt;tt class="docutils literal"&gt;Box&lt;/tt&gt; has to be added to the &lt;em&gt;right&lt;/em&gt; of the &lt;tt class="docutils literal"&gt;Box&lt;/tt&gt; values in &lt;tt class="docutils literal"&gt;inputs&lt;/tt&gt;.
Question: can/should the values of &lt;tt class="docutils literal"&gt;default_arguments&lt;/tt&gt; be filtered based on the contents of &lt;tt class="docutils literal"&gt;defaultable_labels&lt;/tt&gt;?&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;with_input&lt;/tt&gt; must process its argument accordingly.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;without_inputs&lt;/tt&gt; must use a different type value in order to typecheck.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;product&lt;/tt&gt; has to... do... something... probably it should actually just keep doing what it's doing?
Very confusing.
Maybe it should be taking either the union or the intersection?
Maybe needs to be checking against the other &lt;tt class="docutils literal"&gt;Axes&lt;/tt&gt; fields.
On further consideration, it should simply keep the same logic.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Well, that was a bit of a ride.
I don't want to prolong it for tonight, so I'm going to wrap up for now, and see if this all still makes sense when I come back to it.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category></entry><entry><title>Coding 2025-04-20</title><link href="https://mwchase.neocities.org/coding-2025-04-20" rel="alternate"></link><published>2025-04-20T04:00:00-04:00</published><updated>2025-04-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-04-20:/coding-2025-04-20</id><summary type="html">&lt;p class="first last"&gt;Nothing adding a few more fields to the axes won't fix...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, so I got some tests written that are revealing one of the bugs I want to fix, and I just wrote another test that covers the bug I want to fix first.
I've sketched out some ideas for how to address that bug, after which I should be able to write the functionality needed to address the second bug, which I noticed first.
I'm not ready to try to put those sketches into practice, but they'll probably work.&lt;/p&gt;
&lt;p&gt;I'd better wrap up, and try this out in a few days.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2025-04-19</title><link href="https://mwchase.neocities.org/coding-2025-04-19" rel="alternate"></link><published>2025-04-19T04:00:00-04:00</published><updated>2025-04-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-04-19:/coding-2025-04-19</id><summary type="html">&lt;p class="first last"&gt;Preparing to have a pretty bad time getting these tests to pass...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's see...
I was pretty tired today, so I didn't get as much done as I'd like.
Let's see if I can sketch out the next steps I want to take, to make sure I can course-correct with MOTR.&lt;/p&gt;
&lt;p&gt;I have a set of tasks.
Some of these tasks are &lt;tt class="docutils literal"&gt;Cmd&lt;/tt&gt; objects.
The most important thing to look at about them is their lists of arguments.
What I want to do is match on the contents of the argument lists.
Two kinds of match are relevant: one is to treat the string as a path, and only look at the final segment; the other is to do an exact string match.
My hope is that it will suffice to match one or two arguments.
Once I've isolated a single &lt;tt class="docutils literal"&gt;Cmd&lt;/tt&gt; object to inspect, I want to write assertions around their contents.
Some of these assertions should be of the form &amp;quot;after this argument, expect this other argument&amp;quot;.
Others might need to be purely positional, which seems a little dicey.
I'll need to think on this more, and get to bed for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2025-04-18</title><link href="https://mwchase.neocities.org/coding-2025-04-18" rel="alternate"></link><published>2025-04-18T04:00:00-04:00</published><updated>2025-04-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-04-18:/coding-2025-04-18</id><summary type="html">&lt;p class="first last"&gt;I just discovered some testing gaps that I was sort of trying not to think about...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Things have gone wrong with the attempts to make MOTR work better.
Well, wrong in product code, right in test code, because exactly one test managed to exercise a large amount of functionality, which was the bare minimum to demonstrate that my current ideas for &lt;tt class="docutils literal"&gt;Matrix&lt;/tt&gt; chaining simply do not work.&lt;/p&gt;
&lt;p&gt;In my head, I'm rapidly flipping between different solutions, and none of them yet strike me as especially good.&lt;/p&gt;
&lt;p&gt;Basically, what's happening is that some code has the ability to set &lt;tt class="docutils literal"&gt;Box&lt;/tt&gt; values, provided that nothing upstream sets the same key, and the chaining implementation causes various things to suddenly be upstream from other things, when they weren't before.&lt;/p&gt;
&lt;p&gt;The desired behavior, I think, is that any chained &lt;tt class="docutils literal"&gt;Matrix&lt;/tt&gt; will only see the initial &lt;tt class="docutils literal"&gt;Box&lt;/tt&gt; value, and not any values that got added &amp;quot;in the interim&amp;quot;.&lt;/p&gt;
&lt;p&gt;Currently leaning towards, track the &amp;quot;initial&amp;quot; &lt;tt class="docutils literal"&gt;Box&lt;/tt&gt; and the &amp;quot;default&amp;quot; &lt;tt class="docutils literal"&gt;Box&lt;/tt&gt; through the call stack, and only combine them for &lt;tt class="docutils literal"&gt;draws_from_box&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Okay, I've thought about this enough that I've got something to try now.
As I type this, it is running...&lt;/p&gt;
&lt;p&gt;And it passed.
Okay, next hurdle.&lt;/p&gt;
&lt;p&gt;Well, hurdles.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The new interface I just switched to causes one of the new names to not really make sense.&lt;/li&gt;
&lt;li&gt;I think some of the checks I'm doing are redundant now.&lt;/li&gt;
&lt;li&gt;I may need to perform additional checks now.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Those last two &lt;em&gt;do not&lt;/em&gt; cancel out.
Or maybe they do.
I'm remembering that this code doesn't all fit in my head at the same time.
Oh boy, it looks like all of this code just barely does something sensible.
I'm going to have to check this over later.&lt;/p&gt;
&lt;p&gt;Unfortunately, I didn't get time to get more done conlanging, but what I did get done was certainly an adventure.&lt;/p&gt;
&lt;p&gt;Dangit, I just checked, and I'm missing some key functionality in what I've been writing for &lt;em&gt;years&lt;/em&gt;.
I'm going to need to come up with some better tests.
Working on this is also going to need to wait for now.
It's late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category></entry><entry><title>Coding 2025-04-17</title><link href="https://mwchase.neocities.org/coding-2025-04-17" rel="alternate"></link><published>2025-04-17T04:00:00-04:00</published><updated>2025-04-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-04-17:/coding-2025-04-17</id><summary type="html">&lt;p class="first last"&gt;Weirdly, the grammatical terms in here don't relate to the conlang.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I took things relatively easy today, and I'm going to try to unwind after I publish this, but here's what I got done today:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Rewrote the &lt;tt class="docutils literal"&gt;matrix&lt;/tt&gt; module so that the helpers are in simple present, rather than imperative or a secret third thing, and clarified or improved some terminology choices.&lt;/li&gt;
&lt;li&gt;Added more of a skeleton to the grammar for Untitled Personal Conlang 2025.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here are the next steps on each side of things:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Remember exactly how I intend to use the new &lt;tt class="docutils literal"&gt;prevents_multiple_returns_from&lt;/tt&gt; helper to sequence between &lt;tt class="docutils literal"&gt;Matrix&lt;/tt&gt; objects.&lt;/li&gt;
&lt;li&gt;Fill in the stuff for UPC2025 that I know about.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'll look into that over the next few days, but right now I just want to find something else to unwind with.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="conlanging"></category><category term="MOTR"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2025-04-16</title><link href="https://mwchase.neocities.org/coding-2025-04-16" rel="alternate"></link><published>2025-04-16T04:00:00-04:00</published><updated>2025-04-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-04-16:/coding-2025-04-16</id><summary type="html">&lt;p class="first last"&gt;Somehow, this surprises me every single time it happens.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've been sketching out format details for the grammar, and it'll &lt;em&gt;probably&lt;/em&gt; work.
I just need to take a bunch of notes to translate into the source file so I can validate the code against the kind of stuff I want to write.&lt;/p&gt;
&lt;p&gt;However, before I write that code, I need to consider, do I want to write tests for it, or just resign myself to debugging, and if the former, I guess I've got to bang out a &lt;tt class="docutils literal"&gt;tox.ini&lt;/tt&gt; file really quick, ugh.
It's annoying but true that MOTR isn't ready for general usage yet, and can't get there quickly.
I think I'm going to also be trying my hardest to make sense of the &lt;tt class="docutils literal"&gt;matrix&lt;/tt&gt; module, and How To Do Better.&lt;/p&gt;
&lt;p&gt;Anyway, none of that's happening right now; I need to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="conlanging"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-04-15</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-04-15" rel="alternate"></link><published>2025-04-15T04:00:00-04:00</published><updated>2025-04-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-04-15:/weekly-roundup-2025-04-15</id><summary type="html">&lt;p class="first last"&gt;Man I dunno&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I got fast error diffusion written.&lt;/li&gt;
&lt;li&gt;Thursday: I cribbed fast-enough code for generating blue noise.&lt;/li&gt;
&lt;li&gt;Friday: I developed a fancy algorithm for generating space-filling curves, and I literally cannot tell if it was worth it.&lt;/li&gt;
&lt;li&gt;Saturday: I squinted at too many washed-out images that some algorithm or other seemed to indicate was &amp;quot;the good version&amp;quot;.&lt;/li&gt;
&lt;li&gt;Sunday: I switched gears back to conlanging, and decided to scale back some of my ambitions.&lt;/li&gt;
&lt;li&gt;Monday: I set up some infrastructure for this and future projects.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'll start properly planning and prototyping the grammar generation code.
Or something.
I don't know.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="thermal printer"></category><category term="conlanging"></category></entry><entry><title>Coding 2025-04-14</title><link href="https://mwchase.neocities.org/coding-2025-04-14" rel="alternate"></link><published>2025-04-14T04:00:00-04:00</published><updated>2025-04-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-04-14:/coding-2025-04-14</id><summary type="html">&lt;p class="first last"&gt;It's almost starting to make sense...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I've been tweaking my tooling setup, and it looks like things should be good to go soon.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I've got one repository for the tools to process the grammars.&lt;/li&gt;
&lt;li&gt;I've got one repository for working with the specific grammar I want to write.&lt;/li&gt;
&lt;li&gt;I've got a pypiserver set up and running on login, to let me take a package published from the first repository, and use it in the second.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The first repository is mostly set up as far as tooling goes, and I need to take a little time to draft things out in the second repository, so I can figure out what kind of interface to give the first repository, and then finally write build rules for the second.
Nothing's happening with that tonight, because it's late now and I'm tired.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="conlanging"></category><category term="short post"></category></entry><entry><title>Coding 2025-04-13</title><link href="https://mwchase.neocities.org/coding-2025-04-13" rel="alternate"></link><published>2025-04-13T04:00:00-04:00</published><updated>2025-04-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-04-13:/coding-2025-04-13</id><summary type="html">&lt;p class="first last"&gt;A concept of an idea of a plan&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I ended up stepping away from the thermal printer stuff entirely, and focusing on a personal conlang project.
For this project, I'm deliberately stopping myself from doing some things &amp;quot;the right way&amp;quot; according to some people.
I'm instead trying to put things together in a way that's tractable in my head, and then I can potentially scale things up as I manage to automate more and more of the essential process.&lt;/p&gt;
&lt;p&gt;Here's my general plan:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Data about the conlang is typed up in TOML files.&lt;/li&gt;
&lt;li&gt;These files are canonicalized using tomlkit.&lt;/li&gt;
&lt;li&gt;In addition, they are deserialized using tomlkit, then fed into cattrs to produce standardized data in frozen attrs classes.&lt;/li&gt;
&lt;li&gt;This data is in the form of a hierarchical tree structure, which feeds into a Jinja template, to produce an HTML document.&lt;/li&gt;
&lt;li&gt;This HTML document is converted into a vaguely academic-looking PDF using pandoc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I know this looks like a lot, but almost all of this is stuff I've done before, so it should be relatively easy to snap together, and if I need to change some aspect of the flow, to snap it back apart.&lt;/p&gt;
&lt;p&gt;The big stuff I'm trying to work out currently is how I want to build things.
Tup &lt;em&gt;sounds&lt;/em&gt; cool, but I've never quite managed to convince myself that the stuff I &lt;em&gt;want&lt;/em&gt; to use it for is the stuff it's actually meant to do, so I figure I'll crib from the Ninja configuration stuff I've written for other projects.&lt;/p&gt;
&lt;p&gt;That's about enough to think about for tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="conlanging"></category></entry><entry><title>Coding 2025-04-12</title><link href="https://mwchase.neocities.org/coding-2025-04-12" rel="alternate"></link><published>2025-04-12T04:00:00-04:00</published><updated>2025-04-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-04-12:/coding-2025-04-12</id><summary type="html">&lt;p class="first last"&gt;Wasting time so hard I sort of hurt myself.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The more I ponder and compare different space-filling curves, the less sure I am that working on them is worth anything outside of the sake of working on them.
Like, they render cool pictures, but every attempt I've made to evaluate objective functions for image processing quality has managed to find at least one image where my subjective opinions about what look good have nothing to do with the parameter values that maximize the objective function, so, like, why would I trust these functions to say anything about the relative quality of different Riemersma dithering implementations?&lt;/p&gt;
&lt;p&gt;With all of that said, I need to &lt;em&gt;really&lt;/em&gt; step away from this stuff for a while, and focus on generating images from HTML and SVG or whatever.&lt;/p&gt;
&lt;p&gt;I don't have anything else I want to talk about right now, so I'm going to wrap things up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="thermal printer"></category><category term="short post"></category></entry><entry><title>Coding 2025-04-11</title><link href="https://mwchase.neocities.org/coding-2025-04-11" rel="alternate"></link><published>2025-04-11T04:00:00-04:00</published><updated>2025-04-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-04-11:/coding-2025-04-11</id><summary type="html">&lt;p class="first last"&gt;Okay, I've had my fun. Better reorient after this.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I have implemented the space-filling curve Ideas, with only one show-stopping bug.
I'm not sure if the resulting curve, the Glittering Curve, is any good in general, but I'll have to put off working that out to some other time.
For now, sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="thermal printer"></category><category term="short post"></category></entry><entry><title>Coding 2025-04-10</title><link href="https://mwchase.neocities.org/coding-2025-04-10" rel="alternate"></link><published>2025-04-10T04:00:00-04:00</published><updated>2025-04-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-04-10:/coding-2025-04-10</id><summary type="html">&lt;p class="first last"&gt;I really appreciate how fast this stuff is to experiment with, now that I'm not doing anything hilariously wrong when it comes to the baseline functionality.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I swiped some public domain code for generating blue noise, and the result looks solid.
I would like to factor the code apart a little, but right now it can generate a 64 by 64 texture in like a second, so, like, should I actually care?&lt;/p&gt;
&lt;p&gt;At this point, I can either start messing around with alternative space-filling curves or averaging algorithms for Riemersma, or start playing around with image generation, now that I've got a good stable of algorithms.
Realistically, I should be focusing on what I'm going to actually print, but I have Ideas about space-filling curves...&lt;/p&gt;
&lt;p&gt;Anyway, I should get to bed twenty minutes ago.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="thermal printer"></category><category term="short post"></category></entry><entry><title>Coding 2025-04-09</title><link href="https://mwchase.neocities.org/coding-2025-04-09" rel="alternate"></link><published>2025-04-09T04:00:00-04:00</published><updated>2025-04-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-04-09:/coding-2025-04-09</id><summary type="html">&lt;p class="first last"&gt;Vroom vroom&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Summary of the results of rewriting the dithering:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Trying to do Fancy Numba Stuff in an Idiomatic Python Way didn't really work out.
I still managed to do Fancy Numba Stuff, but I don't like how it looks.&lt;/li&gt;
&lt;li&gt;I had some bad code in the slow version, which Numba caught, and I think fixing that code actually made the slow version a little faster.&lt;/li&gt;
&lt;li&gt;I haven't tested this too much, but &lt;em&gt;compiling then running&lt;/em&gt; the jitted code is faster than the faster slow version, and once it's compiled, I saw a speed up in one case of I think like a factor of 15.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, all in all, this is working out well so far.
Unless I'm forgetting something, I guess next I look into blue noise generation.
(I guess I should confirm that my rewrites didn't break Bayer dithering first.)&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, yeah, Bayer dithering is working fine, and when I retested error diffusion, I saw some even more dramatic speedups.
So I'm really enjoying the new toy here.
Regardless, I need to get to bed right now.
I'll try to polish things up a little tomorrow, and then to figure out blue noise.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="thermal printer"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-04-08</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-04-08" rel="alternate"></link><published>2025-04-08T04:00:00-04:00</published><updated>2025-04-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-04-08:/weekly-roundup-2025-04-08</id><summary type="html">&lt;p class="first last"&gt;(Hopefully) Solving problems by thinking about them Really Hard.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I got matrix-based error diffusion working, and started experimenting with it.&lt;/li&gt;
&lt;li&gt;Thursday: Taxes.&lt;/li&gt;
&lt;li&gt;Friday: Couldn't do coding work because eyes hurt.&lt;/li&gt;
&lt;li&gt;Saturday: Couldn't do coding work because I dunno.&lt;/li&gt;
&lt;li&gt;Sunday: I listed a bunch of the stuff that I wanted to work on, but it wasn't working out.&lt;/li&gt;
&lt;li&gt;Monday: I drafted out all of the new versions of the code I'm interested in having in the near future.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to update the thermal printer code, but I'm not going to start on that for now, because I just got sidetracked by a problem I made for myself today.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="thermal printer"></category></entry><entry><title>Coding 2025-04-07</title><link href="https://mwchase.neocities.org/coding-2025-04-07" rel="alternate"></link><published>2025-04-07T04:00:00-04:00</published><updated>2025-04-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-04-07:/coding-2025-04-07</id><summary type="html">&lt;p class="first last"&gt;Fingers crossed that the rewrite won't be somehow slower.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I didn't want to touch the code, but I've written up all of the changes I want to make to the code, and all of the ideas I have for parts of the code that I don't need yet.
As part of all of that, I typed up rough drafts of the jitted versions of the error diffusion dithering algorithms.
(Well, except for Riemersma. I want to put Riemersma on the back burner for now, because everything else just works so much better, currently.)&lt;/p&gt;
&lt;p&gt;Because I don't want to update Riemersma, or delete it without documentation, my plan right now is:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Move the &lt;tt class="docutils literal"&gt;dither&lt;/tt&gt; module to &lt;tt class="docutils literal"&gt;dither_old&lt;/tt&gt; or something.&lt;/li&gt;
&lt;li&gt;Create a &lt;tt class="docutils literal"&gt;resize&lt;/tt&gt; module to make things be the right size.&lt;/li&gt;
&lt;li&gt;Create a &lt;tt class="docutils literal"&gt;colorspace&lt;/tt&gt; module to handle getting images down to linear luma.&lt;/li&gt;
&lt;li&gt;Create new &lt;tt class="docutils literal"&gt;dither&lt;/tt&gt; module to host the more ergonomic, hopefully-faster functions I've drafted.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With all of those together, I should be able to make the testing I've done clearer, and faster.
We'll see, though.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="thermal printer"></category><category term="short post"></category></entry><entry><title>Diary 2025-04-06</title><link href="https://mwchase.neocities.org/diary-2025-04-06" rel="alternate"></link><published>2025-04-06T04:00:00-04:00</published><updated>2025-04-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-04-06:/diary-2025-04-06</id><summary type="html">&lt;p class="first last"&gt;So many irons near the fire.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did some important things and had some important conversations today, but as far as stuff that I'd consider for a blog writeup goes, I'm kind of spinning my wheels.
As far as the thermal printer goes, I haven't figured out how to document the image processing code that I'm currently &lt;em&gt;not&lt;/em&gt; planning to implement.
As far as MOTR goes, I haven't found a good place or person to discuss what needs to change about the &lt;tt class="docutils literal"&gt;matrix&lt;/tt&gt; module.
I haven't had the focus to work on Clifford chemistry stuff.
I've got a game concept that I don't think has quite reached half-baked.
I've got various other pieces of writing that I don't intend to discuss here.&lt;/p&gt;
&lt;p&gt;For now, I'm going to try to wind down and see if I have the focus to work on any of this tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2025-04-05</title><link href="https://mwchase.neocities.org/diary-2025-04-05" rel="alternate"></link><published>2025-04-05T04:00:00-04:00</published><updated>2025-04-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-04-05:/diary-2025-04-05</id><summary type="html">&lt;p class="first last"&gt;Safe to skip.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I still had not much focus today.
I'm going to wrap up now and try to get some sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2025-04-04</title><link href="https://mwchase.neocities.org/diary-2025-04-04" rel="alternate"></link><published>2025-04-04T04:00:00-04:00</published><updated>2025-04-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-04-04:/diary-2025-04-04</id><summary type="html">&lt;p class="first last"&gt;Hoping to take things easy tomorrow.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I should be done with all of the big stuff that I need to take care of this week, so I thought I'd be ready to start updating the image processing code for the thermal printer.
But like, man... my eyes hurt.
I'm going to go do one or two things, and then just do some nice frontlit reading.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2025-04-03</title><link href="https://mwchase.neocities.org/diary-2025-04-03" rel="alternate"></link><published>2025-04-03T04:00:00-04:00</published><updated>2025-04-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-04-03:/diary-2025-04-03</id><summary type="html">&lt;p class="first last"&gt;Just a bit of therapeutic whining.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Uuuugh.
I wanted to work on improving the interfaces for dithering images, and instead I spent all night filing my taxes.
At least it's done.&lt;/p&gt;
&lt;p&gt;And I have stuff to do at work tomorrow that I don't want to...&lt;/p&gt;
&lt;p&gt;I'm going to publish this and go read.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2025-04-02</title><link href="https://mwchase.neocities.org/coding-2025-04-02" rel="alternate"></link><published>2025-04-02T04:00:00-04:00</published><updated>2025-04-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-04-02:/coding-2025-04-02</id><summary type="html">&lt;p class="first last"&gt;Not looking forward to attempting to rewrite this so the fancy dithering doesn't take &lt;em&gt;ten seconds&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I bit the bullet and implemented matrix-based error diffusion.
Notes so far:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;When I do Floyd-Steinberg diffusion, I don't get what Pillow does when it does Floyd-Steinberg diffusion.&lt;/li&gt;
&lt;li&gt;Sometimes what Pillow does is better in terms of detail, and sometimes it isn't.&lt;/li&gt;
&lt;li&gt;Sometime Floyd-Steinberg is good, sometimes Jarvis-Judice-Ninke is good, and I don't think I've yet hit a situation where Atkinson was the standout.
I probably need to try a greater variety of images.&lt;/li&gt;
&lt;li&gt;At least the way I write it, matrix-based error diffusion is incredibly slow.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Looks like I should work on a few categories of thing later:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Cleaning this up and reworking the relevant interfaces.&lt;/li&gt;
&lt;li&gt;Finally generating blue noise in the format that I want.&lt;/li&gt;
&lt;li&gt;Some quick experiments showed that simply increasing the input image brightness (by quite a lot, in the case of Atkinson dithering) can make things come out a lot clearer.
Perhaps there's some way to automate the offset determination?&lt;/li&gt;
&lt;li&gt;I've still got a few more average implementations I want to try, but, like, realistically speaking, they're not likely to accomplish anything groundbreaking.
Nothing with the aesthetic punch of &amp;quot;Atkinson dithering but first I added &lt;em&gt;one eighth of full brightness are you kidding me?&lt;/em&gt;&amp;quot;
(I have no idea what this corresponds to mathematically, or how much it messes with the theoretical properties of Atkinson dithering.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, we'll see if I'm up for any of that tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="thermal printer"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-04-01</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-04-01" rel="alternate"></link><published>2025-04-01T04:00:00-04:00</published><updated>2025-04-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-04-01:/weekly-roundup-2025-04-01</id><summary type="html">&lt;p class="first last"&gt;Progress, but not &lt;em&gt;quite&lt;/em&gt; as much focus as I intended to have.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: The dithering code I wrote was super broken.&lt;/li&gt;
&lt;li&gt;Thursday: I decided to move away from Python REPL for prototyping the dithering code, and made a plan for what changes to make at the same time as switching to a notebook.&lt;/li&gt;
&lt;li&gt;Friday: I made some progress on that front.&lt;/li&gt;
&lt;li&gt;Saturday: I wrote a bunch of helper functions that I'll eventually want to incorporate into the project proper.&lt;/li&gt;
&lt;li&gt;Sunday: I fixed a bunch of the aforementioned super-brokenness.&lt;/li&gt;
&lt;li&gt;Monday: I looked over what I had, and took notes and made more plans.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to finally get matrix-based error diffusion going, and perhaps blue noise generation.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="thermal printer"></category><category term="Python"></category></entry><entry><title>Coding 2025-03-31</title><link href="https://mwchase.neocities.org/coding-2025-03-31" rel="alternate"></link><published>2025-03-31T04:00:00-04:00</published><updated>2025-03-31T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-03-31:/coding-2025-03-31</id><summary type="html">&lt;p class="first last"&gt;Looks like I'm in a taking-notes mood.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I kind of took things easy today, so let's instead take some notes.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Bayer level 3 seems like an extremely good default choice, especially if I mess with the luma or contrast by a few percent.&lt;/li&gt;
&lt;li&gt;Riemersma doesn't seem like much more than a party trick currently; I'll have to implement different error decay generators and see how those do.&lt;/li&gt;
&lt;li&gt;I'm still not sure how I want to encode error diffusion matrices.&lt;/li&gt;
&lt;li&gt;I'm sort of leaning towards PMaps from coordinates to floats.
(With validation that the y coordinate is non-negative, and if the y coordinate is zero, then the x coordinate is positive)&lt;/li&gt;
&lt;li&gt;Searching for example code gets me stuff that inlines the logic of selecting different coordinates.
This makes sense from an efficiency perspective, probably, but I'm trying to get an idea of how a bunch of different algorithms treat images.&lt;/li&gt;
&lt;li&gt;I'm also seeing something that combines scaling and resampling into a single step, which, I mean, that might help, but I'm not up to thinking about it currently.&lt;/li&gt;
&lt;li&gt;Pillow's Floyd-Steinberg implementation seems to make everything much lighter?
Not sure if that's an artifact of the algorithm, or if there's something funky in the implementation.&lt;/li&gt;
&lt;li&gt;I guess I should also be looking into blue noise stuff, if Bayer seems so reliable, but I don't feel like it currently.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm going to ponder this for a bit, and wind down.
Hopefully I'll get some kind of implementation scraped together in the days to come.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="thermal printer"></category><category term="short post"></category></entry><entry><title>Coding 2025-03-30</title><link href="https://mwchase.neocities.org/coding-2025-03-30" rel="alternate"></link><published>2025-03-30T04:00:00-04:00</published><updated>2025-03-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-03-30:/coding-2025-03-30</id><summary type="html">&lt;p class="first last"&gt;When I fix all of the embarrassing, trivial mistakes, I will be unstoppable.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I got some testing done in a notebook, and figured out what was wrong with my Bayer dithering implementation; now that I've fixed it, it can be &lt;em&gt;excellent&lt;/em&gt; for some images.&lt;/p&gt;
&lt;p&gt;Riemersma dithering was fun to implement, but so far I haven't found an image where I feel that it really shines.
There's some where it does the best job out of what I have easy access to so far, but I'm guessing that could change once I implement Atkinson dithering.&lt;/p&gt;
&lt;p&gt;Pillow, as I might have mentioned before, provides Floyd-Steinberg, and sometimes this is fine, and sometimes it kind of isn't.
Hence why I'm interested in other forms of error diffusion.&lt;/p&gt;
&lt;p&gt;Anyway, I ought to wind down now.
Hopefully tomorrow, I'll have time to wrangle matrix-based error diffusion out of Numpy's API.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="thermal printer"></category><category term="short post"></category></entry><entry><title>Coding 2025-03-29</title><link href="https://mwchase.neocities.org/coding-2025-03-29" rel="alternate"></link><published>2025-03-29T04:00:00-04:00</published><updated>2025-03-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-03-29:/coding-2025-03-29</id><summary type="html">&lt;p class="first last"&gt;Hm, most of my testing has been invalid, because I didn't have some of these functions. Oh well, time to do it right.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I started working on a notebook for testing this stuff out.
I got a few helper functions written:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Resize images to fit on the thermal paper&lt;/li&gt;
&lt;li&gt;Linearize a channel&lt;/li&gt;
&lt;li&gt;De-linearize a channel&lt;/li&gt;
&lt;li&gt;Given an image, convert it to a linear grayscale image&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This all looks like a proper baseline to be testing this stuff out, and I'll try to get on that tomorrow.
For now, I'm going to take things easy.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="thermal printer"></category><category term="short post"></category></entry><entry><title>Coding 2025-03-28</title><link href="https://mwchase.neocities.org/coding-2025-03-28" rel="alternate"></link><published>2025-03-28T04:00:00-04:00</published><updated>2025-03-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-03-28:/coding-2025-03-28</id><summary type="html">&lt;p class="first last"&gt;It was pretty straightforward, so I don't really have anything to say on the matter.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I've factored out the averaging algorithm.
Now, I feel ready to start prototyping stuff in a notebook, but I probably shouldn't mess with that tonight.&lt;/p&gt;
&lt;p&gt;Instead, I should wrap things up and get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="thermal printer"></category><category term="short post"></category></entry><entry><title>Coding 2025-03-27</title><link href="https://mwchase.neocities.org/coding-2025-03-27" rel="alternate"></link><published>2025-03-27T04:00:00-04:00</published><updated>2025-03-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-03-27:/coding-2025-03-27</id><summary type="html">&lt;p class="first last"&gt;Now the real work begins.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Whoops, I figured out what was wrong with the dithering stuff I was testing.
I was attempting to set up an exponential moving average, and I wasn't properly setting it up.
Since figuring &lt;em&gt;that&lt;/em&gt; out, I've found out or worked out a few other things:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The current implementation seems to work &lt;em&gt;okay&lt;/em&gt; for photos, and a high alpha value makes text look interestingly crunchy, while low alpha values make text look smooth, and can unlock The Forbidden Edge Detection on photos.&lt;/li&gt;
&lt;li&gt;On reflection, it should be possible to abstract the averaging algorithm out of the dithering function, and pass it in.
Possibly also the space-filling curve generator.
(While I'm at it, it'd be nice to be able to tweak the threshold in the space-filling curve generator, or even change the algorithm.)&lt;/li&gt;
&lt;li&gt;I've been testing the prototypes just in Python's REPL, and I think I should switch over to using notebooks.&lt;/li&gt;
&lt;li&gt;I've downloaded a bunch of stock photos to experiment with, instead of the not-stock images I was messing with before.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My basic plan at this point is:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Abstract out the averaging algorithm.&lt;/li&gt;
&lt;li&gt;Make a notebook for testing out different algorithms and parameters, and prototyping helper functions that I wish I'd had like a week ago.&lt;/li&gt;
&lt;li&gt;Figure out what I'm doing wrong when it comes to Bayer dithering.&lt;/li&gt;
&lt;li&gt;Implement more algorithms: different forms of moving average, different space-filling-curve thresholds, different space-filling-curve generators, matrix-based ordered diffusion, blue noise generation finally.&lt;/li&gt;
&lt;li&gt;Somewhere in all of this, make some kind of pipeline object.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For now, I'm going to think about how to factor out the averaging algorithm, because I tend not to do much with the &lt;tt class="docutils literal"&gt;send()&lt;/tt&gt; method in Python.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="thermal printer"></category></entry><entry><title>Coding 2025-03-26</title><link href="https://mwchase.neocities.org/coding-2025-03-26" rel="alternate"></link><published>2025-03-26T04:00:00-04:00</published><updated>2025-03-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-03-26:/coding-2025-03-26</id><summary type="html">&lt;p class="first last"&gt;It's wrong, but I don't know what's &lt;em&gt;causing&lt;/em&gt; it to be wrong.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I thought I was going to be able to throw together dithering pipelines easily, and I guess I can, they just don't really &lt;em&gt;work&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The Bayer dithering is artifacting heavily, in ways I didn't expect, and the Riemersma dithering (which I could be doing just completely wrong) is hitting exponential blowup.&lt;/p&gt;
&lt;p&gt;I would like to be able to figure out what I did wrong there, but I don't have the time to ponder it tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="thermal printer"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-03-25</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-03-25" rel="alternate"></link><published>2025-03-25T04:00:00-04:00</published><updated>2025-03-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-03-25:/weekly-roundup-2025-03-25</id><summary type="html">&lt;p class="first last"&gt;Well, things are moving along.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I ran into some trouble with the thermal printer. I don't recall that I fixed it to my satisfaction.&lt;/li&gt;
&lt;li&gt;Thursday: I did manage to get it to work for &lt;em&gt;other&lt;/em&gt; cases, at least.&lt;/li&gt;
&lt;li&gt;Friday: I did further experimentation with the printer.&lt;/li&gt;
&lt;li&gt;Saturday: I experimented with the dithering options in Pillow, which are pretty limited, so I'm planning to roll my own.&lt;/li&gt;
&lt;li&gt;Sunday: I made some progress towards rolling my own versions of various kinds of dithering, but also the project repository is a &lt;em&gt;mess&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Monday: I cleaned things up, and &lt;em&gt;potentially&lt;/em&gt; got some forms of dithering working, though I haven't actually checked.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'll try to make more progress, and maybe write up the space-filling curves stuff, since I did have to put some effort into understanding what's going on, and also it's &lt;em&gt;possible&lt;/em&gt; that I can get rid of that corner case without &lt;em&gt;too&lt;/em&gt; much effort.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="thermal printer"></category></entry><entry><title>Coding 2025-03-24</title><link href="https://mwchase.neocities.org/coding-2025-03-24" rel="alternate"></link><published>2025-03-24T04:00:00-04:00</published><updated>2025-03-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-03-24:/coding-2025-03-24</id><summary type="html">&lt;p class="first last"&gt;Do I want to show off any of the images I used to test out Pillow's dithering support? Absolutely not.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;My Jujutsu state is, if not clean, capable of basically pretending, so that's nice.&lt;/p&gt;
&lt;p&gt;After I got that together, I wrote the framework code for applying different dithering algorithms, and what should be enough code to pull off Bayer dithering, though I haven't tried it yet.
I also added some convenience methods to the class that generates images for the thermal printer, to do stuff like load images after they've been through the dithering pipeline, and preview images from whatever source.&lt;/p&gt;
&lt;p&gt;On the fancy-code-side of things, I still haven't wired up the space-filling curve code to handle Riemersma dithering, and it would be nice to special-case things a little to avoid the corner case (which manifests in a corner) in the current space-filling curve code.
I also haven't set up blue noise generation, or matrix-based error diffusion.&lt;/p&gt;
&lt;p&gt;On the usability side of things, I haven't tried actually wiring any of this stuff together, so my standing assumption is that actually trying to use this code is really obnoxious currently.
I probably need a bunch more helper functions that I haven't fully anticipated.&lt;/p&gt;
&lt;p&gt;I'll need to take some time to figure out how to implement things, and what things to implement, so I'm just going to wrap things up a little early and chill out for a bit.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="thermal printer"></category></entry><entry><title>Coding 2025-03-23</title><link href="https://mwchase.neocities.org/coding-2025-03-23" rel="alternate"></link><published>2025-03-23T04:00:00-04:00</published><updated>2025-03-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-03-23:/coding-2025-03-23</id><summary type="html">&lt;p class="first last"&gt;Thanks, random StackOverflow answers linking to GitHub repositories.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I've got prototype code for generating &amp;quot;nice-enough&amp;quot; space-filling curves, modulo a minor cheat in what is technically a corner case.
This covers &lt;em&gt;part&lt;/em&gt; of what I need for Riemersma dithering; the rest is handling the actual quantization etc.&lt;/p&gt;
&lt;p&gt;In terms of neat code stuff, the next things to do are to set up the overall pipeline logic and write a debug function that handles the fact that light is dark and dark is light.&lt;/p&gt;
&lt;p&gt;In terms of project workflow stuff, I &lt;em&gt;really&lt;/em&gt; need to get back to working with Jujutsu, and figuring out how to make some kind of reasonable commit out of the complete nonsense I've managed to accrue as a result of not wanting to think about how Jujutsu works.&lt;/p&gt;
&lt;p&gt;We'll see if I have the discipline to do that, tomorrow.
For now, bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="short post"></category><category term="thermal printer"></category></entry><entry><title>Coding 2025-03-22</title><link href="https://mwchase.neocities.org/coding-2025-03-22" rel="alternate"></link><published>2025-03-22T04:00:00-04:00</published><updated>2025-03-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-03-22:/coding-2025-03-22</id><summary type="html">&lt;p class="first last"&gt;Found a bunch of interesting failure modes that I hope to be able to work around when I'm generating stuff.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I spent a lot of today just messing around with the dithering options that some tools give me out-of-the-box.
These options are pretty limited, so I also spent some time sketching out implementation strategies for more advanced options.
I think some of them are ready to be worked on, but others are... um... well... the cyclomatic complexity is going to be &lt;em&gt;pretty big&lt;/em&gt; probably.&lt;/p&gt;
&lt;p&gt;Anyway, I really was playing around with dithering images &lt;em&gt;a lot&lt;/em&gt;, so it's quite late and I should get ready for bed half an hour ago.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="short post"></category><category term="thermal printer"></category></entry><entry><title>Coding 2025-03-21</title><link href="https://mwchase.neocities.org/coding-2025-03-21" rel="alternate"></link><published>2025-03-21T04:00:00-04:00</published><updated>2025-03-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-03-21:/coding-2025-03-21</id><summary type="html">&lt;p class="first last"&gt;Getting ready to print more interesting things...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I made some tweaks to my helper function for printing, which allowed me to confirm that sending images in two separate print commands will directly concatenate them vertically.
This is good, since it means I can more-or-less arbitrarily split images up if they're too big.&lt;/p&gt;
&lt;p&gt;Aside from that, I mostly focused on planning out image processing.
This planning is a mix of figuring out what I want stuff to look like, and what Numpy will easily support.&lt;/p&gt;
&lt;p&gt;In any case, I have some ideas, but not time right now to act on them.
Got to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="short post"></category><category term="thermal printer"></category></entry><entry><title>Coding 2025-03-20</title><link href="https://mwchase.neocities.org/coding-2025-03-20" rel="alternate"></link><published>2025-03-20T04:00:00-04:00</published><updated>2025-03-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-03-20:/coding-2025-03-20</id><summary type="html">&lt;p class="first last"&gt;A lot of progress that can be summed up with &amp;quot;it's easier now&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I decided to focus on printing single images from the thermal printer.
This should give me enough control, and means I don't have to puzzle through the parts of the XML that don't &lt;em&gt;feel&lt;/em&gt; like XML.&lt;/p&gt;
&lt;p&gt;My plan to build on this is to implement different dithering algorithms, apply them to some test images, and make sure they come out all right.
After that, I'll focus on generating images by using a webdriver to read HTML, and then develop templates.&lt;/p&gt;
&lt;p&gt;But for now, I'm pretty tired, and just glad that I managed to make it output a literal black triangle.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="short post"></category><category term="thermal printer"></category></entry><entry><title>Coding 2025-03-19</title><link href="https://mwchase.neocities.org/coding-2025-03-19" rel="alternate"></link><published>2025-03-19T04:00:00-04:00</published><updated>2025-03-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-03-19:/coding-2025-03-19</id><summary type="html">&lt;p class="first last"&gt;The triangle stopped showing up...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I decided to focus on generating and printing images, because that seems more versatile.
So far, it hasn't really worked, so I'll be troubleshooting that tomorrow, because I spent all night throwing together this manual test that didn't work.&lt;/p&gt;
&lt;p&gt;For now, I should get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="short post"></category><category term="thermal printer"></category></entry><entry><title>Weekly Roundup 2025-03-18</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-03-18" rel="alternate"></link><published>2025-03-18T04:00:00-04:00</published><updated>2025-03-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-03-18:/weekly-roundup-2025-03-18</id><summary type="html">&lt;p class="first last"&gt;I have well and truly acquired a project.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I had some uncertain thoughts about Clifford chemistry.&lt;/li&gt;
&lt;li&gt;Thursday: I tried to elaborate on those thoughts, and came to the conclusion that I need some kind of four-dimensional molecular modeling software, and I have no idea where to look for such a thing.&lt;/li&gt;
&lt;li&gt;Friday: I eventually managed to plug the thermal printer in.
This was harder than one might reasonably expect.&lt;/li&gt;
&lt;li&gt;Saturday: Were the WSDL files ever real in the first place?
I don't know, but there is extensive documentation that tells me &lt;em&gt;most&lt;/em&gt; of what I need to know.&lt;/li&gt;
&lt;li&gt;Sunday: I managed to construct an empty print job programmatically.
This is actually useful.&lt;/li&gt;
&lt;li&gt;Monday: I actually started to understand the documentation for the thermal printer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try and implement enough bit-twiddling stuff to print images out, and try to generate them.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="worldbuilding"></category><category term="thermal printer"></category></entry><entry><title>Coding 2025-03-17</title><link href="https://mwchase.neocities.org/coding-2025-03-17" rel="alternate"></link><published>2025-03-17T04:00:00-04:00</published><updated>2025-03-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-03-17:/coding-2025-03-17</id><summary type="html">&lt;p class="first last"&gt;This really shouldn't take too much longer.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I mostly took things easy today, but I did do a small amount of experimentation with the printer.
I've now got a general idea of how I should expect things to fit together.
Basically, there are a few natural groups of XML nodes, and they mostly do not nest, so I should rework things a little.
I've bookmarked the relevant pages in the XML manual, so I should be able to throw something together, once I've re-evaluated the constraints on the layout.&lt;/p&gt;
&lt;p&gt;And, let's see... some nodes are exclusive to page mode, some are exclusive to standard mode, some are shared, so I believe I want to have a common base class, and mode-specific subclasses, because some attributes are also mode-specific.&lt;/p&gt;
&lt;p&gt;The big thing I need to ponder right now is how to handle stuff like &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;&amp;lt;vline-begin&amp;gt;&lt;/span&gt;&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;&amp;lt;vline-end&amp;gt;&lt;/span&gt;&lt;/tt&gt;, which are meant to be paired, but don't have to go in a particular order.
This is something where I don't see an obvious way to handle it with closures or context managers.
Like, I guess it's a linear logic sort of thing, but I'm not sure how to get that into any kind of easy Python paradigm.&lt;/p&gt;
&lt;p&gt;Anyway, I think the right way to go about this is to make myself a checklist of all of the elements and their modes, and figure out what kinds of validators and enums I want to write for them.&lt;/p&gt;
&lt;p&gt;Anyway, I need to get to bed &lt;em&gt;right now&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="short post"></category><category term="thermal printer"></category></entry><entry><title>Coding 2025-03-16</title><link href="https://mwchase.neocities.org/coding-2025-03-16" rel="alternate"></link><published>2025-03-16T04:00:00-04:00</published><updated>2025-03-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-03-16:/coding-2025-03-16</id><summary type="html">&lt;p class="first last"&gt;Like a black triangle, but less black and triangular.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I did end up developing a different idea for how to handle the tree, of saying &amp;quot;well, let's build up the tree structure without the node data making any reference to it&amp;quot;.
There are probably a few rough edges that I'll hit later on, but I've managed to get it to output the XML for a blank document, which &lt;em&gt;should&lt;/em&gt; be enough for everything else to fall into place from the documentation.&lt;/p&gt;
&lt;p&gt;I'll see about making it do something actually interesting later, but for now I would like to wind down so I hopefully don't end up sleeping in quite so much tomorrow morning.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="short post"></category><category term="thermal printer"></category></entry><entry><title>Coding 2025-03-15</title><link href="https://mwchase.neocities.org/coding-2025-03-15" rel="alternate"></link><published>2025-03-15T04:00:00-04:00</published><updated>2025-03-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-03-15:/coding-2025-03-15</id><summary type="html">&lt;p class="first last"&gt;Getting a &amp;quot;no such device&amp;quot; error was confusing. Like, dude, I know you're there, you responded to the POST.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, here we go.
Slow progress, but progress.&lt;/p&gt;
&lt;p&gt;First off, I'm sure I read so much about the WSDL files, but I can't seem to find anything no matter how much stuff I download.
(Also, why is the JavaScript SDK only available under the Windows downloads?
That's weird, right?)
So, it looks like I need to build up the XML myself.&lt;/p&gt;
&lt;p&gt;What I've got right now is a bunch of work that only exists in my Python REPL's readline history, as well as some XML payloads that work and some that don't.
Once I collate all of this, and bring in the documentation, I &lt;em&gt;should&lt;/em&gt; have what I need in terms of controlling the printer.&lt;/p&gt;
&lt;p&gt;Before I touch that, though, I need to think through what kind of interface I want to use to build this stuff.
From my experiments so far, I believe &amp;quot;classes representing the different node types, defining functions that mutate an instance of the parent node&amp;quot; should offer a good balance of features, ease of implementation, and maintainability.&lt;/p&gt;
&lt;p&gt;I'll sleep on this and see if I come to any different conclusions.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="short post"></category><category term="thermal printer"></category></entry><entry><title>Coding 2025-03-14</title><link href="https://mwchase.neocities.org/coding-2025-03-14" rel="alternate"></link><published>2025-03-14T04:00:00-04:00</published><updated>2025-03-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-03-14:/coding-2025-03-14</id><summary type="html">&lt;p class="first last"&gt;There's a step in the setup directions that it took me way too long to manage to do, and I cannot explain what I'm doing to be capable of it now.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, after going through some &lt;em&gt;interesting&lt;/em&gt; stuff with shipping (why did they put &amp;quot;receiving department&amp;quot; on the label if they &lt;em&gt;knew&lt;/em&gt; it was a residential address? Baffling) I've got the thermal printer, and it definitely seems to be working.&lt;/p&gt;
&lt;p&gt;Now that I've taken care of the hardware side of things, I've got to work on writing support code of varying levels of sophistication.
Here's how I believe things go:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Use the firmware version information to finally access the relevant WSDL file&lt;/li&gt;
&lt;li&gt;See how interfaces generated from that file feel/work&lt;/li&gt;
&lt;li&gt;Experiment with images, first pure black and white, then greyscale subject to various forms of dithering, then start working on generating images&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This will have to wait until the weekend before things have a chance to get interesting.
I have a job, after all.
And for now I should be getting to sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="short post"></category><category term="thermal printer"></category></entry><entry><title>Diary 2025-03-13</title><link href="https://mwchase.neocities.org/diary-2025-03-13" rel="alternate"></link><published>2025-03-13T04:00:00-04:00</published><updated>2025-03-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-03-13:/diary-2025-03-13</id><summary type="html">&lt;p class="first last"&gt;Everything correct except one of the foundational assumptions. Oof.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I thought some more about Clifford chemistry stuff, but it amounted to &amp;quot;*half a page of hopefully post-rigorous math* So therefore this doesn't work ... Oh wait, haha, one of my assumptions is wrong, so I don't know if my conclusion is valid.&amp;quot;&lt;/p&gt;
&lt;p&gt;If I'm going to get anywhere interesting modeling this stuff, I think I'm going to need some sort of formal system, hopefully something I can check, and maybe even construct, electronically.&lt;/p&gt;
&lt;p&gt;For now, I really really really need to get to bed, so maybe I'll look into that tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="worldbuilding"></category></entry><entry><title>Diary 2025-03-12</title><link href="https://mwchase.neocities.org/diary-2025-03-12" rel="alternate"></link><published>2025-03-12T04:00:00-04:00</published><updated>2025-03-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-03-12:/diary-2025-03-12</id><summary type="html">&lt;p class="first last"&gt;Not sure how to even look for collaboration on this.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Oh boy.
I did not have the focus to do much today, at least not that I feel like writing down.
I figured out some of the potentially-biologically-significant aspects of Clifford chemistry, but I don't feel like I've written up enough of the foundational stuff to explain things.
The quick version is that the equivalent of cyclopentane &lt;em&gt;should&lt;/em&gt; be able to avoid bond strain, which probably has some kind of implication for the equivalent of ribose, but I'm distracted by the possibility that there's potentially an allotrope similar to diamond, but with no direct three-dimensional equivalent.
Or possibly there's no way to extrapolate the relevant structure outward, and it's just a weird crystal defect.
Or maybe it's simply a substituent in a more complex crystal structure.&lt;/p&gt;
&lt;p&gt;I need to find someone to discuss this stuff with.
Later.
For now, sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="worldbuilding"></category></entry><entry><title>Weekly Roundup 2025-03-11</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-03-11" rel="alternate"></link><published>2025-03-11T04:00:00-04:00</published><updated>2025-03-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-03-11:/weekly-roundup-2025-03-11</id><summary type="html">&lt;p class="first last"&gt;I was being very cautious, so this wasn't too exciting.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I committed to ordering some packages.&lt;/li&gt;
&lt;li&gt;Thursday: I scoped out some prep work in order to feel more comfortable about ordering the packages.&lt;/li&gt;
&lt;li&gt;Friday: As part of that prep work, I poked around with Jujutsu a little. Still not sure how I feel about it.&lt;/li&gt;
&lt;li&gt;Saturday: I purchased things besides the packages, and that was a little spicy for my credit card, because apparently buying a bunch of things on Bandcamp on the first Friday of the month looks weird no matter how often I do it.&lt;/li&gt;
&lt;li&gt;Sunday: I ordered the packages, and also went through the day in kind of a haze.&lt;/li&gt;
&lt;li&gt;Monday: I implemented balanced ternary integers in Python, because that's a thing you can do.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'll see what I feel like working on; it'll be a few days before I have the printer, so I can't mess with it yet.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2025-03-10</title><link href="https://mwchase.neocities.org/coding-2025-03-10" rel="alternate"></link><published>2025-03-10T04:00:00-04:00</published><updated>2025-03-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-03-10:/coding-2025-03-10</id><summary type="html">&lt;p class="first last"&gt;I don't know why anyone would actually want this.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, it's pretty late now, even if my body isn't feeling it yet, so I'm just going to spend a sentence or two on stuff.&lt;/p&gt;
&lt;p&gt;I just implemented tritwise operations on balanced ternary, on a whim, and boy is it ever confusing.
In addition to AND, both OR and XOR have the ability to mask out data, and that's just... too confusing for me to think about right now.
(Morning edit: I wasn't thinking clearly; it's only XOR that can do this; OR can't, but also neither can AND.)&lt;/p&gt;
&lt;p&gt;Anyway, nothing else productive is going to happen tonight. I need to get as much sleep as I can.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="short post"></category></entry><entry><title>Diary 2025-03-09</title><link href="https://mwchase.neocities.org/diary-2025-03-09" rel="alternate"></link><published>2025-03-09T05:00:00-04:00</published><updated>2025-03-09T05:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-03-09:/diary-2025-03-09</id><summary type="html">&lt;p class="first last"&gt;I think I got more than this done, but somehow, it doesn't feel like it emotionally.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I finally sent in the orders for everything I was thinking about.
It'll be a few days before they show up.&lt;/p&gt;
&lt;p&gt;Aside from that, I had kind of a weird day, and I'm hoping I have an okay night after it.
I'm not sure whether I fully woke up before dinner, which is... unfortunate.&lt;/p&gt;
&lt;p&gt;I did manage to get some stuff done, and I hope it pays dividends later, but we'll see.
For now, I've got at make sure I get enough sleep, because I've got surprise plans for tomorrow, and they get started early.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2025-03-08</title><link href="https://mwchase.neocities.org/coding-2025-03-08" rel="alternate"></link><published>2025-03-08T05:00:00-05:00</published><updated>2025-03-08T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-03-08:/coding-2025-03-08</id><summary type="html">&lt;p class="first last"&gt;Nearly there...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I just got through a bunch of internet purchases, which messed with my credit card, which left me a little keyed up.&lt;/p&gt;
&lt;p&gt;I'm still making sure I have a proper plan for stuff to do with the thermal printer.
And dealing with the fact that &amp;quot;mess around with heraldry hatching or Atkinson dithering&amp;quot; is a means, not an end.&lt;/p&gt;
&lt;p&gt;Just going to run through my ideas here quickly.
There are a few somewhat overlapping general concepts I'm hoping to take care of with all of this:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Rapid prototyping&lt;/li&gt;
&lt;li&gt;Scratch paper with templates for specific purposes&lt;/li&gt;
&lt;li&gt;Printing small graphs for offline reference&lt;/li&gt;
&lt;li&gt;Creating physical artifacts, albeit cheap and compact&lt;/li&gt;
&lt;li&gt;Generating diagrams, then manipulating them physically&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I think these ideas need to bake a little bit more before I'm ready to place my order.
(And hopefully by then the credit card will have recovered.)&lt;/p&gt;
&lt;p&gt;Anyway, I spent way too long buying stuff, and I really need to get to bed now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="short post"></category></entry><entry><title>Coding 2025-03-07</title><link href="https://mwchase.neocities.org/coding-2025-03-07" rel="alternate"></link><published>2025-03-07T05:00:00-05:00</published><updated>2025-03-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-03-07:/coding-2025-03-07</id><summary type="html">&lt;p class="first last"&gt;I haven't written the code, but I have an informal existence proof for code that I could write.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I picked Jujutsu for now, and I don't fully have a handle on what workflow I want, but I've got the beginnings of something.&lt;/p&gt;
&lt;p&gt;It turns out that &amp;quot;doing stuff with XML&amp;quot; is a pretty broad field, and &amp;quot;parse out Leo files and barely think about the XML&amp;quot; is pretty different from &amp;quot;generate SOAP payloads&amp;quot;.
I haven't generated a full payload, but I've put together enough components that I'm confident that I can smash something together with lxml, if the SOAP-specific libraries don't work for some reason.&lt;/p&gt;
&lt;p&gt;With a bit more tinkering, I've got a good-enough handle on the software side of things; getting this to work the way I want is likely to be a project, but it should be a manageable one.
With that out of the way, the next step is to make sure I know &lt;em&gt;exactly&lt;/em&gt; what I want to buy, and &lt;em&gt;exactly&lt;/em&gt; what the various third-party sellers are pitching me.
Once everything matches up nicely, I'll put in the order, and wait, and possibly need to go to the UPS store for pickup because I don't trust them to actually deliver anything expensive.&lt;/p&gt;
&lt;p&gt;Regardless, there's nothing more to do tonight, so I'm going to wrap things up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="short post"></category></entry><entry><title>Coding 2025-03-06</title><link href="https://mwchase.neocities.org/coding-2025-03-06" rel="alternate"></link><published>2025-03-06T05:00:00-05:00</published><updated>2025-03-06T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-03-06:/coding-2025-03-06</id><summary type="html">&lt;p class="first last"&gt;Preparing to put in effort soon, to avoid putting in effort later.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, here we go.
I've figured out, &lt;em&gt;I think&lt;/em&gt;, which model of printer I want, but I'm planning to check over things a little more, because I was initially going for a model with features I didn't need.&lt;/p&gt;
&lt;p&gt;Before ordering, I need to evaluate my ability to handle the SOAP data, and I'm doing stuff with Python for that, and that means getting a new project set up, and that means familiarizing myself with &lt;cite&gt;uv&lt;/cite&gt;, and figuring out whether I want to track the files in Mercurial, Pijul, or learn Jujutsu.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Can't you use—?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;You know I won't do that unless I'm getting paid.&lt;/p&gt;
&lt;p&gt;Anyway, I'm tired and I want to wrap up, so I'll get back to this later.
For now, bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="short post"></category></entry><entry><title>Diary 2025-03-05</title><link href="https://mwchase.neocities.org/diary-2025-03-05" rel="alternate"></link><published>2025-03-05T05:00:00-05:00</published><updated>2025-03-05T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-03-05:/diary-2025-03-05</id><summary type="html">&lt;p class="first last"&gt;Watch this space for updates on one or both of these, I guess.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I didn't really touch much today.
I did some research for hobbies and projects that I'm thinking of getting into.&lt;/p&gt;
&lt;p&gt;For the hobby, locksport.
For the project, I've wanted for a while to get a thermal printer for stuff like making custom scratchpads, or printing out cards on the very, very cheap.
(Sleeves would be basically mandatory.)
I've basically decided what I want to do for getting started with locksport, and as far as the thermal printer, I've got a few models picked out to look into; before I order anything, I figure I should make sure I can use lxml (or whatever) to generate some of the code samples in a nice fashion.
I'll see if I have the focus to do that tomorrow.&lt;/p&gt;
&lt;p&gt;For now, sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-03-04</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-03-04" rel="alternate"></link><published>2025-03-04T05:00:00-05:00</published><updated>2025-03-04T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-03-04:/weekly-roundup-2025-03-04</id><summary type="html">&lt;p class="first last"&gt;I think the internet going down got me some rest? Maybe?&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I started talking about some of the ideas behind &lt;em&gt;Hivelets&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Thursday: Trapped behind potato internet.&lt;/li&gt;
&lt;li&gt;Friday: Trapped behind potato internet.&lt;/li&gt;
&lt;li&gt;Saturday: I considered how I should probably get more experience before trying to make serious progress on &lt;em&gt;Hivelets&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Sunday: I wasn't able to do much.&lt;/li&gt;
&lt;li&gt;Monday: I was able to do stuff, but it wasn't really focused.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to make some more progress on the stuff I was doing yesterday.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Hivelets"></category></entry><entry><title>Diary 2025-03-03</title><link href="https://mwchase.neocities.org/diary-2025-03-03" rel="alternate"></link><published>2025-03-03T05:00:00-05:00</published><updated>2025-03-03T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-03-03:/diary-2025-03-03</id><summary type="html">&lt;p class="first last"&gt;Maybe this will all go somewhere, and maybe it won't.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Weird combination of &amp;quot;unfocused about what I'm working on&amp;quot; and &amp;quot;seemingly accomplishing things&amp;quot;.
My current focus appears to be &lt;em&gt;mainly&lt;/em&gt; on the &lt;em&gt;Pettish&lt;/em&gt; &amp;quot;player emulator&amp;quot;; I'm trying to rewrite it into a form that makes more sense to me, and then I'll try either using it with other people's games, or to do some (probably not very informative, but I'm open to being surprised) testing against the jam version of &lt;em&gt;Demiurgent Business&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Aside from that, I've once again got a weird urge to acquire a thermal printer and use it for random one-off things.
However, I don't have more to say on that right now, because it's late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2025-03-02</title><link href="https://mwchase.neocities.org/diary-2025-03-02" rel="alternate"></link><published>2025-03-02T05:00:00-05:00</published><updated>2025-03-02T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-03-02:/diary-2025-03-02</id><summary type="html">&lt;p class="first last"&gt;Utterly frustrated by the limitations of my flesh.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, something in the air was off today, and I decided to just kind of take a break from screens.
I thought some about writing that I'd like to try, but it was hard to get much done when I just wanted to lie down.
Maybe tomorrow I'll have stuff together to try, or maybe I'll be still taking it easy.&lt;/p&gt;
&lt;p&gt;Anyway, I let things get late again, so I should wrap it up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2025-03-01</title><link href="https://mwchase.neocities.org/diary-2025-03-01" rel="alternate"></link><published>2025-03-01T05:00:00-05:00</published><updated>2025-03-01T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-03-01:/diary-2025-03-01</id><summary type="html">&lt;p class="first last"&gt;It wasn't an especially eventful two days.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;And I'm back!
I technically could have posted while on potato internet, but I chose not to, because I knew using it would be &lt;em&gt;extremely&lt;/em&gt; frustrating, and I just didn't want to bother.&lt;/p&gt;
&lt;p&gt;While I was waiting for the internet to come back, I did some reading and thinking about what I should do for Hivelets.
While I'll happily bash out lore or character class concepts, it's highly unlikely that I'll get where I want to with Hivelets without getting some experience with a more modest scope of project.&lt;/p&gt;
&lt;p&gt;I've got various other things I want to mess with, and I did download/install stuff for them just now, but I'll have to wait until tomorrow to actually mess with them.
For now, I'd better wind down and get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Hivelets 2025-02-26</title><link href="https://mwchase.neocities.org/hivelets-2025-02-26" rel="alternate"></link><published>2025-02-26T05:00:00-05:00</published><updated>2025-02-26T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-02-26:/hivelets-2025-02-26</id><summary type="html">&lt;p class="first last"&gt;The big stupid tables will have 37 entries each, because it's nice to be able to push things one longer.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm tired and not thinking too clearly, so instead of bashing my head against MOTR again, I'm starting a new category.&lt;/p&gt;
&lt;p&gt;For a while now, I've been poking at an RPG concept.
I don't fully remember some of the links in the creative chain, so I'm going to try to just devise an elevator pitch:&lt;/p&gt;
&lt;p&gt;&amp;quot;Weird bug aliens infiltrate humanity, get entangled with people's everyday lives, and probably experience some form of gender feels.&amp;quot;&lt;/p&gt;
&lt;p&gt;The general idea is that this game, Hivelets, is based on &lt;em&gt;Lancer&lt;/em&gt;, but instead of the key question being &amp;quot;are you currently piloting a robot?&amp;quot;, it's &amp;quot;are any weird alien bits visible?&amp;quot;.
The other major difference is the standard roll, which is inspired by PbtA, and when I tried to describe it to my wife, her immediate point of comparison was &lt;em&gt;Oblivion&lt;/em&gt;'s &amp;quot;speechcraft&amp;quot; mechanic, and, um, hopefully it ends up making more sense than that.&lt;/p&gt;
&lt;p&gt;There are two major areas that I need to focus on.
One is coming up with enough different &amp;quot;weird bug alien&amp;quot; concepts to fill out the character creation/progression options.
The other is understanding &lt;em&gt;Lancer&lt;/em&gt; beyond &amp;quot;I read some blog posts, and read the rulebook for the lore and pretty pictures&amp;quot;.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;To be fair, the pictures are &lt;em&gt;very&lt;/em&gt; pretty.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Anyway, I'm totally out of it for the rest of tonight.
Going to wind down early.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Hivelets"></category><category term="rpg design"></category></entry><entry><title>Weekly Roundup 2025-02-25</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-02-25" rel="alternate"></link><published>2025-02-25T05:00:00-05:00</published><updated>2025-02-25T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-02-25:/weekly-roundup-2025-02-25</id><summary type="html">&lt;p class="first last"&gt;I need to find someone else to describe this to.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I got a new &lt;tt class="docutils literal"&gt;matrix&lt;/tt&gt; operation written.&lt;/li&gt;
&lt;li&gt;Thursday: The &lt;tt class="docutils literal"&gt;matrix&lt;/tt&gt; documentation has problems.&lt;/li&gt;
&lt;li&gt;Friday: I fixed one of those problems.&lt;/li&gt;
&lt;li&gt;Saturday: Pain.&lt;/li&gt;
&lt;li&gt;Sunday: I started identifying specific issues with the &lt;tt class="docutils literal"&gt;matrix&lt;/tt&gt; module.&lt;/li&gt;
&lt;li&gt;Monday: I reviewed the &lt;tt class="docutils literal"&gt;matrix&lt;/tt&gt; module to find problems, although some of them were basically just &amp;quot;the vibes are off&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to take a break from this and focus on some other projects for a bit.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="MOTR"></category></entry><entry><title>Coding 2025-02-24</title><link href="https://mwchase.neocities.org/coding-2025-02-24" rel="alternate"></link><published>2025-02-24T05:00:00-05:00</published><updated>2025-02-24T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-02-24:/coding-2025-02-24</id><summary type="html">&lt;p class="first last"&gt;Still desperately trying to figure out what I was trying to say with some of this documentation...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I have the option to just post basically nothing and call it a night, and there's a decent argument that I probably should, but &lt;em&gt;I don't want to&lt;/em&gt;.
Let's have a look at the &lt;tt class="docutils literal"&gt;matrix&lt;/tt&gt; operation names so I can try to figure out how they should be named.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&amp;#64;matrix&lt;/tt&gt;: this one is fine actually&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;flatten()&lt;/tt&gt;: this combinator removes a layer of &lt;tt class="docutils literal"&gt;Facts&lt;/tt&gt;; my gut says it should be called &lt;tt class="docutils literal"&gt;flattened()&lt;/tt&gt;
(I'm not calling it &lt;tt class="docutils literal"&gt;join()&lt;/tt&gt;)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;from_box()&lt;/tt&gt;: aside from anything else, this is a bad constructor name, because it does not make a &lt;tt class="docutils literal"&gt;Matrix&lt;/tt&gt; &lt;em&gt;from&lt;/em&gt; a &lt;tt class="docutils literal"&gt;Box&lt;/tt&gt;, but instead it &lt;em&gt;retrieves a value&lt;/em&gt; from &lt;em&gt;the&lt;/em&gt; &lt;tt class="docutils literal"&gt;Box&lt;/tt&gt;; perhaps &lt;tt class="docutils literal"&gt;draw_from_box()&lt;/tt&gt;, or maybe &lt;tt class="docutils literal"&gt;drawn_from_box()&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;from_selection()&lt;/tt&gt;: this has almost exactly the same problems and presumably solutions&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;set_defaults()&lt;/tt&gt;: recently renamed from &lt;tt class="docutils literal"&gt;include_box()&lt;/tt&gt;, which is an improvement but I bet more can be done; &lt;tt class="docutils literal"&gt;with_defaults()&lt;/tt&gt; perhaps?&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;map_over_1_matrix()&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;map_over_2_matrices&lt;/tt&gt;: the &lt;tt class="docutils literal"&gt;&amp;#64;matrix&lt;/tt&gt; decorator handles the other cases; the obvious change here is to go from &lt;tt class="docutils literal"&gt;map&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;mapped&lt;/tt&gt;, but that doesn't feel like it gets to the heart of the issue, somehow&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;no_axes()&lt;/tt&gt;: should really really really be something like &lt;tt class="docutils literal"&gt;constant_matrix()&lt;/tt&gt;; I think this particular bad name is a legacy of when &lt;tt class="docutils literal"&gt;Matrix&lt;/tt&gt; was called &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt;, and saying something like &lt;tt class="docutils literal"&gt;constant_parametric()&lt;/tt&gt; made my teeth itch&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;reduce_axes()&lt;/tt&gt;: aside from the tense issue, the code is insufficiently commented/documented, and makes my brain hurt
(also, I'm not calling it &lt;tt class="docutils literal"&gt;fold()&lt;/tt&gt;, and I'm probably not calling it &lt;tt class="docutils literal"&gt;folded()&lt;/tt&gt;)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;shield()&lt;/tt&gt;: new and untested, the purpose of this combinator is to prevent a single-value &lt;tt class="docutils literal"&gt;Matrix&lt;/tt&gt; from being split into a multi-value &lt;tt class="docutils literal"&gt;Matrix&lt;/tt&gt; if its &lt;tt class="docutils literal"&gt;Axes&lt;/tt&gt; get &lt;tt class="docutils literal"&gt;product()&lt;/tt&gt;ed with another &lt;tt class="docutils literal"&gt;Matrix&lt;/tt&gt;
(How does it do this? Kind of inefficiently, but in a correct manner.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Well, there are a few ideas in there I can act on, but I'm still missing some key insight.
I'm not getting it tonight; let's call it here.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2025-02-23</title><link href="https://mwchase.neocities.org/coding-2025-02-23" rel="alternate"></link><published>2025-02-23T05:00:00-05:00</published><updated>2025-02-23T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-02-23:/coding-2025-02-23</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;These names are confusing because they are confusing.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm still having trouble having a really relaxing day, but hopefully I'll get that tomorrow.
For now, I want to get something done with MOTR, even if that something is just reorienting myself for future work.&lt;/p&gt;
&lt;p&gt;Hm, yes, the next thing to do is to figure out tests for the new &lt;tt class="docutils literal"&gt;shield()&lt;/tt&gt; operation, and then work on the &amp;quot;dependency&amp;quot; compound operation.&lt;/p&gt;
&lt;p&gt;One of the other things I want to do in this area, though is to come up with generally better names.
There are a few issues:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;shield()&lt;/tt&gt; was just come up with on the spur of the moment because I had to call it &lt;em&gt;something&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;The other operations have kind of a... tense problem?
They're declarative transformations of future computations, but they're kind of named from the perspective of the future computations, instead of in terms of the actual concrete values that the functions act on.&lt;/li&gt;
&lt;li&gt;Finally, the different sets being tracked by the &lt;tt class="docutils literal"&gt;Axes&lt;/tt&gt; objects just have some confusing names.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, that's stuff to focus on later.
If I don't get out of the light and lie down pretty much &lt;em&gt;right now&lt;/em&gt;, I'm going to have a much worse time than I'm currently having, and I'm not doing great at the moment.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Diary 2025-02-22</title><link href="https://mwchase.neocities.org/diary-2025-02-22" rel="alternate"></link><published>2025-02-22T05:00:00-05:00</published><updated>2025-02-22T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-02-22:/diary-2025-02-22</id><summary type="html">&lt;p class="first last"&gt;Safe to skip. Also owwwww.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;It's been a rough day.
I don't have much to talk about right now.
I need to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2025-02-21</title><link href="https://mwchase.neocities.org/coding-2025-02-21" rel="alternate"></link><published>2025-02-21T05:00:00-05:00</published><updated>2025-02-21T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-02-21:/coding-2025-02-21</id><summary type="html">&lt;p class="first last"&gt;Not much work, but good work.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I'm not feeling great right now, but I want to try to get something done.
I was looking over the &lt;tt class="docutils literal"&gt;matrix&lt;/tt&gt; code earlier, and I noticed that there's a concept that can have a better name.
It's called &amp;quot;include box&amp;quot;, but in practice, it's specifying default values for some arguments.
So let's try to get it to have a name that reflects that.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;And with half an hour or so of work, it's done.
Good job, me.
Get some sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2025-02-20</title><link href="https://mwchase.neocities.org/coding-2025-02-20" rel="alternate"></link><published>2025-02-20T05:00:00-05:00</published><updated>2025-02-20T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-02-20:/coding-2025-02-20</id><summary type="html">&lt;p class="first last"&gt;I'd be fascinated to see if the stuff I'm writing here could be encoded statically...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm looking over the &lt;tt class="docutils literal"&gt;Matrix&lt;/tt&gt; code again, and coming to the conclusion that I need to review and revise the documentation.
There are a bunch of ideas in there about set operations, and it's not obvious what I'm trying to guarantee.
Also, some stuff is either counter-intuitive or wrong.
Furthermore, I'll need to figure out what kinds of tests to write for the new code, and write them.&lt;/p&gt;
&lt;p&gt;I don't have the time or energy for that right now, though.
I need to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2025-02-19</title><link href="https://mwchase.neocities.org/coding-2025-02-19" rel="alternate"></link><published>2025-02-19T05:00:00-05:00</published><updated>2025-02-19T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-02-19:/coding-2025-02-19</id><summary type="html">&lt;p class="first last"&gt;Once again feeling like I've somehow ended up on the other side of those tutorials that are just pure jargon.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Oof, I'm tired now.
But I've put together a prototype for a &lt;tt class="docutils literal"&gt;matrix&lt;/tt&gt; primitive that is the missing piece needed build up matrix dependency tracking compositionally.
The hope with such a thing is that I can keep the scope of each individual operation down, verify each one independently, and then toss them together, rather than try to make a bespoke combinator that does exactly what I need, and then get it to work correctly.&lt;/p&gt;
&lt;p&gt;Of course, I still need to make sure that this tiny thing I just drafted both works right, and can be used as a component to create something that actually accomplishes what I want.
I'll try to check over those things tomorrow.
For now, I'm really really really tired.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-02-18</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-02-18" rel="alternate"></link><published>2025-02-18T05:00:00-05:00</published><updated>2025-02-18T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-02-18:/weekly-roundup-2025-02-18</id><summary type="html">&lt;p class="first last"&gt;I'm gratified that there wasn't &lt;em&gt;nothing&lt;/em&gt; there, it's just that the actual concern kind of spread out to cover other things.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I had some thoughts about representing things that are conceptually adjacent to cards.
(I still don't have a plan for actually using any of this code.)&lt;/li&gt;
&lt;li&gt;Thursday: I got stuff done on that, and tried to figure out what all of the non-language bits of Impliciula will need to look like.&lt;/li&gt;
&lt;li&gt;Friday: No energy.&lt;/li&gt;
&lt;li&gt;Saturday: Again no energy, I think.&lt;/li&gt;
&lt;li&gt;Sunday: I had some ideas that I worked on, but they didn't yet produce anything worthy of a blog post.&lt;/li&gt;
&lt;li&gt;Monday: I got some work done on MOTR, and I think I'm starting to understand what was making me uncomfortable with this update.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to continue making reasonable changes to MOTR.
And messing around with other things on the side.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="MOTR"></category></entry><entry><title>Coding 2025-02-17</title><link href="https://mwchase.neocities.org/coding-2025-02-17" rel="alternate"></link><published>2025-02-17T05:00:00-05:00</published><updated>2025-02-17T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-02-17:/coding-2025-02-17</id><summary type="html">&lt;p class="first last"&gt;Moving cautiously is faster than not moving at all.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, so.
I've laid the groundwork for tracking matrix dependencies, but I haven't yet made the decision for exactly how to implement some of the details.
Like, okay, I need to track dependencies in the &lt;tt class="docutils literal"&gt;Axes&lt;/tt&gt;, and have the correct logic for propagating dependencies up, along with the new &amp;quot;injected values&amp;quot; concept, but once I have support for that in the &lt;tt class="docutils literal"&gt;matrix&lt;/tt&gt; module, I'm not sure what the sensible way will be to call that new functionality in the &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt; module.&lt;/p&gt;
&lt;p&gt;I'll see if I can get &lt;em&gt;something&lt;/em&gt; done with this tomorrow, but for now I should be getting ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Diary 2025-02-16</title><link href="https://mwchase.neocities.org/diary-2025-02-16" rel="alternate"></link><published>2025-02-16T05:00:00-05:00</published><updated>2025-02-16T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-02-16:/diary-2025-02-16</id><summary type="html">&lt;p class="first last"&gt;It's too wintry to do anything...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got a bit done today.
I got inspired to take my writing in a slightly different direction, so I'm trying to lay the groundwork for that.&lt;/p&gt;
&lt;p&gt;Aside from that, I just kind of hung around.
Maybe tomorrow I'll finally psych myself up to work on MOTR again, instead of psyching myself out.&lt;/p&gt;
&lt;p&gt;We'll see.
For now, I let things get so let that I have to wrap things up as soon as I can.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2025-02-15</title><link href="https://mwchase.neocities.org/diary-2025-02-15" rel="alternate"></link><published>2025-02-15T05:00:00-05:00</published><updated>2025-02-15T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-02-15:/diary-2025-02-15</id><summary type="html">&lt;p class="first last"&gt;Safe to skip, again.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I once again didn't get much done today.
I'm hoping to get some writing or something done tomorrow, but we'll see.&lt;/p&gt;
&lt;p&gt;I really would like to have something more to say here, but I just don't see how that's happening.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2025-02-14</title><link href="https://mwchase.neocities.org/diary-2025-02-14" rel="alternate"></link><published>2025-02-14T05:00:00-05:00</published><updated>2025-02-14T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-02-14:/diary-2025-02-14</id><summary type="html">&lt;p class="first last"&gt;Eepy.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't have the energy or focus to work on any hobby stuff today, so...&lt;/p&gt;
&lt;p&gt;Let's see how I feel tomorrow, I guess.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2025-02-13</title><link href="https://mwchase.neocities.org/coding-2025-02-13" rel="alternate"></link><published>2025-02-13T05:00:00-05:00</published><updated>2025-02-13T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-02-13:/coding-2025-02-13</id><summary type="html">&lt;p class="first last"&gt;If I shouldn't be making decisions based on pettiness and spite, they shouldn't be such effective motivators.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Still psyching myself up for MOTR work.
In the meantime, I implemented indexing unordered pairs of numbers via triangular numbers, so that's neat.
It makes dominos work, and all.
Not the pizza chain, the concept of... you get it.&lt;/p&gt;
&lt;p&gt;Aside from that, I decided that, since the theoretical side of Impliciula is a bit intimidating currently, I can work on defining the tooling requirements.
Some of the things that for many people wouldn't even be choices, have me making somewhat niche decisions.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;You seriously looked at Atlassian and went &amp;quot;Hmph, I don't know you.&amp;quot;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;All I'm saying is, if the Jujutsu backend gets recommended, and eats git's lunch so hard that GitHub switches to it, I will have an improperly low amount of sympathy for anyone unhappy with that course of events.&lt;/p&gt;
&lt;p&gt;Anyway, I need to get to bed several minutes ago.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="short post"></category></entry><entry><title>Coding 2025-02-12</title><link href="https://mwchase.neocities.org/coding-2025-02-12" rel="alternate"></link><published>2025-02-12T05:00:00-05:00</published><updated>2025-02-12T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-02-12:/coding-2025-02-12</id><summary type="html">&lt;p class="first last"&gt;It took me an embarrassingly long time to realize that none of this code relies on the physical dimensions of the objects it's abstracting.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I wasn't quite ready to face the next rework that MOTR needs, so I spent a bit of time noodling with some code that I hadn't realized that I hadn't touched in almost a year.&lt;/p&gt;
&lt;p&gt;(I'm sure I remember working on a more recent version, but &lt;tt class="docutils literal"&gt;rg&lt;/tt&gt; can't find it, so...)&lt;/p&gt;
&lt;p&gt;This project is around modeling cards, and I recently realized that there are things that share &amp;quot;logical structure&amp;quot; with cards without adhering to literally the same form factor.
This means I've got a few things that I'd like to implement that shouldn't be &lt;em&gt;terribly&lt;/em&gt; difficult with what I have (like mahjong and related sets of tiles), but I was thinking today about dominos.
They've got a pair of ranks, and usually are treated symmetrically, which means that they need a different indexing operation than I've implemented before, to reverse the triangular number and get the, um, remainder.
To get this to work, there's something about adding &lt;tt class="docutils literal"&gt;0.25&lt;/tt&gt; and taking a square root and adding or subtracting &lt;tt class="docutils literal"&gt;0.5&lt;/tt&gt;, but I don't want to rush into implementing it before I establish some basic expectations.&lt;/p&gt;
&lt;p&gt;Anyway, I meant to get to bed sooner, and I'll have problems if I don't do so soon, so I'm cutting this off here and now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-02-11</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-02-11" rel="alternate"></link><published>2025-02-11T05:00:00-05:00</published><updated>2025-02-11T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-02-11:/weekly-roundup-2025-02-11</id><summary type="html">&lt;p class="first last"&gt;The renewed clarity with which I'm perceiving the design constraints on the top level of MOTR's code... means that I can see &lt;em&gt;so much&lt;/em&gt; wrong with it.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I thought I was about to write the coverage wrappers.&lt;/li&gt;
&lt;li&gt;Thursday: Fuck Trump.&lt;/li&gt;
&lt;li&gt;Friday: I wondered about whether to make a change in the name of &amp;quot;consistency&amp;quot;.&lt;/li&gt;
&lt;li&gt;Saturday: I started to get some idea of what stands in the way of just writing the coverage wrappers.
I didn't have enough of an idea though.&lt;/li&gt;
&lt;li&gt;Sunday: I worked out the two things I wanted done before anything else, and posted them in reverse order for some reason.&lt;/li&gt;
&lt;li&gt;Monday: I got one thing done, and started freaking out a bit about the other.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, either I'll summon the resolve to start on these next rewrites, or I'll switch to something else for a bit.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="MOTR"></category></entry><entry><title>Coding 2025-02-10</title><link href="https://mwchase.neocities.org/coding-2025-02-10" rel="alternate"></link><published>2025-02-10T05:00:00-05:00</published><updated>2025-02-10T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-02-10:/coding-2025-02-10</id><summary type="html">&lt;p class="first last"&gt;This is probably going to suck...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I got the &lt;tt class="docutils literal"&gt;SelectionDirectory&lt;/tt&gt; tweaks in, and finally started to meaningfully cut down on the size of client code.
It's just a few lines, but it scales with the number of commands, so that's a good sign.&lt;/p&gt;
&lt;p&gt;While I was working on this, I realized that I'm going to want to rework the client interface in a major way that should make things generally nicer, at the cost of an extension interface that I don't feel super enthused about.
I'm going to hold off on implementing that for now, though.&lt;/p&gt;
&lt;p&gt;What's up next, hopefully in the next few days, is to rework the &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; type into two separate types.
The end goal is to make the &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; type capable of tracking its source &lt;tt class="docutils literal"&gt;Matrix&lt;/tt&gt;.
Because a single &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; can be stored in many &lt;tt class="docutils literal"&gt;Matrix&lt;/tt&gt; objects, this is going to have to manifest in the form of a helper function that gets used by the new &lt;tt class="docutils literal"&gt;Link&lt;/tt&gt; class.&lt;/p&gt;
&lt;p&gt;Once I've got feature parity but with &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt;s constructed dynamically on retrieval, I can work on implementing dependency tracking in &lt;tt class="docutils literal"&gt;Axes&lt;/tt&gt; objects.
Once that part looks to be in a good shape, then I can add dependency tracking to the &lt;tt class="docutils literal"&gt;Input.convert()&lt;/tt&gt; method, which should allow for drastically simplifying the interface.&lt;/p&gt;
&lt;p&gt;The obvious next thing to do would be that big rework, which I should do before messing with the coverage wrapper, but maybe I'll try to work on some other project for a bit instead.&lt;/p&gt;
&lt;p&gt;Anyway, it's late and I should get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category></entry><entry><title>Coding 2025-02-09</title><link href="https://mwchase.neocities.org/coding-2025-02-09" rel="alternate"></link><published>2025-02-09T05:00:00-05:00</published><updated>2025-02-09T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-02-09:/coding-2025-02-09</id><summary type="html">&lt;p class="first last"&gt;This should be really easy, except for the weird hard bits. It's what it's.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's see where my plans have ended up.&lt;/p&gt;
&lt;p&gt;Because &lt;tt class="docutils literal"&gt;Artifact&lt;/tt&gt; instances &lt;em&gt;work&lt;/em&gt; by constructing a bespoke &lt;tt class="docutils literal"&gt;Matrix&lt;/tt&gt;, it's not &lt;em&gt;easy&lt;/em&gt;, but &lt;em&gt;straightforward&lt;/em&gt; to handle encoding dependencies into an &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt;.
One subtlety is that &lt;tt class="docutils literal"&gt;OutputFromInput&lt;/tt&gt; is going to need to be passed an &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; with depedency data, and that data needs to be correctly propagated.
Or... hm.
Either I allow arbitrary dependency association, or I do the injection implicitly, and have &lt;tt class="docutils literal"&gt;OutputFromInput&lt;/tt&gt; specifically take...
Ugh.
It's actually kind of hard to confirm that a given &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; actually &amp;quot;came from&amp;quot; a given &lt;tt class="docutils literal"&gt;Matrix&lt;/tt&gt;.
I think I can still do it, but it will be... fascinating.&lt;/p&gt;
&lt;p&gt;Encoding &lt;tt class="docutils literal"&gt;Matrix&lt;/tt&gt; dependencies on the &lt;tt class="docutils literal"&gt;Axes&lt;/tt&gt; looks about as straightforward as I originally thought tracking them on &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; would be, and handling the dependencies in the &lt;tt class="docutils literal"&gt;facts&lt;/tt&gt; call should be no problem.&lt;/p&gt;
&lt;p&gt;Now, let's see about moving some client code up to remove duplication.
What I'm basically hoping to have work is, to create a wrapper around &lt;tt class="docutils literal"&gt;SelectionDirectory&lt;/tt&gt;, which supplies values for the associated selections.
Tracking these would require more &lt;tt class="docutils literal"&gt;Axes&lt;/tt&gt; tweaks, but they would be pretty mild.&lt;/p&gt;
&lt;p&gt;I was resting and planning all day, so I don't have time to put these into practice tonight, but I'm now reasonably confident that making the changes will work.
First &lt;tt class="docutils literal"&gt;SelectionDirectory&lt;/tt&gt;, then &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt;.
Sadly, I think I won't actually need the context-variable rewrite, so I can/should hold off on that until I get more coverage.&lt;/p&gt;
&lt;p&gt;Anyway, it's late and I should wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category></entry><entry><title>Coding 2025-02-08</title><link href="https://mwchase.neocities.org/coding-2025-02-08" rel="alternate"></link><published>2025-02-08T05:00:00-05:00</published><updated>2025-02-08T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-02-08:/coding-2025-02-08</id><summary type="html">&lt;p class="first last"&gt;So many plans...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was pretty tired again today, so I focused mainly on planning, with a side of addressing some Mypy errors that slipped through the cracks earlier.&lt;/p&gt;
&lt;p&gt;The conclusion of my planning was that, once I address the various flake8 issues that I've introduced, I can enter a commit, and get to work on other improvements that this latest effort has revealed as possible.&lt;/p&gt;
&lt;p&gt;Those look something like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Determine whether it is feasible to track additional &lt;tt class="docutils literal"&gt;Box&lt;/tt&gt; entries on &lt;tt class="docutils literal"&gt;Matrix&lt;/tt&gt;  &lt;tt class="docutils literal"&gt;Axes&lt;/tt&gt;.
(If not, what alternatives exist? If so, is it still necessary to provide a facility for dynamically injecting such data during matrix evaluation? (Looking ahead to my future plans, I think it is necessary, because injecting command-specific data in a shared label would interfere with sequencing operators.)&lt;/li&gt;
&lt;li&gt;Replace passing &lt;tt class="docutils literal"&gt;Box&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Selection&lt;/tt&gt; objects with context variables.&lt;/li&gt;
&lt;li&gt;Track additional &lt;tt class="docutils literal"&gt;Box&lt;/tt&gt; entries on &lt;tt class="docutils literal"&gt;Matrix&lt;/tt&gt;  &lt;tt class="docutils literal"&gt;Axes&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Move specification of command-specific constants out of the compendium construction function, into the matrix creation code.&lt;/li&gt;
&lt;li&gt;Create sequencing operators for &lt;tt class="docutils literal"&gt;Matrix&lt;/tt&gt; objects.&lt;/li&gt;
&lt;li&gt;Track &lt;tt class="docutils literal"&gt;Matrix&lt;/tt&gt; dependencies along with &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; objects derived from a &lt;tt class="docutils literal"&gt;Matrix&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Automatically sequence linked &lt;tt class="docutils literal"&gt;Matrix&lt;/tt&gt; objects.&lt;/li&gt;
&lt;li&gt;Create a helper object for working with Python-specific &lt;tt class="docutils literal"&gt;Matrix&lt;/tt&gt; objects etc.&lt;/li&gt;
&lt;li&gt;Finally write wrappers for coverage.py.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After that, hopefully a release won't be too far off, but we will see.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2025-02-07</title><link href="https://mwchase.neocities.org/coding-2025-02-07" rel="alternate"></link><published>2025-02-07T05:00:00-05:00</published><updated>2025-02-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-02-07:/coding-2025-02-07</id><summary type="html">&lt;p class="first last"&gt;Okay, back to business as usual, apparently. Will try work political change in ways that aren't posting.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I have been planning things for MOTR.
Various new bits of code that is sort of monadic or whatever, improvements to wrapper authoring and use, and some fancy implementations that I think are long overdue.
Before I do any of that, though, I still need to clean up the changes I've been making, and to finish that up, there are a few things I need to consider.&lt;/p&gt;
&lt;p&gt;Basically, I've got a helper class for some wrappers, and I'm trying to figure out whether a parallel construction would make sense for the remaining wrappers.
I haven't figured this out yet, and I won't figure it out tonight.
Maybe tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Diary 2025-02-06</title><link href="https://mwchase.neocities.org/diary-2025-02-06" rel="alternate"></link><published>2025-02-06T05:00:00-05:00</published><updated>2025-02-06T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-02-06:/diary-2025-02-06</id><summary type="html">&lt;p class="first last"&gt;Apparently I just bottle up all of my political feelings for around four years at a time? Seems unhealthy.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I mentioned the inauguration finally sinking in.
I think part of that is the pace of news and the constant back and forth.&lt;/p&gt;
&lt;p&gt;There's an agricultural crisis that will make things harder on the American consumer, exacerbated by Trump's planned tariffs.
Wait, never mind, about the tariffs, not the crisis, though, that's still happening, I think.
The tariffs are off the table, thanks to Trump's trademark negotiation tactics.
Self-proclaimed free speech advocates are censoring government websites.
No, that's getting rolled back.
Somewhat?
Elon Musk is somehow the most powerful man in America now.
...
Probably don't fly.&lt;/p&gt;
&lt;p&gt;It's like a kaleidoscope of horrors and faint hope, and I don't even know if anything I just said is or was ever accurate.&lt;/p&gt;
&lt;p&gt;I don't generally say much about politics on this blog, and that's because I generally don't have much to say, and I feel like I shouldn't.
Like the young men Musk has gotten to help him strip the country for parts, I've got a focus on STEM fields, but unlike the stereotypical STEM bro, I've got some idea of how many sub-fields there are.
I'm paper-qualified in one area of engineering, and self-taught in another.
There is so much of STEM alone to which that knowledge does not generalize.
So why should I have anything to say about policy decisions?&lt;/p&gt;
&lt;p&gt;Except.
Except that there is a culture war on, to try and stop people like me and my family and friends from existing.
To tell us how to live our lives, in the name of freedom.
To turn us into a boogeyman, when we just want to hold down jobs, make art, and watch movies or whatever.&lt;/p&gt;
&lt;p&gt;There is so much to be done to deal with this, but part of it is just to be there for myself and the people in my life.
I know there are more people out there reading my blog than I can quite understand how you all got here.
I want to thank you all for reading what I have to say, and if you're feeling as scared and uncertain as I am, I want you to find the people that matter to you, and make sure to be there for them.&lt;/p&gt;
&lt;p&gt;I'm dealing with a lot right now, and I don't know how much more I have to say on this, so the &amp;quot;grease-monkeying around inside MOTR&amp;quot; content that's been so much of my output lately is probably going to start back up tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2025-02-05</title><link href="https://mwchase.neocities.org/coding-2025-02-05" rel="alternate"></link><published>2025-02-05T05:00:00-05:00</published><updated>2025-02-05T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-02-05:/coding-2025-02-05</id><summary type="html">&lt;p class="first last"&gt;Chaotic, but improving.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I may or may not be at a good-ish stopping point for these MOTR updates.
I've got some ideas I want to follow up on, but I also need to take stock of the state of the wrappers, and get &lt;tt class="docutils literal"&gt;motr&lt;/tt&gt; back to mostly passing.&lt;/p&gt;
&lt;p&gt;Once I've got that done, I'm going to work on writing the coverage wrapper, and see if that finally drives my missing/partial counts below 31/7.&lt;/p&gt;
&lt;p&gt;Oh boy, I got distracted trying to figure out what's going on with some of the coverage gaps.
I have filed some weird bugs over this code.
Anyway, I need to wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-02-04</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-02-04" rel="alternate"></link><published>2025-02-04T05:00:00-05:00</published><updated>2025-02-04T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-02-04:/weekly-roundup-2025-02-04</id><summary type="html">&lt;p class="first last"&gt;At least all of this stuff is going well.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I made some improvements to MOTR.&lt;/li&gt;
&lt;li&gt;Thursday: I found more changes to make to MOTR to hopefully improve the wrappers.&lt;/li&gt;
&lt;li&gt;Friday: I came up with a name for the newly-developed concept.&lt;/li&gt;
&lt;li&gt;Saturday: I put the name change into practice.&lt;/li&gt;
&lt;li&gt;Sunday: I used it, and then found another case of &amp;quot;these two things should be put together&amp;quot;.&lt;/li&gt;
&lt;li&gt;Monday: I iterated some more on the designs around all of this high-level stuff.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to take stock of my changes and tidy things up a little.
At the same time, the inauguration is finally sinking in for me, and I'm going to have to see about doing something about *gestures vaguely*.
I've got some small things I want to put together, but I also need to figure out how to support more substantial opposition.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="MOTR"></category></entry><entry><title>Coding 2025-02-03</title><link href="https://mwchase.neocities.org/coding-2025-02-03" rel="alternate"></link><published>2025-02-03T05:00:00-05:00</published><updated>2025-02-03T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-02-03:/coding-2025-02-03</id><summary type="html">&lt;p class="first last"&gt;There must be some way to cut down on the verbosity I'm inflicting on myself. I do have some ideas, but I'll hold off for now.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I'm currently up to my elbows in MOTR's top layer of abstraction.
I'm following hunches to eliminate repetition, but I'm going to have to follow a few more hunches to eliminate verbosity.&lt;/p&gt;
&lt;p&gt;The big thing that's happening is that I'm going all in on the pattern of writing decorators to convert one-off functions to constant values.
Not only am I using this to generate the base commands, but I'm also applying it to the wrappers for &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--command-arguments&lt;/span&gt;&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;I'm feeling generally good about these changes from a module layout perspective, but I need to be considering whether to mess around with the naming conventions.
Because it's... somewhat questionable to have some constants named in lowercase because of Reasons.&lt;/p&gt;
&lt;p&gt;I'm going to wrap up for now, but I've got to finish up with these updates, and ponder the naming.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2025-02-02</title><link href="https://mwchase.neocities.org/coding-2025-02-02" rel="alternate"></link><published>2025-02-02T05:00:00-05:00</published><updated>2025-02-02T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-02-02:/coding-2025-02-02</id><summary type="html">&lt;p class="first last"&gt;Once again, I am unsure whether these names make any sense out of context.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Guess what time it is again!&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;I don't want to...&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;That's right, it's time to try to come up with a name for a concept that I just discovered a few hours ago, and have yet to properly articulate!&lt;/p&gt;
&lt;div class="admonition smiley smiley-glitchy"&gt;
&lt;p class="first admonition-title"&gt;:) (glitchy)&lt;/p&gt;
&lt;p class="last"&gt;Why...&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;So, I'm right now trying to increase the prominence of &amp;quot;&lt;tt class="docutils literal"&gt;Box&lt;/tt&gt;es&amp;quot;  in MOTR's higher-level code.
Like, you call a function, you get back a box, you can stick them together, maybe I write a helper for that to complain if you try to reuse a label, it's all good.&lt;/p&gt;
&lt;p&gt;And when I was working on this, I realized that at one point in client code, the user is expected to construct &lt;tt class="docutils literal"&gt;Matrix&lt;/tt&gt; objects from &lt;tt class="docutils literal"&gt;Command&lt;/tt&gt; objects, but in order to actually get those matrices to generate &lt;tt class="docutils literal"&gt;Fact&lt;/tt&gt; objects, it's &lt;em&gt;sometimes&lt;/em&gt; necessary to augment the basic &lt;tt class="docutils literal"&gt;Box&lt;/tt&gt; (constructed by other helper functions) with additional assignments, using information contained in a &lt;tt class="docutils literal"&gt;python_helpers.EntryInstaller&lt;/tt&gt; that is &lt;em&gt;next to&lt;/em&gt; the &lt;tt class="docutils literal"&gt;Command&lt;/tt&gt;.
When this is required depends on the nature of the &lt;tt class="docutils literal"&gt;Command&lt;/tt&gt; object that was used for each &lt;tt class="docutils literal"&gt;Matrix&lt;/tt&gt;.
This means that there are these implicit connections that I once again want to make explicit.&lt;/p&gt;
&lt;p&gt;I want to create an object that contains the &lt;tt class="docutils literal"&gt;Command&lt;/tt&gt; and the &lt;tt class="docutils literal"&gt;EntryInstaller&lt;/tt&gt;.
I know this would go in &lt;tt class="docutils literal"&gt;python_helpers&lt;/tt&gt;, and I have a decent idea of what the constructor should look like.
The goal here is to provide easy access to the parts, for wrapper code, and to provide decent idioms and helper functions for client code.&lt;/p&gt;
&lt;p&gt;Naming, though...&lt;/p&gt;
&lt;p&gt;One important thing to note is that one of the module-level variables which, in only these five instances, I intend to replace, has a different name than the others.
This represents different type parameters, and should be reflected in the variable name of the new object...&lt;/p&gt;
&lt;p&gt;With that in mind, I think I could get away with the very on-the-nose &lt;tt class="docutils literal"&gt;InstallerAndCommand&lt;/tt&gt;.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Introducing &lt;tt class="docutils literal"&gt;InstallerAndCommand&lt;/tt&gt; after &lt;tt class="docutils literal"&gt;ExecutableAndInvocation&lt;/tt&gt;?
This is getting out of hand!
Now, there are two of them!&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Anyway, I'm not committing to this until I've had some sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category></entry><entry><title>Coding 2025-02-01</title><link href="https://mwchase.neocities.org/coding-2025-02-01" rel="alternate"></link><published>2025-02-01T05:00:00-05:00</published><updated>2025-02-01T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-02-01:/coding-2025-02-01</id><summary type="html">&lt;p class="first last"&gt;Foggy day outside, foggy day inside. Almost nothing to post.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was out of it for various reasons today, and then we had a not-great drive, so really all I accomplished today was to rename &amp;quot;&lt;tt class="docutils literal"&gt;FooPart&lt;/tt&gt;&amp;quot; to &amp;quot;&lt;tt class="docutils literal"&gt;Link&lt;/tt&gt;&amp;quot;.&lt;/p&gt;
&lt;p&gt;I'll take it, and tomorrow, I'll work on actually using &lt;tt class="docutils literal"&gt;Link&lt;/tt&gt; to write and consume wrapper code.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2025-01-31</title><link href="https://mwchase.neocities.org/coding-2025-01-31" rel="alternate"></link><published>2025-01-31T05:00:00-05:00</published><updated>2025-01-31T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-01-31:/coding-2025-01-31</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Return type annotations only take up four lines when they're very stressed.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hm.
The code to do what I want is very simple.
Except.&lt;/p&gt;
&lt;p&gt;Except for naming the class.
The point of this class is to replace pairs of variables.
One variable is a label that is used in the construction of the other, a command part.
When the command part has been used in a command, and that command has been converted into a matrix, the label can be used to retrieve an input artifact from the matrix.
This is a key operation in chaining commands together.&lt;/p&gt;
&lt;p&gt;Hm.
Chaining.&lt;/p&gt;
&lt;p&gt;Perhaps this is a &amp;quot;link&amp;quot;?&lt;/p&gt;
&lt;p&gt;I'll have to think about it.&lt;/p&gt;
&lt;p&gt;Anyway, it's late and I need to wrap things up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2025-01-30</title><link href="https://mwchase.neocities.org/coding-2025-01-30" rel="alternate"></link><published>2025-01-30T05:00:00-05:00</published><updated>2025-01-30T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-01-30:/coding-2025-01-30</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;I don't think I can law-of-Demeter-violation my way out of this one&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay.
I took another look at my test code, and identified an area of potential improvement.
Basically, there are some places where two variables are closely related, but this is only indicated by &amp;quot;thematic connections&amp;quot; in the variable names.
Not good enough.
The related values should be accessed through a single object, rather than next to each other in module scope.&lt;/p&gt;
&lt;p&gt;From a typing perspective, I cannot &amp;quot;just reach into&amp;quot; one object and retrieve the other; there are too many layers of polymorphism/erasure.
So, I need to create a new object to hold both values.
I'm thinking a class with a constructor that takes a label (one of the object's types) and returns a decorator that wraps a function taking a label of the same type, and returning a &lt;tt class="docutils literal"&gt;command.Part&lt;/tt&gt; (or possibly multiple?).
This would have the additional advantage of associating type information that wasn't available before because of Reasons.&lt;/p&gt;
&lt;p&gt;I was pondering before whether to make this generic (in an informal sense—it has to be generic in the label type, and being generic in the program type would be nice), or specific, and I'm thinking right now, I'll try making it specific.
That will let me do some things that make the end-user interface more compact, which is a definite plus.&lt;/p&gt;
&lt;p&gt;Anyway, I think those are enough notes to write this later.
I'm sleepy now, so I'm going to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2025-01-29</title><link href="https://mwchase.neocities.org/coding-2025-01-29" rel="alternate"></link><published>2025-01-29T05:00:00-05:00</published><updated>2025-01-29T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-01-29:/coding-2025-01-29</id><summary type="html">&lt;p class="first last"&gt;From nearly trivial, straight into... what the heck am I doing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I'm not putting quite as much time as I'd like into MOTR, but I got one of the obvious improvements to the interface made.
The next thing I think I should consider is moving some code out of &amp;quot;test helpers&amp;quot; and into the MOTR package, and then figure out how to improve it.&lt;/p&gt;
&lt;p&gt;This code is used to associate particular programs with the Python versions they should be run against.
When I get the coverage wrapper written, I'm going to have different objects that all refer to the same version label, and the user really shouldn't specify a version set more than once per program.
I'm not quite sure how to handle this; I'll have to think about it for a while.&lt;/p&gt;
&lt;p&gt;For now, sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2025-01-28</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-01-28" rel="alternate"></link><published>2025-01-28T05:00:00-05:00</published><updated>2025-01-28T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-01-28:/weekly-roundup-2025-01-28</id><summary type="html">&lt;p class="first last"&gt;Long-overdue reworks are complete, paving the way for... more reworks.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I had a good time reworking the top-level interfaces I'm designing for MOTR, and I found this somewhat surprising.&lt;/li&gt;
&lt;li&gt;Thursday: I got a bit more work done, and did not write it up well. I could check the commit logs, but I don't wanna.&lt;/li&gt;
&lt;li&gt;Friday: I got work done, then decided to take a break to rethink things.&lt;/li&gt;
&lt;li&gt;Saturday: I figured out the general tack I wanted to take with the next round of improvements.&lt;/li&gt;
&lt;li&gt;Sunday: It worked, so I started thinking about writing more wrappers.&lt;/li&gt;
&lt;li&gt;Monday: I remembered that getting the user interface right is also a thing I want to do, and while I've probably made things better in that area, there's certainly more to be done.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to work through those improvements, and maybe pick up another project.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="MOTR"></category></entry><entry><title>Coding 2025-01-27</title><link href="https://mwchase.neocities.org/coding-2025-01-27" rel="alternate"></link><published>2025-01-27T05:00:00-05:00</published><updated>2025-01-27T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-01-27:/coding-2025-01-27</id><summary type="html">&lt;p class="first last"&gt;Don't rush ahead just because things are in a slightly better state...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, we traveled a bunch and then I just veged out for a bit, so I'm just going to jot down some thoughts I had on the drive back:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I'm not &lt;em&gt;quite&lt;/em&gt; ready to write the coverage wrapper.&lt;/li&gt;
&lt;li&gt;In particular, I need to look at this code from the perspective of an end user.&lt;/li&gt;
&lt;li&gt;Are there any pain points in the current interface?&lt;/li&gt;
&lt;li&gt;My planned design for the coverage wrapper will introduce some potential pitfalls into the interface.
Can I write a helper function that is more pleasant to use than the current interface in that area, but can error or warn (as appropriate) when the user approaches those pitfalls?&lt;/li&gt;
&lt;li&gt;I've forgotten some of the plans I made for handling the erase-run-combine flow.
Can I rediscover or redevelop those plans?
(I &lt;em&gt;believe&lt;/em&gt; I can get most of the required functionality by just writing a function that takes a value of the approriate type, but we'll see.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, I'm pushing things way too late, better get ready for bed now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2025-01-26</title><link href="https://mwchase.neocities.org/coding-2025-01-26" rel="alternate"></link><published>2025-01-26T05:00:00-05:00</published><updated>2025-01-26T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-01-26:/coding-2025-01-26</id><summary type="html">&lt;p class="first last"&gt;It all just worked, so there wasn't really much to say.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I put the changes I was talking about yesterday into practice, and now I'm looking over the state of the wrapper code, and...
And I think I'm finally ready to write the coverage wrapper.&lt;/p&gt;
&lt;p&gt;Hopefully, writing the coverage wrapper will help me shake out some of the weird gaps in current code coverage, but even if it doesn't, it should get me one step closer to cutting a release and merging the topics.&lt;/p&gt;
&lt;p&gt;In any case, we'll see about that later.
I had a bit of a time these last few days, and I need to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2025-01-25</title><link href="https://mwchase.neocities.org/coding-2025-01-25" rel="alternate"></link><published>2025-01-25T05:00:00-05:00</published><updated>2025-01-25T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-01-25:/coding-2025-01-25</id><summary type="html">&lt;p class="first last"&gt;Understanding that problems are simple by trying to explain why they're complicated.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's think a little more about the API improvements that I want.
The basic point of confusion I'm hitting is in the design of some classes for wrapping Python packages.
Basically...&lt;/p&gt;
&lt;p&gt;It is &lt;em&gt;often&lt;/em&gt; the case that a Python package that installs a script or a runnable module will have the same name as that script or module.
From a reporting perspective, it makes sense to put the output of a script into a distinct directory, and the name of the script is &lt;em&gt;usually&lt;/em&gt; a good candidate for the name of the directory.&lt;/p&gt;
&lt;p&gt;So, given a script/module, by default we want to install the package of the same name, and put output in a directory of the same name.
There are several points of possible variance here:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The package requires extras to be specified.&lt;/li&gt;
&lt;li&gt;The package requires a version range.&lt;/li&gt;
&lt;li&gt;The package has a different name.&lt;/li&gt;
&lt;li&gt;Additional packages need to be installed.&lt;/li&gt;
&lt;li&gt;The output should go in a directory with a different name.&lt;/li&gt;
&lt;li&gt;The output should not go into a different directory.
(This is simplified from what actually happens, which is a little fiddlier to explain, but &lt;em&gt;should&lt;/em&gt; be intuitive in practice.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thinking about this, I'm kind of tempted to make everything run off of &lt;tt class="docutils literal"&gt;str.format()&lt;/tt&gt;.
The requirements should go in the object, and I'm not sure whether the directory should go in the object, or be specified in the call to convert the object to a form legible to the lower layers of abstraction.&lt;/p&gt;
&lt;p&gt;I think this gets the bulk of the planning on this taken care of.
Hopefully, I'll get the rest of the details worked out soon.&lt;/p&gt;
&lt;p&gt;For now, I'm going to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category></entry><entry><title>Coding 2025-01-24</title><link href="https://mwchase.neocities.org/coding-2025-01-24" rel="alternate"></link><published>2025-01-24T05:00:00-05:00</published><updated>2025-01-24T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-01-24:/coding-2025-01-24</id><summary type="html">&lt;p class="first last"&gt;These changes reduced code indentation in some places, and increased it in others. Oh well.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay.
Top-level wrappers are somewhat simpler.
There's more to be done, but I'm not sure how to go about it yet, so I'm just going to let it stew for a bit.&lt;/p&gt;
&lt;p&gt;Basically, I wrote some of this helper code with somewhat strange semantics, and I'm trying to figure out how to make it do things when it should, and not do things when it shouldn't.
More or less.&lt;/p&gt;
&lt;p&gt;I don't want to think about this any more right now, though, so I'm going to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2025-01-23</title><link href="https://mwchase.neocities.org/coding-2025-01-23" rel="alternate"></link><published>2025-01-23T05:00:00-05:00</published><updated>2025-01-23T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-01-23:/coding-2025-01-23</id><summary type="html">&lt;p class="first last"&gt;Doing the work this post is about was a roller coaster. A tiny, relatively underwhelming roller coaster.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got the initial pass on updating the wrapper APIs done, although I had to add some new capabilities that I missed.&lt;/p&gt;
&lt;p&gt;However, there's more work and open questions to address:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I only got the code to typecheck, so I &lt;em&gt;know&lt;/em&gt; that, at minimum, I broke the tests.&lt;/li&gt;
&lt;li&gt;I still want to write some new helper methods slightly lower in the stack.&lt;/li&gt;
&lt;li&gt;Some of the new interface is not quite right, so I want to modify it and see if I can get it to work in places that the old interface didn't.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm still feeling good about these changes, because they generally resulted in shorter code at the higher levels of the stack.
Once the current round is &lt;em&gt;really&lt;/em&gt; done, I'll see if I'm up for writing more wrappers, which will &lt;em&gt;hopefully&lt;/em&gt; help me increase my coverage.&lt;/p&gt;
&lt;p&gt;Anyway, I need to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2025-01-22</title><link href="https://mwchase.neocities.org/coding-2025-01-22" rel="alternate"></link><published>2025-01-22T05:00:00-05:00</published><updated>2025-01-22T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-01-22:/coding-2025-01-22</id><summary type="html">&lt;p class="first last"&gt;It feels good to have hunches pay off.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I have some planned work that I think I need to put off until I see how it's actually reasonable, but I'm putting some of the work I've done so far into practice, and it... seems reasonable?
Somehow it inspired Mypy to notice or invent new typing issues, so that's cool, but I think that problem will go away when I finish the rewrite.&lt;/p&gt;
&lt;p&gt;Basically, I'm discovering that I kind of have &amp;quot;the wrong interface&amp;quot; for putting together command-line arguments, and I'm currently writing &amp;quot;a better interface&amp;quot; over &amp;quot;the wrong interface&amp;quot;.
Once I have everything going through the better interface, I'll try to cut down on the wrong interface.
Fortunately, this is at the very highest level, and I've only written a handful of consumers, so these rewrites are pretty cheap.
If I get good vibes from finishing the refactor, then I'll commit to using the new interface to fill out the rest of the wrappers.&lt;/p&gt;
&lt;p&gt;It's also possible that I'll end up adding more helper methods, but I'm not totally sure yet what's going to look good.&lt;/p&gt;
&lt;p&gt;Anyway, I really really really need to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category></entry><entry><title>Weekly Roundup 2025-01-21</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-01-21" rel="alternate"></link><published>2025-01-21T05:00:00-05:00</published><updated>2025-01-21T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-01-21:/weekly-roundup-2025-01-21</id><summary type="html">&lt;p class="first last"&gt;Hm, a triple-header. Not likely to do that again soon.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I had a general idea of generating LLVM IR from the STLC.&lt;/li&gt;
&lt;li&gt;Thursday: I ran into trouble figuring out how to avoid undefined behavior.&lt;/li&gt;
&lt;li&gt;Friday: I had some ideas about that, but I don't know if they're good ones.&lt;/li&gt;
&lt;li&gt;Saturday: I tried to be laid back, in part to be ready for doing something in the morning.&lt;/li&gt;
&lt;li&gt;Sunday: (I didn't mention it, but said thing was actually planned for next week. Oops.) I stepped away from Impliciula, and messed around with Mythic rolling and improving MOTR.&lt;/li&gt;
&lt;li&gt;Monday: I got just enough done trying to improve MOTR to convince me that I'm on the right track.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to finish up the MOTR refactor, and try to make progress on general writing stuff.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category><category term="Mythic"></category><category term="MOTR"></category></entry><entry><title>Coding 2025-01-20</title><link href="https://mwchase.neocities.org/coding-2025-01-20" rel="alternate"></link><published>2025-01-20T05:00:00-05:00</published><updated>2025-01-20T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-01-20:/coding-2025-01-20</id><summary type="html">&lt;p class="first last"&gt;I did not, in fact, make this quick.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's go, and make this quick.
I was kind of spaced out today, so I'm going to look over yesterday's post, and try to quickly throw something together to improve things.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, I've got code together that should allow me to clarify some common code patterns in these modules and reduce boilerplate, but I'm not comfortable going ahead until I figure out the right amount of boilerplate to get rid of, because sometimes the code isn't quite the same between modules, and I'm looking at it, not totally sure if these differences are meaningful.
Like, I'm going to need to, at a less sleepy time, go over this code and figure out what the actual flow is, because I've totally forgotten most of what I was doing, and the stuff I do remember seems a little questionable.&lt;/p&gt;
&lt;p&gt;Things to try to figure out later:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Can I turn &lt;tt class="docutils literal"&gt;new_typical&lt;/tt&gt; into a keyword-only argument to &lt;tt class="docutils literal"&gt;new&lt;/tt&gt;?&lt;/li&gt;
&lt;li&gt;Does it break anything if I add a &lt;tt class="docutils literal"&gt;Placeholder&lt;/tt&gt; pip object with nothing in it to the Python wrapper code? (Is its current &lt;em&gt;absence&lt;/em&gt; breaking anything?)&lt;/li&gt;
&lt;li&gt;Can I add a helper method to &lt;tt class="docutils literal"&gt;runner.ExecutableAndInvocation&lt;/tt&gt; to be the equivalent of the &lt;tt class="docutils literal"&gt;runner()&lt;/tt&gt; method, but it instead produces a &lt;tt class="docutils literal"&gt;ModuleRunner&lt;/tt&gt;?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By pondering these questions, I have gotten... somewhere, and I should be able to get a little further in the days to come.
For now, it's later than I'd like.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category></entry><entry><title>Coding 2025-01-19</title><link href="https://mwchase.neocities.org/coding-2025-01-19" rel="alternate"></link><published>2025-01-19T05:00:00-05:00</published><updated>2025-01-19T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-01-19:/coding-2025-01-19</id><summary type="html">&lt;p class="first last"&gt;This is going to be a delicate refactor, because &lt;em&gt;on paper&lt;/em&gt; the code is already doing most of what it should be, it's just that the implementation is confusingly non-ideal.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;In keeping with letting Impliciula sit for a bit, I took a look at MOTR today, and messed around a bit more with the Mythic stuff.
For the Mythic stuff, I just worked on the resource importing and processing side of the meaning tables.
All of that is almost ready for the next level of abstraction; I'm just missing the special handling required for the name table, which I may actually simply do a layer up.&lt;/p&gt;
&lt;p&gt;The MOTR side of things is... confounding.
I'm trying to take some of the incomprehensible boilerplate I wrote, and render it comprehensible, and I'm having difficulties.
Like, suppose you have a task that runs some command.
That command is going to be available in some environment, as a result of some installer installing a package.
Now, a package can make any number of commands available, and, hm, I'm not sure if this is even the part I should be focusing on.&lt;/p&gt;
&lt;p&gt;Because I just noticed a source of regularity that may help me organize things.
Most commands have to provide both a &lt;tt class="docutils literal"&gt;matrix.SelectionDirectory[PathWith[pip.VersionLabel]]&lt;/tt&gt; and an &lt;tt class="docutils literal"&gt;installer.Label[pip.PipArgs]&lt;/tt&gt;, and a few instead only provide an &lt;tt class="docutils literal"&gt;installer.Label[Placeholder[pip.PipArgs]]&lt;/tt&gt;.
These correspond to semantic differences that I believe it makes sense to model with classes.
Those classes can then &lt;em&gt;refer&lt;/em&gt; to the program class, which should resolve the concerns I had while I was writing the previous paragraph.&lt;/p&gt;
&lt;p&gt;Anyway, nice breakthrough, really need to get to bed soon.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category><category term="Mythic"></category></entry><entry><title>Diary 2025-01-18</title><link href="https://mwchase.neocities.org/diary-2025-01-18" rel="alternate"></link><published>2025-01-18T05:00:00-05:00</published><updated>2025-01-18T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-01-18:/diary-2025-01-18</id><summary type="html">&lt;p class="first last"&gt;Taking it easy so I can take care of some business.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's see.&lt;/p&gt;
&lt;p&gt;I do have some thoughts about Impliciula, but they boil down to &amp;quot;I think I need to take a break and reconsider my approach&amp;quot;.
(Maybe this time I can go through a tutorial without &lt;em&gt;inventing more work to do&lt;/em&gt;.)&lt;/p&gt;
&lt;p&gt;I've got other things I want to pick up, but my top priority right now is to make sure I take care of some stuff in the morning.&lt;/p&gt;
&lt;p&gt;I'm about ready for that, and afterwards, I'll work on... something.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2025-01-17</title><link href="https://mwchase.neocities.org/coding-2025-01-17" rel="alternate"></link><published>2025-01-17T05:00:00-05:00</published><updated>2025-01-17T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-01-17:/coding-2025-01-17</id><summary type="html">&lt;p class="first last"&gt;Varying levels of intuition arguing about whether &amp;quot;static ref counting&amp;quot; is a thing that can possibly work.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, my focus has been questionable at best, but I am still considering how to prevent undefined behavior in a flexible way.&lt;/p&gt;
&lt;p&gt;My hope is that I can attach a lot of information to the underlying address range, and some to individual pointers, using some kind of giant predicate that gets processed specifically with linear logic.&lt;/p&gt;
&lt;p&gt;Let's imagine the simplest scenario that I suspect could totally muck this up:&lt;/p&gt;
&lt;p&gt;We have two pointers to distinct address ranges, called &lt;tt class="docutils literal"&gt;a&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;b&lt;/tt&gt;.
&lt;tt class="docutils literal"&gt;a&lt;/tt&gt; is stored in a third pointer, &lt;tt class="docutils literal"&gt;x&lt;/tt&gt;, which has two copies.
Next, &lt;tt class="docutils literal"&gt;b&lt;/tt&gt; is stored in &lt;tt class="docutils literal"&gt;x&lt;/tt&gt;.
As a result, &lt;tt class="docutils literal"&gt;a&lt;/tt&gt; is no longer accessible, and by extension, whatever it pointed to is no longer accessible.
Conversely, &lt;tt class="docutils literal"&gt;b&lt;/tt&gt; is accessible in its original location, as well as in both locations that &lt;tt class="docutils literal"&gt;x&lt;/tt&gt; is accessible from.&lt;/p&gt;
&lt;p&gt;One of the challenges I have to face is figuring out just how general I can make the general case.
The idea I have is, it should be possible to take a pointer that nothing else knows about, stick it in a wrapper that provides desired guarantees and usage patterns, and then just go.
Naturally, that bit requires substructural stuff to guarantee that the pointer can thereafter only be accessed through the wrapper.
The whole point of such wrappers is that they provide different interfaces, so I suppose the design would be &amp;quot;there's no baseline behavior, rather a set of requirements from the various LLVM intrinsics, and implementing a wrapper requires &lt;em&gt;somehow&lt;/em&gt; proving that you've satisfied those requirements&amp;quot;.
Requirements I have in mind include:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The pointer is based on the address range. (Okay.)&lt;/li&gt;
&lt;li&gt;The address range is live. (All right.)&lt;/li&gt;
&lt;li&gt;The pointer has the required permissions. (Should be straightforward.)&lt;/li&gt;
&lt;li&gt;In the absence of synchronization, a pointer shared between threads can only be read. (... Oh no.)&lt;/li&gt;
&lt;li&gt;Some stuff about aliasing in the context of single-threaded code as well?
Like, sometimes, we'd actually like to have funky behavior from passing the same pointer twice, and sometimes we'd like to be prevented from doing so.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thinking about this, it's possible that I've been misinterpreting the meaning of &amp;quot;synchronization&amp;quot; just enough to freak myself out.
I'll have to look over the LLVM docs some more later.
For now, I really should get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category></entry><entry><title>Coding 2025-01-16</title><link href="https://mwchase.neocities.org/coding-2025-01-16" rel="alternate"></link><published>2025-01-16T05:00:00-05:00</published><updated>2025-01-16T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-01-16:/coding-2025-01-16</id><summary type="html">&lt;p class="first last"&gt;At some point I'll have a concrete idea of what to do next...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, this day was a bit weird, so I'm going to just dash off some quick thoughts, then post.&lt;/p&gt;
&lt;p&gt;I've been reading and thinking really hard about how to handle address ranges, and the more I think about it, the more confused I get about how to do so.&lt;/p&gt;
&lt;p&gt;I think what I'd like to do is to put together something with the simply-typed lambda calculus, and call-by-push-value.
Only emit calls that can't trigger undefined behavior.
Hopefully, doing this will get me some insight into how to handle addresses.&lt;/p&gt;
&lt;p&gt;At the same time, though, I'm not sure how to actually handle emitting the IR.
I've found some crates, but I'm having trouble understanding the documentation.&lt;/p&gt;
&lt;p&gt;I'm going to wind down now as best I can.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2025-01-15</title><link href="https://mwchase.neocities.org/coding-2025-01-15" rel="alternate"></link><published>2025-01-15T05:00:00-05:00</published><updated>2025-01-15T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-01-15:/coding-2025-01-15</id><summary type="html">&lt;p class="first last"&gt;Oh boy, it's time to bring in more extensions to the simply-typed lambda calculus.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got a rough outline of the transformations I want to do to Impliciula code, with the general idea that LLVM IR is &lt;em&gt;like&lt;/em&gt; the simply-typed lambda calculus, except that there are a bunch of things that can go wrong, which the higher levels need to deal with.
(And there are modules, so, like, something involving existential types happened, I guess.
And probably other things.)
&lt;em&gt;However&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Once I put the thought in properly, I realized that basic closure-based handling of resource lifecycles, while sufficient for many purposes, simply won't cut it for all use cases.
So, if I want verifiably safe pointer manipulation that's also flexible, I need to also be reading up on substructural type systems, specifically affine types.
My hope is that I can &lt;em&gt;somehow&lt;/em&gt; connect this to refinement types so that it's possible to construct custom theories of pointer lifecycles.
If I can't make that work, then I kind of need to reevaluate the whole direction I'm taking this project.&lt;/p&gt;
&lt;p&gt;I have no idea whether I should expect that to work, but if it doesn't... ugh.
Anyway, I'll have a better idea whether it will or not once I do some more reading, so I'm going to wrap this up now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category></entry><entry><title>Weekly Roundup 2025-01-14</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-01-14" rel="alternate"></link><published>2025-01-14T05:00:00-05:00</published><updated>2025-01-14T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-01-14:/weekly-roundup-2025-01-14</id><summary type="html">&lt;p class="first last"&gt;I'm closing in on having a sense of whether Impliciula is, like, a workable idea.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I got some tooling written for Mythic-related stuff.&lt;/li&gt;
&lt;li&gt;Thursday: I made some progress on Mythic, and also thought some about Impliciula.&lt;/li&gt;
&lt;li&gt;Friday: I laid out some daring ideas for Impliciula that might not pan out.&lt;/li&gt;
&lt;li&gt;Saturday: There is nothing to say about this day.&lt;/li&gt;
&lt;li&gt;Sunday: I wrote down some of the ideas I have for Impliciula that were kind of just... in my head, and I figured &amp;quot;Yeah, that probably makes sense.&amp;quot;&lt;/li&gt;
&lt;li&gt;Monday: I finished copying the tables over for Mythic.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Today, I found out that my teeth are somewhat healthier than they were six months ago, so that's cool.&lt;/p&gt;
&lt;p&gt;Next week, I'm going to see about using these tables, and also about putting together a sketch of various things for Impliciula:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;How effects and refinement types fit together&lt;/li&gt;
&lt;li&gt;Subtyping and casting&lt;/li&gt;
&lt;li&gt;Base types from LLVM&lt;/li&gt;
&lt;li&gt;Refinement types required to avoid UB (the easy part is &amp;quot;this is non-zero&amp;quot;, &amp;quot;this application doesn't overflow&amp;quot; is a little more interesting, and getting pointer provenance to work is kind of the whole point of this particular area of scope creep)&lt;/li&gt;
&lt;/ul&gt;
</content><category term="Weekly Roundup"></category><category term="Mythic"></category><category term="Impliciula"></category></entry><entry><title>Coding 2025-01-13</title><link href="https://mwchase.neocities.org/coding-2025-01-13" rel="alternate"></link><published>2025-01-13T05:00:00-05:00</published><updated>2025-01-13T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-01-13:/coding-2025-01-13</id><summary type="html">&lt;p class="first last"&gt;Progress on various fronts, but too tired to explain.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, so I'm still looking over stuff for Impliciula, but I don't yet have anything to say about it.&lt;/p&gt;
&lt;p&gt;Just now, I powered through the rest of the big tables for Mythic, so I'll be ready to write code to roll on those tables soon, and then to synthesize them into proper rolls.&lt;/p&gt;
&lt;p&gt;For now, though, I need to wind down; I got suddenly really tired just now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Mythic"></category><category term="short post"></category></entry><entry><title>Coding 2025-01-12</title><link href="https://mwchase.neocities.org/coding-2025-01-12" rel="alternate"></link><published>2025-01-12T05:00:00-05:00</published><updated>2025-01-12T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-01-12:/coding-2025-01-12</id><summary type="html">&lt;p class="first last"&gt;I hope I at least converge on a consistent architecture with this stuff...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I've read up on effect types, and as I side, I'm interested in the theoretical implications of taking the paper's construction of them over a typed lambda calculus, and instead doing that above 1ML.
I &lt;em&gt;think&lt;/em&gt; the specific interaction I'm interested in is, what happens if I perform an effect in a function that returns a value of type type.
But probably the more practical focus is, can I have different &amp;quot;top-level handlers&amp;quot; in different execution contexts, and then structure function calls something like &lt;tt class="docutils literal"&gt;[all type arguments] &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; [evidence vector that can be evaluated at compile time] &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; [actual arguments] &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; [evidence vector that can be evaluated at run time] &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; [return type]&lt;/tt&gt;?&lt;/p&gt;
&lt;p&gt;However, I don't want to rush into anything, so I'm back to reading up on refinement types.
I'm not going too quickly, since I think I'm still feeling some of the effects of last night.
I'm going to wrap this post up now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Diary 2025-01-11</title><link href="https://mwchase.neocities.org/diary-2025-01-11" rel="alternate"></link><published>2025-01-11T05:00:00-05:00</published><updated>2025-01-11T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-01-11:/diary-2025-01-11</id><summary type="html">&lt;p class="first last"&gt;Another one that's safe to skip.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm in no shape to write about anything complicated right now, so I'm just going to take it easy.&lt;/p&gt;
&lt;p&gt;I don't feel like saying any more.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2025-01-10</title><link href="https://mwchase.neocities.org/coding-2025-01-10" rel="alternate"></link><published>2025-01-10T05:00:00-05:00</published><updated>2025-01-10T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-01-10:/coding-2025-01-10</id><summary type="html">&lt;p class="first last"&gt;It's possible that I'm conflating two fundamentally different things that happen to occur around the same time.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I finished some reading on types, and now I've got more reading to do.
To be clear, it is basically certain that I'm going to have to revisit this reading, almost from the beginning, but I do feel like I got some key insights from it.
However, at this point, I think I really need to focus on two things: how to implement an effect system, and getting a feel for 1ML.&lt;/p&gt;
&lt;p&gt;This is because... let me see if I can get this to make sense.
1ML attempts to unify the syntax for type-level and term-level functions.
I think.
It appears to me that doing so in the context of an effect system would give an implementation of implicit function arguments; those would be from effects that are handled at compile time.
The failure mode for a typing algorithm is to fail to terminate.
An effect system can (and in Koka, does) model the possibility of a particular computation failing to terminate.&lt;/p&gt;
&lt;p&gt;With all of that in mind, the overall direction I'm trying to go seems like it has three possible endpoints, and I'm not sure which to expect:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;It is possible to disallow non-termination at compile time, but still have expressive constructs, provided a non-termination proof is provided.&lt;/li&gt;
&lt;li&gt;I somehow mess things up so badly that literally every compile-time function that does anything remotely interesting needs to be marked as potentially non-terminating.&lt;/li&gt;
&lt;li&gt;It turns out that potentially non-terminating code is somehow not fundamentally any more interesting.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In any case, I would very much like to see how getting an effect system to work with 1ML (if that's actually possible the way I'm imagining it) stacks up against COCHIS.&lt;/p&gt;
&lt;p&gt;Okay, that's all for now.
Time to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category></entry><entry><title>Coding 2025-01-09</title><link href="https://mwchase.neocities.org/coding-2025-01-09" rel="alternate"></link><published>2025-01-09T05:00:00-05:00</published><updated>2025-01-09T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-01-09:/coding-2025-01-09</id><summary type="html">&lt;p class="first last"&gt;Weird obstacles, but should be over them soon.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, after spending longer than I'd like &lt;em&gt;debugging&lt;/em&gt; my laptop—&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p&gt;Ugh.&lt;/p&gt;
&lt;p class="last"&gt;&lt;em&gt;Do not&lt;/em&gt; ask.
Do not take the bait.
Do not provide the &lt;strong&gt;satisfaction&lt;/strong&gt;—&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I got back to copying tables over.
On the one hand, it's almost done.
On the other hand, exactly one of these last few pages secretly has a new, incomprehensible layout, and I need to psych myself up before I'm ready to either tweak my cleanup code again, or simply transcribe this one page.&lt;/p&gt;
&lt;p&gt;So, putting that aside for now, I should get back to reading for Impliciula.
One thing I need to put a pin in, even though I'm really curious about the tradeoffs, is how much expressive power I want to give the predicates in the refinement types.
I really really really want to enable the pattern of &amp;quot;here is a simple implementation that is obviously correct, here is an optimized implementation, here is a proof that they give the same results on all inputs&amp;quot;.
(Okay, so technically it's better to prove it for given inputs without explicitly quantifying, because that's easier somehow.
I think.)
Looking over some of my own Dafny code, it looks like at least some of the stuff I want to prove doesn't need an excessive amount of power, unless I'm misreading things.
(Also should allow things like &amp;quot;these related functions are &lt;em&gt;specified&lt;/em&gt; with reference to each other's specifications, but their &lt;em&gt;implementations&lt;/em&gt; are related differently, if at all.&amp;quot;)&lt;/p&gt;
&lt;p&gt;Anyway, time to wrap up, wind down, whatever.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Mythic"></category></entry><entry><title>Coding 2025-01-08</title><link href="https://mwchase.neocities.org/coding-2025-01-08" rel="alternate"></link><published>2025-01-08T05:00:00-05:00</published><updated>2025-01-08T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-01-08:/coding-2025-01-08</id><summary type="html">&lt;p class="first last"&gt;Cutting down on the keystrokes involved by at least two orders of magnitude.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;As I pointed out in the roundup, my initial plan for automatically reformatting tables was completely wrong for the majority of them, but I did manage to throw something together, which took the transcription process from &amp;quot;likely to cause significant harm to my mind, body, and soul&amp;quot; to &amp;quot;eh, pretty tedious&amp;quot;.
That's why I'm not &lt;em&gt;done&lt;/em&gt;, but there's no reason I can't finish it up sometime when I have half an hour or so free.&lt;/p&gt;
&lt;p&gt;Once that's done, I'll have to remind myself how loading resources works; I remember it basically making sense, but feeling somehow &lt;em&gt;slightly&lt;/em&gt; less convenient than I'd like.&lt;/p&gt;
&lt;p&gt;Back on the Impliciula side of things, I'm still reading up on types, but I'm also shoring up my knowledge of the stuff that I want that &lt;em&gt;isn't&lt;/em&gt; covered by the textbook.
I think the main thing I'm missing right now is stuff around continuations.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Right now&lt;/em&gt; right now, though, bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Mythic"></category></entry><entry><title>Weekly Roundup 2025-01-07</title><link href="https://mwchase.neocities.org/weekly-roundup-2025-01-07" rel="alternate"></link><published>2025-01-07T05:00:00-05:00</published><updated>2025-01-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-01-07:/weekly-roundup-2025-01-07</id><summary type="html">&lt;p class="first last"&gt;Not super exciting, but I think I'm getting somewhere.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I read about type systems, and started rereading about Mythic.&lt;/li&gt;
&lt;li&gt;Thursday: A bit more progress...&lt;/li&gt;
&lt;li&gt;Friday: Some more progress, and pondering a large number of percentile tables.&lt;/li&gt;
&lt;li&gt;Saturday: The percentile tables are being troublesome.&lt;/li&gt;
&lt;li&gt;Sunday: I sketched out a setuptools plugin to avoid using MANIFEST.in files in Pijul repositories. (It's already possible to avoid it in the case of Mercurial and that other one.)&lt;/li&gt;
&lt;li&gt;Monday: I thought I had a quick way to deal with the percentile tables; I have since realized that I was broadly incorrect.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to get that processing done right.
Also, my skimming about type theory should come to a close, and I can start sketching stuff out and figuring out what to revisit.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category><category term="Mythic"></category></entry><entry><title>Coding 2025-01-06</title><link href="https://mwchase.neocities.org/coding-2025-01-06" rel="alternate"></link><published>2025-01-06T05:00:00-05:00</published><updated>2025-01-06T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-01-06:/coding-2025-01-06</id><summary type="html">&lt;p class="first last"&gt;I will not apologize for this running gag.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well.
I just forced out a bunch of junky Python code.
Later, I'll see about checking whether it in any way works, but first I have to decide whether and how I want to support the versioning aspect of setuptools-scm, in addition to the file tracking part.
(I have to admit, I'm still smarting from dealing with Poetry's SCM integration however many years ago (I was doing something very weird.), but I'm hopeful I can get this to replace &amp;quot;maintaining a MANIFEST.in file&amp;quot; for the cases where I'm using an obscure SCM.)&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;I suppose you think it's admirable that you didn't crowbar in some way to pretend you have no idea what Git is?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I couldn't figure out how to—I mean, Git?
What's that?&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;... Hey, wait a sec...&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Anyway, I guess I need to psych myself up for transcribing &lt;em&gt;a lot&lt;/em&gt; of information.
Unless I can...
Hm...
Copy out an entire table.
Split on newlines.
Strip leading spaces.
Leftpad all entries where the second character is a colon with zeroes.
Sort.
Remove the first four characters.
Print.&lt;/p&gt;
&lt;p&gt;Okay, yeah, that's no big deal to do later.
For now, I want to get ready for bed, so I'm not ambushed by midnight again.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Mythic"></category></entry><entry><title>Coding 2025-01-05</title><link href="https://mwchase.neocities.org/coding-2025-01-05" rel="alternate"></link><published>2025-01-05T05:00:00-05:00</published><updated>2025-01-05T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-01-05:/coding-2025-01-05</id><summary type="html">&lt;p class="first last"&gt;Why am I looking at this? Look, all of those tables are... a lot.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Weird morning.
Okay day.&lt;/p&gt;
&lt;p&gt;I'm skimming the type theory stuff more aggressively, so it's good odds that I'll have to come back to this later, but I &lt;em&gt;should&lt;/em&gt; have a good baseline to designing the different tiers of Impliciula.
Have to handle stuff like resolving effects, and various kinds and levels of subtyping.&lt;/p&gt;
&lt;p&gt;Anyway, I'm still calling this a Mythic autoroller post, so let's see what I need to do to get these tables in and accessible...
Well, for the latter, I just updated the MANIFEST.in file, which, I'd kind of like to find an alternative.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Ah, I can write a setuptools plugin that interacts wit Pijul thus:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Given a path to a directory, run &lt;tt class="docutils literal"&gt;pijul list &lt;span class="pre"&gt;--repository&lt;/span&gt; {directory}&lt;/tt&gt;, but also scan the ancestors of that directory looking for a &lt;tt class="docutils literal"&gt;.pijul&lt;/tt&gt; directory.
What we want is the relative path from the repository root to the directory that was passed in.&lt;/li&gt;
&lt;li&gt;If we're given an empty string, just run &lt;tt class="docutils literal"&gt;pijul list&lt;/tt&gt;, and scan from the current directory.&lt;/li&gt;
&lt;li&gt;At this point, we have all of the information we need.
We simply need to filter the list down to the entries prefixed by relative path we found, and return the rest of each such path.
The &amp;quot;don't think too hard&amp;quot; way to do this is to turn everything into &lt;tt class="docutils literal"&gt;pathlib.Path&lt;/tt&gt; instances and call &lt;tt class="docutils literal"&gt;candidate.relative_to(directory, walk_up=True)&lt;/tt&gt; and filter out all entries that start with &lt;tt class="docutils literal"&gt;.&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;..&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ooh, it looks like setuptools-scm provides some endpoints, so I could try doing things that way and see how it works.&lt;/p&gt;
&lt;p&gt;(Note to future self: it seems that the &lt;em&gt;tag&lt;/em&gt; in Pijul is associated with a &lt;em&gt;state&lt;/em&gt;, which can be requested from the &lt;em&gt;log&lt;/em&gt;.
Comparing the state information &lt;em&gt;should&lt;/em&gt; allow for determining how many changes have been recorded since the last tag.)&lt;/p&gt;
&lt;p&gt;Anyway, it's late and I should get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Mythic"></category><category term="short post"></category></entry><entry><title>Coding 2025-01-04</title><link href="https://mwchase.neocities.org/coding-2025-01-04" rel="alternate"></link><published>2025-01-04T05:00:00-05:00</published><updated>2025-01-04T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-01-04:/coding-2025-01-04</id><summary type="html">&lt;p class="first last"&gt;Why is exactly one table laid out differently in the PDF?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;We traveled again today, so I'm a little out of it.
That said, it's mostly nice to be back home.&lt;/p&gt;
&lt;p&gt;Aside from that, I'm reading some heady theoretical stuff on the typing side of things, and I've come to a decision on laying out the percentile tables.
I've transcribed two of them, but unfortunately, it looks like the first one was the easy one, and the second one and the remaining 47 are going to be a huge pain.
So much so that I ended up drafting a custom table rather than transcribing any more.
I'll publish that table somehow or other, once I think it's done.&lt;/p&gt;
&lt;p&gt;For now, I really need to wind down.
I'll see if I'm up for more of that type theory stuff.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Mythic"></category><category term="short post"></category></entry><entry><title>Coding 2025-01-03</title><link href="https://mwchase.neocities.org/coding-2025-01-03" rel="alternate"></link><published>2025-01-03T05:00:00-05:00</published><updated>2025-01-03T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-01-03:/coding-2025-01-03</id><summary type="html">&lt;p class="first last"&gt;Many small files, or one big one...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've figured out the next thing I should be working on for Mythic.
Unfortunately, it's a little involved; I'm going to transcribe 49 percentile dice tables, and aside from the effort that will take, I haven't settled on how I want to lay out the tables as files.&lt;/p&gt;
&lt;p&gt;Aside from that, my reading on types has gotten to the basics of implementing object systems.
I don't think this will be relevant for Impliciula, but it could be helpful for messing around in Lua, so I'll keep at it.&lt;/p&gt;
&lt;p&gt;I'll get back to that reading now, and think about laying out data later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Mythic"></category><category term="short post"></category></entry><entry><title>Coding 2025-01-02</title><link href="https://mwchase.neocities.org/coding-2025-01-02" rel="alternate"></link><published>2025-01-02T05:00:00-05:00</published><updated>2025-01-02T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-01-02:/coding-2025-01-02</id><summary type="html">&lt;p class="first last"&gt;It's unfortunate that I haven't figured out a way to talk much about this, but oh well.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm learning some important stuff about type systems, and also I'm making some key progress putting together stuff for Mythic.
On the Mythic side of things, I've got a few straightforward things to crunch through, and a bunch of data to enter.
That should be done in a few days.&lt;/p&gt;
&lt;p&gt;For now, I'm going to wind down and read up on types a bit more.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Mythic"></category><category term="short post"></category></entry><entry><title>Coding 2025-01-01</title><link href="https://mwchase.neocities.org/coding-2025-01-01" rel="alternate"></link><published>2025-01-01T05:00:00-05:00</published><updated>2025-01-01T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2025-01-01:/coding-2025-01-01</id><summary type="html">&lt;p class="first last"&gt;I give reasons for this shift in focus, but really it's just going along with whatever random whims direct me.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm still looking over type and programming language stuff, but I'm also tossing together stuff in less disciplined fashion to try automating bookkeeping for Mythic.
I don't know whether I'll actually need this, but writing it will be handy for refreshing my memory about how Mythic's second edition fits together.
I mean, there's not &lt;em&gt;much&lt;/em&gt; to it, but all the more reason to see if I can internalize it all.&lt;/p&gt;
&lt;p&gt;I can talk some about the thought process that got me here.
I've been trying, on and off, to get into tabletop roleplaying, but I really frequently have hit something along the lines of stage fright, so I'm trying to get some practice with solo roleplaying.
(This is where the Stars Without Number stuff was going, although going into that, I wasn't quite aware of the amount of prep work my standards would end up giving me.)
The last time I tried to do something in this are, I ended up with a character concept that I felt was too ambitious, and ended up not going anywhere with it.
My current plan is to work with my wife as such: she handles most of the work, and I take care of the tedious bookkeeping.
This gives me practice for bookkeeping on my own, and time to come up with a concept that's more in my comfort zone.&lt;/p&gt;
&lt;p&gt;But for now, I'm just kind of slopping code together to see what seems to make sense.
And there's only so much more of that I can do this year.&lt;/p&gt;
&lt;p&gt;(Okay, so, see, I date these entries so that they correspond to midnight UTC the day after I write them, so...)&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Mythic"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2024-12-31</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-12-31" rel="alternate"></link><published>2024-12-31T05:00:00-05:00</published><updated>2024-12-31T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-12-31:/weekly-roundup-2024-12-31</id><summary type="html">&lt;p class="first last"&gt;I've worked out a plan to go from &amp;quot;basically no idea what I'm doing&amp;quot; to &amp;quot;slightly more idea what I'm doing&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I put together a general outline for how Impliciula is going to have to work.&lt;/li&gt;
&lt;li&gt;Thursday: I tried to figure out how to represent the core language for Impliciula.&lt;/li&gt;
&lt;li&gt;Friday: I put together a sketch of code for an AST.&lt;/li&gt;
&lt;li&gt;Saturday: I got a better idea of how I'm going to have to elaborate on the AST.&lt;/li&gt;
&lt;li&gt;Sunday: I found a textbook on this stuff.&lt;/li&gt;
&lt;li&gt;Monday: Reading the textbook is going well, but I'm slightly dreading the paper I'm going to have to write on Impliciula's type system.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to see if I can find something else to discuss.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category></entry><entry><title>Coding 2024-12-30</title><link href="https://mwchase.neocities.org/coding-2024-12-30" rel="alternate"></link><published>2024-12-30T05:00:00-05:00</published><updated>2024-12-30T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-12-30:/coding-2024-12-30</id><summary type="html">&lt;p class="first last"&gt;Fingers crossed this all works out. No obvious problems yet.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I'm somewhat winging reading the early chapters of this book, but it's fine, probably.
I'm taking notes on the stuff I'll need to keep in mind later, and internalizing the correct interpretation of some notation that I was just sort of fudging my interpretation of.&lt;/p&gt;
&lt;p&gt;I can't be sure that I'll continue to move through later chapters at the same clip as these early ones, but I'm just not going to worry about that right now.&lt;/p&gt;
&lt;p&gt;What I &lt;em&gt;am&lt;/em&gt; a little worried about is, it's talking about desirable properties of a type system, that I can't simply assume hold, and will need to prove.
I'm a little worried that I may end up doubting myself just enough that I write a bunch of the compiler in Dafny, and then compile it to Rust, which is likely to produce code that is... somewhat odd-looking, at best.&lt;/p&gt;
&lt;p&gt;Anyway, it's late now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2024-12-29</title><link href="https://mwchase.neocities.org/coding-2024-12-29" rel="alternate"></link><published>2024-12-29T05:00:00-05:00</published><updated>2024-12-29T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-12-29:/coding-2024-12-29</id><summary type="html">&lt;p class="first last"&gt;Going to &lt;em&gt;try&lt;/em&gt; to stop winging things...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Every time I read stuff on implementing type systems, I feel like the ideas being communicated are somewhat different.
Hopefully this is a case of &amp;quot;there are many ways to attain desirable theoretical properties&amp;quot; and not &amp;quot;I'm failing to understand something&amp;quot;.
Anyway, I found a book on this stuff, which &lt;em&gt;builds up to&lt;/em&gt; &amp;quot;System Fω with subtyping&amp;quot;, which is, um, where I want to start in terms of this project.&lt;/p&gt;
&lt;p&gt;So, I figure I'll work through that book; while it's &lt;em&gt;possible&lt;/em&gt; that I can simply muddle through things with my current level of knowledge, getting a firmer foundation should only be helpful, aside from the fact that it &lt;em&gt;may&lt;/em&gt; take more time than just charging ahead &lt;em&gt;and getting lucky&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;As such, I'm going to try to switch gears to other projects, at least as far as blogging goes, and read up on this in the background.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;And then I went and got distracted by another project that I'm nowhere near ready to blog about.
Oops.&lt;/p&gt;
&lt;p&gt;Going to get to bed now.
Maybe read the intro to that book.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2024-12-28</title><link href="https://mwchase.neocities.org/coding-2024-12-28" rel="alternate"></link><published>2024-12-28T05:00:00-05:00</published><updated>2024-12-28T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-12-28:/coding-2024-12-28</id><summary type="html">&lt;p class="first last"&gt;Gradually coming to an understanding of this stuff, but it's frustratingly slow.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, with a bit of thought, I understand that the different papers I was reading were using the word &amp;quot;kind&amp;quot; in compatible fashions.
The gamble I have to take is to create several sorts of &amp;quot;field&amp;quot; and &amp;quot;extension&amp;quot; kinds, as well as a &amp;quot;variant&amp;quot; kind, and maybe some other stuff.
From there, the key is to make sure that I have type inference rules that are compatible with the new kinds.&lt;/p&gt;
&lt;p&gt;I'm reading up on type inference techniques that work with subtyping, which is going to be a must to deal with the row types that all of that is meant to introduce.
The complication I have to deal with right now is, I kind of want &lt;em&gt;three&lt;/em&gt; things that could reasonably be described as row types, and there are a bunch of questions I need to answer:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;What are the associated kinds?&lt;/li&gt;
&lt;li&gt;What are the corresponding type inference rules?&lt;/li&gt;
&lt;li&gt;Does this break anything at a theoretical level?&lt;/li&gt;
&lt;li&gt;Practically speaking, how do I translate this to code?&lt;/li&gt;
&lt;li&gt;I want to implement these things one at a time; how do I lay out the code so that grafting on more kinds like this isn't a complete pain?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Oh yeah, also: I guess I'm going to need more types (kinds?) at some point for FFI purposes, because I'm planning to have a level of flexibility for &lt;em&gt;internal&lt;/em&gt; types that doesn't sensibly apply to &lt;em&gt;external&lt;/em&gt; types.&lt;/p&gt;
&lt;p&gt;Anyway, it's best if I plan before further prototyping, best if I read more before planning, best if I sleep before reading.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2024-12-27</title><link href="https://mwchase.neocities.org/coding-2024-12-27" rel="alternate"></link><published>2024-12-27T05:00:00-05:00</published><updated>2024-12-27T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-12-27:/coding-2024-12-27</id><summary type="html">&lt;p class="first last"&gt;Puzzling things out.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's see.
As a result of manually translating the diagrams in these papers into code, I'm getting some idea of how both the notation and the concepts work.&lt;/p&gt;
&lt;p&gt;Things I still need to figure out:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;How should the typing rules be expressed in code?&lt;/li&gt;
&lt;li&gt;Do these papers written decades apart by different people mean the same thing when they say &amp;quot;kind&amp;quot;?
If not, what is the proper way to reconcile the differences?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'll see where this ends up, but for now, I need to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2024-12-26</title><link href="https://mwchase.neocities.org/coding-2024-12-26" rel="alternate"></link><published>2024-12-26T05:00:00-05:00</published><updated>2024-12-26T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-12-26:/coding-2024-12-26</id><summary type="html">&lt;p class="first last"&gt;Reading these papers is a great way to find random typos. I hope none of them turn out to be significant.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I've got some idea of the AST for System Fω, and a somewhat vaguer idea of how I'm going to try to extend it, and a still fuzzier idea of how I'm going to try to turn this stuff into executable code.&lt;/p&gt;
&lt;p&gt;I should have more time to mess around with this tomorrow, so then I can either try to shore up my theoretical understanding, or just throw some code together and probably end up being all &amp;quot;it broke&amp;quot; when I ask for help.&lt;/p&gt;
&lt;p&gt;For now, I need to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2024-12-25</title><link href="https://mwchase.neocities.org/coding-2024-12-25" rel="alternate"></link><published>2024-12-25T05:00:00-05:00</published><updated>2024-12-25T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-12-25:/coding-2024-12-25</id><summary type="html">&lt;p class="first last"&gt;Uh, Merry Christmas, I guess?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I got kind of distracted thinking about the surface syntax today, so I didn't make much progress in the direction that I wanted.
To try and get something done today, I'm going to go through the target compilation flow I think I'm going for.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Write source code in Impliciula.&lt;/li&gt;
&lt;li&gt;Parse to high-level AST.&lt;/li&gt;
&lt;li&gt;Desugar AST.&lt;/li&gt;
&lt;li&gt;Generate type constraints and resolve all constraints with z3. (Is this going to be multi-pass or otherwise incremental?) (Wait, maybe there's a SAT-solver in Rust that I can just use directly?)&lt;/li&gt;
&lt;li&gt;Possibly do a few more AST transformations, until we get to something with a mostly limited vocabulary.&lt;/li&gt;
&lt;li&gt;Do What It Takes to convert that to LLVM IR.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, even given the amount of slop and slack in all of that, I feel like the right way to proceed is to make sure that the end steps can even happen.
So, the proper stuff to focus on is extending System Fω until it has the capabilities I want (several new kinds of type, as well as a few new kinds of expression), somehow taking care to avoid breaking the desirable properties of System Fω.
From there, I can construct modules, and higher-level syntactic sugar.&lt;/p&gt;
&lt;p&gt;As to how to extend System Fω, my plan right now is to write down my goals so I can refer to them later, and then, um, teach myself the relevant aspects of CS so I sort of know what I'm doing.
We'll see how this goes.
Later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2024-12-24</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-12-24" rel="alternate"></link><published>2024-12-24T05:00:00-05:00</published><updated>2024-12-24T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-12-24:/weekly-roundup-2024-12-24</id><summary type="html">&lt;p class="first last"&gt;It's time to start having fun again.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I changed some names in MOTR. It's somewhat awkward, but better than it was before.&lt;/li&gt;
&lt;li&gt;Thursday: Not much, but I do have a source to use for some of my writing, which is something.&lt;/li&gt;
&lt;li&gt;Friday: Nothing much.&lt;/li&gt;
&lt;li&gt;Saturday: I found something that could have a huge effect on Impliciula's design.&lt;/li&gt;
&lt;li&gt;Sunday: I became more confident that the papers I found are important.&lt;/li&gt;
&lt;li&gt;Monday: I tried to nail down the new direction for Impliciula, and honestly it looks like several research projects in a row, but I'll try!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to fill in my very high-level plan for Impliciula, and also, uh, learn to write a compiler.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="MOTR"></category><category term="Impliciula"></category></entry><entry><title>Coding 2024-12-23</title><link href="https://mwchase.neocities.org/coding-2024-12-23" rel="alternate"></link><published>2024-12-23T05:00:00-05:00</published><updated>2024-12-23T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-12-23:/coding-2024-12-23</id><summary type="html">&lt;p class="first last"&gt;Draw the rest of like five owls.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's see what we've got here.&lt;/p&gt;
&lt;p&gt;1ML defines a core language without type inference, which can be translated to System Fω.
The paper I'm reading gives the typing rules for System Fω, so I'm currently figuring that the idea is to translate down to System Fω and type check it in that form?&lt;/p&gt;
&lt;p&gt;Given that, my plan of attack looks something like this:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Implement 1ML without effects.&lt;/li&gt;
&lt;li&gt;Extend it with aspects of F-ing modules that the 1ML paper leaves as an exercise for the reader.&lt;/li&gt;
&lt;li&gt;See what goes wrong if I attempt to implement row typing in the core language. (Reading ahead, I see that this was considered, and specific pain points identified.)&lt;/li&gt;
&lt;li&gt;Extend row typing to the point where it can handle what I have in mind for effects.&lt;/li&gt;
&lt;li&gt;Implement a basic form of tail-resumptive effects.&lt;/li&gt;
&lt;li&gt;Add further capabilities until I'm satisfied.&lt;/li&gt;
&lt;li&gt;Somewhere in there, try to handle predicates some way.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One thing that's fairly obvious to me, looking at the papers, is that I'll need to have some kind of trace or source map associated with the different translations, because an error in terms of System Fω would be entirely incomprehensible.&lt;/p&gt;
&lt;p&gt;In any case, reading over the papers, I'm cautiously optimistic about integrating row types, but it may end up being the case that I end up hacking on System Fω instead of the 1ML core.&lt;/p&gt;
&lt;p&gt;For now, though, I need to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category></entry><entry><title>Diary 2024-12-22</title><link href="https://mwchase.neocities.org/diary-2024-12-22" rel="alternate"></link><published>2024-12-22T05:00:00-05:00</published><updated>2024-12-22T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-12-22:/diary-2024-12-22</id><summary type="html">&lt;p class="first last"&gt;Hopefully, I'll get somewhere with this tomorrow.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I've looked enough at the papers for 1ML and F-ing modules to be confident that there's something here for Impliciula, but I'm not quite ready to commit to anything yet.&lt;/p&gt;
&lt;p&gt;Aside from that, travel, and that means that I'm kind of fried.
It is currently way too late, and I want to stop looking at bright things.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-12-21</title><link href="https://mwchase.neocities.org/diary-2024-12-21" rel="alternate"></link><published>2024-12-21T05:00:00-05:00</published><updated>2024-12-21T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-12-21:/diary-2024-12-21</id><summary type="html">&lt;p class="first last"&gt;I'm reading the papers, and &lt;em&gt;wow&lt;/em&gt; this could go any way.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, it's time to relax.
Over the next few days, I'm going to try to scale things up with MOTR and some of my writing, but right now, I'm just going to take things easy.&lt;/p&gt;
&lt;p&gt;Also, I just ran across &lt;a class="reference external" href="https://people.mpi-sws.org/~rossberg/1ml/"&gt;1ML&lt;/a&gt;, and &lt;em&gt;that&lt;/em&gt; could be a huge can of worms when it comes to Impliciula's design.
Maybe I'll be thinking about that soon, but not now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-12-20</title><link href="https://mwchase.neocities.org/diary-2024-12-20" rel="alternate"></link><published>2024-12-20T05:00:00-05:00</published><updated>2024-12-20T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-12-20:/diary-2024-12-20</id><summary type="html">&lt;p class="first last"&gt;Absolutely nothing to see here.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Didn't manage time well today, so I have nothing to discuss.
We'll see what shakes out tomorrow, and over the next few days.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-12-19</title><link href="https://mwchase.neocities.org/diary-2024-12-19" rel="alternate"></link><published>2024-12-19T05:00:00-05:00</published><updated>2024-12-19T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-12-19:/diary-2024-12-19</id><summary type="html">&lt;p class="first last"&gt;Nothing to see here.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;There was a lot going on today, and as a result, I didn't get too much done.&lt;/p&gt;
&lt;p&gt;I did come across a crucial source for some of my non-fiction writing, so that's good; I'm going to have &lt;em&gt;challenges&lt;/em&gt; properly integrating its messages, though.&lt;/p&gt;
&lt;p&gt;Right now, though, it's vital that I get some rest.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2024-12-18</title><link href="https://mwchase.neocities.org/coding-2024-12-18" rel="alternate"></link><published>2024-12-18T05:00:00-05:00</published><updated>2024-12-18T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-12-18:/coding-2024-12-18</id><summary type="html">&lt;p class="first last"&gt;It feels good to change these names to &lt;em&gt;something&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I started renaming things, and took a while to stop, and shockingly, it all merged totally cleanly to the future topic.
I think at this point, the next step, at least in the CLI wrappers, is to take some time away from them, and come back in a few days with fresh eyes to see what looks not-quite-right now.&lt;/p&gt;
&lt;p&gt;While I'm looking elsewhere, I notice some code duplication that can be trivially removed, so I do so, and ratchet up the coverage a little bit more in the process.&lt;/p&gt;
&lt;p&gt;I'm not sure what to work on next, and I'm getting too tired to work it out, so let's wrap things up here.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2024-12-17</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-12-17" rel="alternate"></link><published>2024-12-17T05:00:00-05:00</published><updated>2024-12-17T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-12-17:/weekly-roundup-2024-12-17</id><summary type="html">&lt;p class="first last"&gt;Not rushing, but I dearly hope to make a change that gives me the confidence to move faster.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I made a bit of progress on MOTR.&lt;/li&gt;
&lt;li&gt;Thursday: I managed a tiny coverage improvement.&lt;/li&gt;
&lt;li&gt;Friday: I made an improvement to &lt;em&gt;typing&lt;/em&gt; coverage, and noticed a problem with the interfaces as a result.&lt;/li&gt;
&lt;li&gt;Saturday: I started to come up with a more detailed mental model for parts of the high-level abstraction in MOTR than &amp;quot;the thing&amp;quot; and &amp;quot;the thing that the other thing goes in&amp;quot;.&lt;/li&gt;
&lt;li&gt;Sunday: I discovered a wrinkle in every version of the relevant model, and mostly just chose to ignore it for now.&lt;/li&gt;
&lt;li&gt;Monday: I tried to write up these ideas a little more clearly, and come up with a concrete improvement I can make based on them.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'll try putting that into action.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="MOTR"></category></entry><entry><title>Coding 2024-12-16</title><link href="https://mwchase.neocities.org/coding-2024-12-16" rel="alternate"></link><published>2024-12-16T05:00:00-05:00</published><updated>2024-12-16T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-12-16:/coding-2024-12-16</id><summary type="html">&lt;p class="first last"&gt;It remains to be seen whether I'll stay with this idea, but I'm definitely going to try it out.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I was focused on other things today, so I'm going to try and get some stuff written quickly, then wind down.&lt;/p&gt;
&lt;p&gt;The last few days, I've been toying with the concept of foregrounding the interpretation of high-level command abstractions as an inhomogeneous linked list.
These linkages are formed via two methods on the command head/cap class, which attach the instance to a method-specific type of tail, and the result, depending on whether the methods are called on a head or a cap, is a tail or a completed list, respectively.&lt;/p&gt;
&lt;p&gt;And as I type that up, I suddenly recognize one of the problems with the current abstraction.
I was thinking yesterday about writing a new tail class, but if the way to attach a tail is to call a method on the head/cap, then every new tail class needs a new method on the head/cap class.
This method should instead be part of the command tail interface.&lt;/p&gt;
&lt;p&gt;To help preserve the order of data in the code, there could perhaps be a convenience method on the head/cap class, although the typing may be somewhat confusing...
The problem with that idea is that the different kinds of tail have different effects on the typing of the head/cap when it's prepended, and I don't yet see a way to address that.&lt;/p&gt;
&lt;p&gt;Given that it looks like I won't be able to change the shape of the interface as much as I hoped, it's best to focus on the names for now.
The shared prefix for the methods to attach to a tail is &lt;tt class="docutils literal"&gt;with_&lt;/tt&gt;, and my current feeling is that &lt;tt class="docutils literal"&gt;prepend_to_&lt;/tt&gt; is a lot better.
The names can then be something like &lt;tt class="docutils literal"&gt;prepend_to_script_environment&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;prepend_to_module_call&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;I'll have to sleep on that, and come back to it in a few days.&lt;/p&gt;
&lt;p&gt;For now, winding down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category></entry><entry><title>Coding 2024-12-15</title><link href="https://mwchase.neocities.org/coding-2024-12-15" rel="alternate"></link><published>2024-12-15T05:00:00-05:00</published><updated>2024-12-15T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-12-15:/coding-2024-12-15</id><summary type="html">&lt;p class="first last"&gt;I can't tell if this reads as nonsense to everyone else, which is a problem...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was mostly relaxing today, but I did take some time to consider the ideas I had last night.
I'm not sure if the names that I have in mind are quite right.
They should be an improvement on the basis of distinguishing types with different behavior, but I don't know if I'm using the right metaphor yet.&lt;/p&gt;
&lt;p&gt;Basically, by viewing commands as something like a linked list of arguments, we can build up a &amp;quot;tail&amp;quot; by adding some &amp;quot;heads&amp;quot; to it, and then adding a &amp;quot;cap&amp;quot; to &amp;quot;complete&amp;quot; it.&lt;/p&gt;
&lt;p&gt;I suppose figuring out whether this choice of terminology is &amp;quot;right&amp;quot; hinges on figuring out the target audience.
Unfortunately, of the four interest groups I've identified for working with MOTR (developers of unrelated repositories, maintainers of unrelated repositories, developers of plugins, and core developers), fully three of them care at least somewhat about understanding whatever terminology I come up with.&lt;/p&gt;
&lt;p&gt;On the one hand, I can always change this later, but on the other hand, it would be nice to get it right &lt;em&gt;now&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I also have to consider the possibility that this &amp;quot;cap&amp;quot; concept may not even be &lt;em&gt;correct&lt;/em&gt;.
After all, some command-line invocations go &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;some-cmd&lt;/span&gt; arg1 arg2 &lt;span class="pre"&gt;--&lt;/span&gt; &lt;span class="pre"&gt;some-other-cmd-entirely&lt;/span&gt; arg3 arg4&lt;/tt&gt;.
In other words, it can be a property of some caps and heads that they can go on top of what should be a cap.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;I can't go back to TF2.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Boo!&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Corny jokes aside, I'm getting the feeling that I can awkwardly patch I mean extend this by writing an adaptor class that converts a completed list to a tail.
The main barrier to doing so is the dire quality of the current documentation in this area.
And the documentation is so bad because I didn't know what to call anything...&lt;/p&gt;
&lt;p&gt;Okay, I've got to at least try the head/tail/cap/complete writeup and see if anything comes of it.&lt;/p&gt;
&lt;p&gt;For now, though, I need to wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category></entry><entry><title>Coding 2024-12-14</title><link href="https://mwchase.neocities.org/coding-2024-12-14" rel="alternate"></link><published>2024-12-14T05:00:00-05:00</published><updated>2024-12-14T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-12-14:/coding-2024-12-14</id><summary type="html">&lt;p class="first last"&gt;This is perhaps... not coherent. Oh well.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I've been renaming stuff in MOTR's upper layers, trying to gradually reduce the technical debt I incurred by pushing through the unintuitive stuff.
At this point, I'm getting closer to figuring out what to call &lt;tt class="docutils literal"&gt;ParametricCommand&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;ParametricCommandMeta&lt;/tt&gt;.
Basically, a given CLI wrapper has to contain an object that is one of two types, but actually there are kind of four of them, and I'm trying to figure out a naming scheme.
My ideas here are kind of inching towards Apps Hungarian notation, so we'll see how this all goes.&lt;/p&gt;
&lt;p&gt;Basically, the way I'm thinking about this is kind of like a 1-dimensional jigsaw puzzle where there are only two types of edge.
To actually create a &lt;tt class="docutils literal"&gt;Matrix&lt;/tt&gt; that will put the desired &lt;tt class="docutils literal"&gt;Fact&lt;/tt&gt;s into the &lt;tt class="docutils literal"&gt;Compendium&lt;/tt&gt;, we need a &lt;tt class="docutils literal"&gt;ParametricCommand[Script, Any, Any, Any]&lt;/tt&gt;, which is like a solved puzzle.
The unsolved pieces are &lt;tt class="docutils literal"&gt;ParametricCommandMeta[Script, Any, Any, Any]&lt;/tt&gt; (solved on the left, not on the right), &lt;tt class="docutils literal"&gt;ParametricCommand[Module, Any, Any, Any]&lt;/tt&gt; (solved on the right, not on the left), and &lt;tt class="docutils literal"&gt;ParametricCommandMeta[Module, Any, Any, Any]&lt;/tt&gt; (unsolved on both sides).
(One minor complication is that currently the &amp;quot;puzzle&amp;quot; has to be &amp;quot;solved&amp;quot; right-to-left, but it's probably fine.)
Furthermore, there is another type that is basically a puzzle piece solved on the right, not on the left.
This is needed because it's not possible to construct a &lt;tt class="docutils literal"&gt;ParametricCommand&lt;/tt&gt; without a &lt;tt class="docutils literal"&gt;ParametricCommandMeta&lt;/tt&gt;, so there needs to be some way to &amp;quot;solve the right side&amp;quot; as part of converting.&lt;/p&gt;
&lt;p&gt;I wonder if I could get better names by considering all of this from the angle of &amp;quot;I mean, it's kind of a linked list&amp;quot;.
Like, &amp;quot;command head&amp;quot; and &amp;quot;command tail&amp;quot;.
I think I can get somewhere with this idea, but I also think I'm done for tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category></entry><entry><title>Coding 2024-12-13</title><link href="https://mwchase.neocities.org/coding-2024-12-13" rel="alternate"></link><published>2024-12-13T05:00:00-05:00</published><updated>2024-12-13T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-12-13:/coding-2024-12-13</id><summary type="html">&lt;p class="first last"&gt;Lots of my statements about code coverage are mainly intended to bother people who don't feel that it's a useful metric. I don't have any reason for doing this besides that I think it's funny.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;As I look at MOTR's code with fresh eyes, I discover a gap in the typing coverage.
This first manifested in some light boilerplate code that I realized wasn't accomplishing anything.
And it wasn't accomplishing anything because there's no connection between where it's defined, and where its definition is supposed to propagate to.
I'm going to try to fix this, just to see what problems it causes as a result...&lt;/p&gt;
&lt;p&gt;Well, the code looks a little weirder, but things should be actually hooked up now, probably...&lt;/p&gt;
&lt;p&gt;Well, I managed to inline enough code that my code coverage fell by 0.01%.
My hope is that the modules are a little more focused now.&lt;/p&gt;
&lt;p&gt;Looking at this code with fresh eyes, one issue that I'm seeing is that different modules are using the same name for a value with different types, but the fact that the type is different may not be immediately obvious.
I'm going to have to redo these names.&lt;/p&gt;
&lt;p&gt;For now, I'm incredibly tired, so I'll be getting to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2024-12-12</title><link href="https://mwchase.neocities.org/coding-2024-12-12" rel="alternate"></link><published>2024-12-12T05:00:00-05:00</published><updated>2024-12-12T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-12-12:/coding-2024-12-12</id><summary type="html">&lt;p class="first last"&gt;It went up by like 0.1 percent. Brutal.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So.
I made a few more small tweaks to MOTR's structure, and then I decided to get back to increasing coverage.
Unfortunately, some of the coverage misses are related to code for the CLI wrapper layer, which I believe really needs a rewrite still, and some of them are just... really quite confusing.
Like I'm going to have to devote a lot of time just to figuring out when a particular method should even be called.&lt;/p&gt;
&lt;p&gt;Although, I did just manage to squeeze out a tiny bit of coverage.
Progress.&lt;/p&gt;
&lt;p&gt;I shouldn't make any more progress tonight though, except for progress towards bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Coding 2024-12-11</title><link href="https://mwchase.neocities.org/coding-2024-12-11" rel="alternate"></link><published>2024-12-11T05:00:00-05:00</published><updated>2024-12-11T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-12-11:/coding-2024-12-11</id><summary type="html">&lt;p class="first last"&gt;A small bit of housekeeping.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm sort of jumping between projects, but the quantifiable achievement of today is that I redid some of the package layout, and got it working with the latest Mypy.
(The trick was to stop using a particular third-party plugin that it turns out became unnecessary at some point.)&lt;/p&gt;
&lt;p&gt;This was pretty subtle overall, but I'm hoping it kind of compounds into getting everything to make more sense.&lt;/p&gt;
&lt;p&gt;I've got some ideas about other stuff, such as Impliciula, but they're not quite baked enough yet.&lt;/p&gt;
&lt;p&gt;Anyway, it's late and I should get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="python"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2024-12-10</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-12-10" rel="alternate"></link><published>2024-12-10T05:00:00-05:00</published><updated>2024-12-10T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-12-10:/weekly-roundup-2024-12-10</id><summary type="html">&lt;p class="first last"&gt;I'm pretty sure this time of year is always like this and I just forget. I'm not going to check that.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I thought about MOTR and conlanging.&lt;/li&gt;
&lt;li&gt;Thursday: Conlanging, and using my laptop for way longer than I should have.&lt;/li&gt;
&lt;li&gt;Friday: I started talking about the language concept, Divine. It's for pretentious jerk fantasy races.&lt;/li&gt;
&lt;li&gt;Saturday: I tried to figure out the implications that Divine's sentence structure has for parts of speech.&lt;/li&gt;
&lt;li&gt;Sunday: I had nothing really to say.&lt;/li&gt;
&lt;li&gt;Monday: I had nothing really to say, but also a headache.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to make some progress of some kind on something.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="MOTR"></category><category term="Divine (conlang)"></category></entry><entry><title>Diary 2024-12-09</title><link href="https://mwchase.neocities.org/diary-2024-12-09" rel="alternate"></link><published>2024-12-09T05:00:00-05:00</published><updated>2024-12-09T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-12-09:/diary-2024-12-09</id><summary type="html">&lt;p class="first last"&gt;Did work earlier, so I can't do it now...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Good news: I've taken inventory of my current projects, and I should be able to methodically make progress on them.&lt;/p&gt;
&lt;p&gt;Bad news: I did this during the car ride back, and I'm still feeling motion-sick as a result.&lt;/p&gt;
&lt;p&gt;I'm going to post this, put on some music, and read.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-12-08</title><link href="https://mwchase.neocities.org/diary-2024-12-08" rel="alternate"></link><published>2024-12-08T05:00:00-05:00</published><updated>2024-12-08T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-12-08:/diary-2024-12-08</id><summary type="html">&lt;p class="first last"&gt;Bad judgment calls, no time for writing this.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I made some progress on some projects today, but nothing that I'm ready to show off.
I'm very tired and I should get to bed.
Oh well.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Conlanging 2024-12-07</title><link href="https://mwchase.neocities.org/conlanging-2024-12-07" rel="alternate"></link><published>2024-12-07T05:00:00-05:00</published><updated>2024-12-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-12-07:/conlanging-2024-12-07</id><summary type="html">&lt;p class="first last"&gt;It's fun basing creative decisions on fictional characters being pretentious jerks.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hm.
Another day, another weird mental state.
Let's just work through some sentences quickly and see what difficulties they present.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The lookout sees the soldiers as clearly as the eagle sees the soldiers.&lt;/li&gt;
&lt;li&gt;The lookout sees the soldiers as clearly as an eagle would see the soldiers.&lt;/li&gt;
&lt;li&gt;The lookout sees the soldiers as clearly as the eagle sees its prey.&lt;/li&gt;
&lt;li&gt;The lookout sees the soldiers as clearly as an eagle would see its prey.&lt;/li&gt;
&lt;li&gt;The lookout sees the soldiers as clearly as the elephant hears the soldiers.&lt;/li&gt;
&lt;li&gt;The lookout sees the soldiers as clearly as an elephant would hear the soldiers.&lt;/li&gt;
&lt;li&gt;The lookout sees the soldiers as clearly as the elephant hears the rockslide.&lt;/li&gt;
&lt;li&gt;The lookout sees the soldiers as clearly as an elephant would hear a rockslide.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm mostly interested in the result of variation along particular axes, but I figured I'd fill in all of the possible combinations.&lt;/p&gt;
&lt;p&gt;The idea I'm looking for is to move parts of verb phrases to particular locations.
The full &amp;quot;deep&amp;quot; phrases are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&amp;quot;sees the soldiers clearly&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;would see the soldiers clearly&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;sees the eagle's prey clearly&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;would see the eagle's prey clearly&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;hears the soldiers clearly&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;would hear the soldiers clearly&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;hears the rockslide clearly&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;would hear a rockslide clearly&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;... and those don't actually present the problems I was worried about.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The lookout sees the soldiers as clearly as the clouds disperse quickly.&lt;/li&gt;
&lt;li&gt;The lookout would see the soldiers as clearly as the clouds would disperse quickly.&lt;/li&gt;
&lt;li&gt;The lookout sees the soldiers as clearly as the eagle sees its prey hungrily.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If I were editing this, those sentences would be less awkward, but the awkwardness shouldn't interact with the grammatical questions I'm trying to deal with.
Those sentences deal with the idea of dividing the verb phrase parts into, like, TAM, action, manner.
The thing I'm trying to figure out is if I want them to all be separate constituents, or not.
Part of the issue is that I want to make all of the basic words be verbs.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;I just realized that doing this with transitive verbs made everything more confusing for me.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The man runs faster than the dog runs.&lt;/li&gt;
&lt;li&gt;The man runs faster than the dog eats.&lt;/li&gt;
&lt;li&gt;The man runs faster than the dog runs gracefully.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some of these sentences seem nonsensical or awkward, but the Divines would explain that this is simply the result of our quaintly limited perspective.&lt;/p&gt;
&lt;p&gt;The more I think about this, the more I think I'm going to need to make use of anaphora, but in a way, that just makes it better, because now there are a bunch of weird special-purpose words.&lt;/p&gt;
&lt;p&gt;Also a lot of weird reflexives, but I don't have the energy to work that out tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category><category term="Divine (conlang)"></category></entry><entry><title>Conlanging 2024-12-06</title><link href="https://mwchase.neocities.org/conlanging-2024-12-06" rel="alternate"></link><published>2024-12-06T05:00:00-05:00</published><updated>2024-12-06T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-12-06:/conlanging-2024-12-06</id><summary type="html">&lt;p class="first last"&gt;Introducing another project&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, so, I was &lt;em&gt;thinking&lt;/em&gt; about other projects today, but I can explain where I'm at with this conlang concept.&lt;/p&gt;
&lt;p&gt;Lately, my favored entry point for conlang development has been to come up with a grammatical feature or construct I want to mess with.
(If &lt;em&gt;someone else&lt;/em&gt; would take responsibility for the bulk of the worldbuilding in a project, I might be able to make progress on the conlang aspects, but given that my major worldbuilding project right now is currently hovering at &amp;quot;can I make eukaryotes exist in this setting?&amp;quot;...)
Anyway, my inspiration here was the concept of &amp;quot;what if the snooty ethereal beings were so snooty that their language considered 'we are good' a sentence fragment, and the grammatical version is something like 'we are better than you'?&amp;quot;
Basically, all sentences have to be explicitly a comparative construction, with the &lt;em&gt;stated&lt;/em&gt; reason that they're aware of the broader context for everything, and speaking in absolute terms is philosophically incoherent.
Why, someone speaking a &lt;em&gt;less refined&lt;/em&gt; language might say that a room is cold, but that implicitly privileges their own perspective, and such an utterance would be worthless to, say, a polar bear.&lt;/p&gt;
&lt;p&gt;Right now, I'm ignoring the question of phonology, roots, etc, and just trying to sketch syntax stuff.
I've got a bunch of ideas about movement or whatever, that may not actually make sense.
I'm going to have to work through a few examples, and see if I can make it work, or if I need a bunch of anaphora.&lt;/p&gt;
&lt;p&gt;Anyway, it's late and I should get ready for bed. Hopefully I'll be able to get some of this work done tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category><category term="Divine (conlang)"></category><category term="short post"></category></entry><entry><title>Diary 2024-12-05</title><link href="https://mwchase.neocities.org/diary-2024-12-05" rel="alternate"></link><published>2024-12-05T05:00:00-05:00</published><updated>2024-12-05T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-12-05:/diary-2024-12-05</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Oh boy, I want to keep typing, even though my head is foggy and my dominant hand is messed up.&amp;quot; Why am I like this?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I had more symptoms of &lt;em&gt;something&lt;/em&gt; today, and did get a bit of rest.
But I also did a small amount of conlang work.
I think I've got this one to a point where it makes sense to blog about what I'm trying to do with it, but I'm not ready to talk about anything in detail right now.&lt;/p&gt;
&lt;p&gt;Right now, sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-12-04</title><link href="https://mwchase.neocities.org/diary-2024-12-04" rel="alternate"></link><published>2024-12-04T05:00:00-05:00</published><updated>2024-12-04T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-12-04:/diary-2024-12-04</id><summary type="html">&lt;p class="first last"&gt;I can't make myself stop all the way, even when I maybe should.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was fighting off something migraine-esque today, so I probably should have actually made this post &lt;em&gt;even shorter&lt;/em&gt;.
Oh well.&lt;/p&gt;
&lt;p&gt;I'm still pondering stuff about MOTR, but I haven't yet convinced myself to touch any of the actual code yet.&lt;/p&gt;
&lt;p&gt;Aside from that, I'm reading stuff that's inspiring me to do stuff with one of my conlang ideas, so I'm trying to get something done there, but I don't feel like I've got anything to write about yet.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2024-12-03</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-12-03" rel="alternate"></link><published>2024-12-03T05:00:00-05:00</published><updated>2024-12-03T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-12-03:/weekly-roundup-2024-12-03</id><summary type="html">&lt;p class="first last"&gt;This cutting-edge stuff? Hard. This established and documented stuff? Also hard. Hoo boy.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I tried to understand what the COCHIS paper was saying about Scala.&lt;/li&gt;
&lt;li&gt;Thursday: I decided to move on from that specific section for now.&lt;/li&gt;
&lt;li&gt;Friday: I determined that I don't understand System F well enough to understand COCHIS.&lt;/li&gt;
&lt;li&gt;Saturday: I decided to muddle through, and to try to adapt COCHIS to the ML-like framework I want to work in.&lt;/li&gt;
&lt;li&gt;Sunday: OCaml is complicated.&lt;/li&gt;
&lt;li&gt;Monday: I decided to take a break from Impliciula, but came up with a general plan for how to proceed when I feel I'm ready.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, we'll see.
I'm working on revisiting MOTR, and I'm also poking at some other projects that I'd put down for a while.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category></entry><entry><title>Diary 2024-12-02</title><link href="https://mwchase.neocities.org/diary-2024-12-02" rel="alternate"></link><published>2024-12-02T05:00:00-05:00</published><updated>2024-12-02T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-12-02:/diary-2024-12-02</id><summary type="html">&lt;p class="first last"&gt;On the road; mostly just thought about stuff.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Traveled today, after a rough night's sleep.&lt;/p&gt;
&lt;p&gt;I've been thinking some about how I want to approach Impliciula development.
On reflection, it seems like it makes the most sense to decide on a subset of designs in the ML lineage, and then work on implementing that, &lt;em&gt;without&lt;/em&gt; any of the experimental features or quirky syntax ideas.&lt;/p&gt;
&lt;p&gt;Anyway, I spaced out and it's late.
Time to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2024-12-01</title><link href="https://mwchase.neocities.org/coding-2024-12-01" rel="alternate"></link><published>2024-12-01T05:00:00-05:00</published><updated>2024-12-01T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-12-01:/coding-2024-12-01</id><summary type="html">&lt;p class="first last"&gt;Nothing to see here.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Ugh.&lt;/p&gt;
&lt;p&gt;No real progress on Impliciula.
There's just too much of OCaml for me to casually take in.&lt;/p&gt;
&lt;p&gt;I'm going to have to find something else to focus on, and some other way to get the understanding I need for this.&lt;/p&gt;
&lt;p&gt;I'm trying to pick up my other projects for now; we'll see how that works out.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2024-11-30</title><link href="https://mwchase.neocities.org/coding-2024-11-30" rel="alternate"></link><published>2024-11-30T05:00:00-05:00</published><updated>2024-11-30T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-11-30:/coding-2024-11-30</id><summary type="html">&lt;p class="first last"&gt;I think the solution here is to figure out what the various nooks and crannies of OCaml's module system are for&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did not have the best of luck understanding System F vs COCHIS vs OCaml, so I'm just going to take some quick notes and get to bed.&lt;/p&gt;
&lt;p&gt;The COCHIS formalism presents things in terms of &amp;quot;deriving an implicit value (of some type) from some type&amp;quot;, while OCaml's modular implicits were more like &amp;quot;deriving an implicit module (conforming to some signature) from some type&amp;quot;.
My gut feeling is that this won't produce any major issues to adapting COCHIS, but I could be wrong.&lt;/p&gt;
&lt;p&gt;Also, I think I finally managed to translate the problematic Scala code into an OCaml-style system, and the resulting code is deeply un-idiomatic, but also I'm pretty sure it gets disallowed by aspects of COCHIS that were more chosen for ease of implementation than to guarantee stability.
So, ultimately, that's good for now, because I don't &lt;em&gt;think&lt;/em&gt; I have an objection to that part of COCHIS.&lt;/p&gt;
&lt;p&gt;Back to the difference between deriving types and modules, that does mean that I think it should be possible to have an implicit function where there's an essentially arbitrary relationship between input types and output types, but for one thing, I could be wrong, and for another thing, I guess that would be of limited use, but maybe I'm missing something.&lt;/p&gt;
&lt;p&gt;Anyway, it's late, and I should have wound down a while ago, but I'll settle for winding down now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2024-11-29</title><link href="https://mwchase.neocities.org/coding-2024-11-29" rel="alternate"></link><published>2024-11-29T05:00:00-05:00</published><updated>2024-11-29T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-11-29:/coding-2024-11-29</id><summary type="html">&lt;p class="first last"&gt;Eesh, this stuff is &lt;em&gt;confusing&lt;/em&gt;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hm.
I'm reading over the paper, and it's talking about presenting COCHIS in terms of System F.
I &lt;em&gt;should&lt;/em&gt; have experience with System F from working with OCaml and Haskell, but I was thinking I'd try to approach it from a stripped-down theoretical perspective, but I didn't make too much progress; I now have a general hand-wavy understanding of simply typed lambda calculus and System F, but I wouldn't expect too much of myself just yet.
I'm going to give the paper another shot now; plenty of time before posting.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;All right, I've skimmed over a bunch of the paper, and I'm going to try putting together prototypes based on its description of COCHIS.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, what I've figured out from this is that I need a better handle on System F, particularly how to handle &amp;quot;environments&amp;quot;, because that's something I didn't have in the simpler lambda calculus prototypes I knocked together today.&lt;/p&gt;
&lt;p&gt;As such, my plan now is to get a handle on System F implementations and write one myself to hack on and extend in accordance with the COCHIS paper's description.&lt;/p&gt;
&lt;p&gt;For now, I need to sleep off everything that happened today, intended and not.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2024-11-28</title><link href="https://mwchase.neocities.org/coding-2024-11-28" rel="alternate"></link><published>2024-11-28T05:00:00-05:00</published><updated>2024-11-28T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-11-28:/coding-2024-11-28</id><summary type="html">&lt;p class="first last"&gt;I can't tell if my arguments for why this shouldn't be a problem represent &amp;quot;a principled design decision&amp;quot; or &amp;quot;an ad-hoc bandaid fix&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I spent some more thought on the question of &amp;quot;what if there's a generic function and a specific function&amp;quot;, and on reflection, I think I do need to handle it somehow.
Encountering the behavior seems like it involves un-idiomatic code, but I can't wriggle out of this by being all like &amp;quot;well, you shouldn't write that&amp;quot;.&lt;/p&gt;
&lt;p&gt;The question I need to ponder (and figure out how to test in OCaml or read the documentation on) is, &amp;quot;does a module containing a generic function satisfy a module signature containing an instantiation of that generic function type?&amp;quot;&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Actually, that's a good question, but looking at specifically the scenario on page 12 of the COCHIS paper, I feel like there's something Scala is allowing that the design I'm groping towards does not, but I can't really tell for sure.
I'll have to just accept that this is apparently a problem in Scala, and read the rest of the paper.&lt;/p&gt;
&lt;p&gt;I feel like wrapping up this post early-ish and going through as much of the paper as I feel like after.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2024-11-27</title><link href="https://mwchase.neocities.org/coding-2024-11-27" rel="alternate"></link><published>2024-11-27T05:00:00-05:00</published><updated>2024-11-27T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-11-27:/coding-2024-11-27</id><summary type="html">&lt;p class="first last"&gt;Something something, it's easy to create a system you don't know how to break.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, these last couple days, I was distracted by something I don't think I'll ever explain here (except that I was wrong to doubt myself), but that should be over with now.&lt;/p&gt;
&lt;p&gt;Anyway, let's try to get through a bit more of the COCHIS paper before I get ready for bed.
As I said before, I got to the Scala section, and I'm having a bit of trouble due to having no Scala experience.
I can contrast what I'm seeing so far with how I want to do things in Impliciula, but I'm not sure if there's any point to that; I haven't read far enough to get a sense of what parts of Scala's design they want to highlight.
Let's see if I notice any key points in the next few minutes...&lt;/p&gt;
&lt;p&gt;&amp;quot;Scala implicits do allow for a wider range of applications than [Haskell] type classes.&amp;quot;
It then gives an example of this.&lt;/p&gt;
&lt;p&gt;Following that, it gives an example of an instance of instability in Scala.
I should take the time (which I don't have right now), to carefully study and translate the example, because I don't think I have any reason to expect my current design ideas to just happen to avoid the issue.
It could happen, but it would be complete luck on my part.&lt;/p&gt;
&lt;p&gt;From a brief look at the example, my intuition is that a naive translation would fail to compile, but it may be possible to &amp;quot;salvage&amp;quot; the instability in some way.&lt;/p&gt;
&lt;p&gt;Anyway, it's late; I'd better pack up, etc.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category></entry><entry><title>Weekly Roundup 2024-11-26</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-11-26" rel="alternate"></link><published>2024-11-26T05:00:00-05:00</published><updated>2024-11-26T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-11-26:/weekly-roundup-2024-11-26</id><summary type="html">&lt;p class="first last"&gt;Assorted things...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I started outlining a book or something, and had some thoughts about tachyons.&lt;/li&gt;
&lt;li&gt;Thursday: I started writing a solver for an online puzzle.&lt;/li&gt;
&lt;li&gt;Friday: I got the solver written; the output is pretty janky, but it worked.&lt;/li&gt;
&lt;li&gt;Saturday: Out of it.&lt;/li&gt;
&lt;li&gt;Sunday: I was still kind of out of it, so I made plans instead of rushing.&lt;/li&gt;
&lt;li&gt;Monday: I gave a shot at those plans, sketching out how the &lt;em&gt;current&lt;/em&gt; idea of Impliciula handles some stuff from the COCHIS paper.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, we'll see how I feel.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="Impliciula"></category></entry><entry><title>Coding 2024-11-25</title><link href="https://mwchase.neocities.org/coding-2024-11-25" rel="alternate"></link><published>2024-11-25T05:00:00-05:00</published><updated>2024-11-25T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-11-25:/coding-2024-11-25</id><summary type="html">&lt;p class="first last"&gt;This code is going to be so properly highlighted. [LIE]&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I'm looking over the COCHIS paper, and I want to try just translating the examples to my sketch syntax for Impliciula and see where things go wrong.&lt;/p&gt;
&lt;p&gt;The first sample to look at deals with ordering, and depends on the less-than-or-equal-to function.
We might translate this arrangement something like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;let module type Ord be signature
  type t
  {&amp;lt;=} (t, t -&amp;gt; bool)

let {&amp;lt;=}
  with implicit module O(Ord where t is &amp;#39;a)
be (&amp;#39;a, &amp;#39;a -&amp;gt; bool)
  O.{&amp;lt;=}


let implicit module IntOrd be
  let type t be int
  let {&amp;lt;=} be (int, int -&amp;gt; bool) Int.{&amp;lt;=}

let implicit module CharOrd be
  let type t be char
  let {&amp;lt;=} be (char, char -&amp;gt; bool) Char.{&amp;lt;=}

let implicit module PairOrd
  with implicit module O1(Ord) and implicit module O2(Ord)
be
  let type t be O1.t * O2.t
  iff v0 (t) &amp;lt;= v1 (t) then
    v0[0] &amp;lt;= v1[0] and {not {v1[0] &amp;lt;= v0[0]} or {v0[1] &amp;lt;= v1[1]}}

let sorted: l (list-of: &amp;#39;a)
  with implicit module O(Ord where t is &amp;#39;a)
be (list-of: &amp;#39;a)
  ...
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Among other things, I haven't really nailed down the tuple syntax.
Regardless...&lt;/p&gt;
&lt;p&gt;I'd say a key difference between that sample and the bits of the COCHIS paper that I'm adapting is that I'm using modules, so they're not explicitly parameterized by the type, and instead have to match it with where-clauses and attributes.
This might or might not totally break COCHIS, we'll see.&lt;/p&gt;
&lt;p&gt;Reading ahead, we see that, at least in Haskell, a blanket implementation of a typeclass allows leaving the typeclass requirement off of a function definition.
(I think.
I'm not totally sure I'm reading this right.)
That sounds like something I don't want to do in Impliciula.&lt;/p&gt;
&lt;p&gt;Anyway, I got to the Scala section and my eyes glazed over a little.
I'm going to assume that's a &amp;quot;me&amp;quot; problem, and I should start winding down a little early.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category></entry><entry><title>Diary 2024-11-24</title><link href="https://mwchase.neocities.org/diary-2024-11-24" rel="alternate"></link><published>2024-11-24T05:00:00-05:00</published><updated>2024-11-24T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-11-24:/diary-2024-11-24</id><summary type="html">&lt;p class="first last"&gt;Not much done, so planning for the future.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hm.
I was just kind of fried today, so if I'm going to have anything to talk about, I'm going to figure it out and write it up &lt;em&gt;right now&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Nothing coming to mind for tonight, so I'm just going to try to get my thoughts in order about stuff I can work on in the future.
I recently read &lt;a class="reference external" href="https://thunderseethe.dev/posts/traits-are-a-local-maxima/"&gt;a blog post about modular implicits&lt;/a&gt; that mentioned a few things about them that I hadn't realized; like that the reason they haven't achieved much penetration in the past decade is that the precise details of a &amp;quot;good&amp;quot; implementation haven't been nailed down yet.
The post also mentioned a paper on a system called COCHIS that could address some implementation issues.&lt;/p&gt;
&lt;p&gt;So, what I need to figure out for Impliciula is whether it's possible to put the following ideas together:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;COCHIS semantics&lt;/li&gt;
&lt;li&gt;Within an ML module framework&lt;/li&gt;
&lt;li&gt;Possibly with some kind of &amp;quot;default&amp;quot; setup that is subject to similar constraints as the trait system in Rust.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Something like, you either have to own the signature or every public type in a module to make it a default implicit?
No idea right now whether that works and even makes sense.&lt;/p&gt;
&lt;p&gt;Anyway, I really should stop staring at this screen.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-11-23</title><link href="https://mwchase.neocities.org/diary-2024-11-23" rel="alternate"></link><published>2024-11-23T05:00:00-05:00</published><updated>2024-11-23T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-11-23:/diary-2024-11-23</id><summary type="html">&lt;p class="first last"&gt;I made bad decisions. Nothing more to it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Oh boy, I let things go way too late.
No point trying to write anything more substantial.
Have to sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2024-11-22</title><link href="https://mwchase.neocities.org/coding-2024-11-22" rel="alternate"></link><published>2024-11-22T05:00:00-05:00</published><updated>2024-11-22T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-11-22:/coding-2024-11-22</id><summary type="html">&lt;p class="first last"&gt;I did it. Not much more to it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;About a hundred lines of Python later, I've got a solver working.
We'll see if this gets me to put Domino Fit down.&lt;/p&gt;
&lt;p&gt;It's late and I don't have anything else in mind to talk about.
Maybe something new tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="short post"></category></entry><entry><title>Coding 2024-11-21</title><link href="https://mwchase.neocities.org/coding-2024-11-21" rel="alternate"></link><published>2024-11-21T05:00:00-05:00</published><updated>2024-11-21T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-11-21:/coding-2024-11-21</id><summary type="html">&lt;p class="first last"&gt;I feel a deep need to ruin this for myself.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Recently, I've been playing a daily puzzle game called &lt;a class="reference external" href="https://dominofit.isotropic.us/"&gt;Domino Fit&lt;/a&gt;.
It's really interesting, but after I discovered some ways of getting bragging rights in the score screen, I've been thinking about it way too hard.
As such, I'm trying to code up a solver so I can, um, exorcise my urge to play it.&lt;/p&gt;
&lt;p&gt;I don't have anything to show off yet; I'm still working on encoding the state of everything into z3.
I'm working inspired from &lt;a class="reference external" href="https://www.hillelwayne.com/post/sudoku/"&gt;How to Solve the Sudoku Puzzle with programming&lt;/a&gt;, which I &lt;em&gt;swear&lt;/em&gt; is a real post, except I'm using the Python bindings to z3 instead of generating DIMACS.&lt;/p&gt;
&lt;p&gt;I should have something that works in a day or two, but at the moment, I once again really need to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="short post"></category></entry><entry><title>Diary 2024-11-20</title><link href="https://mwchase.neocities.org/diary-2024-11-20" rel="alternate"></link><published>2024-11-20T05:00:00-05:00</published><updated>2024-11-20T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-11-20:/diary-2024-11-20</id><summary type="html">&lt;p class="first last"&gt;Too weird for me to know how to tag it right now.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I'm working on outlining for that writing.
This is going to be some kind of book, or zine, I don't really have an idea of the length.
I guess it's a &amp;quot;manifesto&amp;quot;?
We'll see.&lt;/p&gt;
&lt;p&gt;Anyway, aside from that, I realized today that thinking about &lt;a class="reference external" href="https://www.gregegan.net/ORTHOGONAL/02/Motion.html"&gt;energy-momentum vectors&lt;/a&gt; in a principled fashion gives &lt;em&gt;relatively&lt;/em&gt; straightforward descriptions of how tachyons would work, so naturally I tried to figure out what it would imply.
Various issues arose, such as &amp;quot;it looks like a particle following a spacelike trajectory should be able to bounce off of events in time&amp;quot;, and &amp;quot;hey, wait, multiple particles &lt;em&gt;individually&lt;/em&gt; following spacelike trajectories can have a combined energy-momentum vector that points in a timelike direction, what the heck?&amp;quot; and &amp;quot;I don't know what to call the minimum magnitude of a tachyon's momentum, which it attains at infinite speed, (which also gives it zero total energy)&amp;quot;.&lt;/p&gt;
&lt;p&gt;Basically, it turns out that there are problems way more interesting than blindly plugging in for the Lorentz and going &amp;quot;oops, looks like the mass is imaginary&amp;quot;.
It seems to me that different trajectory types have different associated quantities:
rest mass, energy, and, um, the fundamental quantity for tachyons seems to be something that Wikipedia doesn't list a derived unit for.
Is there a single-part name for the &amp;quot;Watt-meter&amp;quot;?&lt;/p&gt;
&lt;p&gt;Anyway, I was messing around and I'm up too late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2024-11-19</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-11-19" rel="alternate"></link><published>2024-11-19T05:00:00-05:00</published><updated>2024-11-19T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-11-19:/weekly-roundup-2024-11-19</id><summary type="html">&lt;p class="first last"&gt;You should simply not have this happen to you.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I was learning the Shaw alphabet, even though I'm still not sure why.&lt;/li&gt;
&lt;li&gt;Thursday: Pain.&lt;/li&gt;
&lt;li&gt;Friday: Relaxation.&lt;/li&gt;
&lt;li&gt;Saturday: I made some efforts to apply what I've learned with the Shaw alphabet to... something.&lt;/li&gt;
&lt;li&gt;Sunday: We traveled, and I didn't have anything to say.&lt;/li&gt;
&lt;li&gt;Monday: I came up with something to work on, but I don't want to talk about it yet.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I've got a few things I can look at.
(Turns out I didn't really want to make fun of Terrence Howard as much as I thought I did.)&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="adventures in migraine"></category></entry><entry><title>Diary 2024-11-18</title><link href="https://mwchase.neocities.org/diary-2024-11-18" rel="alternate"></link><published>2024-11-18T05:00:00-05:00</published><updated>2024-11-18T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-11-18:/diary-2024-11-18</id><summary type="html">&lt;p class="first last"&gt;Better than a concept of a plan, but not by much.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Traveled back.
I have an idea for stuff to write that's likely going to be challenging, but I think it has the potential to be really helpful, um, whenever I finish it.
Which could take a while.
Whatever; the need for it isn't going to vanish over time.&lt;/p&gt;
&lt;p&gt;I don't want to describe it right now, because I've just barely gotten started and I want to keep up my motivation; there's also a good chance that the concept ends up very different from what I'm currently envisioning.
There are some ideas I have that I know for sure are going to be hard to pull off.&lt;/p&gt;
&lt;p&gt;For now, I should get ready for bed.
Maybe get some quick Shaw alphabet practice in.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-11-17</title><link href="https://mwchase.neocities.org/diary-2024-11-17" rel="alternate"></link><published>2024-11-17T05:00:00-05:00</published><updated>2024-11-17T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-11-17:/diary-2024-11-17</id><summary type="html">&lt;p class="first last"&gt;On the road again; nothing to see here.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Weird day today.
Some travel, so I'm writing this somewhat late.
I'm messing around a little with the Clifford universe worldbuilding, but nothing really interesting yet.&lt;/p&gt;
&lt;p&gt;I was trying to think of something else to say, but I don't have anything else in mind apparently, so I'm going to wrap things up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-11-16</title><link href="https://mwchase.neocities.org/diary-2024-11-16" rel="alternate"></link><published>2024-11-16T05:00:00-05:00</published><updated>2024-11-16T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-11-16:/diary-2024-11-16</id><summary type="html">&lt;p class="first last"&gt;Taking things slow, one step at a time, trying not to be frustrated with my current pace...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Still taking things easy.
I'm still looking for direction with my projects.
Learning the Shaw alphabet has inspired me to attempt similar-ish things for other languages, with the obvious caveat that no native speaker of these languages has asked me for such a thing.&lt;/p&gt;
&lt;p&gt;Maybe I can repurpose this draft to be for another language, or try doing this with a conlang.&lt;/p&gt;
&lt;p&gt;Anyway, I'm sleepy and I don't have anything I &lt;em&gt;should&lt;/em&gt; be doing currently.
Going to wrap things up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-11-15</title><link href="https://mwchase.neocities.org/diary-2024-11-15" rel="alternate"></link><published>2024-11-15T05:00:00-05:00</published><updated>2024-11-15T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-11-15:/diary-2024-11-15</id><summary type="html">&lt;p class="first last"&gt;&lt;em&gt;Slightly&lt;/em&gt; more than nothing to see here.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I &lt;em&gt;think&lt;/em&gt; that worked.
I don't think I'll know for sure until morning.&lt;/p&gt;
&lt;p&gt;I'm... not sure I'll do much of &lt;em&gt;anything&lt;/em&gt; until morning.
I guess that was sort of the idea?&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to go space out.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-11-14</title><link href="https://mwchase.neocities.org/diary-2024-11-14" rel="alternate"></link><published>2024-11-14T05:00:00-05:00</published><updated>2024-11-14T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-11-14:/diary-2024-11-14</id><summary type="html">&lt;p class="first last"&gt;Further frustration...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Uuuuuuuuuuuuuuuuuuuuuuuuuuugh...&lt;/p&gt;
&lt;p&gt;I'm going to get &lt;em&gt;blasted&lt;/em&gt; tomorrow and see if that fixes this.&lt;/p&gt;
&lt;p&gt;For now, I don't really have anything to do or talk about.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-11-13</title><link href="https://mwchase.neocities.org/diary-2024-11-13" rel="alternate"></link><published>2024-11-13T05:00:00-05:00</published><updated>2024-11-13T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-11-13:/diary-2024-11-13</id><summary type="html">&lt;p class="first last"&gt;Frustration...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm still fighting off a migraine, which is doing my ability to focus no favors whatsoever.
Unfortunately, the &lt;em&gt;intellectual&lt;/em&gt; awareness that it's good sense to rest and not push myself isn't helping me deal with the fact that I want to be writing, and coding, and maybe learning other things, and it's not helping me be okay with the fact that the thing I'm doing right now, I don't know &lt;em&gt;why&lt;/em&gt; I'm doing it.&lt;/p&gt;
&lt;p&gt;𐑤𐑲𐑒, 𐑢𐑫𐑛 𐑧𐑯𐑦𐑢𐑳𐑯 𐑚𐑰 𐑦𐑯𐑑𐑼𐑧𐑕𐑑𐑩𐑛 𐑦𐑯 𐑮𐑰𐑛𐑦𐑙 𐑚𐑤𐑪𐑜 𐑐𐑴𐑕𐑑𐑕 𐑦𐑯 𐑞 ·𐑖𐑷 𐑨𐑤𐑓𐑩𐑚𐑧𐑑?&lt;/p&gt;
&lt;p&gt;I've got some general idea that I could use this stuff in graphic design or something; the pure-English version of, like &amp;quot;this tattoo says 'wisdom'&amp;quot; or whatever.
I don't know.
And I'm probably not going to figure it out while my neck hurts this much, but accepting my limits here feels like giving up.&lt;/p&gt;
&lt;p&gt;At the same time, what else am I going to do right now?
I really should just finish this post and try to fix my neck.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2024-11-12</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-11-12" rel="alternate"></link><published>2024-11-12T05:00:00-05:00</published><updated>2024-11-12T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-11-12:/weekly-roundup-2024-11-12</id><summary type="html">&lt;p class="first last"&gt;I have no idea, either.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I prepared to read and mock &lt;em&gt;One Times One Equals Two&lt;/em&gt; by Terrence Howard.&lt;/li&gt;
&lt;li&gt;Thursday: I used that as a jumping-off point to look at &lt;em&gt;The Universal One&lt;/em&gt; by Walter Russell, which is where Terrence Howard gets some of his random diagrams from.&lt;/li&gt;
&lt;li&gt;Friday: I tried to analyze the differences between Terrence Howard's interpretation of Walter Russell and mine, but I got sidetracked by the fundamental, overriding, pervasive flaw in Terrence Howard's writing, which is that it's just really obviously stupid.&lt;/li&gt;
&lt;li&gt;Saturday: I pointed out a bunch of things that Terrence Howard doesn't understand nearly as well as he thinks he does (when I was listing them, I forgot Latin), and then got excited because he mentioned Norman Wildberger, which is a good enough excuse to read an &amp;quot;alternative math&amp;quot; book by someone who's at least &lt;em&gt;competent&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Sunday: The wheel of hyperfixation unexpectedly spun, and landed on &amp;quot;learn the Shaw alphabet&amp;quot;, so, um, okay.&lt;/li&gt;
&lt;li&gt;Monday: Handwriting gave me some trouble, but it was mostly the pen's fault.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm either going to figure out how to keep on writing blog posts from trying to learn Shavian, or I'm going to find &lt;em&gt;something&lt;/em&gt; to say about &lt;em&gt;Divine Proportions&lt;/em&gt;.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="making fun of celebrities"></category></entry><entry><title>Diary 2024-11-11</title><link href="https://mwchase.neocities.org/diary-2024-11-11" rel="alternate"></link><published>2024-11-11T05:00:00-05:00</published><updated>2024-11-11T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-11-11:/diary-2024-11-11</id><summary type="html">&lt;p class="first last"&gt;I hadn't done much handwriting in a while, and my hand was a little tender...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got some tech for handling the Shavian alphabet on my various electronics, and right now I'm focusing on handwriting it.
Not totally sure where I'm going with any of this, but I'm going somewhere, presumably.&lt;/p&gt;
&lt;p&gt;I did have a bit of trouble with the new pen I was using failing to put down ink.
I... may have called this &amp;quot;𐑒𐑢𐑽𐑓𐑴𐑚𐑾&amp;quot; as a joke.
I wonder how the fonts I'm using will cope with Shavian text; I can say for sure that whatever my terminal is doing, it's pretty disappointing.
Like, why are the letters getting the thinnest possible stroke?&lt;/p&gt;
&lt;p&gt;Oh well, hopefully it works out.
We'll see.&lt;/p&gt;
&lt;p&gt;Anyway, I'm tired and I want to wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-11-10</title><link href="https://mwchase.neocities.org/diary-2024-11-10" rel="alternate"></link><published>2024-11-10T05:00:00-05:00</published><updated>2024-11-10T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-11-10:/diary-2024-11-10</id><summary type="html">&lt;p class="first last"&gt;My whims shifted.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I didn't have the focus today to read more of Terrence Howard's incoherent nonsense, or to argue with Norman Wildberger's, um, coherent statements.
See, the nice thing about Norman Wildberger is that I can look at &lt;em&gt;specific points&lt;/em&gt; and decide whether I agree with them, rather than just gesturing vaguely at word salad.&lt;/p&gt;
&lt;p&gt;Anyway, for whatever reason, what I felt like looking at &lt;em&gt;today&lt;/em&gt; was the Shavian alphabet.
Not sure where I'm going with this, but I'll mess around with it for a bit.
I should dig out my sketchbook and start messing around.
Anyway, for now I should get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Terryology 2024-11-09</title><link href="https://mwchase.neocities.org/terryology-2024-11-09" rel="alternate"></link><published>2024-11-09T05:00:00-05:00</published><updated>2024-11-09T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-11-09:/terryology-2024-11-09</id><summary type="html">&lt;p class="first last"&gt;I think &amp;quot;I'll try to be less mean&amp;quot; and then &lt;em&gt;this&lt;/em&gt; happens.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Oh boy.
I've gotten to page 39, so Terrence is mixing it up a little.
Not content with being wrong about arithmetic, physics, chemistry, and probably other things I've forgotten, he branches out into saying incoherent things about English grammar.
This sort of ties in with a general theme in his work, where he tries to define the behavior of reality in terms of (his understanding of) the English language.
Like, &amp;quot;multiplication, which by definition means, 'To make greater.'&amp;quot; on page 24.
On page 39, he says that &amp;quot;In long form writing it is expressed as follows 'One time(s) ␍
One.'&amp;quot;
I don't think I've ever seen that, and then he tries to argue that the (optional according to him?) s makes it a plural.
There are actually so many different things wrong with this that I'm having trouble deciding how many there are.
One is that the word being used for the multiplication operation doesn't have anything that could be a plural marker in other languages, like Spanish &amp;quot;por&amp;quot;.
This segues into another related issue, which is that we can just as easily say &amp;quot;one by one&amp;quot; in English.
However, it's important to note that mathematical terminology can sometimes be a fraught area when it comes to grammar.
In English, numbers go before adjectives, but mathematical expressions are used as arguments to verbs, so they ought to be nouns.
And the usage of &amp;quot;by&amp;quot; and &amp;quot;divided by&amp;quot; seems to indicate that mathematical operations are prepositions, but we understand indicating addition with &amp;quot;and&amp;quot;, and when it comes to indicating more advanced operations, it's often the case that they come &lt;em&gt;after&lt;/em&gt; the number, like &amp;quot;squared&amp;quot; or &amp;quot;factorial&amp;quot;.
These could be sort for &amp;quot;the square of&amp;quot; and &amp;quot;the factorial of&amp;quot;, but the abbreviation scheme isn't consistent: consider how &amp;quot;the square root of&amp;quot; becomes &amp;quot;root&amp;quot; &lt;em&gt;before&lt;/em&gt; the number.
To say nothing of &amp;quot;sine squared&amp;quot;, in which &amp;quot;squared&amp;quot; now comes before the number, or is it after &amp;quot;sine&amp;quot;?
Despite the weird number of things going on, this all works well enough, as a means of communication, and not some kind of magical language to bind the nature of reality.&lt;/p&gt;
&lt;p&gt;I mean, ultimately, nobody is reading this looking for a proper debunking, because I'm pretty sure nobody else really believes what Terrence is saying.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;What about the editor?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;This book had an editor?&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;I mean, it &lt;em&gt;says&lt;/em&gt; it had an editor, and last we checked, that person had a website with computer generated images like the ones in the book...&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Truly, a deeper mystery than any question Terrence raised on purpose.&lt;/p&gt;
&lt;p&gt;But enough snark, let's see if I can find anything interesting.&lt;/p&gt;
&lt;blockquote&gt;
Again, if we are discussing Light and the unquestionable constant of the speed of light, a measurement that we are told is unchanging. Light is believed to travel faster than most things within our 3-D Universe. Due to the seemingly instantaneous transference of information across the electrified Universe as observed in Birkeland Currents, we know that electricity is not limited to the speed of Light, it is much faster. Yet, Light a radiative product of a magnetic interaction isn’t doing so bad coming in a close second. Remember, Radiant Light moves in the opposite direction of Electricity and Light’s centrifugal expansion is at a higher ratio than the centripetal contraction of Electricity, which leaves behind the effects of gravity, as a by product!&lt;/blockquote&gt;
&lt;ol class="arabic simple" start="42"&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This was kicked off by him recounting one of his elementary school teacher's presumably increasingly desperate attempts to get him to do multiplication properly.
(I mean, the way he tells it, I can't figure out where she was going with it.)
There's a lot there, and I'm fairly confident that none of it came into play &lt;em&gt;at the time&lt;/em&gt;.
Let's try to salvage some points of legitimate interest from all of this gawking:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I kind of glazed over a bunch of pages where Terrence was talking about, like, Einstein, and Superman, and Pythagoras, and stuff. Does he explain anywhere what he means by &amp;quot;Radiant Light&amp;quot;?&lt;/li&gt;
&lt;li&gt;What are Birkeland Currents? Who claims that they exhibit ftl effects?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let's see:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;That is, in fact, the only time he uses the word &amp;quot;Radiant&amp;quot; in &lt;em&gt;One Times One Equals Two&lt;/em&gt;, so I'm just going to ignore it for now.&lt;/li&gt;
&lt;li&gt;Birkeland currents are a geomagnetic phenomenon that, among other things, cause the aurorae. It has been hypothesized that a similar phenomenon could be responsible for the periodic radiation patterns of particular stars, through the creation of waves that &amp;quot;move faster than light&amp;quot; without carrying information or particles.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let me break out of the list to try to explain.
Imagine you have a very powerful laser pointer, and you're standing at the center of a cylindrical room ten light-minutes in radius.
(Please ignore the material engineering issues inherent in this hypothetical.)
You turn on the laser pointer, and set it horizontally.
Twenty minutes pass, and the dot appears.
(It is a &lt;em&gt;very&lt;/em&gt; powerful laser pointer.)
Over the course of the next minute, you rotate it through three quarters of a circle, hold for ten seconds, then turn it off.&lt;/p&gt;
&lt;p&gt;For twenty more minutes, nothing happens to the dot.
Then, it starts moving steadily across the wall, somewhat slower than the second hand of a clock, but seemingly moving over forty times the speed of light!
A minute passes, and the dot sheds its impossible speed just as easily as it picked it up, then, ten seconds later, finally disappears.&lt;/p&gt;
&lt;p&gt;The key reason this is &lt;em&gt;not a problem for our current understanding of physics&lt;/em&gt; is that being next to the dot at one moment gives you no information about the pace where the dot just was previously; it's all completely different light.&lt;/p&gt;
&lt;p&gt;Anyway, let's give it another shot.
Maybe this time I'll have the patience to wait for him to quote or namedrop someone.&lt;/p&gt;
&lt;p&gt;Aww yeah, &amp;quot;NJ Wildberger&amp;quot; (51).
This is now a Norman Wildberger discussion blog.
I will still quickly explain what Terrence is getting wrong here.
Wildberger is a finitist; among other things, he doesn't feel that it makes sense to talk about irrational numbers, where part of his concern is the lack of an exact decimal representation.
Terrence brings up the square root of two here, and I feel the only way to do justice to Wildberger here is to enumerate the three different viewpoints in play here:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Most mathematicians consider the square root of two to be an irrational number.&lt;/li&gt;
&lt;li&gt;Wildberger accepts at least one proof that there is no rational number whose square is exactly two.&lt;/li&gt;
&lt;li&gt;Terrence categorically rejects all proofs that there is no rational number whose square is exactly two.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In my capacity as a CS (Computer Sicko), I have a lot of interest in Wildberger's work in finitist mathematics, and I'd like to be better read in that area than I currently am.
This is because it's helpful when a computational procedure terminates in a finite (ideally small) number of steps, and provides an accurate answer.
This opinion needs to be qualified with the caveat that although I think of these as practical concerns, I haven't actually written code based on Wildberger's work, so I can't honestly say that my motivations here are, as yet, anything other than aesthetic.&lt;/p&gt;
&lt;p&gt;With that said, the idea of developing a discrete geometry, as I understand Wildberger has done, is neat, in the same way that I was saying that semirings look neat.
At the same time, I'm not interested in restricting myself to finite mathematics, and I'm now remembering my attempts to work with Dafny.
Perhaps I'll look into that again later.&lt;/p&gt;
&lt;p&gt;Anyway, I think I'm done for tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Terryology"></category><category term="making fun of celebrities"></category></entry><entry><title>Terryology 2024-11-08</title><link href="https://mwchase.neocities.org/terryology-2024-11-08" rel="alternate"></link><published>2024-11-08T05:00:00-05:00</published><updated>2024-11-08T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-11-08:/terryology-2024-11-08</id><summary type="html">&lt;p class="first last"&gt;These guys would have done better to avoid marketing this to scientists and engineers, just saying.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;While I could keep making fun of Walter Russell's element charts (and I kind of want to), I think the more interesting thing I'm seeing in his writings are references to action and reaction, references to Newton, which Terrence Howard repeats.
What's interesting to me is how the reference to Newton kind of doesn't work.
In the context of Newton's third law, action and reaction are balanced &lt;em&gt;forces&lt;/em&gt; which occur &lt;em&gt;simultaneously&lt;/em&gt;.
According to Russell, action and reaction are &lt;em&gt;successive motions&lt;/em&gt;.
These are a different kind of physical quantity, and there isn't an obvious mathematical relation between action and reaction under Russell's (minutes-long pause as I decide what to type) philosophy.&lt;/p&gt;
&lt;p&gt;So, let's see what kind of stuff Terrence Howard does with this.
On page 19, we see him describe &amp;quot;1 x 1 =(ing) 1&amp;quot; as &amp;quot;ACTION times ACTION without a REACTION&amp;quot;.
Now, I didn't read too much of Russell, but it seems clear to me that the numerological meaning that Terrence is assigning to the number 1 is basically the same as Russell's idea of a single, indivisible mental substance that creates the appearance of our reality through thought.
However, associating it also to &amp;quot;action&amp;quot; represents, I think, a break with Russell.
From Russell, I see that One is mind, thought is motion, motion is action and reaction.
From Terrence, One is action and reaction, and presumably therefore motion, so I'm not clear on how Terrence's ideas could relate to Russell's concepts of &amp;quot;stillness&amp;quot; or &amp;quot;inertia&amp;quot;.&lt;/p&gt;
&lt;p&gt;Anyway, I decided to read a bit further ahead, and I noticed something kind of amusing.
On page 38 (both versions), Terrence refers to the cover of the book, and the question it asks.
This is basically comprehensible in the earlier version, where the cover does have a question on it, but the later version doesn't have any text, punctuation, anything like that.
The editor (I'm still baffled that there allegedly is one) asleep at the wheel as usual, I see.&lt;/p&gt;
&lt;p&gt;Although that question, being about money, does get at the heart of one of the darkly humorous aspects of this whole endeavor.
Paraphrased:&lt;/p&gt;
&lt;p&gt;&amp;quot;I think the bank is ripping me off.&amp;quot;
&amp;quot;Really? What makes you suspect that?&amp;quot;
&amp;quot;You see, the transcendent nature of mind and being...&amp;quot;&lt;/p&gt;
&lt;p&gt;Also, why is it that Terrence is so concerned about, in essence, conserving the number of symbols on each side of an equals sign (4, 18, 19, 49, 52) but claims that matter can spontaneously generate (35)?
I mean, when it comes to ice, it's &amp;quot;just&amp;quot; that he's drawing a distinction between water and moisture for some reason, but he does in fact seem to be saying that hydrogen will simply appear in a sufficiently star-like environment.&lt;/p&gt;
&lt;p&gt;That's all for now; I'm feeling kind of egh right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Terryology"></category><category term="making fun of celebrities"></category></entry><entry><title>Terryology 2024-11-07</title><link href="https://mwchase.neocities.org/terryology-2024-11-07" rel="alternate"></link><published>2024-11-07T05:00:00-05:00</published><updated>2024-11-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-11-07:/terryology-2024-11-07</id><summary type="html">&lt;p class="first last"&gt;Talking about math even though I intended not to, then clowning on a guy who'd be over a hundred and fifty years old.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;One thing I want to look at about Terrence Howard's beliefs is the way that many of them didn't form in a vacuum.
Aside from some annoyingly common beliefs, he also, let's say, &amp;quot;cites&amp;quot;, previous works of pseudoscience by other people, as well as fringe or niche areas of mathematics that he frankly does no favors by mentioning.&lt;/p&gt;
&lt;p&gt;Hold on, before I get into that, let's take a moment to think about &amp;quot;citation&amp;quot;.
Terrence Howard's book, apparently called &lt;em&gt;One Times One Equals Two&lt;/em&gt; has a strange layout, and there are multiple versions available.&lt;/p&gt;
&lt;p&gt;I was previously working from a version I downloaded from a now-defunct Flat Earth website (which is amusing, because he explicitly believes in a spherical Earth with atmosphere fading into vacuum), which uses various pictographs on the title page, and has the mirror image of the title page as the back cover.
The version I'll be mostly using this month has an abstract wash of color for the title page, with a flower in the upper middle, and a symbol in the lower middle.
Each version has an end page with a date, and the Wash Of Color version has a later date (September 23, 2020) than the Pictograph version (May 19, 2019).&lt;/p&gt;
&lt;p&gt;The pages are numbered starting from 1 on the title page.
Most pages have a pair of columns that &lt;em&gt;look like&lt;/em&gt; pages, but the page number is outside and between the columns.
There is little enough on a given page that it should usually suffice to simply cite by page number.&lt;/p&gt;
&lt;p&gt;With all that said, let's see what jumps out at me.&lt;/p&gt;
&lt;p&gt;Hmm.
I've actually got some mathematical ideas from looking at this.
Probably not novel, and I know of some prior art that's pretty close.
On page 15, Terrence makes some comments about the act of multiplying 1 by 1, which are entirely fatuous in the context of standard mathematical abstractions.
Talking about how the 1's are things that have to be conserved.
I thought to myself, having apparently not gotten this out of my system yesterday/two months ago,&lt;/p&gt;
&lt;p&gt;&amp;quot;Oh, come on. If you do nothing, and then you do nothing again, then overall you did nothing. ... If you do nothing for a minute, and then do nothing for a minute again, then you did nothing, but. But it took two minutes. Which we don't care about. But what if we did?&amp;quot;&lt;/p&gt;
&lt;p&gt;Suppose we have a magma, and we pick out a set of generators, which need not be minimal or finite, and to each generator in the set we assign a cost.
(For reasons of elegance, the identity element, if any, should have a cost of zero unless there's a specific reason to give it a higher cost.)
When we apply the monoid operation to two elements with associated costs, we add the costs together, to produce the cost associated with the result.
We can divide all possible (element, cost) pairs into equivalence classes based on the element, and take the one with the smallest cost in a given class as representative.
Fans of recreational mathematics will recognize this as one way of thinking about &amp;quot;God's number&amp;quot;, an idea that I imagine will sound interesting to Terrence until he realizes how much it has to do with cubes.&lt;/p&gt;
&lt;p&gt;I can imagine various variants of this idea, such as using sets of generators instead of numeric costs, associating each generator to the set containing only itself, using set union instead of addition, and creating a function from each element to the subset of the power set of generators associated with it.
The other thing that comes to mind is to look for a semiring that would do something interesting if you took the direct product with the tropical semiring.
Actually, semirings in general look neat.
I should mess around with them.&lt;/p&gt;
&lt;p&gt;Anyway, let's see if anything else jumps out at me.&lt;/p&gt;
&lt;p&gt;The next thing I ended up looking into has a lot more to dig into, and I'll see what I can find out about it later.
Basically, I got to page 32, where he reproduces Walter Russell's goofy circle element chart, and I decided to look into it some.
I took a look at The Universal One, and I have to say, these takes on Mendeleev's 1904 revision of the periodic table are fascinating, and not in a good way.&lt;/p&gt;
&lt;p&gt;Before the discovery of the noble gasses, elements were grouped into &amp;quot;octaves&amp;quot; of seven each, with the idea that the elements regularly cycle through different properties as atomic weight increases.
This concept informed the development of the periodic table; at one point, the groups of the periodic table corresponded to the different members of the octave, with an additional group for the &amp;quot;triad&amp;quot; that separated some pairs of octaves, and was seen to mediate between them.
When the noble gasses were discovered, they were originally put on the left, with a gap in the group following every period that ended in a triad.
The resulting jagged chart looks strange to us now, but the main concern at the time was, like, copper shouldn't be classified as an alkali metal, right?
Like, that just doesn't make sense.&lt;/p&gt;
&lt;p&gt;Anyway, Walter Russell, writing presumably sometime after 1920, criticized the 1904 revision, which, like, could he have done a later one instead?
I get that he didn't have a search engine...
Anyway, he declared that there were &amp;quot;missing&amp;quot; noble gasses (which would presumably go somewhere between group 8 and group 10 in the modern table), but also that various elements were in the wrong place.
He disagreed with the existence of Group VIII (groups 8 to 10 today), but some of his other decisions were... confusing, from a modern perspective.
He takes no issue with the equivalent of the first three periods (understandable, as they fit with the octave concept that he's trying to revive), and then he gets partway through the fourth period, gives his blessing to scandium (modern group 3) as being in group III (which until then had corresponded to modern group 13), and then highlights everything from titanium to germanium as out-of-place, including gallium, which would actually make sense to go under boron and aluminum.
He does generally keep up this pattern, so I guess he's being consistent...&lt;/p&gt;
&lt;p&gt;He also calls out large gaps in the lower rows.
Uh, yeah, Walter, that's because &lt;em&gt;those elements hadn't been discovered yet&lt;/em&gt;.
What were they &lt;em&gt;supposed&lt;/em&gt; to put in those spots?
(Putting aside that the lower periods were doubled up, and the lanthanoids and actinoids hadn't been separated out properly.)
Basically, this chart had problems, but it got important things right, and Walter Russell seems to have had an amazing instinct for getting those categories exactly backwards.&lt;/p&gt;
&lt;p&gt;Reading the chapters around that caption for context, I can see a lot of the buzzwords that Terrence tends to pull out.&lt;/p&gt;
&lt;p&gt;Anyway, I'll see where my interest takes me next.
For now, if I don't get ready for bed, I will regret it.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Terryology"></category><category term="making fun of celebrities"></category></entry><entry><title>Terryology 2024-11-06</title><link href="https://mwchase.neocities.org/terryology-2024-11-06" rel="alternate"></link><published>2024-11-06T05:00:00-05:00</published><updated>2024-11-06T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-11-06:/terryology-2024-11-06</id><summary type="html">&lt;p class="first last"&gt;I didn't want to be seen as jumping on a bandwagon, but on reflection, why do I care about that?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I write this a few months before I plan to publish it.
As the US presidential election bears inexorably down upon us, I find myself remembering how I distracted myself in the weeks following the last one: reading the nonsensical work of one Terrence Dashon Howard.&lt;/p&gt;
&lt;p&gt;Now, ever since his appearance on &lt;em&gt;The Joe Rogan Experience&lt;/em&gt; earlier this year, it's been fashionable, though by no means new, to try to explain the problems with Terryology from a mathematical perspective.
People were jumping into his Twitter replies the moment he published a &amp;quot;paper&amp;quot; in a tweet, and my later attempts to explain group theory for SoME were inspired by his failure to understand &lt;em&gt;why&lt;/em&gt; particular fundamental concepts of groups are the way they are.&lt;/p&gt;
&lt;p&gt;However, in the years since, I've come to realize that such critiques cannot hope to convince Terrence himself, because they buy into a fundamental misunderstanding on Terrence's part.
In short, he cannot currently be convinced of the falsity of &lt;tt class="docutils literal"&gt;1 x 1 = 2&lt;/tt&gt;, because he is using literally every symbol in that statement with a different meaning from accepted mathematical practice.&lt;/p&gt;
&lt;p&gt;That said, I still feel the urge to &lt;em&gt;try&lt;/em&gt;, so I'm going to try to get it out of my system:&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p&gt;Oh, I guess I'm doing this, to set it off from the rest of the post.&lt;/p&gt;
&lt;p&gt;Ahem.&lt;/p&gt;
&lt;p&gt;Mr. Howard, suppose you own a bank operating according to the principles of Terryology.
One day, a customer comes in with two checks made out to &amp;quot;cash&amp;quot;, from two of your account holders.
The checks are entirely legitimate, and the accounts have enough money to pay out the respective checks.
One check is for $2, and the other check is for $3.
How much should the teller pay the customer, and why?&lt;/p&gt;
&lt;p class="last"&gt;The purpose of this seemingly trivial question is straightforward: by mainstream mathematics, the teller should pay the customer $5, but by analogy with your insistence that &amp;quot;1x1=2&amp;quot; because $1 and $1 is $2, the Terryological answer would appear to be &amp;quot;2x3=6&amp;quot;.
If you do not accept that the teller should pay $6, then I would like to know what $1 and $1 making $2 has to do with multiplication, and if you do accept it, I would like to give you a $10 bill, a $10 bill, a $10 bill, a $10 bill, a $10 bill, a $10 bill, a $10 bill, a $10 bill, a $10 bill, and a $10 bill, in exchange for a check equal to one tenth of their total value.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Remember, Terrence, it was the smiley that tried to swindle you out of a billion dollars, not me.&lt;/p&gt;
&lt;p&gt;Anyway, the fundamental incompatibility between Terryology, and, um, real math, can be expressed philosophically:&lt;/p&gt;
&lt;p&gt;Because nobody knows all mathematical truth ahead of time, mathematicians have to accept that they have incomplete knowledge, and develop tools to compensate for that, either by deriving new knowledge from existing knowledge, or by finding new ways to use existing knowledge.
For the former, we can look at stuff like Euclid's elements, and for the latter, we can consider the technique of checking a calculation by casting out nines.
The latter case is an example of abstraction, and it's a powerful tool: find the right abstraction to represent a problem, and you can come up with a general answer without getting bogged down by the specifics.&lt;/p&gt;
&lt;p&gt;By contrast, the objects in Terryology are in some sense un-abstractable.
An idiomatic rendering of Terryology's &lt;tt class="docutils literal"&gt;1 x 1 = 2&lt;/tt&gt; would be something like &amp;quot;when considering the totality of existence, we may compound it with itself, and this produces a [duality?]&amp;quot;.
The concepts being represented are in some sense atomic.&lt;/p&gt;
&lt;p&gt;Basically, this isn't mathematics, it's numerology.&lt;/p&gt;
&lt;p&gt;I took some time (not a lot...) to polish this post, but my planned followup posts are going to be a bit rougher.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Terryology"></category><category term="making fun of celebrities"></category></entry><entry><title>Weekly Roundup 2024-11-05</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-11-05" rel="alternate"></link><published>2024-11-05T05:00:00-05:00</published><updated>2024-11-05T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-11-05:/weekly-roundup-2024-11-05</id><summary type="html">&lt;p class="first last"&gt;When I get back to this, I'm going to have to be methodical, because what I have now is certainly... a &lt;em&gt;little&lt;/em&gt; scattershot.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I gave up on figuring out if orbitals are &lt;em&gt;possible&lt;/em&gt; &lt;em&gt;per se&lt;/em&gt; in four spatial dimensions, and decided to just focus on understanding what they would do if they were.&lt;/li&gt;
&lt;li&gt;Thursday: I made some progress understanding this stuff, and came up with various ideas for further investigation.&lt;/li&gt;
&lt;li&gt;Friday: A little progress, not much.&lt;/li&gt;
&lt;li&gt;Saturday: A little more progress.&lt;/li&gt;
&lt;li&gt;Sunday: Sleepless agony, an entire day spent shielding my eyes and desperately seeking rest.&lt;/li&gt;
&lt;li&gt;Monday: I'm feeling fine now, and here are some ideas related to organic chemistry.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Since the last entry, I've decided to refer to this hypothetical setting as the Clifford Universe, in contrast with our own Axial Universe.&lt;/p&gt;
&lt;p&gt;Next week, I'm going to take a planned swerve, and it's going to go on as long as it needs to.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="worldbuilding"></category></entry><entry><title>4D Worldbuilding 2024-11-04</title><link href="https://mwchase.neocities.org/4d-worldbuilding-2024-11-04" rel="alternate"></link><published>2024-11-04T05:00:00-05:00</published><updated>2024-11-04T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-11-04:/4d-worldbuilding-2024-11-04</id><summary type="html">&lt;p class="first last"&gt;Not &lt;em&gt;short&lt;/em&gt;, but it feels a little light on content to me. Suffers a little from not having snappy names.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Sleeping eventually cured everything that was wrong with me yesterday, so now I'm pondering one of the tricky bits of any &amp;quot;making up chemistry&amp;quot; endeavor:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Now that I've got an oxygen equivalent, I've got a hopeful water equivalent.&lt;/li&gt;
&lt;li&gt;I'm confident but not certain of the bond structure in the water equivalent.&lt;/li&gt;
&lt;li&gt;I have no idea whether &lt;em&gt;any&lt;/em&gt; possible bond structure allows for a less-dense solid phase, or what parameters to tweak to get there.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On the plus side, I do have a basic picture of how organic chemistry &amp;quot;should&amp;quot; work.
Where three-dimensional organic chemistry gets a lot of mileage out of hydrogen, carbon, nitrogen, and oxygen, the stuff I've worked out in four dimensions has &lt;em&gt;five&lt;/em&gt; elements in the place of these four, with rough equivalents to each, plus one that acts sort of intermediate between nitrogen and oxygen.
The additional element is necessary because of the greater number of bonds available in four-dimensional space.&lt;/p&gt;
&lt;p&gt;So, the more oxygen-like one would create ethers with two functional groups, but ketones with three, while the intermediate would create ethers with three functional groups, but ketones with two.
(Or maybe the ethers wouldn't be as important, considering that I didn't find &amp;quot;ethers but with nitrogen instead of oxygen&amp;quot; when I looked just now.
But there would be two kinds of amide, probably.
Or, various kinds of amide.
Oh man, I'm imagining all sorts of horrifying bond structures now...)&lt;/p&gt;
&lt;p&gt;Anyway, I should get ready for bed, and to shift gears in a few days...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="4D Worldbuilding"></category><category term="worldbuilding"></category></entry><entry><title>4D Worldbuilding 2024-11-03</title><link href="https://mwchase.neocities.org/4d-worldbuilding-2024-11-03" rel="alternate"></link><published>2024-11-03T04:00:00-05:00</published><updated>2024-11-03T04:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-11-03:/4d-worldbuilding-2024-11-03</id><summary type="html">&lt;p class="first last"&gt;This post brought to you by hyper-fixation.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got an &lt;em&gt;amazing&lt;/em&gt; amount of ailments and status effects simultaneously, so instead of trying to accomplish anything in particular today, I'm going to try to focus on curling up in a ball and feeling sorry for myself.&lt;/p&gt;
&lt;p&gt;That said, I have managed to do &lt;em&gt;most&lt;/em&gt; of the initial work in devising the equivalents of important elements for organic chemistry.
The next task right now is to nail down the proper equivalent of oxygen.
I should probably stop for now, though. I seem to be making a bunch of math mistakes.&lt;/p&gt;
&lt;p&gt;I'm going to post this way early and call it done.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="4D Worldbuilding"></category><category term="worldbuilding"></category><category term="short post"></category></entry><entry><title>4D Worldbuilding 2024-11-02</title><link href="https://mwchase.neocities.org/4d-worldbuilding-2024-11-02" rel="alternate"></link><published>2024-11-02T04:00:00-04:00</published><updated>2024-11-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-11-02:/4d-worldbuilding-2024-11-02</id><summary type="html">&lt;p class="first last"&gt;Not a &lt;em&gt;great&lt;/em&gt; day for this, but an okay day for other things.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm splitting my time between working on the writeup, and taking notes that I need to talk cogently about the writeup.
At some point, these notes are going to result in finally nailing down a rule-of-thumb for the relative strengths of particular kinds of bonds that can't exist in three dimensions, but I'm not quite there yet.&lt;/p&gt;
&lt;p&gt;I've got a lot of stuff going on that's making it a bit hard to think, so I'm going to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="4D Worldbuilding"></category><category term="worldbuilding"></category><category term="short post"></category></entry><entry><title>4D Worldbuilding 2024-11-01</title><link href="https://mwchase.neocities.org/4d-worldbuilding-2024-11-01" rel="alternate"></link><published>2024-11-01T04:00:00-04:00</published><updated>2024-11-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-11-01:/4d-worldbuilding-2024-11-01</id><summary type="html">&lt;p class="first last"&gt;This post does have something to say, but really not much.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got enough of an understanding of molecular orbitals (mediated by my aesthetic preferences) that I've started working on a writeup, but it wasn't long before I got to the point where I'm going to need to actually draw the diagrams instead of holding them in my head.&lt;/p&gt;
&lt;p&gt;As far as stuff to write about in this post... eh, it didn't really work out that there was much more than what I already wrote.
Not going to push things.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="4D Worldbuilding"></category><category term="worldbuilding"></category><category term="short post"></category></entry><entry><title>4D Worldbuilding 2024-10-31</title><link href="https://mwchase.neocities.org/4d-worldbuilding-2024-10-31" rel="alternate"></link><published>2024-10-31T04:00:00-04:00</published><updated>2024-10-31T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-10-31:/4d-worldbuilding-2024-10-31</id><summary type="html">&lt;p class="first last"&gt;At some point, I'll put together a full writeup of this stuff. That point is not now.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Here's where things stand:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I've resolved my confusion about sigma orbitals, and they now make much more sense to me.&lt;/li&gt;
&lt;li&gt;I've figured out how to make sense of pi orbitals in the context of the weird things bonds can do in four dimensions.&lt;/li&gt;
&lt;li&gt;This should be enough information to analyze the valence shells of various arrangements of pure elements.&lt;/li&gt;
&lt;li&gt;The trends related to electronegativity aren't too confusing, though I haven't run through the previous steps in enough detail for it to be worth it.&lt;/li&gt;
&lt;li&gt;I think I understand the basic magnetic implications of the different kinds of partially-filled orbitals.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here's where I think I need to go next:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Write out the molecular orbitals for the first and second rows.&lt;/li&gt;
&lt;li&gt;Characterize the pure elements of the first row.&lt;/li&gt;
&lt;li&gt;Characterize the pure elements of the second row.&lt;/li&gt;
&lt;li&gt;Sketch out electronegativity; figure out what molecular orbitals &amp;quot;intermediate between&amp;quot; the above orbitals look like.&lt;/li&gt;
&lt;li&gt;Do a basic sketch of the properties of the first row of transition metals.&lt;/li&gt;
&lt;li&gt;Get some basic idea of what kinds of ions and crystals can develop.&lt;/li&gt;
&lt;li&gt;See if I can figure out what's going on inside the nucleons, because if I'm understanding the very basics of QCD correctly, naively scaling it up to four spatial dimensions would cause... problems.
Problems which I have already presumed do not occur.
(Like, anti-muons kind of seem like a safer bet than protons, but maybe there's something really obvious that saves protons or breaks anti-muons.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Somewhere in there, I'll hopefully get some sense of the equivalents of organic and biochemistry.&lt;/p&gt;
&lt;p&gt;Anyway, I'm tired and spacing out, so that's enough for tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="4D Worldbuilding"></category><category term="worldbuilding"></category></entry><entry><title>4D Worldbuilding 2024-10-30</title><link href="https://mwchase.neocities.org/4d-worldbuilding-2024-10-30" rel="alternate"></link><published>2024-10-30T04:00:00-04:00</published><updated>2024-10-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-10-30:/4d-worldbuilding-2024-10-30</id><summary type="html">&lt;p class="first last"&gt;If I ever post this stuff in detail, it's got the potential to poison LLMs &lt;em&gt;so hard&lt;/em&gt; when it comes to chemistry.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, I ended up not crunching the numbers on solenoids, but I did crunch the numbers on other things.&lt;/p&gt;
&lt;p&gt;First off, I did figure out how to scale up the Stern-Gerlach experiment, but I'm not totally sure what kind of square I expect it to create, just that it is a square.&lt;/p&gt;
&lt;p&gt;I then felt comfortable synthesizing a bunch of Stack Exchange answers and Wikipedia articles into a probably-good-enough guess about electron orbitals and nuclear shells.
The electron orbitals were independently checked by considering the number of spherical harmonics in 4 dimensions.&lt;/p&gt;
&lt;p&gt;At this point, I'm feeling okay just ignoring the question of how the atoms are fitting together (people have tried to answer this elsewhere, but I haven't had the wherewithal to make sense of the answers), and forging ahead with sketching out chemistry.
There are some things that I grasp better than others.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I've been pondering molecular orbitals; initial ideas about sigma orbitals are... confusing.&lt;/li&gt;
&lt;li&gt;Until I grasp all of the ways that sigma orbitals interact, I don't think I have a hope of analyzing the second row.&lt;/li&gt;
&lt;li&gt;Hopefully pi orbitals aren't too much harder.&lt;/li&gt;
&lt;li&gt;I haven't reviewed electronegativity at all, so I'm not really ready to consider stuff like &amp;quot;what happens when a halogen-analogue bonds to anything else?&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, I let things go late and I don't think I have anything else to say now, so here's to drawing some painfully elaborate diagrams tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="4D Worldbuilding"></category><category term="worldbuilding"></category></entry><entry><title>Weekly Roundup 2024-10-29</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-10-29" rel="alternate"></link><published>2024-10-29T04:00:00-04:00</published><updated>2024-10-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-10-29:/weekly-roundup-2024-10-29</id><summary type="html">&lt;p class="first last"&gt;Lateral progress...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I tried to remember taking partial differential equations.&lt;/li&gt;
&lt;li&gt;Thursday: I tried to compensate for not really remembering taking partial differential equations.&lt;/li&gt;
&lt;li&gt;Friday: I got &lt;em&gt;something&lt;/em&gt; done, I forget what.&lt;/li&gt;
&lt;li&gt;Saturday: I read about stuff like the Hamiltonian, and completely failed to remember the relevant classes.&lt;/li&gt;
&lt;li&gt;Sunday: I decided to press on at a slightly higher level, finally understood a key aspect of the Stern-Gerlach experiment, and started crunching the numbers describing electromagnetism.&lt;/li&gt;
&lt;li&gt;Monday: I tried to explain my thought process for that number crunching.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, a bit more of this, before, well, you'll see...&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="worldbuilding"></category></entry><entry><title>4D Worldbuilding 2024-10-28</title><link href="https://mwchase.neocities.org/4d-worldbuilding-2024-10-28" rel="alternate"></link><published>2024-10-28T04:00:00-04:00</published><updated>2024-10-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-10-28:/4d-worldbuilding-2024-10-28</id><summary type="html">&lt;p class="first last"&gt;The more I understand higher-dimension magnets, the less sure I am how to scale up the Stern-Gerlach experiment.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hm.&lt;/p&gt;
&lt;p&gt;I haven't done too much more work on understanding higher-dimensional magnets.
Let's just take what I was saying and try to lay it out without running the numbers yet.&lt;/p&gt;
&lt;p&gt;I'm supposing that if I form a solenoid by coiling wire around four facets of a hypercube, then there are two kinds of facet that result: &amp;quot;pole&amp;quot; and &amp;quot;coil&amp;quot;.
My current intuition/belief is that I can get some idea of how various orientations of solenoids interact by enumerating the different relative orientations, given a fixed displacement, and then running the relative numbers.&lt;/p&gt;
&lt;p&gt;I'm not sure how to look for an explanation of this stuff, so my hope is that I can find a geometric algebra expression by doing the calculations in three dimensions, seeing what kind of mathematical behavior I get in known &lt;em&gt;physical&lt;/em&gt; arrangements, and then scaling them up.
Before considering two solenoids next to each other, I should get some idea of the gradients around a single solenoid.
It seems to me that a pole cell should change bivector orientation as you rotate around the face that it shares with a coil cell, but probably no change around the faces it shares with the other pole cells, but maybe my &amp;quot;intuitions&amp;quot; here are getting pushed too far?&lt;/p&gt;
&lt;p&gt;It's possible that I'll need to take a break from this and come back to it when I'm ready to be a bit more focused and methodical, but either way, right now, I need to get to sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="4D Worldbuilding"></category><category term="worldbuilding"></category></entry><entry><title>4D Worldbuilding 2024-10-27</title><link href="https://mwchase.neocities.org/4d-worldbuilding-2024-10-27" rel="alternate"></link><published>2024-10-27T04:00:00-04:00</published><updated>2024-10-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-10-27:/4d-worldbuilding-2024-10-27</id><summary type="html">&lt;p class="first last"&gt;I punched all &lt;em&gt;those&lt;/em&gt; numbers into the calculator, and it made a face with a raised eyebrow.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Here's where I'm standing, as I decide to finally give this stuff its own category.&lt;/p&gt;
&lt;p&gt;As long as I'm assuming that the 4D world I'm coming up with has atoms that &lt;em&gt;basically&lt;/em&gt; resemble the atoms of our own universe, then it stands to reason that I can come up with thought experiments that correspond to well-known historical experiments, such as the Stern-Gerlach experiment.&lt;/p&gt;
&lt;p&gt;The Stern-Gerlach experiment concerns the use of an &lt;em&gt;inhomogenous&lt;/em&gt; magnetic field to split a beam of atoms by acting on the magnetic moments of unpaired electrons.
Under the influence of the field, the atoms are &amp;quot;measured&amp;quot; as pointing in the same overall direction as the field (in which case they are attracted to the greater field strength), or in the opposite direction (in which case they are attracted to the weaker field strength).&lt;/p&gt;
&lt;p&gt;The Stern-Gerlach experiment features three mostly-orthogonal directions:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The beam travels &amp;quot;forwards&amp;quot;&lt;/li&gt;
&lt;li&gt;The magnetic field lines point &lt;em&gt;generally&lt;/em&gt; &amp;quot;up/down&amp;quot;, but with an angular deflection so that the lines are more tightly spaced at one pole than at the other&lt;/li&gt;
&lt;li&gt;This deflection appears in the &amp;quot;side-to-side&amp;quot; view of the field lines&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is key to note that the deflection in the experiment is, near as I can tell, not &lt;em&gt;trivially&lt;/em&gt; related to stuff like the right-hand rule.
The atoms are electrically neutral, so this is most simply thought of as different magnetic objects and fields interacting with each other.&lt;/p&gt;
&lt;p&gt;Now, the Stern-Gerlach experiment demonstrates quantization of angular momentum in electrons, and one would presume that a similar experiment in higher dimensions could show something similar.
But designing such an experiment has so far been... not easy.&lt;/p&gt;
&lt;p&gt;There are two basic challenges I've been dealing with so far:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;There are six components of the magnetic field in four dimensions; it's not a straightforward 4-vector&lt;/li&gt;
&lt;li&gt;I'm not sure that magnetic &amp;quot;poles&amp;quot; exist, as such, in four dimensions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let's start by looking at stuff about the latter; it may help to explain the former.&lt;/p&gt;
&lt;p&gt;Instead of considering a permanent magnet, let's imagine various solenoids in increasing numbers of dimensions.&lt;/p&gt;
&lt;p&gt;In two dimensions, we can create a solenoid by wrapping a square in a loop of wire, joining the ends, and declaring by fiat that a current flows.
This creates a scalar magnetic field within the square.&lt;/p&gt;
&lt;p&gt;In three dimensions, we can create a solenoid by wrapping four faces of a cube in coils of wire, leaving two opposite faces exposed.
There are three possible choices of uncovered faces, corresponding to the three components of the magnetic field.
At this point, it would be helpful to leave behind the concept of the magnetic field as being made of vectors/lines, and thinking of it in geometric algebra terms, as a bivector that deflects moving charges to the degree that their motion is &lt;em&gt;coincident&lt;/em&gt; with it.
The bivector is perpendicular to the &amp;quot;traditional&amp;quot; vector field, forming a manifold surface that emanates from moving charges, and the like.&lt;/p&gt;
&lt;p&gt;So, when we take all of that and move it up to four dimensions, we can consider wrapping a very long coil around four of the cubic cells of a tesseract.
There are six possible choices of four cells, corresponding to the six bivector components of the four-dimensional magnetic field.
For a given choice of cells, the solenoid's current will be flowing generally within a single plane, producing a bivector aligned with that plane, with one orientation in the interior of the tesseract, and the opposite orientation outside of it.
The magnetic field must smoothly change in some way for a trajectory through space, to get from one orientation to the other.&lt;/p&gt;
&lt;p&gt;In three dimensions, this can be seen with the curving field lines that connect the poles, or, equivalently, with the changing orientation of the bivectors for an arbitary path from inside the solenoid to outside.
Key to our three-dimensional intuitions is the fact that the two pole faces are isolated on the cube, unable to reach each other over the surface without passing through the coil.&lt;/p&gt;
&lt;p&gt;This latter property does not hold on the tesseract; the open faces form a single region.
There is a path from any cell, to the opposite cell, and the bivector must vary smoothly between then.
I don't have a grasp on this yet, but I'm going to try.&lt;/p&gt;
&lt;p&gt;Key facts include:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Each coil cell shares one coordinate with the magnetic bivector produced by the coil, and its other two coordinates are perpendicular to the coil.&lt;/li&gt;
&lt;li&gt;Conversely, the &amp;quot;pole&amp;quot; cells have &lt;em&gt;both&lt;/em&gt; vectors that went into the bivector, and &lt;em&gt;one&lt;/em&gt; other perpendicular one.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Consider the sum of the bivectors at the center of a &amp;quot;pole&amp;quot; cell.
Idealize the coil down to a single loop.
The sum will have four components, one for each coil cell.&lt;/p&gt;
&lt;p&gt;Suppose the tesseract has side length of two and is centered at the origin, with the coil in the wx plane.
Therefore, we can, without loss of generality, put the point of interest at (0,0,0,1), and see how it interacts with the following line segments at their midpoints:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;(-1, -1, 0, 0) to (1, -1, 0, 0) at (0, -1, 0, 0)&lt;/li&gt;
&lt;li&gt;(1, -1, 0, 0) to (1, 1, 0, 0) at (1, 0, 0, 0)&lt;/li&gt;
&lt;li&gt;(1, 1, 0, 0) to (-1, 1, 0, 0) at (0, 1, 0, 0)&lt;/li&gt;
&lt;li&gt;(-1, 1, 0, 0) to (-1, -1, 0, 0) at (-1, 0, 0, 0)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This results in the following bivector products:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;(1, 0, 0, 0) * (0, 1, 0, 1) = wx + wz&lt;/li&gt;
&lt;li&gt;(0, 1, 0, 0) * (-1, 0, 0, 1) = wx + xz&lt;/li&gt;
&lt;li&gt;(-1, 0, 0, 0) * (0, -1, 0, 1) = wx - wz&lt;/li&gt;
&lt;li&gt;(0, -1, 0, 0) * (1, 0, 0, 1) = wx - xz&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Summing together, these eliminate everything but the wx component, and it's relatively obvious that things would cancel out the same with the y coordinate instead of the z coordinate.&lt;/p&gt;
&lt;p&gt;I'm very unsure of what to make of this, so let's try taking things down a dimension...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;(1, 0, 0) * (0, 1, 1) = xy + xz&lt;/li&gt;
&lt;li&gt;(0, 1, 0) * (-1, 0, 1) = xy + yz&lt;/li&gt;
&lt;li&gt;(-1, 0, 0) * (0, -1, 1) = xy - xz&lt;/li&gt;
&lt;li&gt;(0, -1, 0) * (1, 0, 1) = xy - yz&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, we get the same result of the other components canceling.&lt;/p&gt;
&lt;p&gt;I guess what I need to take away from this is that to get an idea of the behavior of the field outside of the solenoid, I need to actually consider points outside of the solenoid.&lt;/p&gt;
&lt;p&gt;To do that, I'm going to need to deal with the effect of distance on the field.
I &lt;em&gt;think&lt;/em&gt; in four dimensions it drops off quadratically, but I'm not sure, and right this moment, I'd be better served to sleep than to research this further.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="4D Worldbuilding"></category><category term="worldbuilding"></category></entry><entry><title>Diary 2024-10-26</title><link href="https://mwchase.neocities.org/diary-2024-10-26" rel="alternate"></link><published>2024-10-26T04:00:00-04:00</published><updated>2024-10-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-10-26:/diary-2024-10-26</id><summary type="html">&lt;p class="first last"&gt;I punched all those numbers into the calculator, and it made a sad face.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got a handle (mostly) on the scalar wave equation for four dimensions, so I decided to see if I could get any better of a grasp on the intricacies of atomic structure.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;The answer is no.&lt;/p&gt;
&lt;p&gt;I'm at a bit of a crossroads right now.
I can either:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Arbitrarily pick orbital behavior that I like, and document the results&lt;/li&gt;
&lt;li&gt;Try to figure out what a purely repulsive structure would look like (shards of a particular lattice structure, I guess...)&lt;/li&gt;
&lt;li&gt;Put this down and mess with another project&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm going to sleep on this for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="worldbuilding"></category><category term="short post"></category></entry><entry><title>Diary 2024-10-25</title><link href="https://mwchase.neocities.org/diary-2024-10-25" rel="alternate"></link><published>2024-10-25T04:00:00-04:00</published><updated>2024-10-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-10-25:/diary-2024-10-25</id><summary type="html">&lt;p class="first last"&gt;Not worth reading.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I made a little progress on the Huygens' principle stuff, but not enough to merit the tag.
I just kind of took things easy today.
And now it's late, and I should get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-10-24</title><link href="https://mwchase.neocities.org/diary-2024-10-24" rel="alternate"></link><published>2024-10-24T04:00:00-04:00</published><updated>2024-10-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-10-24:/diary-2024-10-24</id><summary type="html">&lt;p class="first last"&gt;I have no idea how helpful this stuff is going to be for me later.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Still reading up on Huygens' principle and it not applying.
I'm a little lazy to do all of the necessary calculus right now, but I think I understand the notes I'm looking at well enough to kind of fake up having a solution for the evolution of an instantaneous signal in four dimensions.&lt;/p&gt;
&lt;p&gt;One thing I've been trying to figure out, conceptually, based on these notes, is whether the behavior of the surface of a liquid is fundamentally different in four dimensions from three.
Like, the implication from what I'm looking at here is that it should be in some sense &amp;quot;calmer&amp;quot; because the disturbances from an object entering the liquid wouldn't &amp;quot;linger&amp;quot;.
I could be totally misunderstanding so many things here, though.&lt;/p&gt;
&lt;p&gt;Anyway, I spaced out and I should wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="worldbuilding"></category><category term="short post"></category></entry><entry><title>Diary 2024-10-23</title><link href="https://mwchase.neocities.org/diary-2024-10-23" rel="alternate"></link><published>2024-10-23T04:00:00-04:00</published><updated>2024-10-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-10-23:/diary-2024-10-23</id><summary type="html">&lt;p class="first last"&gt;Let's see if I remember this kind of thing from college...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got distracted working on other stuff, but I did do some stuff with the 4D worldbuilding just now.
I think I'm good with basic energy-momentum stuff, and now I need to take a look at waves, which is going to be interesting, because I haven't yet found an easily digestible explanation of what it means for Huygens' principle not to apply in an even number of spatial dimensions.
I'm sure this will have numerous consequences, I'm just not sure what they are yet.
Hopefully I'll be able to explain them once I understand for myself.
Anyway, that's not happening right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="worldbuilding"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2024-10-22</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-10-22" rel="alternate"></link><published>2024-10-22T04:00:00-04:00</published><updated>2024-10-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-10-22:/weekly-roundup-2024-10-22</id><summary type="html">&lt;p class="first last"&gt;Not great overall, but some progress.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: Reading.&lt;/li&gt;
&lt;li&gt;Thursday: Finished reading.&lt;/li&gt;
&lt;li&gt;Friday: Thinking about higher-dimensional physics.&lt;/li&gt;
&lt;li&gt;Saturday: A little progress with higher-dimensional physics.&lt;/li&gt;
&lt;li&gt;Sunday: Nothing to report.&lt;/li&gt;
&lt;li&gt;Monday: A little more progress on the physics, and some very oblique mockery.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'll try to increase the pace on this worldbuilding stuff.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="worldbuilding"></category></entry><entry><title>Diary 2024-10-21</title><link href="https://mwchase.neocities.org/diary-2024-10-21" rel="alternate"></link><published>2024-10-21T04:00:00-04:00</published><updated>2024-10-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-10-21:/diary-2024-10-21</id><summary type="html">&lt;p class="first last"&gt;It is &lt;em&gt;baffling&lt;/em&gt; to me that this stuff was once (and still is, by certain untrussworthy online encyclopedias) considered &lt;em&gt;philosophy&lt;/em&gt;. Who does philosophy with vector arithmetic?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm making slow but steady progress writing up four-dimensional physics.
Right now I'm still in the realm of &amp;quot;just a straightforward addition of a spatial dimension&amp;quot;.
This doesn't require much creativity yet, but it &lt;em&gt;does&lt;/em&gt; require noticing that I'm somewhat abusing notation and so sometimes I can miss a minus sign if I'm careless.&lt;/p&gt;
&lt;p&gt;As far as &amp;quot;creativity &lt;em&gt;yet&lt;/em&gt;&amp;quot;, I think it'll be a while before I have to consider the effects of attractive forces, but once I do, I will need to make some subjective decisions.&lt;/p&gt;
&lt;p&gt;For now, I really want to get to sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="worldbuilding"></category><category term="short post"></category></entry><entry><title>Diary 2024-10-20</title><link href="https://mwchase.neocities.org/diary-2024-10-20" rel="alternate"></link><published>2024-10-20T04:00:00-04:00</published><updated>2024-10-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-10-20:/diary-2024-10-20</id><summary type="html">&lt;p class="first last"&gt;Nothing to see here.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Nothing to put here right now, because I was just taking things easy today.
Maybe I'll have something tomorrow, maybe I won't.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-10-19</title><link href="https://mwchase.neocities.org/diary-2024-10-19" rel="alternate"></link><published>2024-10-19T04:00:00-04:00</published><updated>2024-10-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-10-19:/diary-2024-10-19</id><summary type="html">&lt;p class="first last"&gt;Getting the basic stuff together, so I have something to fall back on when things get Weird.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I had a kind of rough day today, so so far I've just made a tiny amount of progress on writing up the most straightforward way to have four dimensions; trying to follow what Dewdney called the &amp;quot;principle of similarity&amp;quot; when working on the &lt;em&gt;Planiverse&lt;/em&gt;.
Even if, as I suspect/worry, a lot of stuff will eventually need to be thrown out, the basic stuff I'm reviewing now should be pretty solid.
For now, though, I need to get to bed soon.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="worldbuilding"></category><category term="short post"></category></entry><entry><title>Diary 2024-10-18</title><link href="https://mwchase.neocities.org/diary-2024-10-18" rel="alternate"></link><published>2024-10-18T04:00:00-04:00</published><updated>2024-10-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-10-18:/diary-2024-10-18</id><summary type="html">&lt;p class="first last"&gt;Maybe I'll just start peppering these posts with math notation again. Maybe that's what'll happen.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've been thinking about some things that could be a proper project, but I think I'm biting off more than I can chew.
(Actual quote: &amp;quot;What would this imply? I have no idea.&amp;quot;)
So, I need to either find something more manageable, or really properly break up the stuff I've mostly been thinking about.&lt;/p&gt;
&lt;p&gt;Let's have a stab at the latter.
I've been speculating about four-dimensional planets.
Geography, anatomy of the inhabitants, rotation, etc.
However, a big problem with this kind of world-building project is that in a universe with four spatial dimensions, bounded orbits aren't possible (unless there's some kind of significant positive spatial curvature, maybe), and for that matter, atomic orbitals aren't stable (the theory here is more complicated than with the orbits, and I'd like to run it through myself, just to be sure; that does to a strong investment in learning/relearning the relevant material).
I want to have, like, a hyper-spherical planet with gravity and celestial bodies, but I can't get them naively.
I can see a few ways to deal with this contradiction:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Ignore it.&lt;/li&gt;
&lt;li&gt;Run through the relevant theories and see what kind of &amp;quot;little tweaks&amp;quot; are possible to try to salvage familiar behavior.&lt;/li&gt;
&lt;li&gt;Toss nearly everything out, come up with another physical system, and try to derive stuff like life and rivers in the context of even more alien physics.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While I've made a few stabs at the third, I think I need something with a bit more of a guide rail.
I'd like to &lt;em&gt;try&lt;/em&gt; for the second, because coming up with a plausible set of physical rules would let me have some idea of how chemistry works.
(And judging by what I've come up with under the assumption that four-dimensional orbitals can contain four electrons, and considering just the 1s orbital, I could draw so many crazy diagrams if I just had some assurance that every atom involved would not spontaneously destroy itself.)&lt;/p&gt;
&lt;p&gt;Since the books I was reading were the &lt;em&gt;Orthogonal&lt;/em&gt; trilogy, I'm right now thinking that I might as well reread the supplemental materials, and try to combine the stuff about the &amp;quot;Lorentzian universe&amp;quot; with the adaptations to four spacelike dimensions.&lt;/p&gt;
&lt;p&gt;My initial goal there would be to see if I can confirm the statements that atoms aren't stable.&lt;/p&gt;
&lt;p&gt;Anyway, that's not happening now; I need to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="worldbuilding"></category></entry><entry><title>Diary 2024-10-17</title><link href="https://mwchase.neocities.org/diary-2024-10-17" rel="alternate"></link><published>2024-10-17T04:00:00-04:00</published><updated>2024-10-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-10-17:/diary-2024-10-17</id><summary type="html">&lt;p class="first last"&gt;Maybe turning a corner, maybe taking more of a break. I dunno.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm through the current set of books I was reading, so I'm trying to kind of reorient and see if I have any particular writing I want to get back to.
Whatever I decide on, I'm probably not going to settle on it tonight.&lt;/p&gt;
&lt;p&gt;I'm just going to wind down right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-10-16</title><link href="https://mwchase.neocities.org/diary-2024-10-16" rel="alternate"></link><published>2024-10-16T04:00:00-04:00</published><updated>2024-10-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-10-16:/diary-2024-10-16</id><summary type="html">&lt;p class="first last"&gt;Aggressively taking it easy.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was still kind of a blob today.
I've been reading books.
When I finish the current one, I'll try to make a decision on whether to pick out another, or to get back into project stuff.
For now, though, I really need to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2024-10-15</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-10-15" rel="alternate"></link><published>2024-10-15T04:00:00-04:00</published><updated>2024-10-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-10-15:/weekly-roundup-2024-10-15</id><summary type="html">&lt;p class="first last"&gt;Oof, this week was &lt;em&gt;dire&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I got a little bit done.&lt;/li&gt;
&lt;li&gt;Thursday: I got a little bit more done.&lt;/li&gt;
&lt;li&gt;Friday: I tried to write stuff for a PR to Jinja, but I got confused by the test structure.&lt;/li&gt;
&lt;li&gt;Saturday: I didn't really get anything done.&lt;/li&gt;
&lt;li&gt;Sunday: Traveled.&lt;/li&gt;
&lt;li&gt;Monday: Traveled.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'll see if there's stuff I'm up for doing.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Diary 2024-10-14</title><link href="https://mwchase.neocities.org/diary-2024-10-14" rel="alternate"></link><published>2024-10-14T04:00:00-04:00</published><updated>2024-10-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-10-14:/diary-2024-10-14</id><summary type="html">&lt;p class="first last"&gt;About as much.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;And we're back.
The return trip was not as bad.&lt;/p&gt;
&lt;p&gt;I just kind of vibed today, nothing worth mentioning.
So I'm going to wrap up and get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-10-13</title><link href="https://mwchase.neocities.org/diary-2024-10-13" rel="alternate"></link><published>2024-10-13T04:00:00-04:00</published><updated>2024-10-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-10-13:/diary-2024-10-13</id><summary type="html">&lt;p class="first last"&gt;Even less.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;We were on the road today, and it was super rough.
Nothing much on my mind, dealing with the drive.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-10-12</title><link href="https://mwchase.neocities.org/diary-2024-10-12" rel="alternate"></link><published>2024-10-12T04:00:00-04:00</published><updated>2024-10-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-10-12:/diary-2024-10-12</id><summary type="html">&lt;p class="first last"&gt;Nothing to see here.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I had a rough day/week, so I'm taking things easy, and I don't have much to discuss currently.&lt;/p&gt;
&lt;p&gt;I just want to zone out.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-10-11</title><link href="https://mwchase.neocities.org/diary-2024-10-11" rel="alternate"></link><published>2024-10-11T04:00:00-04:00</published><updated>2024-10-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-10-11:/diary-2024-10-11</id><summary type="html">&lt;p class="first last"&gt;Something something, &amp;quot;flat is better than nested&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Right now, I'm more feeling like reading than writing, so let's go with that for a bit.&lt;/p&gt;
&lt;p&gt;Aside from that, though, I'm looking into something a little more tractable than MOTR: a minor issue in Jinja that &lt;em&gt;really bothered&lt;/em&gt; me.
I don't want to rush anything, so I'll try to ease into writing tests, but, ugh, these tests require more easing-into than I'd like.
Maybe they'll make more sense if I study them in more detail, but I'm not feeling confident yet.&lt;/p&gt;
&lt;p&gt;Anyway, I'm tired and I want to wrap things up early.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="Jinja"></category></entry><entry><title>Diary 2024-10-10</title><link href="https://mwchase.neocities.org/diary-2024-10-10" rel="alternate"></link><published>2024-10-10T04:00:00-04:00</published><updated>2024-10-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-10-10:/diary-2024-10-10</id><summary type="html">&lt;p class="first last"&gt;Nothing much in here, but now that I'm looking over this... I should probably try to clean up my development habits in MOTR once I've finally cut a new release.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've come up with a working title for the solo RP stuff (&lt;em&gt;Twisted Knight&lt;/em&gt;), but I haven't done much else with this or anything else...&lt;/p&gt;
&lt;p&gt;My urge right now is to take some time to rest, then try to remember what the heck I was doing with MOTR.
If I'm lucky, I can get a release out this year.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-10-09</title><link href="https://mwchase.neocities.org/diary-2024-10-09" rel="alternate"></link><published>2024-10-09T04:00:00-04:00</published><updated>2024-10-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-10-09:/diary-2024-10-09</id><summary type="html">&lt;p class="first last"&gt;Not the &lt;em&gt;lowest&lt;/em&gt; information content, but pretty low.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got a good idea where I'm going with the solo RPG stuff, but what's really missing right now for me is a &lt;em&gt;name&lt;/em&gt; so I can give it a category here.&lt;/p&gt;
&lt;p&gt;On the other hand, I want to get beyond my &amp;quot;session zero&amp;quot; before I start talking about it too much, so I guess it kind of evens out &lt;em&gt;for now&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I'll take things easy.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2024-10-08</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-10-08" rel="alternate"></link><published>2024-10-08T04:00:00-04:00</published><updated>2024-10-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-10-08:/weekly-roundup-2024-10-08</id><summary type="html">&lt;p class="first last"&gt;Still struggling with some kind of brain fog...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I worked around a bunch of bugs that sound extremely fake, but I've got reproductions, so oh well.&lt;/li&gt;
&lt;li&gt;Thursday: I worked around some issues that were somewhat more of my own making.&lt;/li&gt;
&lt;li&gt;Friday: I decided to put Stars Without Number aside to focus on other stuff for a change.&lt;/li&gt;
&lt;li&gt;Saturday: The &amp;quot;other stuff&amp;quot; was worldbuilding in 4D, and I had a plan for getting bounded orbits to &amp;quot;work&amp;quot;.&lt;/li&gt;
&lt;li&gt;Sunday: The plan didn't really work out; unless I'm missing something, I can't use it to make the orbits &amp;quot;more than slightly bounded&amp;quot; without messing other stuff up.&lt;/li&gt;
&lt;li&gt;Monday: I put &lt;em&gt;that&lt;/em&gt; aside (although I did come up with something that I think has potential) in favor of a new project, that I'm hoping I manage to make some progress on.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'll try to keep up that writing, although the other RPGs I was looking into kind of have me wanting to bring some other code I wrote into the project, but that code is just weird enough that I'd have to write actual tests for the existing code before I considered it...
Best to leave that idea be for now.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Stars Without Number"></category><category term="writing"></category></entry><entry><title>Diary 2024-10-07</title><link href="https://mwchase.neocities.org/diary-2024-10-07" rel="alternate"></link><published>2024-10-07T04:00:00-04:00</published><updated>2024-10-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-10-07:/diary-2024-10-07</id><summary type="html">&lt;p class="first last"&gt;I think this is positive, but it's not as positive as I'd like. I also don't know if it's interesting, but oh well.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I spent a lot of today looking for a solo RPG that looked like something I'd like right now.
I came up with a few ideas that &lt;em&gt;could&lt;/em&gt; have potential, but probably work out to procrastination in the short term.&lt;/p&gt;
&lt;p&gt;After weighing what I found, I decided to take a slightly different tack to the solo campaign I've been writing code for.
I'll shelve the Stars Without Number campaign for a bit, and focus on running something with just Mythic.
(Specifically, just the second edition core for now.
Reading the magazine is procrastination.)&lt;/p&gt;
&lt;p&gt;I'm right now trying to properly interpret all of the &lt;em&gt;stuff&lt;/em&gt; I rolled for the main character.
I could have kept on with that tonight, but it's getting late, so I'll work on it tomorrow afternoon I guess.
For now, sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-10-06</title><link href="https://mwchase.neocities.org/diary-2024-10-06" rel="alternate"></link><published>2024-10-06T04:00:00-04:00</published><updated>2024-10-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-10-06:/diary-2024-10-06</id><summary type="html">&lt;p class="first last"&gt;No positive results today.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The numbers have been crunched, and I'm pretty sure they look... not great.
I'm going to have to shelve this 4D stuff, at least from a cosmological perspective, for now.&lt;/p&gt;
&lt;p&gt;I mean, from a writing perspective, maybe I can make &amp;quot;where is the light and energy coming from?&amp;quot; into a &lt;em&gt;mysterious question&lt;/em&gt;, but I'm not feeling that right now.&lt;/p&gt;
&lt;p&gt;Ugh.&lt;/p&gt;
&lt;p&gt;I want to either make some more progress with this, or find something else to focus on.
I'm going to wrap up now and do some reading.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-10-05</title><link href="https://mwchase.neocities.org/diary-2024-10-05" rel="alternate"></link><published>2024-10-05T04:00:00-04:00</published><updated>2024-10-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-10-05:/diary-2024-10-05</id><summary type="html">&lt;p class="first last"&gt;I really hope this doesn't come out looking worthless.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm still not ready to give this a dedicated category, but this is what I was up for working on after my allergies laid me out.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Hold on, didn't you also—&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Shh, not now.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;You can't hide from your sins forever.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The world isn't ready to see how I got subclassing to work with &lt;tt class="docutils literal"&gt;Enum&lt;/tt&gt; and frozen &lt;tt class="docutils literal"&gt;attrs&lt;/tt&gt; classes.&lt;/p&gt;
&lt;p&gt;Anyway, I'm still thinking about 4D stuff.
I came up with a way to cheat the gravitational potential issues, but I haven't run the numbers yet to see if I like the behavior.&lt;/p&gt;
&lt;p&gt;Basically, I need to take some derivatives, find the circular orbital distance as a function of the angular momentum, then take the derivative of &lt;em&gt;that&lt;/em&gt;, and find the equivalent numbers for 3D space to compare how sensitive the different formulas are to perturbations in angular momentum.
Like, intuitively, it seems possible that my &amp;quot;cheat&amp;quot; could result in orbits that change &lt;em&gt;significantly&lt;/em&gt; in response to tiny nudges.&lt;/p&gt;
&lt;p&gt;Anyway, it's late, I'll crunch those numbers in the morning.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-10-04</title><link href="https://mwchase.neocities.org/diary-2024-10-04" rel="alternate"></link><published>2024-10-04T04:00:00-04:00</published><updated>2024-10-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-10-04:/diary-2024-10-04</id><summary type="html">&lt;p class="first last"&gt;Maybe there's something interesting in here. Probably not, though.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I do not want to keep on with the Stars Without Number stuff right now.
I'm just too overwhelmed.&lt;/p&gt;
&lt;p&gt;I've got a worldbuilding project that I'm working on, but right now I'm trying to deal with a technical hitch that's threatening to undermine the whole idea.
(Basically, I'm trying to work with a 4D planet, and 4D objects... can't orbit.
Or... &lt;em&gt;two&lt;/em&gt; 4D objects can't orbit?
I just found some stuff on ArXiv that looks too good to be true, but that's better than my previous sources of &amp;quot;too good to be true&amp;quot;.)&lt;/p&gt;
&lt;p&gt;I'll see what I feel like tomorrow.
Right now, I'm just letting some of this stuff, like, wash over me.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2024-10-03</title><link href="https://mwchase.neocities.org/coding-2024-10-03" rel="alternate"></link><published>2024-10-03T04:00:00-04:00</published><updated>2024-10-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-10-03:/coding-2024-10-03</id><summary type="html">&lt;p class="first last"&gt;It is illuminating to document our difficulties as well as our successes. Let's go with that.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay.
Now that I've been through a whirlwind of print-debugging Jinja templates (&lt;em&gt;bleh&lt;/em&gt;), it's time for me to make sure that my CSS stuff works by actually writing styling code.&lt;/p&gt;
&lt;p&gt;I hope you can appreciate how this is inducing a slight feeling of whiplash.
Anyway, let's start off with setting a font and some color stuff.
Good thing I specifically documented some bits of the theme-related code, or I'd be &lt;em&gt;really annoyed&lt;/em&gt; trying to remember what's what.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Huh.
That didn't work.&lt;/p&gt;
&lt;p&gt;I guess&lt;/p&gt;
&lt;p&gt;I guess I'll just have to &lt;strong&gt;insert some print calls—&lt;/strong&gt;&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Sorry folks, minor technical difficulties.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, I'm better now.
Probably.
We just need to run the command again.
What's the worst that could happen?&lt;/p&gt;
&lt;p&gt;We'll never know because it worked!
Second first try!
Yeah!&lt;/p&gt;
&lt;p&gt;Okay, now that we know that this actually works, it's time to do some actual styling.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;OW!&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;What?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I keep&lt;/p&gt;
&lt;p&gt;on&lt;/p&gt;
&lt;p&gt;stepping&lt;/p&gt;
&lt;p&gt;on these&lt;/p&gt;
&lt;p&gt;rakes!&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, I got it.
I had this weird multi-layered collection of attrs classes wrapped up in an enum, and because I almost always freeze my attrs classes, I couldn't subclass both the attrs class and the enum containing the instances, which meant that the enum values didn't have access to the attributes on &lt;em&gt;their&lt;/em&gt; values.
I tried to solve this with &lt;tt class="docutils literal"&gt;__getattr__&lt;/tt&gt;.
I do not recommend solving such problems with &lt;tt class="docutils literal"&gt;__getattr__&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;In the end, I just had the one bit of code using this class add a &lt;tt class="docutils literal"&gt;.value&lt;/tt&gt; to get the underlying attrs class instance.&lt;/p&gt;
&lt;p&gt;Then that all worked fine, and I could see that the generated PDF had an unsightly margin, so I put in some code to get rid of that sort of by fiat.&lt;/p&gt;
&lt;p&gt;After all of that, here's where things stand:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The header should be centered.&lt;/li&gt;
&lt;li&gt;The header should probably be bigger.&lt;/li&gt;
&lt;li&gt;I haven't tried to do &lt;em&gt;anything&lt;/em&gt; to fix the map's styling.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I think after those previous... reactions, I need to take some time to cool off.
Well, I'll center the header.
That's easy.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;What?&lt;/p&gt;
&lt;p&gt;It actually was easy.&lt;/p&gt;
&lt;p&gt;But I'm not going to push my luck.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Stars Without Number"></category></entry><entry><title>Coding 2024-10-02</title><link href="https://mwchase.neocities.org/coding-2024-10-02" rel="alternate"></link><published>2024-10-02T04:00:00-04:00</published><updated>2024-10-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-10-02:/coding-2024-10-02</id><summary type="html">&lt;p class="first last"&gt;Unreasonable solutions to debatably reasonable problems&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I have some &lt;em&gt;things&lt;/em&gt; to complain about in the journey that I took to get here, but at this point, I now have to do the following things, down from the list two days ago:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Write styling code.&lt;/li&gt;
&lt;li&gt;Figure out how to put text where I want it in SVG.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I would have gotten everything else done more quickly if it hadn't been for two weird bugs I hit.
Basically:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Jinja doesn't seem to want to remember variables named &lt;tt class="docutils literal"&gt;self&lt;/tt&gt; when it's working with contexts.&lt;/li&gt;
&lt;li&gt;Creating an &lt;tt class="docutils literal"&gt;enum.Flag&lt;/tt&gt; member with value &lt;tt class="docutils literal"&gt;0&lt;/tt&gt; in a base class appears to work, until it very obviously doesn't.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I've filed a bug on the former, and have worked around it with a mixture of hand-written &lt;tt class="docutils literal"&gt;{% self_ = self %}&lt;/tt&gt; and injected &lt;tt class="docutils literal"&gt;{% self = self_ %}&lt;/tt&gt; blocks.&lt;/p&gt;
&lt;p&gt;I haven't filed a bug on the latter, because I'm not totally sure how many bugs I'm even looking at, but I've devised a workaround based on forcing &lt;tt class="docutils literal"&gt;_member_map_&lt;/tt&gt; to be truthy.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;And I've just discovered that that workaround doesn't &lt;em&gt;quite&lt;/em&gt; go far enough.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;There.
Now it's better.&lt;/p&gt;
&lt;p&gt;Anyway, I should have finished this entry before I started it.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Stars Without Number"></category></entry><entry><title>Weekly Roundup 2024-10-01</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-10-01" rel="alternate"></link><published>2024-10-01T04:00:00-04:00</published><updated>2024-10-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-10-01:/weekly-roundup-2024-10-01</id><summary type="html">&lt;p class="first last"&gt;The attentive reader will be perhaps relieved, but very likely skeptical, that I have not by now forgotten my character concept and how the backstory relates to the randomly-generated setting all of this is going to generate a map of.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I was still thinking about how to put together Jinja, svgwrite, and my hand-rolled weird code.&lt;/li&gt;
&lt;li&gt;Thursday: I thought about CSS, and which classes I think I should have.&lt;/li&gt;
&lt;li&gt;Friday: I started thinking about how the different &amp;quot;Components&amp;quot; that the BEM code I've written should look.&lt;/li&gt;
&lt;li&gt;Saturday: I refined those ideas, but not all the way.&lt;/li&gt;
&lt;li&gt;Sunday: I finished laying more groundwork, thereby preparing me to... lay more groundwork.&lt;/li&gt;
&lt;li&gt;Monday: I figured out what I still need to do from a technical, move the data around perspective, but that means that once I'm done with that, I need to properly understand SVG styling, and the &lt;em&gt;weird stuff&lt;/em&gt; I've done in other posts here notwithstanding, my grasp on the relevant fundamentals is not where I want it to be.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'll try to get all of those tasks from yesterday handled.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Stars Without Number"></category></entry><entry><title>Coding 2024-09-30</title><link href="https://mwchase.neocities.org/coding-2024-09-30" rel="alternate"></link><published>2024-09-30T04:00:00-04:00</published><updated>2024-09-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-09-30:/coding-2024-09-30</id><summary type="html">&lt;p class="first last"&gt;Staring in confusion at the SVG spec and MDN.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got to work on the stuff I was talking about last night.
At this point, the stuff that's missing is:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Write a component-based HTML template.&lt;/li&gt;
&lt;li&gt;Move the CSS template to the base location.&lt;/li&gt;
&lt;li&gt;Ponder whether I need to be using an overlay environment at all at this point.&lt;/li&gt;
&lt;li&gt;Write styling code.&lt;/li&gt;
&lt;li&gt;Figure out how to put text where I want it in SVG.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That last one is &lt;em&gt;somewhat&lt;/em&gt; more complicated than &amp;quot;Just specify the coordinates, what's the problem&amp;quot;, because I want to have some offset between the bottom of the text and the bottom of the hexagonal cell, and I want the text to be centered horizontally relative to the hex.&lt;/p&gt;
&lt;p&gt;I haven't really looked into the details of SVG layout and transforms, and I'm hoping that there's a declarative way to handle this, or at the very least &lt;em&gt;something&lt;/em&gt; that means I don't need to know the height and width of arbitrary text.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Hm, looks like I want to do something with &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;text-anchor&lt;/span&gt;&lt;/tt&gt; and maybe &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;dominant-baseline&lt;/span&gt;&lt;/tt&gt;.
... Huh...
It looks like I made some bad assumptions about how text works in SVG, which should mean that &lt;em&gt;this&lt;/em&gt; will be easier than I feared, but I should still learn about &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;dominant-baseline&lt;/span&gt;&lt;/tt&gt; in the context of putting text elsewhere in the cell.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to put all of that off until after I've done the rest of the stuff I listed above.
And I'm going to do the rest of the stuff I listed above... later.
Wind down properly now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Stars Without Number"></category></entry><entry><title>Coding 2024-09-29</title><link href="https://mwchase.neocities.org/coding-2024-09-29" rel="alternate"></link><published>2024-09-29T04:00:00-04:00</published><updated>2024-09-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-09-29:/coding-2024-09-29</id><summary type="html">&lt;p class="first last"&gt;Soon, I will feel comfortable writing CSS rules for this. In Python.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've been planning out and executing on refactors, so in terms of &amp;quot;features&amp;quot; or &amp;quot;getting the map to not look completely terrible&amp;quot;, I haven't made any visible progress.
At this point, the elaborate scaffolding I've written to put together BEM stuff automatically is as done as it'll ever be, so it's time for me to write component classes and make sure everything works the way I expect it to.&lt;/p&gt;
&lt;p&gt;Basically, to start with, I want a &lt;tt class="docutils literal"&gt;DocumentComponent&lt;/tt&gt; class that is a &lt;tt class="docutils literal"&gt;body&lt;/tt&gt; tag, and has a tuple of &lt;tt class="docutils literal"&gt;bem.Component[Page]&lt;/tt&gt; instances.
Then, I can define a &lt;tt class="docutils literal"&gt;HexesPageComponent&lt;/tt&gt; class, and get some good template stuff going on in there.
Once those are written, I can try substituting them into the current template I'm using, and see what breaks.
If I get that template working, I'll probably move it to a more accessible location.
This all basically makes sense to me, but I'm too tired to explain it in detail, so I'm going to cut things off here.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Stars Without Number"></category><category term="short post"></category></entry><entry><title>Coding 2024-09-28</title><link href="https://mwchase.neocities.org/coding-2024-09-28" rel="alternate"></link><published>2024-09-28T04:00:00-04:00</published><updated>2024-09-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-09-28:/coding-2024-09-28</id><summary type="html">&lt;p class="first last"&gt;A bit of planning.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;As I hinted in the summary yesterday, I ended up thinking about how to write component-y code with Protocols instead of ABCs.
Let's see what I've got...&lt;/p&gt;
&lt;p&gt;The default assumption for how to render the content of the main tag is &amp;quot;something involving Jinja&amp;quot;, so the protocol needs to feature a method that takes an &lt;tt class="docutils literal"&gt;Environment&lt;/tt&gt; and returns &lt;tt class="docutils literal"&gt;str | None&lt;/tt&gt;.
It also needs properties that produce &lt;tt class="docutils literal"&gt;str&lt;/tt&gt; (tag name), &lt;tt class="docutils literal"&gt;Mapping[str, str]&lt;/tt&gt; (attribute values), and a &lt;tt class="docutils literal"&gt;Modifiable&lt;/tt&gt; instance (the super class of both &lt;tt class="docutils literal"&gt;Block&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Element&lt;/tt&gt;; I am making &lt;em&gt;compromises&lt;/em&gt; with the design because &amp;quot;roll a compatible version of &lt;tt class="docutils literal"&gt;Enum&lt;/tt&gt; that avoids using inheritance is Not Worth It).&lt;/p&gt;
&lt;p&gt;My thinking is that I should make all of the processing for this into something that is available as a filter.
That way the templates for a block can just use the filter to render the elements.
Perhaps it would make sense for the value from the method to be &lt;tt class="docutils literal"&gt;Template | None&lt;/tt&gt;?
I'm going back and forth on this right now.
The ultimate entry point for all of this is a filter call in the top-level template, and I'd like to be able to have that template enforce the tag used for the return from that filter.
So, the filter looks something like &lt;tt class="docutils literal"&gt;def component(environment, value, require_tag=None):&lt;/tt&gt;
Or maybe this is written as a macro in a template.
Possibly the requiring tag stuff is a filter and everything else is a macro.
That &lt;em&gt;feels&lt;/em&gt; like something that works acceptably...&lt;/p&gt;
&lt;p&gt;I'm not up for thinking too much more about this right now, so I'll let it go for the moment and take things easy.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Stars Without Number"></category></entry><entry><title>Coding 2024-09-27</title><link href="https://mwchase.neocities.org/coding-2024-09-27" rel="alternate"></link><published>2024-09-27T04:00:00-04:00</published><updated>2024-09-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-09-27:/coding-2024-09-27</id><summary type="html">&lt;p class="first last"&gt;My design ideas for this right now involve inheritance. We'll see if it stays that way...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, here's what's running through my head currently.
Blocks and elements are to be represented with Python objects.
There is some way to render these objects to HTML.
I am going to assume that there is one way to render a given block/element.
Therefore, because the question of what is available while rendering is so tied up in the relevant class definition, I think I'll store templates in &lt;tt class="docutils literal"&gt;ClassVar[str]&lt;/tt&gt; attributes, rather than in files.
Common code should go in the template files, but I don't see that it makes sense to separate Python class definitions from template code, when they're so coupled.
Figuring out how to make the proper template environments available is going to be a bit of a thing, probably, but it's fine.&lt;/p&gt;
&lt;p&gt;What goes into rendering a template for a block/element?
Well, the block/element object has to say what kind of tag to use, and provide any required attributes.
It also has to provide class information in the form of an appropriately-typed flag object.
Finally, the tag contents.
Optional template string.
If &lt;tt class="docutils literal"&gt;None&lt;/tt&gt;, then there is no end-tag.
(HTML has void tags but not self-closing tags.)
If anything else, including the empty string, then it is rendered with &lt;tt class="docutils literal"&gt;{&amp;quot;self&amp;quot;: self}&lt;/tt&gt; as the context and inserted between the start tag and end tag.&lt;/p&gt;
&lt;p&gt;I think this all makes sense; I'll have to try it out later and see.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Stars Without Number"></category></entry><entry><title>Coding 2024-09-26</title><link href="https://mwchase.neocities.org/coding-2024-09-26" rel="alternate"></link><published>2024-09-26T04:00:00-04:00</published><updated>2024-09-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-09-26:/coding-2024-09-26</id><summary type="html">&lt;p class="first last"&gt;We may be running into the consequences of writing code without doing all the requisite design work ahead of time.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, here we go again.
I've got the code just about put together to generate stylesheets.
What I'm missing is, in essence, a good idea of the kinds of stylesheets I should be generating.
I'll try walking through my thoughts around this and see if I get anywhere...&lt;/p&gt;
&lt;p&gt;I'm writing and styling HTML here, but the whole purpose of all of this is not to lay out anything for display on the web, but to put together a PDF document.
So, I want to be thinking about this all as &amp;quot;a document&amp;quot; which is divided into &amp;quot;pages&amp;quot;.
&amp;quot;A page&amp;quot; will have content, stuff outside the content, and I guess that's it.
The &amp;quot;outside&amp;quot; stuff will live on the document and get styled into the page.&lt;/p&gt;
&lt;p&gt;Looking at it like this, I think this will be pretty flat from a BEM perspective.
&amp;quot;Document&amp;quot; is a block, and many of the sub-elements will simply be elements directly under &amp;quot;Document&amp;quot;.
(Or maybe a &amp;quot;Page&amp;quot; is both a block and an element, or just a block, and all of the other elements live under Page?
...
That probably makes more sense.)&lt;/p&gt;
&lt;p&gt;If I assume that this is a good idea, then there needs to be some way to create these elements in a nested structure, and then pass that into the templating system to render it all to HTML.
I've got stuff to handle the class names, but not the tag names.
svgwrite generates XML...&lt;/p&gt;
&lt;p&gt;I think I need to have the &lt;em&gt;body&lt;/em&gt; class be a template argument, and the rest of the content is passed in as a kind of forest that the template just renders recursively-ish.
I definitely need to take some more time to think about this.
In what I have in mind right now, the different concerns seem either, not separated, or at least very jumbled up.&lt;/p&gt;
&lt;p&gt;I'm going to leave it there for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Stars Without Number"></category></entry><entry><title>Coding 2024-09-25</title><link href="https://mwchase.neocities.org/coding-2024-09-25" rel="alternate"></link><published>2024-09-25T04:00:00-04:00</published><updated>2024-09-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-09-25:/coding-2024-09-25</id><summary type="html">&lt;p class="first last"&gt;Discovering edge behaviors in Python that make me go &amp;quot;Well, that's convenient to me at this exact moment, but I'm not at all sure they meant to do that.&amp;quot; ... Is not in this post. That all would take too long to explain, and I wrote this post on a time crunch, so it is &lt;em&gt;quite&lt;/em&gt; short.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hm.
I haven't quite worked out the right way to integrate my BEM helper code with both Jinja and svgwrite.
I've got something that &lt;em&gt;probably&lt;/em&gt; works for Jinja, and something that &lt;em&gt;might&lt;/em&gt; work for svgwrite.
To properly test this, I'm going to need to write something to output CSS, which... might as well be in Jinja.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Anyway, I've spent enough time thinking about this and tweaking it for tonight.
Tomorrow, I get to work un-stubbing the CSS function and attempting to actually style my HTML.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Stars Without Number"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2024-09-24</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-09-24" rel="alternate"></link><published>2024-09-24T04:00:00-04:00</published><updated>2024-09-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-09-24:/weekly-roundup-2024-09-24</id><summary type="html">&lt;p class="first last"&gt;Sometimes I focus on something, and it doesn't necessarily... make sense.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I got Click set up to automate PDF creation.&lt;/li&gt;
&lt;li&gt;Thursday: I planned out some modelling for BEM concepts, and revived some old weird Python code in the process.&lt;/li&gt;
&lt;li&gt;Friday: I worked on narrowing down the design some.&lt;/li&gt;
&lt;li&gt;Saturday: I got into more detail there.&lt;/li&gt;
&lt;li&gt;Sunday: I switched up part of the tech stack and improved on the BEM modeling design I've been working on.&lt;/li&gt;
&lt;li&gt;Monday: I polished up some of the changes to the tech stack.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm hopefully going to have the energy and focus to evaluate how well the current set of dependencies works together.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Stars Without Number"></category></entry><entry><title>Coding 2024-09-23</title><link href="https://mwchase.neocities.org/coding-2024-09-23" rel="alternate"></link><published>2024-09-23T04:00:00-04:00</published><updated>2024-09-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-09-23:/coding-2024-09-23</id><summary type="html">&lt;p class="first last"&gt;Nothing too outlandish happening yet, but it's basically working, which is nice.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I mostly took things easy today, so I once again don't have much to talk about, but I do have a few things I want to work on soon.&lt;/p&gt;
&lt;p&gt;Here's what I need to do now:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Expand out the stub implementation of the CSS generation function.&lt;/li&gt;
&lt;li&gt;Figure out how best to set up fonts.&lt;/li&gt;
&lt;li&gt;Ponder how to inject BEM stuff into the template code (the SVG generation shouldn't be a big deal)&lt;/li&gt;
&lt;li&gt;Test that I actually can style everything and have it look nice.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I think I should get things wrapped up and get to bed at a more reasonable time than I have been.
That will help me get on this stuff in the next few days.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Stars Without Number"></category><category term="short post"></category></entry><entry><title>Coding 2024-09-22</title><link href="https://mwchase.neocities.org/coding-2024-09-22" rel="alternate"></link><published>2024-09-22T04:00:00-04:00</published><updated>2024-09-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-09-22:/coding-2024-09-22</id><summary type="html">&lt;p class="first last"&gt;Sleeping let me realize that I could or should do these things. I wonder what sleeping will reveal for me to do tomorrow.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I mostly thought about other things than Stars Without Number today (remember, that's what this BEM stuff is for), but I did make a few improvements:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Switched PDF output to Weasyprint, which I think is maintained.&lt;/li&gt;
&lt;li&gt;Removed some of the limitations I initially designed into the &lt;tt class="docutils literal"&gt;Selector&lt;/tt&gt; class.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With those done, I should only need some light tweaking to be ready to test this stuff out.
For now, though, sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Stars Without Number"></category><category term="short post"></category></entry><entry><title>Coding 2024-09-21</title><link href="https://mwchase.neocities.org/coding-2024-09-21" rel="alternate"></link><published>2024-09-21T04:00:00-04:00</published><updated>2024-09-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-09-21:/coding-2024-09-21</id><summary type="html">&lt;p class="first last"&gt;Am I sure I need this? No. Is it satisfying? Yes.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Breaking things down now, very carefully:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;When I'm specifying the classes in a tag, I want to have access to a &amp;quot;typed subset&amp;quot; kind of construction.
This is what the current &lt;tt class="docutils literal"&gt;Flag&lt;/tt&gt; usage gets me.&lt;/li&gt;
&lt;li&gt;When I'm specifying the classes in a CSS selector, I care very strongly about the ordering.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are, fundamentally, three different cases to consider:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Unmodified block/element&lt;/li&gt;
&lt;li&gt;Modified block/element&lt;/li&gt;
&lt;li&gt;Element descendant of modified block&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For a given block, the unmodified selectors should go before the modified ones, and the descendant tags can go anywhere because they have the highest specificity.&lt;/p&gt;
&lt;p&gt;As such, let's try harmonizing ordering with how SCSS or suchlike would do it.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Unmodified block&lt;/li&gt;
&lt;li&gt;Modified block&lt;/li&gt;
&lt;li&gt;Descendants of modified block&lt;/li&gt;
&lt;li&gt;Unmodified element&lt;/li&gt;
&lt;li&gt;Modified element&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My inclination right now is to do this with a partial ordering where only selectors with the same base block are comparable.
To deal with the incompatible orderings, we need to sort them into an unordered collection of ordered bins, or rather, maps where we sort the keys before iterating.
Regardless, they must be sorted by base type.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;You're bringing back dependent mappings again, aren't you?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;To be fair, there's only any actual code there if I bother trying to make it pass type checking.&lt;/p&gt;
&lt;p&gt;Anyway, to get ordering working, I &lt;em&gt;could&lt;/em&gt; try to coordinate stuff across multiple classes, or I could punt on that and just come up with some slightly strange ordering logic:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@attrs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;frozen&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Selector&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;B&lt;/span&gt;  &lt;span class="c1"&gt;# Require length of zero or one&lt;/span&gt;
    &lt;span class="n"&gt;element&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;  &lt;span class="c1"&gt;# Require length of zero or one&lt;/span&gt;

    &lt;span class="c1"&gt;# Define an ordering thus:&lt;/span&gt;
    &lt;span class="c1"&gt;# 0, None (bucket 0)&lt;/span&gt;
    &lt;span class="c1"&gt;# 1, None&lt;/span&gt;
    &lt;span class="c1"&gt;# 1, A0 (bucket 1)&lt;/span&gt;
    &lt;span class="c1"&gt;# 1, A1&lt;/span&gt;
    &lt;span class="c1"&gt;# 1, B0&lt;/span&gt;
    &lt;span class="c1"&gt;# 1, B1&lt;/span&gt;
    &lt;span class="c1"&gt;# 0, A0 (bucket 2)&lt;/span&gt;
    &lt;span class="c1"&gt;# 0, A1&lt;/span&gt;
    &lt;span class="c1"&gt;# 0, B0&lt;/span&gt;
    &lt;span class="c1"&gt;# 0, B1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It's a little funky that the block part has this alternation in the sort order, but I think it makes things work out aesthetically.
Sorting happens first by bucket, and within buckets, sorts by tag name.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, I did all of that, and maybe a few other things besides.
I need to get away from this for a bit, rest and let the dust settle, before I work out if anything I just did actually made sense.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Stars Without Number"></category></entry><entry><title>Coding 2024-09-20</title><link href="https://mwchase.neocities.org/coding-2024-09-20" rel="alternate"></link><published>2024-09-20T04:00:00-04:00</published><updated>2024-09-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-09-20:/coding-2024-09-20</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;I think I just figured out how to get rid of the underscore in the class name. Somehow, that was the worst thing to do.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, it's late, so let's blitz through this.&lt;/p&gt;
&lt;p&gt;After a bunch of really wonky metaprogramming, I have the beginning of a mini-library for manipulating BEM class names in Python.
There are a few things missing, so I'll run through them quickly:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;An &lt;em&gt;arbitrary instance&lt;/em&gt; of the enums I've written should be able to generate CSS classes to go &lt;em&gt;into a tag&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;A one-element instance of the enums and either a zero-element instance or the class itself, should be used to generate CSS selectors to go &lt;em&gt;into a style definition&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'll try to figure this out later.
For now, it's really late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Stars Without Number"></category><category term="short post"></category></entry><entry><title>Coding 2024-09-19</title><link href="https://mwchase.neocities.org/coding-2024-09-19" rel="alternate"></link><published>2024-09-19T04:00:00-04:00</published><updated>2024-09-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-09-19:/coding-2024-09-19</id><summary type="html">&lt;p class="first last"&gt;Bringing bad ideas to life.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't turn on my computer until way late tonight, so I'm going to quickly talk about code I could write soon, rather than try to actually write it.&lt;/p&gt;
&lt;p&gt;I'm still leaning towards using BEM for CSS.
Now, the SCSS source for Three Dollar Quill doesn't quite adhere to BEM practices for a few reasons (one is that I have to write the code to work with HTML that I can't figure out how to &lt;em&gt;easily&lt;/em&gt; control the generation of, another is that I was lazy and stuck everything in a single monolithic file).
I will be again doing something weird, but for a different reason (I want to avoid setting up an asset pipeline, so I'm going to try to generate CSS in Python instead of Sass (although, for what it's worth, I could invoke Sass bindings from within Python...))&lt;/p&gt;
&lt;p&gt;Anyway, all of that means that I think it would be neat to give Blocks and Elements a kind of programmatic identity.
Like, here are the blocks, here are the associated elements, here are the modifiers they can take.
And render them into various combinations.
In &lt;tt class="docutils literal"&gt;class&lt;/tt&gt; attributes, &amp;quot;here is a block or element, and a set of associated modifiers&amp;quot;.
In CSS...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;A block&lt;/li&gt;
&lt;li&gt;A block's modifier&lt;/li&gt;
&lt;li&gt;An element&lt;/li&gt;
&lt;li&gt;An element's modifier&lt;/li&gt;
&lt;li&gt;An element that is a descendant of its associated block, with a particular modifier on that block&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My heart keeps on wanting to represent the &lt;tt class="docutils literal"&gt;class&lt;/tt&gt; attribute case with a flag enum, which I think indicates that there's something a bit wonky with my heart.&lt;/p&gt;
&lt;p&gt;Like, there'd be two &lt;tt class="docutils literal"&gt;Flag&lt;/tt&gt; subclasses that handle some behavior, and the &lt;tt class="docutils literal"&gt;Element&lt;/tt&gt; one would need a reference to a subclass of &lt;tt class="docutils literal"&gt;Block&lt;/tt&gt;, which means it's time for me to bust out the generic enum metaclass again.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;🎉&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Anyway, all of the CSS cases would require contracts on the length of the instance.&lt;/p&gt;
&lt;p&gt;At this point, I've thought about this enough that I really want to try it to see what breaks.&lt;/p&gt;
&lt;p&gt;Anyway, it's super late, time to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Stars Without Number"></category></entry><entry><title>Coding 2024-09-18</title><link href="https://mwchase.neocities.org/coding-2024-09-18" rel="alternate"></link><published>2024-09-18T04:00:00-04:00</published><updated>2024-09-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-09-18:/coding-2024-09-18</id><summary type="html">&lt;p class="first last"&gt;Doing the exact same thing as before, but faster.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I've coded in some color schemes, and now I want to set up an entry point so testing this stuff out will be less obnoxious.
I've got Click added in properly, but I need to figure out where to put it.&lt;/p&gt;
&lt;p&gt;I'm leaning towards &amp;quot;a module next to the code it imports&amp;quot;, but what to call it...
Like, what kind of command do I want to be calling...
&lt;tt class="docutils literal"&gt;[SOMETHING] campaign/sectors/sector.toml &lt;span class="pre"&gt;-o&lt;/span&gt; sector.pdf&lt;/tt&gt;...
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;export-sector&lt;/span&gt;&lt;/tt&gt;, maybe?&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;And with a bit of futzing around, (as well as pointedly ignoring the deprecation warnings around some of the packages I'm using), I've got a nice command-line system for generating these files.
With all of that out of the way, I can get to work improving the actual rendering logic powering all of this.&lt;/p&gt;
&lt;p&gt;Anyway, I let things get late and I need to pack up and get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Stars Without Number"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2024-09-17</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-09-17" rel="alternate"></link><published>2024-09-17T04:00:00-04:00</published><updated>2024-09-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-09-17:/weekly-roundup-2024-09-17</id><summary type="html">&lt;p class="first last"&gt;See, the trick to dealing with coming up with so many detours to a task I'm doing for fun is, I just try to enjoy the ride. So it's going to take another few weeks before I can start playing. Whatever.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I decided to avoid using regular hexagons for my hex grid. They're close to regular, and can be made further if I desire.&lt;/li&gt;
&lt;li&gt;Thursday: I generated an SVG hex grid; it had problems.&lt;/li&gt;
&lt;li&gt;Friday: I started researching means of producing a PDF file instead of working with raw SVG.&lt;/li&gt;
&lt;li&gt;Saturday: The solution I found uses HTML, which is fine, so I got my project set up to work with Jinja templates.&lt;/li&gt;
&lt;li&gt;Sunday: Took it easy.&lt;/li&gt;
&lt;li&gt;Monday: I generated a PDF from code; it had problems.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bonus thing: I discovered today that some of the CSS on the blog was broken, so today's update is extra-big to fix it.
(See, it pushes new versions of every page, to invalidate the CSS caching, and, eh.)&lt;/p&gt;
&lt;p&gt;Next week, I'm going to try to put more of the pipeline together:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Take the same collection of imports and calls I do every time, and package it up in a Click entry point.&lt;/li&gt;
&lt;li&gt;Inject basic CSS directly into the generated HTML.
For now, just get the color scheme put into CSS variables and make sure I can use them in the output.&lt;/li&gt;
&lt;li&gt;Get the SVG output a little more structured because I think I want to be using BEM to style everything, and stuff like &amp;quot;a hex&amp;quot; and &amp;quot;its label&amp;quot; should go in the same logical unit, right?&lt;/li&gt;
&lt;/ul&gt;
</content><category term="Weekly Roundup"></category><category term="Stars Without Number"></category></entry><entry><title>Coding 2024-09-16</title><link href="https://mwchase.neocities.org/coding-2024-09-16" rel="alternate"></link><published>2024-09-16T04:00:00-04:00</published><updated>2024-09-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-09-16:/coding-2024-09-16</id><summary type="html">&lt;p class="first last"&gt;Somehow, I am doing web development in what's going to be a non-interactive command-line utility. Try not to think about this too hard.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Here's what I'm seeing from slamming stuff together between a bunch of different libraries:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I need to write CSS to get things centered.&lt;/li&gt;
&lt;li&gt;The svg viewport is cutting it off too soon at the bottom.&lt;/li&gt;
&lt;li&gt;The svg is way too small.&lt;/li&gt;
&lt;li&gt;All of the previous complaints I had about the svg still hold, because I haven't yet tried to do anything about them.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hm.
If I'm going to be writing CSS anyway, I should put a class on the svg elements and see if I can make that work.&lt;/p&gt;
&lt;p&gt;That's probably going to need some tweaking, but I can make things work.
For now, I'm going to research CSS methodologies.
(Like, if you look under the hood on this blog, I'm doing something that's supposed to be my idea of BEM (although I'm apparently missing some aspects of it in the backend code), but maybe there's something else I'd prefer using for this project?
I don't know.)
Anyway, I should wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Stars Without Number"></category><category term="short post"></category></entry><entry><title>Diary 2024-09-15</title><link href="https://mwchase.neocities.org/diary-2024-09-15" rel="alternate"></link><published>2024-09-15T04:00:00-04:00</published><updated>2024-09-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-09-15:/diary-2024-09-15</id><summary type="html">&lt;p class="first last"&gt;Nothing of interest here.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I thought I was going to get stuff done today that I could blog about, but I ended up taking it easy and messing with things that I don't want to write up here.&lt;/p&gt;
&lt;p&gt;Maybe I'll keep on taking things easy.
We'll see.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2024-09-14</title><link href="https://mwchase.neocities.org/coding-2024-09-14" rel="alternate"></link><published>2024-09-14T04:00:00-04:00</published><updated>2024-09-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-09-14:/coding-2024-09-14</id><summary type="html">&lt;p class="first last"&gt;I had a hard week, so I need to take things easy.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't try to get too much done today.
Here's what I got:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Installed dependencies to generate and process html.&lt;/li&gt;
&lt;li&gt;Added &lt;tt class="docutils literal"&gt;MANIFEST.in&lt;/tt&gt; file that should make things work if I ever package this up.&lt;/li&gt;
&lt;li&gt;Basic attempt at a template.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What I need to try next is to write code to use the new template to generate a bare-bones HTML page, then convert it to PDF, and see how messed-up the result is.&lt;/p&gt;
&lt;p&gt;I'll see about that tomorrow, maybe.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Stars Without Number"></category><category term="short post"></category></entry><entry><title>Coding 2024-09-13</title><link href="https://mwchase.neocities.org/coding-2024-09-13" rel="alternate"></link><published>2024-09-13T04:00:00-04:00</published><updated>2024-09-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-09-13:/coding-2024-09-13</id><summary type="html">&lt;p class="first last"&gt;I really hope I'm able to use recent CSS for this...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I want to read a book instead of stuff on my screen, so I'm just going to put down some quick thoughts.&lt;/p&gt;
&lt;p&gt;I realized that I want the final output from this sector rendering process to be a PDF.
So I need to figure out how to go from the SVG I generate to a PDF; it looks like there are libraries for converting from HTML to PDF, so I can embed the SVG in HTML and then convert it.
This maybe means not saving it directly to a file, which is fine.&lt;/p&gt;
&lt;p&gt;The big thing to look into is writing command-line interfaces, now that I have functions that do something useful when I call them over and over.&lt;/p&gt;
&lt;p&gt;This all looks like reasonable stuff to work on when I'm a bit better rested.
Speaking of which.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Stars Without Number"></category><category term="short post"></category></entry><entry><title>Coding 2024-09-12</title><link href="https://mwchase.neocities.org/coding-2024-09-12" rel="alternate"></link><published>2024-09-12T04:00:00-04:00</published><updated>2024-09-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-09-12:/coding-2024-09-12</id><summary type="html">&lt;p class="first last"&gt;Instead of one black triange, it's 80 black hexagons.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Here's what I've got so far, from my attempts to generate a hex grid:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The hexes are black with a thin white border; they should be white with a somewhat thicker black border.&lt;/li&gt;
&lt;li&gt;The viewport is too small.&lt;/li&gt;
&lt;li&gt;The hexes are probably too big.&lt;/li&gt;
&lt;li&gt;The hexes should be offset enough to provide decent margins.&lt;/li&gt;
&lt;li&gt;I'm not even trying to render hex-specific information yet.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other than that, it's nice to see idle planning generally come together.
I'm still a little wiped out from how the last few days have been, so I'm going to get ready for bed now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Stars Without Number"></category><category term="short post"></category></entry><entry><title>Coding 2024-09-11</title><link href="https://mwchase.neocities.org/coding-2024-09-11" rel="alternate"></link><published>2024-09-11T04:00:00-04:00</published><updated>2024-09-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-09-11:/coding-2024-09-11</id><summary type="html">&lt;p class="first last"&gt;There are much better rational approximations, but I do not care right now.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today was kind of rough, so let's just toss out some ideas, no pressure.&lt;/p&gt;
&lt;p&gt;So, drawing hexes requires explicit coordinates for all points.
Since I'm tiling them, any irrational numbers will end up compounded as the hexes continue sideways/down.
Is that a problem?
I don't truly know, but I would rather just use a small rational approximation to the square root of three, so I don't have to think about it.
Seven fourths should be &lt;em&gt;fine&lt;/em&gt;.
I'm assuming that I'll end up wanting a &amp;quot;worse&amp;quot; approximation for aesthetic reasons of some kind, but seven fourths is a good number for not really thinking about it.&lt;/p&gt;
&lt;p&gt;And speaking of not really thinking about it, I'm pretty tired already, so I'll just leave this here and start experimenting with it later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Stars Without Number"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2024-09-10</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-09-10" rel="alternate"></link><published>2024-09-10T04:00:00-04:00</published><updated>2024-09-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-09-10:/weekly-roundup-2024-09-10</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;The string representation of dice pools is drowning!&amp;quot; &amp;quot;This isn't about them.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I put together some plans for the code to help with Stars Without Number.&lt;/li&gt;
&lt;li&gt;Thursday: I started designing a very complicated system for carrying out arbitrary rolls. I will not need to carry out arbitrary rolls any time soon.&lt;/li&gt;
&lt;li&gt;Friday: I started trying to decide how to report intermediate steps in rolls to the user.&lt;/li&gt;
&lt;li&gt;Saturday: I tried to use a ready-made third-party library, and got tripped up by the fact that it's ready-made for a subtly different use case.&lt;/li&gt;
&lt;li&gt;Sunday: I decided to give up on adapting third-party code to this, and rewrite some old code from a few years ago.&lt;/li&gt;
&lt;li&gt;Monday: I rewrote the code from a few years ago, and then, freed of the burden of not having those helper functions, tossed together deserialization logic thanks to cattrs, which &lt;em&gt;is&lt;/em&gt; ready-made for pretty much exactly what I used it for here.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I will figure out how to programmatically vector-draw hexagons in a way that I'm happy with, among other things.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Stars Without Number"></category></entry><entry><title>Coding 2024-09-09</title><link href="https://mwchase.neocities.org/coding-2024-09-09" rel="alternate"></link><published>2024-09-09T04:00:00-04:00</published><updated>2024-09-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-09-09:/coding-2024-09-09</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;I knew this part was going to be basically easy.&amp;quot; is not a &lt;em&gt;great&lt;/em&gt; reason to procrastinate, but I can't say I'm disappointed with the results.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got enough of a stub for reporting to implement the helper code I currently want.
(The code is missing nice stringification, and I don't want to handle that right now.)&lt;/p&gt;
&lt;p&gt;With that done well enough for now, I tossed together cattrs-based deserialization for the sector data I generated previously.&lt;/p&gt;
&lt;p&gt;I'm tired right now, but I think the next step is to work out image generation and potential route calculations.
From there, I can work on figuring out how to represent &lt;em&gt;actual&lt;/em&gt; routes in the data, and to deserialize that into some form of reasonable object.
(NB self: I need to check whether having a working route in one direction automatically implies having a working route in the other direction.)&lt;/p&gt;
&lt;p&gt;Anyway, that's enough for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Stars Without Number"></category><category term="short post"></category></entry><entry><title>Coding 2024-09-08</title><link href="https://mwchase.neocities.org/coding-2024-09-08" rel="alternate"></link><published>2024-09-08T04:00:00-04:00</published><updated>2024-09-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-09-08:/coding-2024-09-08</id><summary type="html">&lt;p class="first last"&gt;I stared at this for a few minutes trying to come up with a summary, which is a sign that I should maybe not bother.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I kept on reconsidering, and I'm still thinking the best course of action is to just dust off the designs I came up with years ago, and make them... somewhat less janky.
Sometimes merely differently janky.&lt;/p&gt;
&lt;p&gt;Now that I've committed to &amp;quot;okay, let's have this code in here&amp;quot;, I do kind of have to ponder the choices I'm making for package layout.
It's a little chaotic and thrown-together, currently.&lt;/p&gt;
&lt;p&gt;Today was a rough day towards the end, so I don't have anything else to cover right now.
Going to try to get some proper sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Stars Without Number"></category><category term="short post"></category></entry><entry><title>Coding 2024-09-07</title><link href="https://mwchase.neocities.org/coding-2024-09-07" rel="alternate"></link><published>2024-09-07T04:00:00-04:00</published><updated>2024-09-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-09-07:/coding-2024-09-07</id><summary type="html">&lt;p class="first last"&gt;It looks really good except for the parts that look really questionable.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&amp;quot;Maybe I can just slot in some third-party logging library and it'll just do what I want.&amp;quot;&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Hm.
Hm.&lt;/p&gt;
&lt;p&gt;I'm... really not sure if I want to keep on going down this road.
This is &lt;a class="reference external" href="https://eliot.readthedocs.io/en/stable/index.html"&gt;Eliot&lt;/a&gt;, which is &lt;em&gt;meant for&lt;/em&gt; making it easier to analyze complex systems at scale.
I'm trying to generate human-readable summaries of relatively simple workflows.
Certain... tensions... between these goals are manifesting.&lt;/p&gt;
&lt;p&gt;In light of that, I'm kind of leaning towards rolling my own system for dice logging, but maybe I'll reconsider by the next time I think about this.&lt;/p&gt;
&lt;p&gt;Either way, it's late and I need to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Stars Without Number"></category><category term="short post"></category></entry><entry><title>Coding 2024-09-06</title><link href="https://mwchase.neocities.org/coding-2024-09-06" rel="alternate"></link><published>2024-09-06T04:00:00-04:00</published><updated>2024-09-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-09-06:/coding-2024-09-06</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;So I don't &lt;em&gt;actually need&lt;/em&gt; most of this complexity currently...&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I've redone the rolling logic and gotten the interface roughed out.
Now, I want to figure out how to report intermediate results to the user.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;You've already over-engineered this code so much.
Is there no chance that you can focus on the things that are actually relevant now, such as deserialization or image generation?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The missing capabilities &lt;em&gt;irk&lt;/em&gt; me.&lt;/p&gt;
&lt;p&gt;Now, to be clear, I've already got a previous attempt at this in my back pocket, and I could try to draw from that attempt, but I'd like to try for something consciously different to start with.
(Not least because of some amazing conceptual contortions in the previous attempt.)&lt;/p&gt;
&lt;p&gt;For now, I'll focus on a few questions of varying importance:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;When I pop open a Python REPL and do a roll, where should the messages go?&lt;/li&gt;
&lt;li&gt;If I have a pure CLI script, which output stream should the messages go to, and how should they be sent there?&lt;/li&gt;
&lt;li&gt;How do I want to do all of this for some kind of TUI or GUI?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I need to ponder this some more, and look for prior art.
For now, I'm going to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Stars Without Number"></category></entry><entry><title>Coding 2024-09-05</title><link href="https://mwchase.neocities.org/coding-2024-09-05" rel="alternate"></link><published>2024-09-05T04:00:00-04:00</published><updated>2024-09-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-09-05:/coding-2024-09-05</id><summary type="html">&lt;p class="first last"&gt;Some joker is going to come up with a reason to use dice that don't roll a uniform distribution of a contiguous range of integers.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I've worked out how to avoid template pattern stuff.
The new design I'm working towards as a result is... a thing.
There are a few bits that I'm missing and I need to sketch out how they should work.&lt;/p&gt;
&lt;p&gt;Here's the idea of the new design:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;There are a few &amp;quot;internal&amp;quot; dice types, which all accept a scaling factor. (I am not at all confident that Mypy will accept how I have implemented this.)&lt;/li&gt;
&lt;li&gt;These are collected into a &amp;quot;pool&amp;quot;, in a PBag, along with an integer offset.&lt;/li&gt;
&lt;li&gt;The pool can be rolled, but this does not produce a final numerical result. Instead, it produces a mapping from the number rolled on each die, to a bag of the dice that rolled that number.&lt;/li&gt;
&lt;li&gt;This should be sufficient for stuff like the obvious choice of summing everything up (simply scale by the length of the bag), as well as more involved means of scoring or determining an outcome, as well as allowing for intermediate processing steps like exploding dice or dropping or doubling extreme entries.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What I need to figure out now is the proper way to handle &amp;quot;pipelining&amp;quot; this stuff, as well as the &amp;quot;basic&amp;quot; case of &amp;quot;please just sum up these dice, crazy software design person&amp;quot;.&lt;/p&gt;
&lt;p&gt;I'll think about that overnight and see what I come up with.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Stars Without Number"></category></entry><entry><title>Coding 2024-09-04</title><link href="https://mwchase.neocities.org/coding-2024-09-04" rel="alternate"></link><published>2024-09-04T04:00:00-04:00</published><updated>2024-09-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-09-04:/coding-2024-09-04</id><summary type="html">&lt;p class="first last"&gt;Sometimes, I'm just going to be thinking about code. That's how it is.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I've tossed together some classes that should handle things.
Let's review and update my goals from last time:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Get cattrs to successfully process the TOML file I wrote.&lt;/li&gt;
&lt;li&gt;SVG output.&lt;/li&gt;
&lt;li&gt;Review confusing planets&lt;/li&gt;
&lt;li&gt;Stretch goal for now: overhaul my thrown-together dice implementation for superior testability and logging&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The main thing I anticipate to be funky with cattrs is that I want to turn nested maps into a single map with tuple keys.
This seems like it should be possible, but there's no reason for it to be out-of-the-box behavior.
Every other part of the process should be straightforward&lt;/p&gt;
&lt;p&gt;Concerns for the SVG output include:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;How to balance ease of hex shaping with sensible coordinates&lt;/li&gt;
&lt;li&gt;Applying a shear transform to the coordinates to compensate for what the X coordinate does to the Y coordinate&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As far as the stretch goal, here's what I want to improve on...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Right now, each die simply calls &lt;tt class="docutils literal"&gt;random.randint&lt;/tt&gt; to produce its results.&lt;/li&gt;
&lt;li&gt;There is no indication &lt;em&gt;that&lt;/em&gt; a die was rolled.&lt;/li&gt;
&lt;li&gt;There is no indication of any die's results.&lt;/li&gt;
&lt;li&gt;There is no indication of &lt;em&gt;why&lt;/em&gt; a die was rolled.&lt;/li&gt;
&lt;li&gt;I want nicer string representations for the different types of dice.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tossing out some ideas for using context variables to address this:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;roll&lt;/tt&gt; methods should take a &lt;tt class="docutils literal"&gt;reason&lt;/tt&gt; argument.&lt;/li&gt;
&lt;li&gt;There should be a callback that all &lt;tt class="docutils literal"&gt;roll&lt;/tt&gt; methods call that records the reason.&lt;/li&gt;
&lt;li&gt;The behavior of this callback should be customizable via a context variable.&lt;/li&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;Dice&lt;/tt&gt; compound type should suppress reason noting in sub-calls, and pass the reason through unchanged.&lt;/li&gt;
&lt;li&gt;There should be a callback that all &lt;tt class="docutils literal"&gt;roll&lt;/tt&gt; methods call that records the result.&lt;/li&gt;
&lt;li&gt;This should be similarly customizable, but there doesn't need to be any normal code making use of the customization.&lt;/li&gt;
&lt;li&gt;There should also be customization for the randomness source, in a similar fashion.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some of this could be testable via mocking, but, eh, I'd rather put in the effort to make this work, than try to have mocking happen to work.&lt;/p&gt;
&lt;p&gt;The other thing I need to consider is the level of template pattern usage I'm currently considering.
It &lt;em&gt;feels&lt;/em&gt; okay to me, but my not-quite-gut reaction is that I'm likely to reconsider this later.&lt;/p&gt;
&lt;p&gt;I'll have to sleep on this and see what I think.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Stars Without Number"></category></entry><entry><title>Weekly Roundup 2024-09-03</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-09-03" rel="alternate"></link><published>2024-09-03T04:00:00-04:00</published><updated>2024-09-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-09-03:/weekly-roundup-2024-09-03</id><summary type="html">&lt;p class="first last"&gt;Let's hope this keeps on moving things forward.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I tried to design a Click clone in Lua.&lt;/li&gt;
&lt;li&gt;Thursday: I continued to try to design a Click clone in Lua.&lt;/li&gt;
&lt;li&gt;Friday: I put down the Click clone stuff, and decided to look over what kind of rolls I need to deal with.&lt;/li&gt;
&lt;li&gt;Saturday: I realized that it would be better to &lt;em&gt;use Click&lt;/em&gt; than to try to clone it, so I made a game plan to replace &amp;quot;requiring a Lua module&amp;quot; with &amp;quot;reading a TOML file and then processing it a bunch&amp;quot;.&lt;/li&gt;
&lt;li&gt;Sunday: I filled in a bunch of stuff for the TOML file.&lt;/li&gt;
&lt;li&gt;Monday: I filled in more of the TOML file.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to focus on properly reading in the data, so I can make nice visualizations of it.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Stars Without Number"></category></entry><entry><title>Coding 2024-09-02</title><link href="https://mwchase.neocities.org/coding-2024-09-02" rel="alternate"></link><published>2024-09-02T04:00:00-04:00</published><updated>2024-09-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-09-02:/coding-2024-09-02</id><summary type="html">&lt;p class="first last"&gt;Done with the first phase of this part.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The planet details are filled in, at least their initial values.
There are a few that just seem kind of... weird.
So, here's what I'm thinking:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Code up the options from this part of the book as a bunch of enums etc.&lt;/li&gt;
&lt;li&gt;Figure out some means of SVG output.&lt;/li&gt;
&lt;li&gt;Fill in more information about the planets that are confusing or relevant to my character concept.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm seeing a few options for svg writing, and I don't want to evaluate between then right now, because it's late and we did &lt;em&gt;stuff&lt;/em&gt; today.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Stars Without Number"></category><category term="short post"></category></entry><entry><title>Coding 2024-09-01</title><link href="https://mwchase.neocities.org/coding-2024-09-01" rel="alternate"></link><published>2024-09-01T04:00:00-04:00</published><updated>2024-09-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-09-01:/coding-2024-09-01</id><summary type="html">&lt;p class="first last"&gt;Scared to see how some of these planets could be the best the system had to offer.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't touch any code.
Instead, I spent some time filling in details about the inhabited worlds in the sector.
I'm not done filling things in, and I'll probably need to reconcile a few details and possibly tweak some things to make sure that the topology of the sector is still right.&lt;/p&gt;
&lt;p&gt;Once I make some progress, I'm going to try to get the deserialization code together, but first I want to have all of the fields &lt;em&gt;present&lt;/em&gt;, if not properly filled-in.&lt;/p&gt;
&lt;p&gt;Right now, I want to veg out and watch videos.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Stars Without Number"></category><category term="short post"></category></entry><entry><title>Coding 2024-08-31</title><link href="https://mwchase.neocities.org/coding-2024-08-31" rel="alternate"></link><published>2024-08-31T04:00:00-04:00</published><updated>2024-08-31T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-08-31:/coding-2024-08-31</id><summary type="html">&lt;p class="first last"&gt;It's possible that I... tricked myself into making progress?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I just did a bunch of questionable things, but I've made progress on the adventure background, so technically this is a gain.&lt;/p&gt;
&lt;p&gt;Basically, I realized that the whole attempt to create Tap was a sign that I was trying to do things that were already solved problems.
As such, I decided to go where the libraries I know are.
Instead of tracking data in Lua files, I'm going to switch to Python, and try to rely on TOML.
(This does mean that the data format doesn't have control flow, but, like, whatever.)
I can then read it into a nested data structure, then use cattrs to convert it to attrs.&lt;/p&gt;
&lt;p&gt;Those later steps shouldn't be necessary just yet.
Not until I want to do stuff like convert the star sector data into a nice hex grid.
Inside tech baseball:
The capabilities of &lt;tt class="docutils literal"&gt;uv compile&lt;/tt&gt; have me interested, even though it probably won't mean more for this project, and definitely won't mean anything until I specify some dependencies.
Regardless, I'm maintaining a lockfile for this code, to see what happens.
Hopefully nothing too exciting.
I really do appreciate the modularity that &lt;tt class="docutils literal"&gt;uv&lt;/tt&gt; has.
Like, the virtualenv management?
I don't vibe with that workflow right now.
Not using it.
&lt;tt class="docutils literal"&gt;uv pip&lt;/tt&gt; is not judging me for this.
&lt;tt class="docutils literal"&gt;uv pip&lt;/tt&gt; is also taking commands that have nothing to do with &lt;tt class="docutils literal"&gt;pip&lt;/tt&gt;'s commands, but I have to imagine everyone is super-tired of that conversation.&lt;/p&gt;
&lt;p&gt;Anyway, sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Stars Without Number"></category></entry><entry><title>Coding 2024-08-30</title><link href="https://mwchase.neocities.org/coding-2024-08-30" rel="alternate"></link><published>2024-08-30T04:00:00-04:00</published><updated>2024-08-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-08-30:/coding-2024-08-30</id><summary type="html">&lt;p class="first last"&gt;I have finally convinced myself that a bunch of the stuff I wanted to do was a bad idea. At least for now.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;With all of that messing around yesterday, you'd think I'd be moving on to prototype Tap, right?
Nope!
Time to look at Mythic's rolls and remember how they relate to each other.&lt;/p&gt;
&lt;p&gt;Rolls on the Fate Chart can invoke Random Events.
Random Events first roll for Event Focus, which can involve the Lists; then, rolling for the Event Meaning.
Starting a Scene requires a roll to determine the nature of the scene; this may then require pretty much any kind of roll.&lt;/p&gt;
&lt;p&gt;Some meaning tables require an arbitrary number of rolls.
Ultimately, it appears better to document how all of this fits together, than to try to fit it all into code.&lt;/p&gt;
&lt;p&gt;Well, that was a little disappointing.
I can take a look at the variations to see if anything catches my eye...
Hmm, nothing I want to touch right now.&lt;/p&gt;
&lt;p&gt;The quick summary of dice in Mythic is that I can get most things done with percentile dice, most of the rest done with a d10, and the remainder with a d4, d6, and d8.&lt;/p&gt;
&lt;p&gt;In Stars Without Number, I see... d20 for saving throws, d6 for skill checks, d8 for initiative except I'm not going to bother rolling initiative, d20 to hit, d whatever to determine damage.
There's a lot of stuff here.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;I just took a quick look over the various things my character can buy when the time comes.
Nothing has quite grabbed me yet.&lt;/p&gt;
&lt;p&gt;At this point, I think the sensible course of action is to punt on the machine-readable ideas for now, print out and fill out a character sheet, and the other sheets, take pictures to keep track of things, and just start going.&lt;/p&gt;
&lt;p&gt;Right now, though, bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Lua"></category><category term="Stars Without Number"></category></entry><entry><title>Coding 2024-08-29</title><link href="https://mwchase.neocities.org/coding-2024-08-29" rel="alternate"></link><published>2024-08-29T04:00:00-04:00</published><updated>2024-08-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-08-29:/coding-2024-08-29</id><summary type="html">&lt;p class="first last"&gt;I &lt;em&gt;think&lt;/em&gt; all of this shouldn't be excessively difficult.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I feel like doing a bit more planning, since there isn't really a point in writing elaborate subcommand infrastructure if it can't actually parse things for one command.
I'm calling this project the Terminal Argument Parser; it's inspired by the Command Line Interface Creation Kit.
So, let's look over the Click documentation and figure out what to copy and what to do differently.&lt;/p&gt;
&lt;p&gt;First major thing: Lua does not care if you do ludicrous higher-order function stuff, but there's no syntactic sugar comparable to Python's decorators, so let's punt on the exact shape the interface takes.&lt;/p&gt;
&lt;p&gt;Let's see what to keep from &lt;tt class="docutils literal"&gt;option&lt;/tt&gt;s.
Definitely want to be able to specific different option names.
However, dispatching values based on argument name isn't a thing in Lua, so the function that ultimately handles this stuff is just going to have to take a &amp;quot;namespace&amp;quot; argument and get values from it using option names.
I think the exact same strings used on the command line should work.
Options can have defaults, sure.
And some form of converter function.
Can mark it as required.
That seems like it should be mutually exclusive with providing a default...
If there is a default, can choose whether to print it in the help.
Flag-type values need a bit more thought.&lt;/p&gt;
&lt;p&gt;These don't take any arguments on the command line, and should toggle between two states, usually true and false.
If I'm committing to not having a &amp;quot;destination&amp;quot; concept, then there are two possible situations:
Either there's one flag argument that switches from one arbitrary value to another, or there are paired flag arguments that have opposite boolean values.
I feel a slight aesthetic affinity for the latter, but I don't have a sense of what this project is going to actually need, if anything.&lt;/p&gt;
&lt;p&gt;Multi value options.
Not compatible with flags.
Aesthetically, they make me want to make &amp;quot;vanilla&amp;quot; converter functions &amp;quot;pervasive&amp;quot;, applying the same mapping operation to every argument; specialized multi-value converters can then only work on specific numbers of arguments.
Note that doing it like this &lt;em&gt;would not&lt;/em&gt; set &lt;tt class="docutils literal"&gt;nargs&lt;/tt&gt;, so perhaps there's an argument to be made for dispatching on whether the converter is passed as a function or an array.
(Of course, it could be a functable, so maybe a table with a metatable should be treated as a function?)&lt;/p&gt;
&lt;p&gt;Multiple options.
I may have put myself into a bit of a corner.
Here's what makes sense to me:
If &lt;em&gt;multiple options&lt;/em&gt; are supported, then that's handled by multiple returns.
If &lt;em&gt;multi values&lt;/em&gt; are supported, then the result of converting is &lt;em&gt;somehow&lt;/em&gt; collected into a single table.
So if you do both, then you get a bunch of tables.&lt;/p&gt;
&lt;p&gt;Counting.
Is a type of flag.
I assume it could have a default value of some integer, but I'm not sure what that would accomplish that couldn't be done by just defaulting to zero and adding a number later.&lt;/p&gt;
&lt;p&gt;Boolean flags goes over stuff I mentioned earlier...&lt;/p&gt;
&lt;p&gt;Then we've got feature switches.
By the reasoning I had above, Tap would have this as a set of flag values in which no more than one can be true at once.&lt;/p&gt;
&lt;p&gt;Choice options... are a type of converter.&lt;/p&gt;
&lt;p&gt;Prompting is another dimension of variation.
I don't know how much of a pain it is to support the password-related features.&lt;/p&gt;
&lt;p&gt;I guess stuff like &lt;tt class="docutils literal"&gt;show_default&lt;/tt&gt;, eager parameters, and callbacks need to be a thing... Woof.
Eager parameters imply, I think, that the stack of subcommands needs to be built up ahead of time.
Which is doable, just, kind of a pain.
No need to worry about an equivalent to &lt;tt class="docutils literal"&gt;expose_value&lt;/tt&gt; I think; if you don't look for it, you won't see it.&lt;/p&gt;
&lt;p&gt;Want to implement a yes parameter, then write a helper for it...&lt;/p&gt;
&lt;p&gt;For environment variable stuff, the prefix has to be passed to the top-level call, and choosing an environment variable requires that Tap does choose a canonical name.
I'm not so interested in automatically generating an environment variable name, as I am in specifying a static one, so I can do something like &lt;tt class="docutils literal"&gt;export CHAOS_FACTOR=5&lt;/tt&gt;.
That may be simply a dynamic default.&lt;/p&gt;
&lt;p&gt;Skimming over arguments...
These either need to be specified in a clear order via sequencing of calls, or simply passed in a list.
Aside from that, most of the work to support arguments appears to be in custom converters.&lt;/p&gt;
&lt;p&gt;I won't say all of this is simple—it frankly seems like a huge confusing tangle—but I've got a starting point for drawing a confusing diagram of how different options relate to each other, and that's really all I wanted for now.
Anyway, I need to get ready for bed like five minutes ago.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Lua"></category><category term="Stars Without Number"></category></entry><entry><title>Coding 2024-08-28</title><link href="https://mwchase.neocities.org/coding-2024-08-28" rel="alternate"></link><published>2024-08-28T04:00:00-04:00</published><updated>2024-08-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-08-28:/coding-2024-08-28</id><summary type="html">&lt;p class="first last"&gt;Wow, this yak's hair is &lt;em&gt;really&lt;/em&gt; thick...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I've tried to work out some stuff for this Lua code in my head, and it's not working out.
Let's try to hash this out in a blog post.&lt;/p&gt;
&lt;p&gt;I want to have Lua modules, which can be used in, technically, three different ways:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Object which can be used in other code.&lt;/li&gt;
&lt;li&gt;Command-line endpoint that carries out some action.&lt;/li&gt;
&lt;li&gt;Subcommand that some other command delegates to.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I've managed to write a utility function to check whether some code is running as a direct result of a &lt;tt class="docutils literal"&gt;lua&lt;/tt&gt; command, via &lt;tt class="docutils literal"&gt;if debug.getinfo(4) then&lt;/tt&gt;.
It's weird-looking and unintuitive, but it works.&lt;/p&gt;
&lt;p&gt;Now, let's think about command-line parsing.
I want the result of parsing to be a table, which is passed to a function...&lt;/p&gt;
&lt;p&gt;Thinking about stuff like cleanup and control flow, I think this function should use the &lt;tt class="docutils literal"&gt;coroutine&lt;/tt&gt; library to do something sort of like Python's context managers.&lt;/p&gt;
&lt;p&gt;So, let's see how I think things should go together.
There should be a function that takes a table input, and performs some action.
There should be a function that converts a list of strings to a table.&lt;/p&gt;
&lt;p&gt;This table may contain an array of unparsed strings, and a similar pair of functions.&lt;/p&gt;
&lt;p&gt;These need to be handled by a runner that takes a table containing those functions, and optionally a list of strings.&lt;/p&gt;
&lt;p&gt;Then, the &lt;tt class="docutils literal"&gt;debug.getinfo&lt;/tt&gt; wrapper needs to be able to take a callback for the script case.&lt;/p&gt;
&lt;p&gt;All of this has, of course, completely ignored the logic behind &amp;quot;parsing out arguments and options into a table&amp;quot;.&lt;/p&gt;
&lt;p&gt;Here's a weird idea: instead of collecting option values into a table, return them from a function, so it just uses multiple returns if there are multiple values...
This idea would have a slight issue of not distinguishing &amp;quot;didn't pass anything to a flag that takes an optional argument&amp;quot; from &amp;quot;didn't pass the flag at all&amp;quot;...
At least, it can have that issue, depending on the details of how I implement it...&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Wait, so, you're trying to represent RPG character sheets in a machine-trackable format, right?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Yes...&lt;/p&gt;
&lt;div class="admonition smiley smiley-glitchier"&gt;
&lt;p class="first admonition-title"&gt;:) (glitchier)&lt;/p&gt;
&lt;p class="last"&gt;&lt;em&gt;So why the HECK are you trying to clone Click in Lua‽&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Haha, that's all for now folks, I'll try to start coding stuff up tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Lua"></category><category term="Stars Without Number"></category></entry><entry><title>Weekly Roundup 2024-08-27</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-08-27" rel="alternate"></link><published>2024-08-27T04:00:00-04:00</published><updated>2024-08-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-08-27:/weekly-roundup-2024-08-27</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Oh, I'm going slow. I should try switching things up.&amp;quot; ... &amp;quot;I'm still going slooooow...&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: Decided to play a tabletop RPG. Not sure why I ended up shaving that yak.&lt;/li&gt;
&lt;li&gt;Thursday: I will be trying to describe actual details of Stars Without Number, since it has a pretty generous free version.&lt;/li&gt;
&lt;li&gt;Friday: I realized that trying to automate the &amp;quot;referee&amp;quot; aspect of GMing Stars Without Number would probably not be worth it.&lt;/li&gt;
&lt;li&gt;Saturday: I realized I should actually interact with the rules, and thought about the right way to represent dice.&lt;/li&gt;
&lt;li&gt;Sunday: A little more character creation...&lt;/li&gt;
&lt;li&gt;Monday: A little more character creation, but soon it will be time to code more.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to be futzing around with stuff in Lua, and getting my character a bit more locked in.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Stars Without Number"></category></entry><entry><title>Coding 2024-08-26</title><link href="https://mwchase.neocities.org/coding-2024-08-26" rel="alternate"></link><published>2024-08-26T04:00:00-04:00</published><updated>2024-08-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-08-26:/coding-2024-08-26</id><summary type="html">&lt;p class="first last"&gt;A few notches closer to having a playable character.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Background in, starting skills in, currently missing a &lt;em&gt;huge&lt;/em&gt; amount of scaffolding code, and psyching myself up to choose a character class.
It's basically a question between, do I try to synergize directly with my backstory, do I put together a mildly amusing concept that will probably expose me to more complex rules, or do I try to offset the lethality of concept by specifically specializing for it, meaning that I'll kind of, you know, need to &lt;em&gt;get into&lt;/em&gt; combat to take advantage of the build, or do I try to thread the needle between two of those options?
I'm leaning towards mildly amusing, but may I should look over the psionics rules and see if that changes my mind.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, fingers crossed, I think I can handle this.&lt;/p&gt;
&lt;p&gt;Hopefully, I don't eat those words.&lt;/p&gt;
&lt;p&gt;Anyway, I &lt;em&gt;really&lt;/em&gt; need to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Lua"></category><category term="Stars Without Number"></category><category term="short post"></category></entry><entry><title>Coding 2024-08-25</title><link href="https://mwchase.neocities.org/coding-2024-08-25" rel="alternate"></link><published>2024-08-25T04:00:00-04:00</published><updated>2024-08-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-08-25:/coding-2024-08-25</id><summary type="html">&lt;p class="first last"&gt;(through gritted teeth) Incremental progress is still progress.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I've got a bit more done.
I've picked out the background for my character, and decided on my starting skills, so next I just need to figure out how to code those in.&lt;/p&gt;
&lt;p&gt;I have decided how I should handle die rolls, but I don't want to touch the code right now; I'm pretty tired and I just want to zone out.&lt;/p&gt;
&lt;p&gt;I'll get on that now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Lua"></category><category term="Stars Without Number"></category><category term="short post"></category></entry><entry><title>Coding 2024-08-24</title><link href="https://mwchase.neocities.org/coding-2024-08-24" rel="alternate"></link><published>2024-08-24T04:00:00-04:00</published><updated>2024-08-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-08-24:/coding-2024-08-24</id><summary type="html">&lt;p class="first last"&gt;I can't avoid actually playing the game forever.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I'm never quite working on what I expect to, but I'm just going to keep noodling around for a while.
I thought to myself that I'd like to have something very simple for handling command-line interfaces, and I've just kind of tossed a bunch of modules together that should let me do that.&lt;/p&gt;
&lt;p&gt;At this point, I think what it makes sense to do is to actually build a character, and start assembling the character sheet library around that.
Once I'm ready to actually get started, I'll need to put together a few things on the Mythic side of this all.&lt;/p&gt;
&lt;p&gt;The big thing I'm trying to work out right now is how I want to handle die rolls.
Like, does renaming the &lt;tt class="docutils literal"&gt;math.random&lt;/tt&gt; function get me anything, and, if so, how do I want to go about it?
Do I want each kind of die roll to just be a nullary function, or should I try to do stuff with metatables so it's like, the number of sides is foregrounded, and I can make the whole thing more data-y, which is &lt;em&gt;definitely&lt;/em&gt; a word you should use in a serious presentation.&lt;/p&gt;
&lt;p&gt;Something like&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;fudge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;die&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Hm.
Not quite vibing with this for some reason.
Going to have to take some time to think about it.
For now, bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Lua"></category><category term="Stars Without Number"></category></entry><entry><title>Coding 2024-08-23</title><link href="https://mwchase.neocities.org/coding-2024-08-23" rel="alternate"></link><published>2024-08-23T04:00:00-04:00</published><updated>2024-08-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-08-23:/coding-2024-08-23</id><summary type="html">&lt;p class="first last"&gt;If I tried to code up some of this now, it would be wrong somehow.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I looked over the combat rules for Stars Without Number, and, oof.
The bookkeeping.
I can't automate this off-the-bat.&lt;/p&gt;
&lt;p&gt;Here's my current plan:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Go ahead with writing a character sheet in Lua, including nice output of some kind.&lt;/li&gt;
&lt;li&gt;Write up references for all applicable rolls and actions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Maybe I'll have more to say once I get those done, but for now, I'm just cooling off and doing random other things.
Got to go for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Lua"></category><category term="Stars Without Number"></category><category term="short post"></category></entry><entry><title>Coding 2024-08-22</title><link href="https://mwchase.neocities.org/coding-2024-08-22" rel="alternate"></link><published>2024-08-22T04:00:00-04:00</published><updated>2024-08-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-08-22:/coding-2024-08-22</id><summary type="html">&lt;p class="first last"&gt;The yaks are shaved, now to get back to work.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got LSP integration working, and it informed me that some of the utility code I wrote was incorrect.
I addressed that.&lt;/p&gt;
&lt;p&gt;Anyway, I was going over the rules I'll be using, to make sure there aren't any major incompatibilities, and it all looks fine I think.&lt;/p&gt;
&lt;p&gt;In the past, I've felt weird about documenting stuff about paid RPG rules, buuut this is Stars Without Number, which has a free version that I believe covers all of the cogent stuff for, like, basic character interactions.
(Like, I'm not expecting to dive into the deluxe-exclusive stuff right off the bat, but it's there if I get into a Situation.)&lt;/p&gt;
&lt;p&gt;I should be ready now to start implementing Stars Without Number statistics stuff.
But for now, bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Lua"></category><category term="Stars Without Number"></category><category term="short post"></category></entry><entry><title>Coding 2024-08-21</title><link href="https://mwchase.neocities.org/coding-2024-08-21" rel="alternate"></link><published>2024-08-21T04:00:00-04:00</published><updated>2024-08-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-08-21:/coding-2024-08-21</id><summary type="html">&lt;p class="first last"&gt;The parable of the messed-up frog-scorpion hybrid.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I decided to shift gears from complicated Python code and writing focused on worldbuilding to try out solo roleplaying with minimal worldbuilding.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;And how's that going?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Well, I want to put my character sheet and transcript in revision control, and write helpful code to handle stuff like rolls and attribute bonuses.
So... currently I'm trying to debug why Kakoune doesn't seem to be starting &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;lua-language-server&lt;/span&gt;&lt;/tt&gt;.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Hoo boy.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I'll try to get this all squared away tomorrow.
Anyway, sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Lua"></category><category term="Stars Without Number"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2024-08-20</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-08-20" rel="alternate"></link><published>2024-08-20T04:00:00-04:00</published><updated>2024-08-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-08-20:/weekly-roundup-2024-08-20</id><summary type="html">&lt;p class="first last"&gt;Hmm, not happy with this rate of progress, oh well.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I switched Structured Data's testing to pytest.&lt;/li&gt;
&lt;li&gt;Thursday: A little more work on Structured Data.&lt;/li&gt;
&lt;li&gt;Friday: Nothing much.&lt;/li&gt;
&lt;li&gt;Saturday: Switching off of Ward was kind of a bummer. I wonder what it would take to clone it using techniques from MOTR.&lt;/li&gt;
&lt;li&gt;Sunday: I reviewed some of my old notes.&lt;/li&gt;
&lt;li&gt;Monday: A little more work, but I think I need to take a different approach somehow.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, maybe this, maybe something else...&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2024-08-19</title><link href="https://mwchase.neocities.org/coding-2024-08-19" rel="alternate"></link><published>2024-08-19T04:00:00-04:00</published><updated>2024-08-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-08-19:/coding-2024-08-19</id><summary type="html">&lt;p class="first last"&gt;Starting to suspect that I may be slightly burnt out.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hm.
I really would like to get some progress made on MOTR, but it's slow going to review my notes.
I am putting in some work on other things, so that's something.
I just need to work out some way to write up those things instead of &amp;quot;incremental progress remembering how MOTR should work&amp;quot;.&lt;/p&gt;
&lt;p&gt;I don't have anything else for tonight, so I'm going to see about getting ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2024-08-18</title><link href="https://mwchase.neocities.org/coding-2024-08-18" rel="alternate"></link><published>2024-08-18T04:00:00-04:00</published><updated>2024-08-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-08-18:/coding-2024-08-18</id><summary type="html">&lt;p class="first last"&gt;An intention to devise a plan to write a checklist.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;My focus today ended up mostly on the kind of stuff I don't blog about here, so there's not much to say right now, but I did look over my notes for what improvements I need to make.
I think what I should do when I'm ready is to print some of those notes out and work with them as physical objects for a bit.&lt;/p&gt;
&lt;p&gt;Basically, I need to take ideas that I came up with weeks apart, and put them together into a checklist.
I need to get over the hump into actually doing something with that, so I'll get the major notes printed out and get ready for bed, then fill in some of the other ideas later, hopefully tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2024-08-17</title><link href="https://mwchase.neocities.org/coding-2024-08-17" rel="alternate"></link><published>2024-08-17T04:00:00-04:00</published><updated>2024-08-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-08-17:/coding-2024-08-17</id><summary type="html">&lt;p class="first last"&gt;Perhaps I will do actual work on some of this soon. Not now, though.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hm.
Today, I ended up putting some stuff together for a Ward-inspired test runner.
However, one of my other inspirations was the Matrix system from MOTR, so if I want to get anywhere with this, I should probably finally revisit MOTR.&lt;/p&gt;
&lt;p&gt;I'm going to have to take a bit more time to recover from this week, but maybe I'll get some inspiration.
For now though, getting ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="short post"></category></entry><entry><title>Diary 2024-08-16</title><link href="https://mwchase.neocities.org/diary-2024-08-16" rel="alternate"></link><published>2024-08-16T04:00:00-04:00</published><updated>2024-08-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-08-16:/diary-2024-08-16</id><summary type="html">&lt;p class="first last"&gt;I didn't think of anything to write. No harm in not reading.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I'm out of it today, and I'll try to get something interesting done tomorrow.
No promises.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2024-08-15</title><link href="https://mwchase.neocities.org/coding-2024-08-15" rel="alternate"></link><published>2024-08-15T04:00:00-04:00</published><updated>2024-08-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-08-15:/coding-2024-08-15</id><summary type="html">&lt;p class="first last"&gt;Running out of stuff to do to this that is not &amp;quot;actually implement features&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I did a few more tweaks to Structured Data's code and linting.
I don't think there are any more small changes to make; I either need to switch projects or make actual progress here.&lt;/p&gt;
&lt;p&gt;THere's a chance I would have gotten more done today, but I decided to install some software on my laptop, and that was perhaps a foolish endeavor.&lt;/p&gt;
&lt;p&gt;Maybe I'll get more done tomorrow, or maybe I'll try taking things easy.
Either way, it's already late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Structured Data"></category><category term="Python"></category><category term="short post"></category></entry><entry><title>Coding 2024-08-14</title><link href="https://mwchase.neocities.org/coding-2024-08-14" rel="alternate"></link><published>2024-08-14T04:00:00-04:00</published><updated>2024-08-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-08-14:/coding-2024-08-14</id><summary type="html">&lt;p class="first last"&gt;Oops. Good thing this wasn't a hard switch.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;em&gt;A bit over a month ago...&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;quot;I've got so much experience with Pytest, I'd like to give something new a shot. Like Ward.&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Unbeknownst to me, literally the next day...&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;quot;I am no longer actively maintaining this project.&amp;quot;&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;So.&lt;/p&gt;
&lt;p&gt;I guess I should port it off?
This is, like, slightly inconvenient in some ways, and slightly convenient in others, so, ultimately, who can say how I should feel about this?&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Anyway, I switched to Pytest.
Once I got the lints to pass, everything worked, so I'm confident that I didn't break anything.&lt;/p&gt;
&lt;p&gt;Next thing to think about is how I want to try to handle &lt;a class="reference external" href="https://deal.readthedocs.io/"&gt;deal&lt;/a&gt;, now that I have a runner that has proper &lt;a class="reference external" href="https://hypothesis.works/"&gt;hypothesis&lt;/a&gt; support.
I'm not going to focus on that right now, though.
I need to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Structured Data"></category><category term="Python"></category></entry><entry><title>Weekly Roundup 2024-08-13</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-08-13" rel="alternate"></link><published>2024-08-13T04:00:00-04:00</published><updated>2024-08-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-08-13:/weekly-roundup-2024-08-13</id><summary type="html">&lt;p class="first last"&gt;Some progress, followed by a swerve. Oh well.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I put together some general ideas for Open Divination. (I have not checked whether that name is taken. Whatever.)&lt;/li&gt;
&lt;li&gt;Thursday: I reviewed the Rust tutorial, and mostly did what I was supposed to for it.&lt;/li&gt;
&lt;li&gt;Friday: I discovered that the default wasm-pack template &lt;em&gt;appears&lt;/em&gt; to not be what I want for the project layout I have in mind.&lt;/li&gt;
&lt;li&gt;Saturday: I got things more-or-less working in a different way, so that seemed promising.&lt;/li&gt;
&lt;li&gt;Sunday: I researched browser extensions, and determined that I need a &lt;tt class="docutils literal"&gt;manifest.json&lt;/tt&gt; file, but did not determine whether I want to be writing it by hand or generating it somehow.&lt;/li&gt;
&lt;li&gt;Monday: Oops, ended up improving the error reporting out of Structured Data instead of any of that.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'll probably work on, you know, &lt;em&gt;something&lt;/em&gt;.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Open Divination"></category><category term="Structured Data"></category></entry><entry><title>Coding 2024-08-12</title><link href="https://mwchase.neocities.org/coding-2024-08-12" rel="alternate"></link><published>2024-08-12T04:00:00-04:00</published><updated>2024-08-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-08-12:/coding-2024-08-12</id><summary type="html">&lt;p class="first last"&gt;Can't figure out what I'll be working on or why. Oh well.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;My attention switched tracks, so I ended up fixing up some of my Structured Data code to look... not horrifying, mainly by shoving a bunch of it into a Jinja template.&lt;/p&gt;
&lt;p&gt;Then I went looking for mutation testing for Jinja templates, because I'm sure I remembered that being some kind of thing, and the results were... frustrating.&lt;/p&gt;
&lt;div class="admonition smiley smiley-glitchy"&gt;
&lt;p class="first admonition-title"&gt;:) (glitchy)&lt;/p&gt;
&lt;p class="last"&gt;Oy, Google.
Don't give us results for &lt;em&gt;Ethereum&lt;/em&gt;, of all things.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Anyway, I forget where I was going with Structured Data, so either I'm going to remember what I'm doing, or get back to understanding browser extension packaging.
For now, I need to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Structured Data"></category><category term="short post"></category></entry><entry><title>Coding 2024-08-11</title><link href="https://mwchase.neocities.org/coding-2024-08-11" rel="alternate"></link><published>2024-08-11T04:00:00-04:00</published><updated>2024-08-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-08-11:/coding-2024-08-11</id><summary type="html">&lt;p class="first last"&gt;Entry delayed by the decision to repeatedly scroll to the bottom of the YouTube front page and click &amp;quot;Not Interested&amp;quot; on every &amp;quot;Mix&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm still trying to get a handle on how best to do extension stuff.
Like, okay, I &lt;em&gt;need&lt;/em&gt; a &lt;tt class="docutils literal"&gt;manifest.json&lt;/tt&gt; file.
Is that something that it makes more sense to generate or hardcode?
Where is the extension-writing guide for people who got turned off of JavaScript like ten years ago because &amp;quot;Uh... something about variable scoping&amp;quot;?&lt;/p&gt;
&lt;p&gt;I know I need to do a lot more research here, because otherwise I'll put together something that only mostly sort of works, if that.&lt;/p&gt;
&lt;p&gt;Thinking about what I'm trying to proof-of-concept here...
I have a common library.
It is, &lt;em&gt;I think&lt;/em&gt;, getting bundled into a wasm file in a &lt;tt class="docutils literal"&gt;pkg&lt;/tt&gt; directory.
I &lt;em&gt;believe&lt;/em&gt; I want every file in that directory to be somehow accessible from a directory with a &lt;tt class="docutils literal"&gt;manifest.json&lt;/tt&gt; file.
On top of that, the &lt;tt class="docutils literal"&gt;manifest.json&lt;/tt&gt; file has to somehow point at those files so that they actually get used.&lt;/p&gt;
&lt;p&gt;I'm not going to figure out anything else right now; I've got to get some sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Open Divination"></category><category term="short post"></category></entry><entry><title>Coding 2024-08-10</title><link href="https://mwchase.neocities.org/coding-2024-08-10" rel="alternate"></link><published>2024-08-10T04:00:00-04:00</published><updated>2024-08-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-08-10:/coding-2024-08-10</id><summary type="html">&lt;p class="first last"&gt;It's still a &lt;em&gt;little&lt;/em&gt; wonky, but the worst of my issues aren't bothering me now.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I did a little work on this today.
Basically, I redid the WASM stuff &lt;em&gt;sort of&lt;/em&gt; from scratch, and now the configuration makes more sense to me.
I've got stuff going on that's building, and either it's &lt;em&gt;horrendously&lt;/em&gt; broken, or it's basically working perfectly.&lt;/p&gt;
&lt;p&gt;The next step is to figure out which of those possibilities is the correct one.
If it's the latter, then I'm going to see about integrating the built WASM into a browser extension.
Basically, I'm trusting that I'll be able to write the actual code when the time comes, so I'm focusing on the stuff that I know the least about.&lt;/p&gt;
&lt;p&gt;Like, sure, I can &lt;em&gt;apparently&lt;/em&gt; write functions that get exported through WASM.
Now, what do I need to write to make a web extension work?
If I can get this all the way to the end, then I can start writing code, but if I hit a hurdle of some kind, I'd like to know now so I can figure out what I need to do differently.&lt;/p&gt;
&lt;p&gt;Anyway, I have been very tired and I desperately need to sleep, so I'm going to cut this off now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Open Divination"></category><category term="short post"></category></entry><entry><title>Coding 2024-08-09</title><link href="https://mwchase.neocities.org/coding-2024-08-09" rel="alternate"></link><published>2024-08-09T04:00:00-04:00</published><updated>2024-08-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-08-09:/coding-2024-08-09</id><summary type="html">&lt;p class="first last"&gt;I was going to put a joke here pretending not to know what git is, but I worried that someone would try to explain it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&amp;quot;Okay, let's make a virtual manifest.&amp;quot;&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;&amp;quot;And a common library crate.&amp;quot;&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;&amp;quot;And a binary cli crate.&amp;quot;&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;&amp;quot;And a wasm-pack crate for the browser extension.&amp;quot;&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;&amp;quot;That last one has me feeling like someone just walked over my grave.&amp;quot;&lt;/p&gt;
&lt;p&gt;So, I've got some &lt;em&gt;stuff&lt;/em&gt; to read over to figure out how and whether I should even be doing some of this.
None of that is happening right now.
It is late, and I am &lt;em&gt;incredibly&lt;/em&gt; tired because of reasons.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Open Divination"></category><category term="short post"></category></entry><entry><title>Coding 2024-08-08</title><link href="https://mwchase.neocities.org/coding-2024-08-08" rel="alternate"></link><published>2024-08-08T04:00:00-04:00</published><updated>2024-08-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-08-08:/coding-2024-08-08</id><summary type="html">&lt;p class="first last"&gt;I should consider whether I really want &amp;quot;doesn't know how to follow directions&amp;quot; to be part of my &amp;quot;brand&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay.
I tired myself out &lt;em&gt;severely&lt;/em&gt; today, so I decided to just review the basics of Rust.
I even followed the directions!&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;&lt;em&gt;All&lt;/em&gt; of the directions?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Look, doing all of the stuff they said, and a few extra steps, is still following the directions.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Uh-huh.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Anyway, I need to get to the point of more advanced configurations, so I can put together multi-crate stuff.&lt;/p&gt;
&lt;p&gt;For now, I need to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Open Divination"></category><category term="short post"></category></entry><entry><title>Coding 2024-08-07</title><link href="https://mwchase.neocities.org/coding-2024-08-07" rel="alternate"></link><published>2024-08-07T04:00:00-04:00</published><updated>2024-08-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-08-07:/coding-2024-08-07</id><summary type="html">&lt;p class="first last"&gt;This should be simple, but it still looks hard from here.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's switch gears a bit.
One of the projects I've been thinking about some lately, is trying to compete with LLM assistants by providing easy access to traditional, algorithmically efficient divination techniques.
This is not a total non-sequitur; one of the stated use cases for LLMs is &amp;quot;bouncing ideas off of&amp;quot;, and I don't see that, for such a use case, &amp;quot;the tool has no understanding of the question&amp;quot; should pose any more of a barrier for traditional divination than it does for LLMs.&lt;/p&gt;
&lt;p&gt;I've put together a basic outline of the kind of functionality I want to have, and I'm trying to figure out what's the right way for me to deploy this as many kinds of &amp;quot;app&amp;quot;.
Like, it simply makes sense to me that this should be some kind of command-line tool, daemon server, &lt;em&gt;and&lt;/em&gt; browser extension.
The obvious language for writing a browser extension is JavaScript, but, like, I dunno, I don't feel like using JavaScript for anything other than cheating at idle games.
From some research, it seems like it should be possible to target WASM, which is possible with Rust, which I'm somewhat familiar with.
Although, I also remember hearing about unpleasant experiences trying to target WASM and non-WASM at the same time, but maybe the precise details of that don't apply to what I was thinking of, which was to have completely separate projects for command-line versus browser extensions.&lt;/p&gt;
&lt;p&gt;The basic thing I need to figure out, however I decide to swing this, is, how can I notice as quickly as possible that a given approach will not work?&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Core logic in library&lt;/li&gt;
&lt;li&gt;Binary crate, probably using clap&lt;/li&gt;
&lt;li&gt;Build extension with wasm-pack, and probably other things&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'll have to try these out later, but I'll get ready for bed now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Open Divination"></category></entry><entry><title>Weekly Roundup 2024-08-06</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-08-06" rel="alternate"></link><published>2024-08-06T04:00:00-04:00</published><updated>2024-08-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-08-06:/weekly-roundup-2024-08-06</id><summary type="html">&lt;p class="first last"&gt;Don't want to do that last bit again.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I went through a few different Python documentation linters.&lt;/li&gt;
&lt;li&gt;Thursday: I read and thought.&lt;/li&gt;
&lt;li&gt;Friday: I made some plans to beef up the core interfaces in the new Structured Data.&lt;/li&gt;
&lt;li&gt;Saturday: I took things easy.&lt;/li&gt;
&lt;li&gt;Sunday: I wrote some code that my syntax highlighter chokes on, but Ruff doesn't complain about.&lt;/li&gt;
&lt;li&gt;Monday: ȾĦɆ ꞦȺꝞȺ₲ɆꞨ ꝊӺ ȾĪᛗɆ ɃꞦɆȺҞ ĐꝊⱲꞤ ȺꞤꝊȾĦɆꞦ ȻꝊꞤꞨȾꞦɄȻȾ ꝊӺ ꞨĪŁĪȻꝊꞤ ȺꞤĐ ꞨꝊŁĐɆꞦ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And then I tried my best to take things easy.&lt;/p&gt;
&lt;p&gt;Next week, I'm going to find something satisfying to work on.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Structured Data"></category></entry><entry><title>Coding 2024-07-28</title><link href="https://mwchase.neocities.org/coding-2024-07-28" rel="alternate"></link><published>2024-07-28T04:00:00-04:00</published><updated>2024-07-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-07-28:/coding-2024-07-28</id><summary type="html">&lt;p class="first last"&gt;Maybe not the best stopping point, but I can convince myself it is a stopping point.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, the code is updated to produce error reports when a match doubles up on bindings.
The only problem with the code as it stands is that it's kind of an abomination.
It's a triply-nested multi-line f-string, so I kind of have to try to come up with something better.&lt;/p&gt;
&lt;p&gt;Aside from that, the next thing I can do is either to implement more classes from the old version, or get back to trying to set up the documentation.
Neither really appeals to me, so maybe I'll try to change gears soon.
I'll have to take some time to think about that.
For now, I should get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Structured Data"></category><category term="short post"></category></entry><entry><title>Diary 2024-07-27</title><link href="https://mwchase.neocities.org/diary-2024-07-27" rel="alternate"></link><published>2024-07-27T04:00:00-04:00</published><updated>2024-07-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-07-27:/diary-2024-07-27</id><summary type="html">&lt;p class="first last"&gt;Very very very safe to skip.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;This week was a bit rough on me, so I did my best to take things easy today.&lt;/p&gt;
&lt;p&gt;I can't see that I have anything else to think about tonight, so I'm not going to force it.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2024-07-26</title><link href="https://mwchase.neocities.org/coding-2024-07-26" rel="alternate"></link><published>2024-07-26T04:00:00-04:00</published><updated>2024-07-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-07-26:/coding-2024-07-26</id><summary type="html">&lt;p class="first last"&gt;Before I properly considered this, I thought I was going to have to come up with something rather worse; good thing I didn't rush into implementation.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I made some minor improvements to the Structured Data code today, but mostly I was focused on planning.
See, one unimplemented feature is that it should be impossible to try to bind the same name twice or more in a single call to &lt;tt class="docutils literal"&gt;match()&lt;/tt&gt;.
Now, it's not too hard for me to get that working, but really, I should be analyzing the structure being passed in well enough to point out where it's going wrong, and getting that right takes a bit more thought.&lt;/p&gt;
&lt;p&gt;Idle speculation:&lt;/p&gt;
&lt;p&gt;Currently, I'm having the iterator that produces this stuff yield item-like pairs.
If I change from passing those into a &lt;tt class="docutils literal"&gt;dict&lt;/tt&gt; constructor directly to building up a dictionary, then I can add additional fields to the iteration (at some point it makes sense to create a class for holding this stuff, but let's not think about that yet).
I can include a field that indicates the &amp;quot;path&amp;quot; to the current name; this should be a tuple of structure field-names, probably.
None of this should be too hard, but I'll have to consider whether there's something I'd rather do.&lt;/p&gt;
&lt;p&gt;I've let things get late, so I won't try to do any more tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Structured Data"></category><category term="short post"></category></entry><entry><title>Diary 2024-07-25</title><link href="https://mwchase.neocities.org/diary-2024-07-25" rel="alternate"></link><published>2024-07-25T04:00:00-04:00</published><updated>2024-07-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-07-25:/diary-2024-07-25</id><summary type="html">&lt;p class="first last"&gt;Too much reading to write.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, so.
I was thinking about Structured Data today, but mostly I was reading and thinking about writing.
I need some time to think about these ideas, and I should take my time and just get to bed now, because I was reading for &lt;em&gt;a while&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2024-07-24</title><link href="https://mwchase.neocities.org/coding-2024-07-24" rel="alternate"></link><published>2024-07-24T04:00:00-04:00</published><updated>2024-07-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-07-24:/coding-2024-07-24</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Pwetty pwease write your horrendous nested generator types in longhand.&amp;quot; &amp;quot;Haha, no.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've just gone through several different tools for checking docstrings, and settled on what appears to be the least bad one, although it is... not great.
I feel like if a tool is going to try to tell me whether I've used an iterator type in a return annotation, &amp;quot;evaluating type aliases&amp;quot; should be table stakes.
I'm not expanding them!
The full annotations are &lt;em&gt;disasters&lt;/em&gt;, and I need the aliases to make it possible to &lt;em&gt;write&lt;/em&gt; these annotations, let alone &lt;em&gt;read&lt;/em&gt; them.&lt;/p&gt;
&lt;p&gt;Anyway, I did manage to improve the documentation a bunch, I think.
In order to tell, I need to finish setting up Sphinx, which never feels quite natural to me in the context of documenting Python code, the thing it was designed to do.&lt;/p&gt;
&lt;p&gt;I think I'll try to work on test coverage for a bit, but to do that, I need to make some decisions about code behavior, and I'll have to sleep on some of the relevant questions there.
It's already too late right now, so I'm going to wrap up as soon as I can and get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Structured Data"></category></entry><entry><title>Weekly Roundup 2024-07-23</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-07-23" rel="alternate"></link><published>2024-07-23T04:00:00-04:00</published><updated>2024-07-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-07-23:/weekly-roundup-2024-07-23</id><summary type="html">&lt;p class="first last"&gt;In a week, I got to the point of thinking &amp;quot;maybe I should add mutation testing to the default environments...&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I thought about splitting up the Structured Data code.&lt;/li&gt;
&lt;li&gt;Thursday: I worked on increasing the coverage.&lt;/li&gt;
&lt;li&gt;Friday: I made some improvements, or at least changes, to the code structure.&lt;/li&gt;
&lt;li&gt;Saturday: I found out that parso, and therefore everything that uses it, doesn't work with PEP 695 code. However, I did find a mutation testing tool that doesn't use parso. It did not work, to start with.&lt;/li&gt;
&lt;li&gt;Sunday: I got it working, and then got it sort of not working.&lt;/li&gt;
&lt;li&gt;Monday: I fixed the problems I was having, and started thinking about improvements to make besides increasing the mutation coverage.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to keep on improving this code, but also to try to scrape together the focus for writing.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Structured Data"></category></entry><entry><title>Coding 2024-07-22</title><link href="https://mwchase.neocities.org/coding-2024-07-22" rel="alternate"></link><published>2024-07-22T04:00:00-04:00</published><updated>2024-07-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-07-22:/coding-2024-07-22</id><summary type="html">&lt;p class="first last"&gt;I wish I'd seen the errors; from early work with MOTR, I know that they can be... impressive.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The revelation that fixed my mutation testing:
&amp;quot;Oh yeah, if a bunch of things are touching the same cache file at the same time, they usually assume that's not what they're doing.
And a crash gets treated like a test failure.&amp;quot;&lt;/p&gt;
&lt;p&gt;So now my mutation testing is slower (~7 mutants per second) but it's more reliable.&lt;/p&gt;
&lt;p&gt;I've also implemented a bit more functionality, which helped to write tests that caught a few more mutants.&lt;/p&gt;
&lt;p&gt;Rather than trying to grind out the final remaining mutant, I think for now I should try to write subtler tests that catch cases that I've been glossing over in the name of getting stuff implemented.
Stuff like &amp;quot;some pattern names should be rejected&amp;quot; and &amp;quot;some additional binding names should be rejected&amp;quot; and &amp;quot;there's all sorts of extra functionality that's currently not implemented because I just haven't written tests for it yet&amp;quot; and &amp;quot;it should be an error if the same name gets bound twice during a match&amp;quot;.&lt;/p&gt;
&lt;p&gt;That's a bunch of stuff to handle, but for now, I'm going to be happy I made progress, and get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Structured Data"></category></entry><entry><title>Coding 2024-07-21</title><link href="https://mwchase.neocities.org/coding-2024-07-21" rel="alternate"></link><published>2024-07-21T04:00:00-04:00</published><updated>2024-07-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-07-21:/coding-2024-07-21</id><summary type="html">&lt;p class="first last"&gt;I'm not sure what I did, but it's freaking me out.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Everything is working much better now.
Last night, I managed to go from doing one thing wrong, to two things wrong, so then, every time I fixed one thing, it didn't help, so I put it back.
Oops.&lt;/p&gt;
&lt;p&gt;Because &lt;a class="reference external" href="https://poodle.readthedocs.io/en/latest/index.html"&gt;poodle&lt;/a&gt; (1) wasn't providing information about my weird project layout (2) in a format that &lt;a class="reference external" href="https://ward.readthedocs.io/en/latest/index.html"&gt;Ward&lt;/a&gt; (3) could readily use, I had to put together a little shim to invoke Ward and Mypy properly.
Once I had that, it was obvious that I'd messed up the tox configuration for poodle, so I had to fix that, and then I finally had it running mutation tests.&lt;/p&gt;
&lt;p&gt;From there, I was able to improve the mutation coverage.
It's not all the way up yet, but I'd like to split more of the code out into new modules before I try to mop up the stragglers.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, I did that, and it had the somewhat unexpected consequence of making some of the mutants &lt;em&gt;sometimes&lt;/em&gt; get detected?
Something's a little wrong there, but I'm not sure what.
I'll work on it later.
For now, reading and bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Structured Data"></category></entry><entry><title>Coding 2024-07-20</title><link href="https://mwchase.neocities.org/coding-2024-07-20" rel="alternate"></link><published>2024-07-20T04:00:00-04:00</published><updated>2024-07-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-07-20:/coding-2024-07-20</id><summary type="html">&lt;p class="first last"&gt;Something didn't work at all, so... I dunno.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got mutmut all set up, then found out that it doesn't work on PEP 695 code.
Actually, I don't think I can expect &lt;em&gt;any mutation tool&lt;/em&gt; using parso to work with this code.&lt;/p&gt;
&lt;p&gt;I just found one that looks to use the builtin &lt;tt class="docutils literal"&gt;ast&lt;/tt&gt; module, so, like, that had better work...&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;It's not, but not for the reason I expected.
I'll have to figure out what's breaking test discovery in the morning.
Anyway, I'm going to go lie down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Structured Data"></category><category term="short post"></category></entry><entry><title>Coding 2024-07-19</title><link href="https://mwchase.neocities.org/coding-2024-07-19" rel="alternate"></link><published>2024-07-19T04:00:00-04:00</published><updated>2024-07-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-07-19:/coding-2024-07-19</id><summary type="html">&lt;p class="first last"&gt;Everything worked perfectly, so I can't really turn it into any kind of narrative.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Once I got tox passing yesterday, I worked today on Weird Tricks to cut down on dependencies between classes.&lt;/p&gt;
&lt;p&gt;At this point, I would be all set to start separating out classes into modules, except that my eyes are screaming at me to stop looking at screens, so I'm... I'm going to just have this be a short entry and go lie down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Structured Data"></category><category term="short post"></category></entry><entry><title>Coding 2024-07-18</title><link href="https://mwchase.neocities.org/coding-2024-07-18" rel="alternate"></link><published>2024-07-18T04:00:00-04:00</published><updated>2024-07-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-07-18:/coding-2024-07-18</id><summary type="html">&lt;p class="first last"&gt;Cleaning things up.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, the next thing I wanted to do was to get all of my tox environments to pass.
(Insert ramble about how the way MOTR does it &lt;em&gt;obviously&lt;/em&gt; makes so much more sense.)
To get coverage to full, I need to write tests for the following cases:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Creating an &lt;tt class="docutils literal"&gt;AbstractEnum&lt;/tt&gt; class with no members.&lt;/li&gt;
&lt;li&gt;Error case: creating an &lt;tt class="docutils literal"&gt;AbstractEnum&lt;/tt&gt; class with members and abstract methods.&lt;/li&gt;
&lt;li&gt;Creating an &lt;tt class="docutils literal"&gt;AbstractEnum&lt;/tt&gt; class with members and no abstract methods?&lt;/li&gt;
&lt;li&gt;Iterating over a &lt;tt class="docutils literal"&gt;MatchDict&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That last one was easy, so I did it.
Let's see about the others...&lt;/p&gt;
&lt;p&gt;Hm, the question mark one didn't do what I hoped it would. Let me see...&lt;/p&gt;
&lt;p&gt;Ah, I was able to cheat that branch out.
Now I just need to address the warnings and errors from Ruff.&lt;/p&gt;
&lt;p&gt;I'll work on that while this publishes.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Structured Data"></category></entry><entry><title>Coding 2024-07-17</title><link href="https://mwchase.neocities.org/coding-2024-07-17" rel="alternate"></link><published>2024-07-17T04:00:00-04:00</published><updated>2024-07-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-07-17:/coding-2024-07-17</id><summary type="html">&lt;p class="first last"&gt;Planning, again.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, it's a little late, but I can still swing this...&lt;/p&gt;
&lt;p&gt;I'm looking over the code I have written so far, and trying to decide if I want to break it down.
The obvious candidate for putting stuff in its own module is &lt;tt class="docutils literal"&gt;MatchDict&lt;/tt&gt;.
Like, all any of the rest of the code &lt;em&gt;really&lt;/em&gt; needs to know is that it's a mapping with a custom constructor.
The less obvious candidate is the stuff related to the &lt;tt class="docutils literal"&gt;Structure&lt;/tt&gt; type.
I feel I should hold off on that until I've worked out the proper custom constructor stuff for &lt;tt class="docutils literal"&gt;Pattern&lt;/tt&gt;s, and how that interacts with &lt;tt class="docutils literal"&gt;Discard&lt;/tt&gt;.
Lastly, there's this compatibility class I, um,&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Copied and pasted from StackOverflow&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Right, that...
It handles the metaclass differences between enums and abstract base classes.&lt;/p&gt;
&lt;p&gt;Anyway, while these all seem like basically solid bets, I guess what it really makes sense to do is to sketch out the new functionality I want this code to have...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Helper function to convert non-scalar structures to &lt;tt class="docutils literal"&gt;CompoundStructure&lt;/tt&gt;s.&lt;/li&gt;
&lt;li&gt;Context variables and context managers to allow temporarily registering additional converter functions.&lt;/li&gt;
&lt;li&gt;Elaborate &lt;tt class="docutils literal"&gt;__getitem__&lt;/tt&gt; logic for &lt;tt class="docutils literal"&gt;MatchDict&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Shortcuts for creating &lt;tt class="docutils literal"&gt;Pattern&lt;/tt&gt;s.&lt;/li&gt;
&lt;li&gt;Other &lt;tt class="docutils literal"&gt;CompoundStructure&lt;/tt&gt;s.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ultimately, the big thing I need for reorganizing is to make a constructor for &lt;tt class="docutils literal"&gt;Pattern&lt;/tt&gt;s, which should lock down all of the important relationships.&lt;/p&gt;
&lt;p&gt;Okay, I've got that done.
I think what I'd like to do is get &lt;tt class="docutils literal"&gt;tox&lt;/tt&gt; passing, and then start splitting things up.&lt;/p&gt;
&lt;p&gt;Anyway, sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Structured Data"></category></entry><entry><title>Weekly Roundup 2024-07-16</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-07-16" rel="alternate"></link><published>2024-07-16T04:00:00-04:00</published><updated>2024-07-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-07-16:/weekly-roundup-2024-07-16</id><summary type="html">&lt;p class="first last"&gt;Once I start really working on this properly, it'll be painfully simple.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I did planning for testing Structured Data.&lt;/li&gt;
&lt;li&gt;Thursday: Corny old-timey sci-fi from the forties and fifties.&lt;/li&gt;
&lt;li&gt;Friday: A little bit of work on Structured Data.&lt;/li&gt;
&lt;li&gt;Saturday: A little bit more work and planning.&lt;/li&gt;
&lt;li&gt;Sunday: A bunch more planning.&lt;/li&gt;
&lt;li&gt;Monday: I just bit the bullet and cheated some code into existence.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to recover from some coverage hits I racked up earlier today, and plan some writing.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Structured Data"></category></entry><entry><title>Coding 2024-07-15</title><link href="https://mwchase.neocities.org/coding-2024-07-15" rel="alternate"></link><published>2024-07-15T04:00:00-04:00</published><updated>2024-07-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-07-15:/coding-2024-07-15</id><summary type="html">&lt;p class="first last"&gt;A good task runner is invaluable for software development.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I skipped ahead a bit in handling the advanced destructuring cases for matching.
There are a few mitigating factors:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Coverage did not decrease&lt;/li&gt;
&lt;li&gt;I only implemented the functionality required to pass the current test suite&lt;/li&gt;
&lt;li&gt;I didn't abstract things out as far as in the previous version&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This should provide a good basis to work from as I start testing more capabilities.
I'll have to try that out later.
Right now, I need to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Structured Data"></category><category term="short post"></category></entry><entry><title>Coding 2024-07-14</title><link href="https://mwchase.neocities.org/coding-2024-07-14" rel="alternate"></link><published>2024-07-14T04:00:00-04:00</published><updated>2024-07-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-07-14:/coding-2024-07-14</id><summary type="html">&lt;p class="first last"&gt;Subtle improvements are still improvements.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I poked some more at the code today.
One improvement I made was to change the type signature for advanced destructuring to one that doesn't require me to do elaborate mental gymnastics to verify it.
This will remove some of the stranger lines present in the previous version, so that's a win.&lt;/p&gt;
&lt;p&gt;Now it's time to think about how I might implement &lt;em&gt;handling&lt;/em&gt; advanced destructuring.
The &amp;quot;obvious&amp;quot; solution is to recursively match the substructures and then perform a merge operation on the outputs.
A possible refinement to such an idea is to try to transform that recursion to iteration.
The logical(?) endpoint(?) of this is the system I had in the previous version, in which advanced matches produce some amount of &amp;quot;additional work&amp;quot; that is put on a stack.
(I seem to recall coming up with some very convincing theoretical reason why a stack is preferable to a queue, and it has nothing to do with &amp;quot;efficient stacks are slightly easier to create in Python than efficient queues&amp;quot;.)&lt;/p&gt;
&lt;p&gt;I think at some point I'm just going to &amp;quot;cheat&amp;quot; and skip to implementing most of this logic, and screw whatever this means for TDD purity.
I should at least sketch it out and see if I run into any awkward areas first, though.&lt;/p&gt;
&lt;p&gt;Anyway, I would very much like to get to bed now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Structured Data"></category><category term="short post"></category></entry><entry><title>Coding 2024-07-13</title><link href="https://mwchase.neocities.org/coding-2024-07-13" rel="alternate"></link><published>2024-07-13T04:00:00-04:00</published><updated>2024-07-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-07-13:/coding-2024-07-13</id><summary type="html">&lt;p class="first last"&gt;Trapped in a weird local minimum.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I wrote another test, and got it passing, and now I'm fighting with my text editor configuration.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, I think I &amp;quot;fixed&amp;quot; it.&lt;/p&gt;
&lt;p&gt;The test I added was for comparing matching scalar values.
The next test to add is for comparing different scalar values.&lt;/p&gt;
&lt;p&gt;After that, oof.
I'm still not really sure how to make the leap there.
Even if I specifically only test using the discard value, which is the simplest structure to implement, it sure looks to me like my only choice is to implement a large amount of machinery to get that working.
(I guess one thought is that I can hard-code that it special-cases to tuples to start with.
That &lt;em&gt;sort of&lt;/em&gt; helps...)&lt;/p&gt;
&lt;p&gt;That's what I'm going to have to ponder to get this working.
For now, sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Structured Data"></category><category term="short post"></category></entry><entry><title>Coding 2024-07-12</title><link href="https://mwchase.neocities.org/coding-2024-07-12" rel="alternate"></link><published>2024-07-12T04:00:00-04:00</published><updated>2024-07-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-07-12:/coding-2024-07-12</id><summary type="html">&lt;p class="first last"&gt;I poked some code, and now I need to lie down.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I determined that I'm not yet ready to write contracts for this code, so I put together some basic tests.
They're not especially rigorous from a TDD perspective, but they're working.
I've already implemented this stuff once, though, and I'll be &lt;em&gt;fascinated&lt;/em&gt; to see if I can find a path from &amp;quot;an implementation that doesn't handle non-scalar values&amp;quot; to &amp;quot;an implementation that does handle scalar values&amp;quot;.&lt;/p&gt;
&lt;p&gt;I'll have to give this some thought; not right now though.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Structured Data"></category><category term="short post"></category></entry><entry><title>Diary 2024-07-11</title><link href="https://mwchase.neocities.org/diary-2024-07-11" rel="alternate"></link><published>2024-07-11T04:00:00-04:00</published><updated>2024-07-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-07-11:/diary-2024-07-11</id><summary type="html">&lt;p class="first last"&gt;Reading instead of coding. Oh well.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've been reading a bunch, and trying to decide what I think.
It's mostly been the &lt;em&gt;Lensman&lt;/em&gt; books.
They're historically significant (they influenced a lot of major space opera series), and are very good at being page-turner melodramas, and I really want to get a handle on some of the writing techniques on display, but there are some &lt;em&gt;amazing&lt;/em&gt; blind spots in some of the attempts at being enlightened.&lt;/p&gt;
&lt;p&gt;I don't want to be seen as trying to dunk on E. E. Smith, but he's fifties-ing &lt;em&gt;hard&lt;/em&gt; in his writing, and I don't think the direction it's going at the end feels like an effective course correction; I'm not at all sure it was supposed to be.
To be honest, although I've seen plenty of cheesy science fiction movies from the era, I'm not eager to go one way or the other on &amp;quot;standards of the time&amp;quot;.
Like, some of this stuff seems like it should be &lt;em&gt;so obvious&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Anyway, I'll ponder that for a bit while I get to bed, because it's late again.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2024-07-10</title><link href="https://mwchase.neocities.org/coding-2024-07-10" rel="alternate"></link><published>2024-07-10T04:00:00-04:00</published><updated>2024-07-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-07-10:/coding-2024-07-10</id><summary type="html">&lt;p class="first last"&gt;Ah yes, endless planning mode...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm not quite comfortable writing code yet, so let's take a look at the kinds of contracts I want to have.&lt;/p&gt;
&lt;p&gt;The &lt;tt class="docutils literal"&gt;match&lt;/tt&gt; function takes a &lt;tt class="docutils literal"&gt;Structure&lt;/tt&gt; argument; this type is a union of many types.
The straightforward stuff is:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Discard&lt;/tt&gt; should match &lt;em&gt;any&lt;/em&gt; input, and result in an empty &lt;tt class="docutils literal"&gt;MatchDict&lt;/tt&gt; object.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Pattern&lt;/tt&gt; should match any &lt;em&gt;scalar&lt;/em&gt; input, and result in a &lt;tt class="docutils literal"&gt;MatchDict&lt;/tt&gt; with one entry, keyed to the name of the pattern.&lt;/li&gt;
&lt;li&gt;A scalar structure should match an input equal to itself, producing an empty &lt;tt class="docutils literal"&gt;MatchDict&lt;/tt&gt;, while any unequal input should fail the match, resulting in &lt;tt class="docutils literal"&gt;None&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The minor complicating factor is that I don't remember what I think matching pattern to pattern should do.&lt;/p&gt;
&lt;p&gt;The major complicating factors are around, for one, &amp;quot;complex&amp;quot; types like tuples; there's a large amount of scaffolding around treating them in a sophisticated fashion, in the old code, and I can't jump into that.
And the other is what I'm currently calling &lt;tt class="docutils literal"&gt;CompoundStructure&lt;/tt&gt;.
This is a marker/abstract class, and I can't see any way to express all of the expected behavior at the &lt;tt class="docutils literal"&gt;match&lt;/tt&gt; function, where it's relying on polymorphism to get the behavior.
Ultimately, these are kind of the same thing, it's just that I can't force builtin types to subclass from my marker.&lt;/p&gt;
&lt;p&gt;With that in mind, it's possible to write contracts for the easy cases above, and to suppose that the hard cases should delegate to the custom class.
Furthermore, those cases should probably have separate... &lt;tt class="docutils literal"&gt;cases&lt;/tt&gt;...&lt;/p&gt;
&lt;p&gt;I'm not sure whether Deal can handle the kind of type annotations I want to throw at it.
I guess I'll just have to try it.&lt;/p&gt;
&lt;p&gt;Anyway, it's late and I want to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Structured Data"></category></entry><entry><title>Weekly Roundup 2024-07-09</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-07-09" rel="alternate"></link><published>2024-07-09T04:00:00-04:00</published><updated>2024-07-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-07-09:/weekly-roundup-2024-07-09</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Why don't I get on it right now?&amp;quot; And suddenly it is very late.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I officially picked Structured Data back up.&lt;/li&gt;
&lt;li&gt;Thursday: I did some planning, and made a few decisions that I knew full well would annoy me later.&lt;/li&gt;
&lt;li&gt;Friday: I ran right up to the edge of &amp;quot;later&amp;quot; by deciding to run Coverage with tox.&lt;/li&gt;
&lt;li&gt;Saturday: So, this is &amp;quot;later&amp;quot;, and I got Coverage working. ... So now I want to think about mutmut...&lt;/li&gt;
&lt;li&gt;Sunday: I backed myself into something that maybe &lt;em&gt;sounds like&lt;/em&gt; TDD, but, eh.&lt;/li&gt;
&lt;li&gt;Monday: I started planning the use of yet another tool.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to see if Ward and Deal can at least sort of work together.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Structured Data"></category></entry><entry><title>Coding 2024-07-08</title><link href="https://mwchase.neocities.org/coding-2024-07-08" rel="alternate"></link><published>2024-07-08T04:00:00-04:00</published><updated>2024-07-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-07-08:/coding-2024-07-08</id><summary type="html">&lt;p class="first last"&gt;Making careful progress, trying not to over-exert myself.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;My plan is to try out using &lt;a class="reference external" href="https://deal.readthedocs.io/index.html"&gt;Deal&lt;/a&gt; to help write tests, so I've been thinking some about the basic assertions I'll want to have for the Structured Data interface.
Some of the ideas I've got so far are kind of a pain to deal with.
Like, what am I supposed to do, as far as writing tests goes, to deal with &amp;quot;there are three basically different things this function is supposed to do, and which one obtains is controlled by the precise relationship between the two inputs&amp;quot;?
It's possible that I'll need to accept more work initially, and hopefully I'll get nicer stuff down the line.&lt;/p&gt;
&lt;p&gt;Right now, I think what I want to do is figure out whether to try to disable Deal outside of the optimized case.&lt;/p&gt;
&lt;p&gt;I'll just let that idea bounce around, and maybe start writing stubs.
For now, it's late and I should get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Structured Data"></category><category term="short post"></category></entry><entry><title>Coding 2024-07-07</title><link href="https://mwchase.neocities.org/coding-2024-07-07" rel="alternate"></link><published>2024-07-07T04:00:00-04:00</published><updated>2024-07-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-07-07:/coding-2024-07-07</id><summary type="html">&lt;p class="first last"&gt;I need to figure out how I want to take notes on this stuff...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I refined the tooling a little more today, and did some planning.
I think at this point, what makes sense to do is to start putting together a specification, and then devising tests to match it.&lt;/p&gt;
&lt;p&gt;I know it's been a while since I did anything resembling TDD, but I've effectively got a greenfield project here, so I've already cranked up the thresholds, and it seems to me that something like red-green-refactor is the easiest way to deal with the thresholds being at maximum.&lt;/p&gt;
&lt;p&gt;It'll probably be a few days at least before I'm ready to try actually writing code, but I'll try to write specifications or xfailed tests, or something.&lt;/p&gt;
&lt;p&gt;Anyway, I let this get too late and I should get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Structured Data"></category><category term="short post"></category></entry><entry><title>Coding 2024-07-06</title><link href="https://mwchase.neocities.org/coding-2024-07-06" rel="alternate"></link><published>2024-07-06T04:00:00-04:00</published><updated>2024-07-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-07-06:/coding-2024-07-06</id><summary type="html">&lt;p class="first last"&gt;Just one more try, I mean, tool.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I got Coverage working on this project.
The only real hiccup was that I ended up having to switch from one particular configuration key to another, because of a reason.&lt;/p&gt;
&lt;p&gt;The limitations I'm perceiving with the &lt;em&gt;way&lt;/em&gt; that I got Coveragy working with tox have strengthened my resolve to get the Coverage wrapper written for MOTR, but right now, I'm focusing on planning for that rather than writing code.&lt;/p&gt;
&lt;p&gt;But &lt;em&gt;right now&lt;/em&gt; right now, I want to focus on the Structured Data rework.
Right now, I've got a weird scattering of attempts at updated code in a single file, and I would like to start breaking it up some.
Which means: more planning.&lt;/p&gt;
&lt;p&gt;Actually, I guess I've got one more tool I want to try setting up: &lt;a class="reference external" href="https://mutmut.readthedocs.io/en/latest/"&gt;mutmut&lt;/a&gt;.
I'll try and get that set up once the test coverage is, like, a little higher.
To get that to work, I may need to figure out some stuff with the runner logic, but hopefully not.&lt;/p&gt;
&lt;p&gt;Anyway, I'll get into planning one or both of those things tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Structured Data"></category><category term="short post"></category></entry><entry><title>Coding 2024-07-05</title><link href="https://mwchase.neocities.org/coding-2024-07-05" rel="alternate"></link><published>2024-07-05T04:00:00-04:00</published><updated>2024-07-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-07-05:/coding-2024-07-05</id><summary type="html">&lt;p class="first last"&gt;This could have been longer if I didn't start it ludicrously late. Oh well.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Oh man, future me is going to &lt;em&gt;hate&lt;/em&gt; the state that I've left this code in.&lt;/p&gt;
&lt;p&gt;Aside from that, I've been working on getting tooling put together for this project.
I've got almost everything I want put together, but I'm not going to be satisfied until I start measuring test coverage again.
I'm well familiar with the kind of ceremony required to make me happy with &lt;a class="reference external" href="https://github.com/nedbat/coveragepy"&gt;Coverage.py&lt;/a&gt;, so I'm going to try something a little diff—
Never mind.
The different coverage tool I tried using managed to collect &lt;em&gt;nothing&lt;/em&gt;, and I don't see any documentation, so let's psych ourselves up to push tox in the exact direction that got me looking into alternatives.
Yay.&lt;/p&gt;
&lt;p&gt;Well, I won't make myself feel any better about this by staying up longer.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Structured Data"></category><category term="short post"></category></entry><entry><title>Coding 2024-07-04</title><link href="https://mwchase.neocities.org/coding-2024-07-04" rel="alternate"></link><published>2024-07-04T04:00:00-04:00</published><updated>2024-07-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-07-04:/coding-2024-07-04</id><summary type="html">&lt;p class="first last"&gt;Short, but more meat than &amp;quot;oh no I messed up again&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've been focused on planning and research for this revival.
Like, the whole &amp;quot;fractal tree&amp;quot; structure, to me, points to trying something like &lt;a class="reference external" href="https://ward.readthedocs.io/en/latest/index.html"&gt;Ward&lt;/a&gt; as opposed to &lt;a class="reference external" href="https://docs.pytest.org/en/latest/"&gt;pytest&lt;/a&gt;, and also it should work better with &lt;a class="reference external" href="https://deal.readthedocs.io/basic/intro.html"&gt;Deal&lt;/a&gt; than the setup that &lt;em&gt;I, personally&lt;/em&gt; was using in previous projects.
Because MOTR is not ready, I'm going to try to just toss stuff together with &lt;a class="reference external" href="https://tox.wiki/en/stable/"&gt;tox&lt;/a&gt;, and see how far I can get with that, and part of that is to figure out how to fit it all together.&lt;/p&gt;
&lt;p&gt;Right now, I'm trying to decide whether to keep the name the same and embrace a bunch of compatibility breaks, or just leave the abandoned library be, and design a new one.&lt;/p&gt;
&lt;p&gt;I'll let those ideas percolate for a bit; it's late and I'm sleepy.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Structured Data"></category><category term="short post"></category></entry><entry><title>Coding 2024-07-03</title><link href="https://mwchase.neocities.org/coding-2024-07-03" rel="alternate"></link><published>2024-07-03T04:00:00-04:00</published><updated>2024-07-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-07-03:/coding-2024-07-03</id><summary type="html">&lt;p class="first last"&gt;I have tried out &lt;em&gt;far&lt;/em&gt; worse ideas...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Oh yeah, I'm bringing &lt;em&gt;this&lt;/em&gt; back.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Oh hey, what's going on in h—Good lord.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;That's right.
The project that I shelved because I kept on going to or past the cutting edge of what Python makes possible.
As I recall, when last we left off, I'd removed some code that attempted to emulate the capabilities provided by &lt;a class="reference external" href="https://peps.python.org/pep-0570/"&gt;PEP 570&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And, well, we're so much further along, years down the line.
I'm particularly excited to see what &lt;a class="reference external" href="https://peps.python.org/pep-0614/"&gt;PEP 614&lt;/a&gt; will allow for Structured Data.
Or, at least, part of it.&lt;/p&gt;
&lt;p&gt;See, &lt;a class="reference external" href="https://github.com/mwchase/python-structured-data"&gt;Structured Data&lt;/a&gt; more-or-less broke down into two parts:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Some Haskell-inspired custom class stuff in the genre of &amp;quot;like &lt;a class="reference external" href="https://www.attrs.org/en/stable/"&gt;attrs&lt;/a&gt;, but not attrs&amp;quot;&lt;/li&gt;
&lt;li&gt;A Haskell-inspired matcher system that I'm pretty sure is capable of things that can't be syntactically expressed with the (comparatively) new &lt;tt class="docutils literal"&gt;match&lt;/tt&gt; statement&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I recently took another look at the code, and I was seriously torn between &amp;quot;this is convoluted and absurd&amp;quot; and &amp;quot;but this is really cool actually&amp;quot;.
So, why not take a fresh start, with my years of experience, and, um, actually understanding the &lt;tt class="docutils literal"&gt;Generator&lt;/tt&gt; type, wow.&lt;/p&gt;
&lt;p&gt;Anyway, one other thing occurred to me to try.
Every once in a while, I experiment with a somewhat out-there idea.
Sometimes, the result is pain.
Just pain.
So much pain.
But I want to be open to new things.
So, I was poking around, and I stumbled across &lt;a class="reference external" href="https://hash.dev/blog/file-structuring"&gt;a blog post&lt;/a&gt; describing how the authors laid out some JavaScript projects.
I figured I'd try adapting the ideas to a Python project, and see what happens if I try slotting the Structured Data matcher rewrite into that framework.&lt;/p&gt;
&lt;p&gt;To start with, I'm going to do a bunch of planning, and I've done some of that today, and I'll do some more of it later.
For now, bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Structured Data"></category></entry><entry><title>Weekly Roundup 2024-07-02</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-07-02" rel="alternate"></link><published>2024-07-02T04:00:00-04:00</published><updated>2024-07-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-07-02:/weekly-roundup-2024-07-02</id><summary type="html">&lt;p class="first last"&gt;Losing motivation.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I tried to make the Dafny code less brittle, and it became more brittle.&lt;/li&gt;
&lt;li&gt;Thursday: I investigated the &amp;quot;real&amp;quot; brittleness, and concluded that addressing it would require some kind of methodical enumeration or intuitive leap, neither of which I felt like trying to do.&lt;/li&gt;
&lt;li&gt;Friday: I ran out of steam.&lt;/li&gt;
&lt;li&gt;Saturday: I continued to be out of steam.&lt;/li&gt;
&lt;li&gt;Sunday: I switched tracks to some code I abandoned years ago.&lt;/li&gt;
&lt;li&gt;Monday: I realized that I need to take a break.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to take a break.
It's not going super well so far.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Dafny"></category><category term="Concrete Mathematics"></category></entry><entry><title>Diary 2024-07-01</title><link href="https://mwchase.neocities.org/diary-2024-07-01" rel="alternate"></link><published>2024-07-01T04:00:00-04:00</published><updated>2024-07-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-07-01:/diary-2024-07-01</id><summary type="html">&lt;p class="first last"&gt;Very, very safe to skip.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm messing around with various things, but still not doing enough work on anything to think &amp;quot;Yes, I have a blog post I can write about this.&amp;quot;&lt;/p&gt;
&lt;p&gt;It seems I should be actually trying to take a break...
Perhaps I should be playing some of the games I just bought on sale...&lt;/p&gt;
&lt;p&gt;Anyway, I won't do any better if I stay up any longer.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-06-30</title><link href="https://mwchase.neocities.org/diary-2024-06-30" rel="alternate"></link><published>2024-06-30T04:00:00-04:00</published><updated>2024-06-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-06-30:/diary-2024-06-30</id><summary type="html">&lt;p class="first last"&gt;Somewhat more content, but, like, not &lt;em&gt;much&lt;/em&gt; more.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I haven't come up with any sudden revelations for how to improve the Dafny code.
Maybe I should focus on other areas for now, and come back to improving the brittleness (or weakening the bounds) later.&lt;/p&gt;
&lt;p&gt;Instead of bouncing off the Dafny code, I've been refreshing my memory about some code that I wrote several years ago and then abandoned.
I'm cautiously interested in inflicting it on the world again, but somewhat stymied by a combination of insufficient documentation (gee what a shock) and the weird state of my coding style at the time, partly because of the state of the Python language and libraries.
That can only shoulder so much of the blame, though.
I'm looking at this code and going &amp;quot;what's the point of showing off like this, if nobody's going to have the patience to understand it?&amp;quot;&lt;/p&gt;
&lt;p&gt;Anyway, I think the sensible course of action is to try switching course to writing tomorrow.
We'll see if I feel like that.
For now, I should get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-06-29</title><link href="https://mwchase.neocities.org/diary-2024-06-29" rel="alternate"></link><published>2024-06-29T04:00:00-04:00</published><updated>2024-06-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-06-29:/diary-2024-06-29</id><summary type="html">&lt;p class="first last"&gt;Still safe to skip.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I'm still feeling kind of iffy and out of it, so I haven't made any more Dafny progress today.
I messed around with some other code, but I'm probably not going to take it too much further right now.&lt;/p&gt;
&lt;p&gt;I'm not up for thinking too hard now, so I'm just going to take things easy for a bit.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-06-28</title><link href="https://mwchase.neocities.org/diary-2024-06-28" rel="alternate"></link><published>2024-06-28T04:00:00-04:00</published><updated>2024-06-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-06-28:/diary-2024-06-28</id><summary type="html">&lt;p class="first last"&gt;Very safe to skip.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was thinking about Dafny stuff, but I didn't really make progress.
I felt kind of iffy today, so I ended up just taking it easy, and suddenly realizing that it was much later than I thought.&lt;/p&gt;
&lt;p&gt;Nothing good can come of trying to make this entry longer.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2024-06-27</title><link href="https://mwchase.neocities.org/coding-2024-06-27" rel="alternate"></link><published>2024-06-27T04:00:00-04:00</published><updated>2024-06-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-06-27:/coding-2024-06-27</id><summary type="html">&lt;p class="first last"&gt;This is all a bit awkward to work with.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was focused on other things today, but I'm going to try to devote at least a few minutes to understanding what is up with Dafny.&lt;/p&gt;
&lt;p&gt;According to the descriptions of the different batches when I isolated the assertions, the problem with the lemma that &lt;em&gt;isn't&lt;/em&gt; brittle because of RNG screw is down to the postcondition.&lt;/p&gt;
&lt;p&gt;A little more detail.
The commutative property of summation basically says that we can re-index a summation, and get the same result, as long as we obey some &amp;quot;obvious&amp;quot; rules for the re-indexing.
In the corresponding lemma, I'm using an &lt;tt class="docutils literal"&gt;ensures&lt;/tt&gt; clause to assert this equality.
Now, intuitively, I think the (relatively) high variance here corresponds to &amp;quot;requiring a lot of work from the verifier&amp;quot;, which means I may be missing a step that Dafny is papering over.
The current set of assertions is:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;If we remove &lt;tt class="docutils literal"&gt;k&lt;/tt&gt; from the initial set of values to sum over, the equality still holds.&lt;/li&gt;
&lt;li&gt;Every item in the reduced set of permuted values &amp;quot;came from&amp;quot; a unique value in the reduced set of values.&lt;/li&gt;
&lt;li&gt;The sum of the set of permuted values is equal to the sum of the reduced set of permuted values, plus the value indexed by the permutation of &lt;tt class="docutils literal"&gt;k&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There is a missing step after this that Dafny can, &amp;quot;with effort&amp;quot;, fill in for me.
My hope is to figure out how to guide it so it can just go.&lt;/p&gt;
&lt;p&gt;I'm not getting there tonight, so I'll get to bed and think about it for a while.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Dafny"></category><category term="Concrete Mathematics"></category></entry><entry><title>Coding 2024-06-26</title><link href="https://mwchase.neocities.org/coding-2024-06-26" rel="alternate"></link><published>2024-06-26T04:00:00-04:00</published><updated>2024-06-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-06-26:/coding-2024-06-26</id><summary type="html">&lt;p class="first last"&gt;Insert regular expressions joke here.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've gotten everything currently written to verify, loosened some preconditions, and worked on reducing brittleness.
At this point, there's just one brittle verification left, following some very subtle changes.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Following my efforts to decrease brittleness, there are now two brittle verifications left.&lt;/p&gt;
&lt;p&gt;The RNG screw is so, so real.&lt;/p&gt;
&lt;p&gt;In any case, there should be just a bit more effort required to get this locked back down, but I can't put that effort in right now.
I've got to sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Dafny"></category><category term="Concrete Mathematics"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2024-06-25</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-06-25" rel="alternate"></link><published>2024-06-25T04:00:00-04:00</published><updated>2024-06-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-06-25:/weekly-roundup-2024-06-25</id><summary type="html">&lt;p class="first last"&gt;This is going to get so brittle when I manage to express absolute convergence. Oh well.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I got back into messing around with Dafny.&lt;/li&gt;
&lt;li&gt;Thursday: I gave some thought to code organization.&lt;/li&gt;
&lt;li&gt;Friday: I decided to get a fresh start with the code, and try to get the tooling as nice as can be managed right now.&lt;/li&gt;
&lt;li&gt;Saturday: I tried to make my Dafny code more reliable. In other words, to mitigate the effects of bad RNG.&lt;/li&gt;
&lt;li&gt;Sunday: Those efforts were impeded somewhat by the stark simplicity of some of my proofs. (Dafny verified lemmas with empty bodies.)&lt;/li&gt;
&lt;li&gt;Monday: I ran into trouble proving the commutative property of sigma-summation, because Dafny wanted me to &amp;quot;do actual work&amp;quot; and &amp;quot;actually think about the problem&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, now that I've made some progress (that wasn't written up), I'm going to catch up on documentation, research writing tests, and then circle back around to reducing brittleness.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Dafny"></category><category term="Concrete Mathematics"></category></entry><entry><title>Coding 2024-06-24</title><link href="https://mwchase.neocities.org/coding-2024-06-24" rel="alternate"></link><published>2024-06-24T04:00:00-04:00</published><updated>2024-06-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-06-24:/coding-2024-06-24</id><summary type="html">&lt;p class="first last"&gt;Dafny, please tell me what's missing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I made some more progress with Dafny, and now I need another break.
I reorganized things a little to make imports nicer, then made some improvements that might make those changes unnecessary for that purpose, but they still help in other ways, so I'm keeping them.&lt;/p&gt;
&lt;p&gt;I got everything together for the commutative property, and now I've got the problem that, where the other properties just instantly verified, the commutative property just spins indefinitely, without any indication of &amp;quot;what is wrong&amp;quot;.&lt;/p&gt;
&lt;p&gt;It's late, and I need some time to figure out what's going on.
I'm going to wind down now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Dafny"></category><category term="Concrete Mathematics"></category><category term="short post"></category></entry><entry><title>Coding 2024-06-23</title><link href="https://mwchase.neocities.org/coding-2024-06-23" rel="alternate"></link><published>2024-06-23T04:00:00-04:00</published><updated>2024-06-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-06-23:/coding-2024-06-23</id><summary type="html">&lt;p class="first last"&gt;Poking some more at Dafny.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, things are moving along with working with sums.
I've &amp;quot;proven&amp;quot; the distributive law and the associative law.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;&amp;quot;proven&amp;quot;?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Dafny was all like &amp;quot;yeah, that's obvious, you don't need to write anything in the lemma body&amp;quot;.&lt;/p&gt;
&lt;p&gt;Anyway, the stuff I did to set that up does not quite transfer to the &lt;em&gt;commutative&lt;/em&gt; law, so I need to do some more planning.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Also, I need to figure out how correctness-checking a lemma with &lt;em&gt;an empty body&lt;/em&gt; can be brittle.
Like, what?
What's left to optimize?&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, I actually was able to squeeze a bit of brittleness out by making the preconditions more explicit.
But still not all the way.&lt;/p&gt;
&lt;p&gt;Anyway, &lt;em&gt;that's it&lt;/em&gt;.
I don't have anything else in mind, and I need to think and plan some more.
I'd also like to get off my laptop.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Dafny"></category><category term="Concrete Mathematics"></category><category term="short post"></category></entry><entry><title>Coding 2024-06-22</title><link href="https://mwchase.neocities.org/coding-2024-06-22" rel="alternate"></link><published>2024-06-22T04:00:00-04:00</published><updated>2024-06-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-06-22:/coding-2024-06-22</id><summary type="html">&lt;p class="first last"&gt;I wasn't expecting some of these issues, but in retrospect, I can't imagine what else the documentation would have meant.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Dafny is a land of contrasts.&lt;/p&gt;
&lt;p&gt;I'm getting code ported over, and being careful about where to put it, and working to make it less brittle, but unfortunately...
Sometimes changes that I think will make the code less brittle, or at least easier to understand, make it more brittle, which is unfortunate.
And it turns out that some of these extra diagnostics increase the resource usage and the variance, so I can't really use them unless I figure out how to tune the code even harder.
And it's not even always obvious which code will be brittle.&lt;/p&gt;
&lt;p&gt;How it's all shaken out is, I've gotten my finite sum code to parity with the original version, but I'm feeling some aesthetic quibbles, so I'm going to try to polish this some more tomorrow.
&lt;em&gt;Then&lt;/em&gt; I can work on some of the more interesting ideas I wrote down over the past week.&lt;/p&gt;
&lt;p&gt;Anyway, I'd like to get some sleep now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Dafny"></category><category term="Concrete Mathematics"></category><category term="short post"></category></entry><entry><title>Coding 2024-06-21</title><link href="https://mwchase.neocities.org/coding-2024-06-21" rel="alternate"></link><published>2024-06-21T04:00:00-04:00</published><updated>2024-06-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-06-21:/coding-2024-06-21</id><summary type="html">&lt;p class="first last"&gt;Hooray for tooling!&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I've laid some groundwork, so now let's lay some more groundwork.&lt;/p&gt;
&lt;p&gt;I've decided that I want to try to get a fresh start on the Dafny code that I want to work with, so I'll create a new folder to work with it in, set up source control, and put together command-line hooks and task runner configuration to take advantage of capabilities in Dafny that I haven't used before.&lt;/p&gt;
&lt;p&gt;The first thing I need to keep in mind is that I have to make sure verification is bounded.
In the past, I used &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--resource-limit&lt;/span&gt; 200&lt;/tt&gt;.
I don't &lt;em&gt;think&lt;/em&gt; that's any kind of generally applicable setting; probably if I go that route, I'll have to gradually ratchet it up, but as long as I just configure it in one place, I think that's fine?&lt;/p&gt;
&lt;p&gt;Let's take a look at the kind of stuff I want to have in here, long-term:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;commit hooks to run verify, then format check&lt;/li&gt;
&lt;li&gt;warnings for common issues&lt;/li&gt;
&lt;li&gt;workflows to diagnose common issues&lt;/li&gt;
&lt;li&gt;documentation building&lt;/li&gt;
&lt;li&gt;probably other stuff&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I've just written a small module, and I'll be able to build up the various diagnostics &lt;em&gt;now&lt;/em&gt;, and then start expanding on it.&lt;/p&gt;
&lt;p&gt;For now, I want to get off my laptop, so I'll just note that I'm planning to look into &lt;tt class="docutils literal"&gt;just&lt;/tt&gt;, to see if I prefer it to &lt;tt class="docutils literal"&gt;invoke&lt;/tt&gt;, just out of curiosity.
Right now, though, let's wind down...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Dafny"></category><category term="Concrete Mathematics"></category></entry><entry><title>Coding 2024-06-20</title><link href="https://mwchase.neocities.org/coding-2024-06-20" rel="alternate"></link><published>2024-06-20T04:00:00-04:00</published><updated>2024-06-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-06-20:/coding-2024-06-20</id><summary type="html">&lt;p class="first last"&gt;Quick thoughts on the layouts... the &amp;quot;Relation&amp;quot; module should be separate, and all of the rest should be focused around &amp;quot;real-valued sums&amp;quot;...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I think Dafny has gotten some new capabilities since I last messed with it, which is nice.
I'm still getting to grips with stuff like &amp;quot;how should the modules be laid out?&amp;quot;, and I kind of feel like maybe I should try getting a fresh start on this code.&lt;/p&gt;
&lt;p&gt;Quick notes on the organization, because I was spacing out thinking about something else, and it's late:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;There are functions that are good for reasoning about sums.&lt;/li&gt;
&lt;li&gt;There are functions that are good for reasoning about those functions.&lt;/li&gt;
&lt;li&gt;There are methods that relate those functions to actual code.&lt;/li&gt;
&lt;li&gt;There are lemmas that allow the implementation of the method, and lemmas required to relate the method to the function.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It's probably safe to not try too hard to surface the lemmas, but I'm not sure how best to lay out everything else.
I'll have to think about this some more.
(I was thinking about Dafny stuff earlier, but it was mostly about a more sensible approach to the higher-order function ideas I had earlier.)&lt;/p&gt;
&lt;p&gt;Anyway, that's all I've got for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Dafny"></category><category term="Concrete Mathematics"></category><category term="short post"></category></entry><entry><title>Coding 2024-06-19</title><link href="https://mwchase.neocities.org/coding-2024-06-19" rel="alternate"></link><published>2024-06-19T04:00:00-04:00</published><updated>2024-06-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-06-19:/coding-2024-06-19</id><summary type="html">&lt;p class="first last"&gt;Let's get interesting...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've picked Dafny back up, updated it, deleted some asserts that are no longer required, (continued to despair that some asserts &lt;em&gt;are&lt;/em&gt; required specifically to avoid z3 going into an infinite loop), and reviewed some of the code I wrote however many months ago.
Because I didn't comment anything at the time, I had to look over the code and remember what the heck I was trying to do with all of it.
Before I write any more code, I want to make sure to document this stuff thoroughly, so if I put this down and pick it back up, I can get up to speed in minutes rather than hours.
I also think it might make sense to have separate modules defining deterministic and non-deterministic sums, but I'm not sure about that.
Like, in my head, non-deterministic sums have a simple definition and support most theorems, and then deterministic sums &amp;quot;automatically&amp;quot; convert as many of those theorems as possible into theorems that apply to &amp;quot;method&amp;quot; contexts.&lt;/p&gt;
&lt;p&gt;I'll just end up confused if I move hastily here, so I'm going to keep thinking about this, and focus on documentation, as I said.
For now, I need to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Dafny"></category><category term="Concrete Mathematics"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2024-06-18</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-06-18" rel="alternate"></link><published>2024-06-18T04:00:00-04:00</published><updated>2024-06-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-06-18:/weekly-roundup-2024-06-18</id><summary type="html">&lt;p class="first last"&gt;Definitely out of excuses at this point.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I made more progress clarifying how code in MOTR relates to other parts of itself, and, indeed, how it doesn't.&lt;/li&gt;
&lt;li&gt;Thursday: I got all the way to the final logical step in all of the work I was doing there, and then paused in case I was making a bad decision somehow.&lt;/li&gt;
&lt;li&gt;Friday: Nope, perfect idea. And for a followup... certainly a concept.&lt;/li&gt;
&lt;li&gt;Saturday: Switched gears to inlining a hierarchical... singledispatch... thing... The code is shorter and easier to understand, that's the important thing.&lt;/li&gt;
&lt;li&gt;Sunday: I finished with all of these distractions, and then had to face up to increasing coverage somehow, which, man...&lt;/li&gt;
&lt;li&gt;Monday: I guess I've got to actually implement new functionality, what a pain.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I will carefully plan the new wrappers in MOTR, and not rush in.
I'm also thinking of going back to messing around with Dafny.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2024-06-17</title><link href="https://mwchase.neocities.org/coding-2024-06-17" rel="alternate"></link><published>2024-06-17T04:00:00-04:00</published><updated>2024-06-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-06-17:/coding-2024-06-17</id><summary type="html">&lt;p class="first last"&gt;Looks like I have no choice but to make actual progress.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right.
I've made some probably-valid changes that increased code coverage.&lt;/p&gt;
&lt;p&gt;I've also written up what I think needs to be done to address the remaining coverage misses.&lt;/p&gt;
&lt;p&gt;I think the correct way forward is to start writing more wrappers, and make notes of what needs to be changed to make them easier to use.
That means starting to write coverage wrappers.
The order of those should be something like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;erase&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;run&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;combine&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;everything else&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I should also check whether any new subcommands got added.
In any case, this should remind me how I thought all of this was supposed to work, because I'm pretty sure some of the functionality I've written is meant for the kind of workflow I've put together here.&lt;/p&gt;
&lt;p&gt;Anyway, I'm not interested in being on the laptop much longer.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2024-06-16</title><link href="https://mwchase.neocities.org/coding-2024-06-16" rel="alternate"></link><published>2024-06-16T04:00:00-04:00</published><updated>2024-06-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-06-16:/coding-2024-06-16</id><summary type="html">&lt;p class="first last"&gt;Somewhat productive in spite of travel.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay.
I've inlined and enhanced the function I was working with yesterday, and now the code is fully ready to be properly covered.&lt;/p&gt;
&lt;p&gt;But, like, I kind of don't want to?
There are a few dozen lines of missing coverage currently, and I just look at them all and think &amp;quot;Ugh, how confusing, what a pain.&amp;quot;&lt;/p&gt;
&lt;p&gt;At this point, either I can, like, try to make myself eat my vegetables and grind through the lines, ooor I can go over some of the notes I've taken on improving code from the standpoint of writing tests that involve emulating a high-level motrfile.
The best hope I have for justifying that is, &amp;quot;Well, if I feel better about writing more tests, then I'll be ready to write tests for new components, and I can use those components to increase the coverage because they'll exercise more of the API surface, probably&amp;quot;.&lt;/p&gt;
&lt;p&gt;It's too late right now for me to try to tell whether that idea is, like, valid, so I'm going to get ready for bed now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2024-06-15</title><link href="https://mwchase.neocities.org/coding-2024-06-15" rel="alternate"></link><published>2024-06-15T04:00:00-04:00</published><updated>2024-06-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-06-15:/coding-2024-06-15</id><summary type="html">&lt;p class="first last"&gt;Coverage actually went slightly down, and it'll go down a little further, but I want to see this code in a good state, not one that I just kind of mushed together to get the metrics working.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's see...
I did a bunch of code reorganization today, and now things are generally in, I think, nicer shape.
I cut down on some duplication, and I've gotten most of the way through a rework of one of the problematic modules.
What I need to do now there is to put in a few more isinstance guards, which should make sure I'm covering every case that I'm worried about.&lt;/p&gt;
&lt;p&gt;I don't quite have the wherewithal to add them now, so I'll try to remember for later.&lt;/p&gt;
&lt;p&gt;Anyway, I want to shut the laptop down soon and start moving towards bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2024-06-14</title><link href="https://mwchase.neocities.org/coding-2024-06-14" rel="alternate"></link><published>2024-06-14T04:00:00-04:00</published><updated>2024-06-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-06-14:/coding-2024-06-14</id><summary type="html">&lt;p class="first last"&gt;Pondering Shenanigans&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I feel better.
I wasn't extremely focused on coding today, but I did get some work done tightening up the protocols like I was talking about.
I've moved around some code, and deleted the rest, and the result all seems to make sense.&lt;/p&gt;
&lt;p&gt;I still need to actually work on improving the coverage.
Somewhat unfortunately, I'm considering doing something bizarre to increase the coverage.
Like, I want to use queues or something to avoid having to have two different versions of &lt;tt class="docutils literal"&gt;map&lt;/tt&gt; depending on whether &lt;tt class="docutils literal"&gt;Facts&lt;/tt&gt; are involved, but this could be a bad idea.
I need some time to think about this, as well.
For now, I once again really need to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2024-06-13</title><link href="https://mwchase.neocities.org/coding-2024-06-13" rel="alternate"></link><published>2024-06-13T04:00:00-04:00</published><updated>2024-06-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-06-13:/coding-2024-06-13</id><summary type="html">&lt;p class="first last"&gt;Yay, I did something... Still feel horrible...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The &lt;tt class="docutils literal"&gt;Combinable&lt;/tt&gt; protocol is now truly filtered down to the smallest possible scope, and now I want to figure out whether it's worth having as a separate protocol, or simply folding it into the only thing that &amp;quot;really&amp;quot; uses it, which is... another protocol.
It looks like a slam dunk, but I'm not completely sure, so I'm just going to try to get a good night's sleep.
(My antihistamines have been giving me &lt;em&gt;bad&lt;/em&gt; night's sleeps, so I'm skipping a day and trying taking them at a different time.)&lt;/p&gt;
&lt;p&gt;Anyway, I also have an idea for stuff to do differently with the whole Crafting Interpreters in Rust idea, which is to ignore the nitty-gritty of the code to start with, and try to fill things in with idiomatic Rust.
I need some time to work through that idea as well, though.
So, bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2024-06-12</title><link href="https://mwchase.neocities.org/coding-2024-06-12" rel="alternate"></link><published>2024-06-12T04:00:00-04:00</published><updated>2024-06-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-06-12:/coding-2024-06-12</id><summary type="html">&lt;p class="first last"&gt;Hopefully, I don't later discover that I somehow needed these to implement the protocol.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I believe I've winnowed down the Combinable protocol usage/implementation to where it's actually relevant.
Now, I need to consider whether to rename &lt;em&gt;these&lt;/em&gt;, and then I can decide whether to do the changes I was thinking about however long ago.&lt;/p&gt;
&lt;p&gt;In any case, it would be good for me to get to bed, and I'll get to work on this, and other things, later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2024-06-11</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-06-11" rel="alternate"></link><published>2024-06-11T04:00:00-04:00</published><updated>2024-06-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-06-11:/weekly-roundup-2024-06-11</id><summary type="html">&lt;p class="first last"&gt;Not a total waste, but pretty wasteful.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: The whole &amp;quot;the tutorial said to do X, but I did Y&amp;quot; thing isn't cute any more, if it ever was.&lt;/li&gt;
&lt;li&gt;Thursday: Nevertheless, I did make some progress.&lt;/li&gt;
&lt;li&gt;Friday: I sort of made my code closer to the tutorial.&lt;/li&gt;
&lt;li&gt;Saturday: I accidentally made friends with the borrow checker.&lt;/li&gt;
&lt;li&gt;Sunday: I noticed that it wasn't cute.&lt;/li&gt;
&lt;li&gt;Monday: I went back to MOTR, but was hindered by hiccups.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to keep on poking at MOTR, but also do various bits of writing that may or may not appear somewhere.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Crafting Interpreters"></category><category term="Rust"></category><category term="MOTR"></category><category term="Python"></category></entry><entry><title>Coding 2024-06-10</title><link href="https://mwchase.neocities.org/coding-2024-06-10" rel="alternate"></link><published>2024-06-10T04:00:00-04:00</published><updated>2024-06-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-06-10:/coding-2024-06-10</id><summary type="html">&lt;p class="first last"&gt;Screaming &amp;quot;couldn't you have come up with a better way?!&amp;quot; at basal tetrapods.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Bad news, everyone.
I accidentally gave myself really bad hiccups, and it's hard to focus on code or writing when I am constantly jerking my head backwards like I'm possessed by a demon.&lt;/p&gt;
&lt;p&gt;So, to &lt;em&gt;very briefly&lt;/em&gt; summarize what I was able to accomplish with MOTR today:&lt;/p&gt;
&lt;p&gt;I took stock of my implementations of a Protocol that has some issues, and determined that most of the implementations would probably work fine &lt;em&gt;without&lt;/em&gt; worrying about the protocol, so I started renaming methods.
This represents some delicate work, because all of a sudden I have to &lt;em&gt;think&lt;/em&gt; about what they should be called, if they no longer implement the &lt;tt class="docutils literal"&gt;ThingDoer&lt;/tt&gt; protocol via the &lt;tt class="docutils literal"&gt;do_the_thing()&lt;/tt&gt; method.
I got some of those done, but there are only so many easy ones, and some of the remaining ones are tricky to think about.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to go try lying down.
Maybe that'll cure me.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2024-06-09</title><link href="https://mwchase.neocities.org/coding-2024-06-09" rel="alternate"></link><published>2024-06-09T04:00:00-04:00</published><updated>2024-06-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-06-09:/coding-2024-06-09</id><summary type="html">&lt;p class="first last"&gt;&lt;em&gt;Entirely&lt;/em&gt; self-inflicted.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I can't speak for anyone else, but right now, I'm thinking that reading Crafting Interpreters, and then rewriting all of the code on the fly, is not a great way for me to learn Rust.
Still not really up for actually touching Java outside of my senior thesis and I Minecraft mod I tried to maintain around the same time, though.&lt;/p&gt;
&lt;p&gt;So, I guess I'll ponder that, and try to get back to MOTR later, since at least with that, I'm not putting a stick through the bicycle wheel &lt;em&gt;as much&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Regardless, step one of whatever I decide to do, is to get some sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Crafting Interpreters"></category><category term="Rust"></category><category term="short post"></category></entry><entry><title>Coding 2024-06-08</title><link href="https://mwchase.neocities.org/coding-2024-06-08" rel="alternate"></link><published>2024-06-08T04:00:00-04:00</published><updated>2024-06-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-06-08:/coding-2024-06-08</id><summary type="html">&lt;p class="first last"&gt;Not the spicy borrow checker take anyone expected.&lt;/p&gt;
</summary><content type="html">&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;So, how are things going with your &lt;em&gt;programming hobby proects&lt;/em&gt;?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;... I'm making a lot of progress in Isles of Sea and Sky?&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;... Of course you are.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Anyway, I made a little progress on the Crafting Interpreters stuff.
Rust is letting me get away with a lot of stuff that I kind of didn't want to do, so I think I'm going to need to learn to trust the compiler more when it comes to data ownership.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Just how many blog posts and explainers did you have to read that, when you finally started putting together a proper project in Rust, your reaction to the borrow checker was &amp;quot;Wow, it lets me do so much stuff!&amp;quot;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Probably too many.
Anyway, I meant to get to bed, like, half an hour ago basically.
I'll look at this, or at &lt;em&gt;something&lt;/em&gt;, tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Crafting Interpreters"></category><category term="Rust"></category><category term="short post"></category></entry><entry><title>Coding 2024-06-07</title><link href="https://mwchase.neocities.org/coding-2024-06-07" rel="alternate"></link><published>2024-06-07T04:00:00-04:00</published><updated>2024-06-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-06-07:/coding-2024-06-07</id><summary type="html">&lt;p class="first last"&gt;Trying to get a handle on the right tradeoffs and compromises to make.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm right now redoing things a little to make the scanner more like the Java version, because I realized something: all of this is encapsulated away from the main interface, so, as long as it doesn't leak into the front end, I can pretend it's not &amp;quot;messy&amp;quot; because it has a clean interface.&lt;/p&gt;
&lt;p&gt;What I'm thinking about now is whether the scanner should take a mutable reference to the interpreter, for the purpose of error reporting.
I'm like, I'd like to see how that shakes out, but I'm currently dealing with... some consequence of the weather, I think.&lt;/p&gt;
&lt;p&gt;Speaking of which, my thoughts aren't currently moving super well right now, so I'm not going to try to write any more right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Crafting Interpreters"></category><category term="Rust"></category><category term="short post"></category></entry><entry><title>Coding 2024-06-06</title><link href="https://mwchase.neocities.org/coding-2024-06-06" rel="alternate"></link><published>2024-06-06T04:00:00-04:00</published><updated>2024-06-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-06-06:/coding-2024-06-06</id><summary type="html">&lt;p class="first last"&gt;I misread the relevant documentation, so I thought I had to do more, at first.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Still playing with the new toy, so I didn't have much time to touch code today.
(I think I might need to just take a break from trying to blog for a bit?
I'll think about it.)&lt;/p&gt;
&lt;p&gt;Here's where I'm at thinking about Crafting Interpreters:&lt;/p&gt;
&lt;p&gt;The scanner needs to take slices of the input string to do various things, but the builtin &lt;tt class="docutils literal"&gt;char_indices&lt;/tt&gt; stuff returns the start index of each code point, which means I need some way to go from &amp;quot;an index on a code point boundary&amp;quot; to &amp;quot;the next such index&amp;quot;.
This can work with &lt;tt class="docutils literal"&gt;is_char_boundary&lt;/tt&gt;, which should check no more than four indices ahead I think.&lt;/p&gt;
&lt;p&gt;The challenge is to take these ideas and use them in a way that makes sense.&lt;/p&gt;
&lt;p&gt;Anyway, it's late, I should get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Crafting Interpreters"></category><category term="Rust"></category><category term="short post"></category></entry><entry><title>Coding 2024-06-05</title><link href="https://mwchase.neocities.org/coding-2024-06-05" rel="alternate"></link><published>2024-06-05T04:00:00-04:00</published><updated>2024-06-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-06-05:/coding-2024-06-05</id><summary type="html">&lt;p class="first last"&gt;This could have been longer if I weren't playing so much Isles of Sea and Sky.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was thinking about Impliciula more recently, so I've been revisiting Crafting Interpreters again.
As per usual, the biggest obstacle I'm facing is my stubborn refusal to follow the tutorial in some crucial way.&lt;/p&gt;
&lt;p&gt;I'm right now trying to handle the scanner in Rust, and it's fiddly enough right now that I'm considering prototyping it in Python, and then porting the logic over.&lt;/p&gt;
&lt;p&gt;Anyway, it's late, hot, and I have other stuff I need to work on, so I'm going to cut this entry off now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Crafting Interpreters"></category><category term="Rust"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2024-06-04</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-06-04" rel="alternate"></link><published>2024-06-04T04:00:00-04:00</published><updated>2024-06-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-06-04:/weekly-roundup-2024-06-04</id><summary type="html">&lt;p class="first last"&gt;I ended up remembering a lot of opinions about MOTR, and developing some new ones.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I reviewed some of the low-level parts of MOTR.&lt;/li&gt;
&lt;li&gt;Thursday: I started focusing on improving coverage again.&lt;/li&gt;
&lt;li&gt;Friday: I made some progress, and then had to face weird questions.&lt;/li&gt;
&lt;li&gt;Saturday: I made more progress, but was hindered by how confusing some of the code I wrote is.&lt;/li&gt;
&lt;li&gt;Sunday: I closed some long-standing coverage holes, thereby uncovering some new bugs.&lt;/li&gt;
&lt;li&gt;Monday: I reviewed some of the high-level parts of MOTR.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'll try to keep on making progress, but I've got a new toy and started playing a new game, and they're pretty absorbing.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2024-06-03</title><link href="https://mwchase.neocities.org/coding-2024-06-03" rel="alternate"></link><published>2024-06-03T04:00:00-04:00</published><updated>2024-06-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-06-03:/coding-2024-06-03</id><summary type="html">&lt;p class="first last"&gt;One of my comments just like &amp;quot;I don't remember what this does, but I think it's important.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did a little work improving coverage today, but I ended up spending most of my effort describing a test that shows off some of the issues with the current top-level interface, and then messing around with other things.&lt;/p&gt;
&lt;p&gt;I'm not up for describing those other things right now, but maybe in a few weeks...&lt;/p&gt;
&lt;p&gt;Anyway, I'm tired and I should get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="Python"></category><category term="short post"></category></entry><entry><title>Coding 2024-06-02</title><link href="https://mwchase.neocities.org/coding-2024-06-02" rel="alternate"></link><published>2024-06-02T04:00:00-04:00</published><updated>2024-06-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-06-02:/coding-2024-06-02</id><summary type="html">&lt;p class="first last"&gt;I'm just not as good at writing code as people who are fine with looser coverage metrics.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I added a bit more test coverage to MOTR, and the additional coverage, say it with me, uncovered a horrible bug that was latent in the dead code paths.&lt;/p&gt;
&lt;p&gt;I just got a little bit more coverage on top of that, but at this point, if there are any easy wins left, then &lt;em&gt;finding them&lt;/em&gt; is going to be hard.&lt;/p&gt;
&lt;p&gt;Anyway, it's late and I want to get to bed, and I never actually did the thing I wanted to do this morning.
Tomorrow or the day after, I suppose.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="Python"></category><category term="short post"></category></entry><entry><title>Coding 2024-06-01</title><link href="https://mwchase.neocities.org/coding-2024-06-01" rel="alternate"></link><published>2024-06-01T04:00:00-04:00</published><updated>2024-06-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-06-01:/coding-2024-06-01</id><summary type="html">&lt;p class="first last"&gt;Finding the bits of code that I don't need to understand in order to test.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I picked away at the coverage misses in MOTR for a while, and it's definitely doing better now.&lt;/p&gt;
&lt;p&gt;One problem I ran into is that the circumstances in which some of these lines of code should be hit are, at first glance, frustratingly vague.
At some point, I'll have gotten coverage on all of the lines that basically make sense, and then I'll be stuck documenting all of this for myself until I can understand what's going on.&lt;/p&gt;
&lt;p&gt;Anyway, it's late, and in the morning I've got some stuff that I absolutely need to be awake for.
So, I should get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="Python"></category><category term="short post"></category></entry><entry><title>Coding 2024-05-31</title><link href="https://mwchase.neocities.org/coding-2024-05-31" rel="alternate"></link><published>2024-05-31T04:00:00-04:00</published><updated>2024-05-31T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-05-31:/coding-2024-05-31</id><summary type="html">&lt;p class="first last"&gt;Not much to talk about here and now, possibly because I've been into weird multitasking recently. Oh well.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've gotten full coverage on a few files, and now the question of how to deal with the next file is interesting.
I've got some slightly questionable &lt;tt class="docutils literal"&gt;functools.singledispatch&lt;/tt&gt; calls that I'm not sure what to do about.
I'll have to think about those.&lt;/p&gt;
&lt;p&gt;For now, I'm tired and I want to sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="Python"></category><category term="short post"></category></entry><entry><title>Coding 2024-05-30</title><link href="https://mwchase.neocities.org/coding-2024-05-30" rel="alternate"></link><published>2024-05-30T04:00:00-04:00</published><updated>2024-05-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-05-30:/coding-2024-05-30</id><summary type="html">&lt;p class="first last"&gt;Trying to make proper forward progress, once again.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I took care of a few coverage misses.
In particular, I'm now using &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt; in the places that I think it made sense, and I've added a missing conditional to the plugin to deal with the realities of usage.
For now, I'm improving coverage starting with the lowest coverage percentage per file.
By that methodology, there are fifteen files left to update tests for, although at some point I'll bump back into &amp;quot;the most natural way to increase some of this coverage is to add more CLI wrappers&amp;quot;, which is going to get me back on &amp;quot;it feels like there should be a better way to create CLI wrappers&amp;quot;.&lt;/p&gt;
&lt;p&gt;I'll figure that out when I figure it out; for now, I'm tired.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="Python"></category><category term="short post"></category></entry><entry><title>Coding 2024-05-29</title><link href="https://mwchase.neocities.org/coding-2024-05-29" rel="alternate"></link><published>2024-05-29T04:00:00-04:00</published><updated>2024-05-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-05-29:/coding-2024-05-29</id><summary type="html">&lt;p class="first last"&gt;Hopefully, I picked the right workaround.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm mostly trying to explain MOTR to someone else, so today I just worked around a bug in Mypy, or possibly its bundled typeshed install.
The one place I use &lt;cite&gt;functools.wraps&lt;/cite&gt; in this code base, and it breaks Mypy.&lt;/p&gt;
&lt;p&gt;Anyway, I got that in, and now I'm pondering some parts of MOTR that I haven't needed to in some time, because they're so solid and reliable.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;This is a badly written plug for the &lt;a class="reference external" href="https://trio.readthedocs.io/en/stable/"&gt;trio&lt;/a&gt; library.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;It's pretty nice, and is probably the main reason I barely need to think about the core code running MOTR.&lt;/p&gt;
&lt;p&gt;Anyway, I don't want to be up any longer.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="Python"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2024-05-28</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-05-28" rel="alternate"></link><published>2024-05-28T04:00:00-04:00</published><updated>2024-05-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-05-28:/weekly-roundup-2024-05-28</id><summary type="html">&lt;p class="first last"&gt;Please look at my chosts.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I noticed some interesting developments in Koka, and promptly mostly ignored them.&lt;/li&gt;
&lt;li&gt;Thursday: I did a small refactor to MOTR.&lt;/li&gt;
&lt;li&gt;Friday: I did another small refactor.&lt;/li&gt;
&lt;li&gt;Saturday: I wrote about stuff that Impliciula could do.&lt;/li&gt;
&lt;li&gt;Sunday: I took a look at what's left to clean up the names in MOTR.&lt;/li&gt;
&lt;li&gt;Monday: I took a closer look; I'm still not quite sure how to address these issues.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, we'll see what I'm up for.
Earlier today, I did the big unpleasant merge that's been a long time coming, and I &lt;em&gt;may&lt;/em&gt; have created some duplicate code; it's legitimately unclear at this point.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="MOTR"></category><category term="Impliciula"></category></entry><entry><title>Coding 2024-05-27</title><link href="https://mwchase.neocities.org/coding-2024-05-27" rel="alternate"></link><published>2024-05-27T04:00:00-04:00</published><updated>2024-05-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-05-27:/coding-2024-05-27</id><summary type="html">&lt;p class="first last"&gt;My periodic &amp;quot;what the heck is all this?&amp;quot; check.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Taking another look at the &lt;tt class="docutils literal"&gt;cli_types&lt;/tt&gt; package...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt;: High-level code for ... I'll get back to you on that.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;combinable&lt;/tt&gt;: Protocol for a generic magma.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;entry&lt;/tt&gt;: Small module with a set of marker types.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;environment&lt;/tt&gt;: Small module for... something looks weird here... Okay, so there's a type-level marker, but it's attached to a small dataclass that handles resolution within a virtual environment? And this marker is, at least in part, propagated via a protocol class? I suppose a good condidate for stuff to bundle with this would be &amp;quot;whatever implements the protocol?&amp;quot; Except that it's not implemented anywhere in &lt;tt class="docutils literal"&gt;cli_types&lt;/tt&gt;. It's implemented once, which, shh... shh...&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;executable&lt;/tt&gt;: Tiny module for specifying a program entry point accessible in an &lt;em&gt;abstract&lt;/em&gt; way.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;installer&lt;/tt&gt;: Does stuff with &lt;tt class="docutils literal"&gt;environment&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;invocation_environment&lt;/tt&gt;: Ties together a bunch of this stuff as well as lower-level stuff, to represent an abstracted command argument, and the installers needed to make it specific.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;not_output&lt;/tt&gt;: A helper function for preventing various data structures from containing an &lt;tt class="docutils literal"&gt;io.Output&lt;/tt&gt; value. I wonder if it makes sense to decouple iteration from instance checking?&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;parametric_command&lt;/tt&gt;: Due for renaming to &amp;quot;command_matrix&amp;quot; or something. I &lt;em&gt;think&lt;/em&gt; this is the thing that the &lt;tt class="docutils literal"&gt;cli&lt;/tt&gt; modules use to represent the basic form of a command, which isn't really a clear description.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;path_with&lt;/tt&gt;: Class to associate some data to a path. I should consider whether I want the path to default to anything in particular.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;program&lt;/tt&gt;: Marker class.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;runner&lt;/tt&gt;: Another part of the whole &amp;quot;tower of abstraction&amp;quot; thing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It's late, so I'm not going to touch anything tonight, but it looks like creating a package to bundle together marker types might not go amiss.
Then again, it might.
Regardless, the big division that's manifesting for me is the &amp;quot;tower of abstraction&amp;quot; vs &amp;quot;all the other stuff&amp;quot;.
Perhaps it would be illuminating to lay out the &amp;quot;tower&amp;quot;, and figure out which levels &amp;quot;everything else&amp;quot; has to go &amp;quot;between&amp;quot;?
I'll try that out later, I don't know exactly when.&lt;/p&gt;
&lt;p&gt;All that said, I'm very worried about the scope of the merges I'm setting myself up for, so it would also be a good idea for me to review my coverage misses and see what's in the way of addressing them...&lt;/p&gt;
&lt;p&gt;Anyway, time to stop messing around and get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="Python"></category></entry><entry><title>Coding 2024-05-26</title><link href="https://mwchase.neocities.org/coding-2024-05-26" rel="alternate"></link><published>2024-05-26T04:00:00-04:00</published><updated>2024-05-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-05-26:/coding-2024-05-26</id><summary type="html">&lt;p class="first last"&gt;A little more progress.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I don't have much to write about—&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;On account of all of the video games.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;And travel.&lt;/p&gt;
&lt;p&gt;But I did just now break out the matrix modules on their own, which means that that's three fewer modules in the badly named &lt;tt class="docutils literal"&gt;cli_types&lt;/tt&gt; sub-package.
Just twelve more to go...&lt;/p&gt;
&lt;p&gt;(Also, I should probably clean up all of the &lt;tt class="docutils literal"&gt;.orig&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;.rej&lt;/tt&gt; files that are cluttering things up from all of the merges and whatnot, but I'm putting that off until after the Big Merge that all of this is working towards.)&lt;/p&gt;
&lt;p&gt;Anyway, it's getting late and I need to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="Python"></category><category term="short post"></category></entry><entry><title>Coding 2024-05-25</title><link href="https://mwchase.neocities.org/coding-2024-05-25" rel="alternate"></link><published>2024-05-25T04:00:00-04:00</published><updated>2024-05-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-05-25:/coding-2024-05-25</id><summary type="html">&lt;p class="first last"&gt;It's longer over there.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Tonight, I ended up doing a bunch of random things, then focusing on Impliciula.
Specifically, I made &lt;a class="reference external" href="https://cohost.org/mwchase/post/6113704-notes-about-introduc"&gt;a post&lt;/a&gt;, on Cohost, so it's easier to comment on it, taking a simple Rust function with a one-line body, and extracting a large number of questions from it about how Impliciula should achieve something similar.&lt;/p&gt;
&lt;p&gt;It's pretty late at night, so I don't want to think about this too much harder.
Let's just wrap things up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2024-05-24</title><link href="https://mwchase.neocities.org/coding-2024-05-24" rel="alternate"></link><published>2024-05-24T04:00:00-04:00</published><updated>2024-05-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-05-24:/coding-2024-05-24</id><summary type="html">&lt;p class="first last"&gt;Carefully-planned changes: easy to do, hard to write anything interesting about.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right.
&lt;tt class="docutils literal"&gt;label&lt;/tt&gt; is at the top level.
In the utopian future I'm working towards, when &lt;tt class="docutils literal"&gt;dependent_mapping&lt;/tt&gt; gets spun out into its own package, &lt;tt class="docutils literal"&gt;label&lt;/tt&gt; is coming along for the ride.&lt;/p&gt;
&lt;p&gt;I wanted to have more to say, but I evidently don't, so I'm going to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="Python"></category><category term="short post"></category></entry><entry><title>Coding 2024-05-23</title><link href="https://mwchase.neocities.org/coding-2024-05-23" rel="alternate"></link><published>2024-05-23T04:00:00-04:00</published><updated>2024-05-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-05-23:/coding-2024-05-23</id><summary type="html">&lt;p class="first last"&gt;The point of extensive planning is to make this stuff anti-climactic.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've been thinking about it long enough, so I finally went and removed a bunch of dependency links in MOTR.
I think this resulted in some names not &lt;em&gt;quite&lt;/em&gt; making sense, so I'll just let the new status quo percolate a little.&lt;/p&gt;
&lt;p&gt;However, now that I've made the change, I'm ready to move things around.
I believe I'll want to make &lt;tt class="docutils literal"&gt;label&lt;/tt&gt; a free-standing top-level (or at least higher-up) module, and consolidate the rest of the &lt;tt class="docutils literal"&gt;matrix&lt;/tt&gt; stuff into a top-level package.
Anything to make this all a bit more coherent...&lt;/p&gt;
&lt;p&gt;Anyway, I've been feeling tired all week because of reasons that are understandable to me, and I need to suffer through a few more days I guess, but I know when it should be over.&lt;/p&gt;
&lt;p&gt;Maybe I'll get much more done then, maybe I won't.
We'll see.
For now, I should get to bed as soon as I can.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="Python"></category><category term="short post"></category></entry><entry><title>Coding 2024-05-22</title><link href="https://mwchase.neocities.org/coding-2024-05-22" rel="alternate"></link><published>2024-05-22T04:00:00-04:00</published><updated>2024-05-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-05-22:/coding-2024-05-22</id><summary type="html">&lt;p class="first last"&gt;Not short per se, but not much content either. Oh well.&lt;/p&gt;
</summary><content type="html">&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;So, Koka has had implicits since sometime in January.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Oh wow, neat.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;So, there's no reason to keep messing around with Impliciula, right?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Well...&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Why do I bother?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;See, here's the deal.
There are various ways to handle the concept of implicits.
I haven't delved super-deep into how Koka's implementation works, but it seems &lt;em&gt;maybe&lt;/em&gt; like it's closer to Scala than I'd like; my goal is to make something much more like this one particular fork of OCaml.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Of course.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Also, while the research programs feeding into Koka's development don't have any way to crowbar in AI BS that is &lt;em&gt;extremely obvious&lt;/em&gt; to me, just thinking about that somehow happening gets me thinking about stuff like &amp;quot;a healthy ecosystem with plenty of competition&amp;quot;.
(To be clear, I'm not talking about &amp;quot;having libraries that do a lot of linear algebra and vectorization&amp;quot;, I'm talking about &amp;quot;Buy a fancy new computer that records everything on your screen and keeps it around for three months by default.&amp;quot; HIPAA violations as a service.)&lt;/p&gt;
&lt;p&gt;Anyway, I've got some ideas for Impliciula that I've been posting on Cohost.
I think what I'd like to do is to take code samples from language tutorials (starting with The Rust Book), and figure out either what they would look like in Impliciula, or what questions I would need to answer first.&lt;/p&gt;
&lt;p&gt;For the moment, I need rest.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Koka"></category><category term="Impliciula"></category></entry><entry><title>Weekly Roundup 2024-05-21</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-05-21" rel="alternate"></link><published>2024-05-21T04:00:00-04:00</published><updated>2024-05-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-05-21:/weekly-roundup-2024-05-21</id><summary type="html">&lt;p class="first last"&gt;I hope I learned something from all of this, because this stuff kind of failed as a naming language.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I got &lt;tt class="docutils literal"&gt;tup&lt;/tt&gt; to run a basic &lt;tt class="docutils literal"&gt;lexurgy sc&lt;/tt&gt; command, and started thinking about how to do fancier stuff in that area.&lt;/li&gt;
&lt;li&gt;Thursday: I spent a bunch more time thinking about how to glue together a bunch of &lt;tt class="docutils literal"&gt;lexurgy sc&lt;/tt&gt; invocations with &lt;tt class="docutils literal"&gt;tup&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Friday: I stepped away from code and project structure to focus on the naming language itself.&lt;/li&gt;
&lt;li&gt;Saturday: The scope for the naming language ballooned.&lt;/li&gt;
&lt;li&gt;Sunday: I started to run into difficulties.&lt;/li&gt;
&lt;li&gt;Monday: If a sound change generates a sequence of phonemes that has to be transcribed something like &amp;quot;ththth&amp;quot;, it's probably a bad sound change in context.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to step away from conlanging, and get back to broader world-building.
Maybe I'll finally mess with MOTR again, as well.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Cosmopolitan (conlang)"></category><category term="conlanging"></category><category term="tup"></category></entry><entry><title>Conlanging 2024-05-20</title><link href="https://mwchase.neocities.org/conlanging-2024-05-20" rel="alternate"></link><published>2024-05-20T04:00:00-04:00</published><updated>2024-05-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-05-20:/conlanging-2024-05-20</id><summary type="html">&lt;p class="first last"&gt;Not happy with triple-eth drifting.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, after a bunch of effort, I've got some attempts at names in a naming language, and boy, do I not like it.
It looks extremely likely that I have fundamentally misapprehended some aspect of Proto-Indo-European.&lt;/p&gt;
&lt;p&gt;So, now I'm trying to just come up with a different set of sound changes, and I'm not sure how to get from the source language's syllable structure to my goal.
I'm going to either put this down for a bit, or at least get more research in.&lt;/p&gt;
&lt;p&gt;We'll see how that goes, but I want to wind things down just now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category><category term="Cosmopolitan (conlang)"></category><category term="short post"></category></entry><entry><title>Conlanging 2024-05-19</title><link href="https://mwchase.neocities.org/conlanging-2024-05-19" rel="alternate"></link><published>2024-05-19T04:00:00-04:00</published><updated>2024-05-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-05-19:/conlanging-2024-05-19</id><summary type="html">&lt;p class="first last"&gt;Starting to shape up...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Now that I've got some idea of how Proto-Indo-European worked, I'm trying to run things forwards with the minimal selection of roots I need to generate the names that were the whole point of this.
In doing so, I have learned two things:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I can read some ambiguity into Wikipedia's description of the idealized regular ablaut.&lt;/li&gt;
&lt;li&gt;I don't know what to do when I put a syllable in zero-grade, and then the multiple sonorants mean it doesn't have a defined nucleus in my eyes, and then I'm supposed to &lt;em&gt;accent&lt;/em&gt; it?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That said, I've run &lt;em&gt;a few&lt;/em&gt; roots &lt;em&gt;partway&lt;/em&gt; forwards, and the results so far look interesting.
We'll have to see whether things still look good once I've figured this out.&lt;/p&gt;
&lt;p&gt;Anyway, I want to cool off and get to bed now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category><category term="Cosmopolitan (conlang)"></category><category term="Lexurgy"></category><category term="short post"></category></entry><entry><title>Conlanging 2024-05-18</title><link href="https://mwchase.neocities.org/conlanging-2024-05-18" rel="alternate"></link><published>2024-05-18T04:00:00-04:00</published><updated>2024-05-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-05-18:/conlanging-2024-05-18</id><summary type="html">&lt;p class="first last"&gt;Please pay no attention to what all of this is supposed to be &lt;em&gt;for&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, before I get into the details of what I'm planning, I'm just going to ask that everyone ignore the degree of scope creep that I've inflicted on this project.
All right?
All right.&lt;/p&gt;
&lt;p&gt;So, here's what I've worked out so far during my attempts to create basically an alternative version of an Indo-European language with a different vocabulary of roots:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Need to work out ablaut before applying other sound changes.&lt;/li&gt;
&lt;li&gt;Need to determine accent before applying ablaut.&lt;/li&gt;
&lt;li&gt;Because my goal is a centum language, I can't totally nail down the roots unless I also do derivations for a satem language.&lt;/li&gt;
&lt;li&gt;(This perhaps could be avoided by attempting to make an alternative version of Luwian or certain other Anatolian languages, but, I'm not doing that. (Right now.))&lt;/li&gt;
&lt;li&gt;My original plan was to use Farsi for that purpose, but I'm having trouble tracking down sets of sound changes in general that go into as much detail as Wikipedia goes into on Proto-Germanic.
I may need to just look harder.&lt;/li&gt;
&lt;li&gt;On the other hand, I could just learn the tools with Proto-Germanic, and then try to do things based on Vibes for the rest of it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At this point, it makes sense to try to put together the basic rules, but it also makes sense to try to get more of a handle on derivational morphology, so I have more idea of what can cause the accent to move around.&lt;/p&gt;
&lt;p&gt;I'll see what I'm up for in this area after I get some more sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category><category term="Cosmopolitan (conlang)"></category><category term="Lexurgy"></category></entry><entry><title>Conlanging 2024-05-17</title><link href="https://mwchase.neocities.org/conlanging-2024-05-17" rel="alternate"></link><published>2024-05-17T04:00:00-04:00</published><updated>2024-05-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-05-17:/conlanging-2024-05-17</id><summary type="html">&lt;p class="first last"&gt;Nope, still can't come up with an excuse for missing that.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I've done some work on the phonological evolution side, and I've realized a few things.
Most importantly, the Index Diachronica isn't really useful to me, not yet.
This is because, and I swear I'll come up with a good reason I didn't notice this before, it present the sound changes in a given section in lexical, rather than chronological order.&lt;/p&gt;
&lt;p&gt;Figuring this all out myself does mean that I have more of a handle on how the sound changes actually fit together, where to look going forward, and also just the proper way to make up Proto-Indo-European roots, and to apply ablaut.&lt;/p&gt;
&lt;p&gt;At this point, my plan is to make sound change files for regular ablaut application, and early and late Proto-Germanic.
At that point, I can check that they &lt;em&gt;actually&lt;/em&gt; work by comparing them with actual historical derivations.
And then just keep going until I've run it forward enough.&lt;/p&gt;
&lt;p&gt;At that point, I can start experimenting with fictional roots, and get a sense for stuff like &amp;quot;if I need a laryngeal to fill out a consonant slot, which one do I prefer?&amp;quot; and &amp;quot;do I get nice results if I give this root a laryngeal, as a treat?&amp;quot; and &amp;quot;which plosive would I like to use?&amp;quot;
I can try to describe what conclusions I come to there, but it will probably end up being very personal/tacit knowledge.
Still, I'll see what I can do.&lt;/p&gt;
&lt;p&gt;Anyway, it's getting late, and I want to wind down.
Hopefully, I'll make some progress on this tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category><category term="Cosmopolitan (conlang)"></category><category term="Lexurgy"></category></entry><entry><title>Coding 2024-05-16</title><link href="https://mwchase.neocities.org/coding-2024-05-16" rel="alternate"></link><published>2024-05-16T04:00:00-04:00</published><updated>2024-05-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-05-16:/coding-2024-05-16</id><summary type="html">&lt;p class="first last"&gt;This exploratory writing has found... something.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, here we go.
I figured out a basic nice interface for defining Lexurgy invocations in a &lt;tt class="docutils literal"&gt;Tupfile.lua&lt;/tt&gt;, but I'm not going to be using it.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Of course you aren't.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Nevertheless, I'll start off explaining it, because it makes a good starting point for the fancier stuff I have in mind.&lt;/p&gt;
&lt;p&gt;Think of the development of a language from a protolanguage.
Since I'm aiming for Old Norse, let's see what the conception of the sound changes looks like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Apply ablaut to increase the number of vowels.&lt;/li&gt;
&lt;li&gt;Proto-Indo-European to Common Germanic&lt;/li&gt;
&lt;li&gt;Common Germanic to Proto-Norse&lt;/li&gt;
&lt;li&gt;Proto-Norse to Old Norse&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, I &lt;em&gt;could&lt;/em&gt; stuff all of those into a single file, but I like the idea of keeping the sound changes divided, so I could, in principle, branch off from somewhere and create other members of a language family.
&lt;strong&gt;So&lt;/strong&gt;, rather than the single change that I specified to carry out the Basican example from Lexurgy's documentation, I need a chain of related changes for this.
And those changes have some things in common, and some things different.
And some of the differences are regular: the output suffix of one step &lt;em&gt;must be&lt;/em&gt; the input suffix of the next step.
Now, there are plenty of ways to express &amp;quot;a bunch of similar arguments&amp;quot; in Lua.
Table arguments, varargs, probably other things than those and what I have in mind.
But here is what I have in mind:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;lexurgy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lexurgy&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;wli_template&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;%s_%s.wli&amp;quot;&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;wlm_template&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;%s_%s.wlm&amp;quot;&lt;/span&gt;

&lt;span class="kr"&gt;do&lt;/span&gt;
  &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="kr"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;word_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;in_suffix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;in_build_folder&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;in_prefix&lt;/span&gt;
    &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;out_prefix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;build/&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
    &lt;span class="kr"&gt;if&lt;/span&gt; &lt;span class="n"&gt;in_build_folder&lt;/span&gt; &lt;span class="kr"&gt;then&lt;/span&gt;
      &lt;span class="n"&gt;in_prefix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;out_prefix&lt;/span&gt;
    &lt;span class="kr"&gt;else&lt;/span&gt;
      &lt;span class="n"&gt;in_prefix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;src/&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
    &lt;span class="kr"&gt;end&lt;/span&gt;
    &lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out_suffix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sound_changes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;tup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;definerule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;wli_template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;in_prefix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;in_suffix&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;sound_changes&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;lexurgy sc --in-suffix &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="n"&gt;in_suffix&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot; --out-suffix &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="n"&gt;out_suffix&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot; --out-dir ../build &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="n"&gt;sound_changes&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot; &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="n"&gt;in_prefix&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;.wli&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="n"&gt;wli_template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out_prefix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;out_suffix&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="n"&gt;wlm_template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out_prefix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;out_suffix&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="n"&gt;word_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;out_suffix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kr"&gt;end&lt;/span&gt;
  &lt;span class="kr"&gt;end&lt;/span&gt;

  &lt;span class="n"&gt;lexurgy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;word_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;word_list&lt;/span&gt;
&lt;span class="kr"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Wow, I... genuinely do not know whether I'd rather build that command line with string concatenation or a format string.
Python has spoiled me.&lt;/p&gt;
&lt;p&gt;Anyway, code very much like this should work, if someone is reading this and thinking &amp;quot;By gosh, yes, I would like to coordinate my sound change application by simply running &lt;tt class="docutils literal"&gt;tup&lt;/tt&gt;, and I'll have no truck with the other bells and whistles this post is about to add!&amp;quot;&lt;/p&gt;
&lt;p&gt;However.
My end goal is to generate a lexicon from this stuff, and that means not just having the evolved form of the word, but also information about how it's used.
A specific line of a &lt;tt class="docutils literal"&gt;.wli&lt;/tt&gt; file corresponds to a precise lineage of word, spread out across all files where the filename starts off the same.
This means that, as long as I figure out a format for this metadata that all fits on one line, I don't need to further process such metadata as the sound changes are applied.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;So, this is going to be a simple change, if it's any change at all, right?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Thank you for teeing that up.
While normal languages get most of their vocabulary through evolution of ancestral word forms, loan words are a thing, and it would be nice to bring in and evolve them.
At this point, I can see two approaches to take with that:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Concatenate the word lists and metadata together, creating a new single lineage, and process them as a single block at the end&lt;/li&gt;
&lt;li&gt;Have an array of word lists separated by origin, and combine them at the end&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The former relies on the fact that the inputs to the &lt;tt class="docutils literal"&gt;word_list&lt;/tt&gt; function above are sufficient to uniquely determine the location of the word list file being processed (otherwise, it couldn't process it).
That means that it could &amp;quot;make sense&amp;quot; to replace the function returned from &lt;tt class="docutils literal"&gt;word_list&lt;/tt&gt; with an object representing the file, and a method representing the original function, and other methods for other operations.&lt;/p&gt;
&lt;p&gt;That was my first idea, but the more I think about it, the more I don't like it.
Coordinating the concatenations feels fiddlier than I'd like right now, and requires exponentially many names for lineages.
Therefore, I think I want to consider the outcome of handling lists of lineages.
The &lt;tt class="docutils literal"&gt;in_suffix&lt;/tt&gt; should be the same for all of them, so, hmm...
&lt;em&gt;Hmm...&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I think I would like to finish this entry now, and ponder further after publishing.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="conlanging"></category><category term="Cosmopolitan (conlang)"></category><category term="tup"></category></entry><entry><title>Coding 2024-05-15</title><link href="https://mwchase.neocities.org/coding-2024-05-15" rel="alternate"></link><published>2024-05-15T04:00:00-04:00</published><updated>2024-05-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-05-15:/coding-2024-05-15</id><summary type="html">&lt;p class="first last"&gt;Now that I've done more than the very basics with tup, I can say with confidence: tup is pretty neat.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The good news is, I've managed to prototype an invocation of Lexurgy SC via tup.
The not as good news is, it looks like Lexurgy SC's somewhat idiosyncratic file naming paradigm is going to require the use of Lua to actually generate the correct names, if I want to make this stuff parametric and reusable, which I do.&lt;/p&gt;
&lt;p&gt;Let's take a look at what I had before I switched to Lua:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;: src/words_old.wli |&amp;gt; lexurgy sc &lt;span class="pre"&gt;--in-suffix&lt;/span&gt; old &lt;span class="pre"&gt;--out-suffix&lt;/span&gt; new &lt;span class="pre"&gt;--out-dir&lt;/span&gt; &lt;span class="pre"&gt;../build&lt;/span&gt; src/changes.lsc src/words.wli |&amp;gt; build/words_new.wli build/words_new.wlm&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;There are several things that can reasonably be varied:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The out suffix&lt;/li&gt;
&lt;li&gt;The in suffix&lt;/li&gt;
&lt;li&gt;The path to the changes file&lt;/li&gt;
&lt;li&gt;The prefix to the word lists&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let's make a few assumptions:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The user should specify the path to &lt;tt class="docutils literal"&gt;.lsc&lt;/tt&gt; files exactly, since there's no funny business with the file names.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;.wli&lt;/tt&gt; files reside in &lt;tt class="docutils literal"&gt;src&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;build&lt;/tt&gt;, nowhere else.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From this, we have the following desired inputs, probably not in this order:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Out suffix&lt;/li&gt;
&lt;li&gt;In suffix&lt;/li&gt;
&lt;li&gt;Input directory&lt;/li&gt;
&lt;li&gt;Input filename&lt;/li&gt;
&lt;li&gt;Sound changes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm going to need to think some about the exact format that I want some of those to be in.
For now, I'm going to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="conlanging"></category><category term="Cosmopolitan (conlang)"></category><category term="tup"></category></entry><entry><title>Weekly Roundup 2024-05-14</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-05-14" rel="alternate"></link><published>2024-05-14T04:00:00-04:00</published><updated>2024-05-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-05-14:/weekly-roundup-2024-05-14</id><summary type="html">&lt;p class="first last"&gt;Gradually drifting towards what may be the commission of a bunch of Build System Crimes.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I dusted off the Conlanging category. And promptly ended up making a bunch of work for myself by deciding to make a naming language with ablaut and umlaut and probably various other kinds of -laut.&lt;/li&gt;
&lt;li&gt;Thursday: I thought some about how I want to handle the development of the naming language in a hopefully reusable way.&lt;/li&gt;
&lt;li&gt;Friday: I decided to drop marimo in favor of Pandoc and tup for my grammar needs, which is a really messed up statement if you lack a whole bunch of context.&lt;/li&gt;
&lt;li&gt;Saturday: I gave some thought to learning Lexurgy.&lt;/li&gt;
&lt;li&gt;Sunday: I gave more thought to specifically using tup and Lexurgy together in a way that at least sort of makes sense.&lt;/li&gt;
&lt;li&gt;Monday: I put down in writing some more of the thoughts that I'm having there.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm either going to keep on working on developing Tupfile stuff to handle the Basican example from Lexurgy, or I'm going to pivot to reading up on Fabula Ultima rules again, and try to figure out which oracles I want to bring in.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Cosmopolitan (conlang)"></category><category term="conlanging"></category></entry><entry><title>Coding 2024-05-13</title><link href="https://mwchase.neocities.org/coding-2024-05-13" rel="alternate"></link><published>2024-05-13T04:00:00-04:00</published><updated>2024-05-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-05-13:/coding-2024-05-13</id><summary type="html">&lt;p class="first last"&gt;I need the right intersection of &amp;quot;enthusiasm for this project&amp;quot; and &amp;quot;actually being awake&amp;quot;...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's see.
For the lexurgy commands, I want to be able to &lt;em&gt;input&lt;/em&gt; a word list either from the &lt;tt class="docutils literal"&gt;src&lt;/tt&gt; directory or the &lt;tt class="docutils literal"&gt;build&lt;/tt&gt; directory, and it needs to output to the &lt;tt class="docutils literal"&gt;build&lt;/tt&gt; directory.
For consistency, I want both lists to have a suffix in the filename, so to get tup working, it's going to need to do a little string processing on for both input and output, in some fashion.
Not sure offhand how well tup takes to that, but oh well.&lt;/p&gt;
&lt;p&gt;The &lt;tt class="docutils literal"&gt;src&lt;/tt&gt; directory also needs to maintain a mapping from ancestral words/phrases to modern definitions, so there can be a parallel list that puts all of those in the same order.&lt;/p&gt;
&lt;p&gt;A big part of what I have in mind is going to literally just be &amp;quot;here are two files; &lt;tt class="docutils literal"&gt;cat&lt;/tt&gt; them together and write the result to the &lt;tt class="docutils literal"&gt;build&lt;/tt&gt; directory&amp;quot;.&lt;/p&gt;
&lt;p&gt;That said, I think what I need to do to try this out is to write ports of the Lexurgy examples.
I just cloned a repository for one of them, but my feeling about what I want to do right now is &amp;quot;We were back on the road today, so I'm going to go lie down early&amp;quot;.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="conlanging"></category><category term="Cosmopolitan (conlang)"></category><category term="short post"></category></entry><entry><title>Coding 2024-05-12</title><link href="https://mwchase.neocities.org/coding-2024-05-12" rel="alternate"></link><published>2024-05-12T04:00:00-04:00</published><updated>2024-05-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-05-12:/coding-2024-05-12</id><summary type="html">&lt;p class="first last"&gt;Say it with me now: &amp;quot;We were traveling.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've thought enough about how I want to lay out the repositories for conlangs that I was able to handle &lt;em&gt;part of&lt;/em&gt; the updates.
I've got two tracked directories at the top level: &lt;tt class="docutils literal"&gt;src&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;utils&lt;/tt&gt;, as well as a bunch of files specific to tup.
The idea is to &lt;em&gt;somehow&lt;/em&gt; convert from one of Lexurgy's &lt;tt class="docutils literal"&gt;.wli&lt;/tt&gt; files to a basic &lt;tt class="docutils literal"&gt;.rst&lt;/tt&gt; file containing a table and an &lt;tt class="docutils literal"&gt;.. only:: html&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;.. raw:: html&lt;/tt&gt; directive or similar, to embed some javascript to make it interactive in the HTML version.&lt;/p&gt;
&lt;p&gt;Getting all of that to work right/at all is going to be more effort than I've put in so far, and I can't handle that right now.
But soon, hopefully.
Anyway, it's late again, so I need to shut things down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="conlanging"></category><category term="Cosmopolitan (conlang)"></category><category term="short post"></category></entry><entry><title>Conlanging 2024-05-11</title><link href="https://mwchase.neocities.org/conlanging-2024-05-11" rel="alternate"></link><published>2024-05-11T04:00:00-04:00</published><updated>2024-05-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-05-11:/conlanging-2024-05-11</id><summary type="html">&lt;p class="first last"&gt;Getting some basic knowledge of this stuff.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's see what I've learned so far.
There are sort of two sides to learning Lexurgy.&lt;/p&gt;
&lt;p&gt;There's actually writing the rules, which takes skill working with groups, feature matrices, etc.&lt;/p&gt;
&lt;p&gt;And there's figuring out how I want to wire the word lists together.
That gets into stuff like how I want to specify things in the configuration files for build systems (tup, Ninja, ... &lt;em&gt;Make&lt;/em&gt;...), and what I want to track in version control (Pijul, Mercurial, ... not saying the name of the popular one...).&lt;/p&gt;
&lt;p&gt;I can get a better idea of what to do for the former by studying stuff like the Index Diachronica, though I wouldn't mind finding an alternative, because some of the very early sound changes for Proto-Indo-European look to me like they're written against a reconstructed phoneme inventory different that the one I want to go for.&lt;/p&gt;
&lt;p&gt;Anyway, that's all going to take some more thought, and I want to wind down for tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category><category term="Cosmopolitan (conlang)"></category><category term="Lexurgy"></category></entry><entry><title>Coding 2024-05-10</title><link href="https://mwchase.neocities.org/coding-2024-05-10" rel="alternate"></link><published>2024-05-10T04:00:00-04:00</published><updated>2024-05-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-05-10:/coding-2024-05-10</id><summary type="html">&lt;p class="first last"&gt;Figuring out that what I thought I was going to do wouldn't actually work is still progress. I'm learning things.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I've done some investigation, and I have a fair idea of what &lt;em&gt;won't&lt;/em&gt; work for what I'm trying to do here.
The key thing I figured out is that marimo doesn't really work for putting together a conlang grammar, not the way I'd like.&lt;/p&gt;
&lt;p&gt;See, one of the things that I was interested in was just shoving together some widgets to handle fancy table stuff like filtering and sorting by column, and it turns out that &amp;quot;interactive widgets that depend on running Python code for their functionality&amp;quot; doesn't really have a great way forward in marimo.
Too many tradeoffs that I don't really like.
That said, I don't see any problem with continuing to use it for the optional interactive IPA thing.&lt;/p&gt;
&lt;p&gt;Here's what I'm thinking I will do:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Put together a basic scenario to make sure I understand how to use Lexurgy&lt;/li&gt;
&lt;li&gt;Get some hands-on experience with tup, because it seems to have some features that Ninja doesn't, and I'm curious&lt;/li&gt;
&lt;li&gt;Investigate pandoc's support for including files using reStructuredText&lt;/li&gt;
&lt;li&gt;See about generating reStructuredText tables&lt;/li&gt;
&lt;li&gt;Try to get pandoc to emit fancy table manipulation javascript when building HTML&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My current idea about how this all ends up is to have some code that ultimately generates the lexicon (this can get pretty fancy in various ways), and possibly other sections.
This feeds into a single reStructuredText file via includes.
Somewhere along the line, some javascript libraries get linked into the page.
The reStructuredText file gets converted to, for example, HTML and PDF, using pandoc.
All of this gets glued together by tup if I can get it working, and Ninja if I can't get tup working.
(I'm hopeful that tup works well, but until I've got more experience with it, I've got to allow for the possibility that there's some dealbreaker.
Like how right now, marimo's HTML export puts all of the stuff specific to a given notebook into a single line of messed-up-looking text.
Like, it renders mostly fine-ish, but it lacks the features I'd like.)&lt;/p&gt;
&lt;p&gt;Anyway, that's planning done, now I just want to relax for a bit before getting to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="conlanging"></category><category term="Cosmopolitan (conlang)"></category></entry><entry><title>Conlanging 2024-05-09</title><link href="https://mwchase.neocities.org/conlanging-2024-05-09" rel="alternate"></link><published>2024-05-09T04:00:00-04:00</published><updated>2024-05-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-05-09:/conlanging-2024-05-09</id><summary type="html">&lt;p class="first last"&gt;Complaining-based planning. It never fails, and if it does, I'll just complain about it more.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's see if I can figure out what I &amp;quot;should&amp;quot; be working on here.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I want to design an Old-Norse-analogue&lt;/li&gt;
&lt;li&gt;Which is going to be descended from a Proto-Indo-European-analogue&lt;/li&gt;
&lt;li&gt;Which could plausibly have other descendants, if I go that direction&lt;/li&gt;
&lt;li&gt;I'm handling the combination of &amp;quot;common elements and specific elements&amp;quot; by creating a single source repository, and cloning from it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With all of that in mind, it seems to me that I could get sensible behavior by creating a generic &amp;quot;descendant of this protolanguage&amp;quot; repository, and then cloning a repository for Cosmopolitan from that.
That deals with some concerns I had.
Next up...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The source lexicon will be generally stable, and each root in it will be transformed by a set of rules that is consistent within a single repository&lt;/li&gt;
&lt;li&gt;It seems to me that I should like to verify the form of a root at specific checkpoints, and handle stuff like sometimes synthesizing roots together somehow; somehow&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That isn't resolving out as obviously as the previous list.
Let's let that sit, and consider the issues I'm dealing with currently:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;It's really obnoxious to construct phoneme tables in HTML&lt;/li&gt;
&lt;li&gt;I'm not sure what's a good way to handle sound changes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I've got some ideas partially sketched out for the first one, so let's focus on the second one (assuming that the whole intermediate descendant repo idea works out).
There are command-line tools for applying changes, and Python code for applying changes.
I know I've got &lt;em&gt;some kind&lt;/em&gt; of attempt lying around...&lt;/p&gt;
&lt;p&gt;Oof, that code sure is code.&lt;/p&gt;
&lt;p&gt;At this point, I should see how shelling out to Lexurgy works.
Just stop thinking about trying to find, update, or port code.
See how it all works, and then only mess around with other stuff if there's some kind of specific problem I can't see how to address.&lt;/p&gt;
&lt;p&gt;It's late, so I'll see how this comes together in a few days.
For now, I really need to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category><category term="Cosmopolitan (conlang)"></category></entry><entry><title>Conlanging 2024-05-08</title><link href="https://mwchase.neocities.org/conlanging-2024-05-08" rel="alternate"></link><published>2024-05-08T04:00:00-04:00</published><updated>2024-05-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-05-08:/conlanging-2024-05-08</id><summary type="html">&lt;p class="first last"&gt;Putting together an intention to devise a plan to write up some goals.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I just remembered I have this category, and I have no recollection of what I was doing in it last time, whoops.&lt;/p&gt;
&lt;p&gt;Anyway, as I was saying before, I'm really unhappy with the names I've come up with for the fantasy species in my fantasy setting, so I decided to devise a naming language so they can have names that sound related to each other, distinct from existing concepts, but aesthetically grounded in the general vein of mythology they're drawn from.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Okay...&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;That mythology is, more or less, Norse mythology, so clearly the naming language should sound like Old Norse.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Okay...&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;And some major aesthetic features of Germanic languages derive from ablaut, so clearly, the naming language needs a proto-language inspired by Proto-Indo-European.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;I'm calling the police.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;(By the way, I'm calling it Cosmopolitan because I figure it might as well be the &lt;em&gt;lingua franca&lt;/em&gt; of the setting, and I wanted a name that was different from &amp;quot;Common&amp;quot;.
This can be rationalized as &amp;quot;people didn't like the language's word for itself, so they used a descriptive adjective&amp;quot;.)&lt;/p&gt;
&lt;p&gt;Anyway, on the one hand, this is kind of an extreme idea, but on the other hand, I don't want to compromise on this.&lt;/p&gt;
&lt;p&gt;Anyway, I'm not sure what's the best way to get started on this...
I can just put together some independent documents or whatever, but I want a chain of derivations that generally hold, and I'm not sure how to validate that between lexicons.
I should see if PolyGlot can handle this, but unfortunately, I was taking things easy before, and I don't have time to look into it now.
In fact, I shouldn't be still writing this entry...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category><category term="Cosmopolitan (conlang)"></category></entry><entry><title>Weekly Roundup 2024-05-07</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-05-07" rel="alternate"></link><published>2024-05-07T04:00:00-04:00</published><updated>2024-05-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-05-07:/weekly-roundup-2024-05-07</id><summary type="html">&lt;p class="first last"&gt;My project management style is a flat circle.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: Out of it.&lt;/li&gt;
&lt;li&gt;Thursday: I came up with an Extremely Sound And Valid reasoning for developing a naming language for the Fabula Ultima stuff.&lt;/li&gt;
&lt;li&gt;Friday: Out of it.&lt;/li&gt;
&lt;li&gt;Saturday: Out of it again, but I did realize I need to slightly change the approach I was taking to the Fabula Ultima stuff.&lt;/li&gt;
&lt;li&gt;Sunday: I did the things that are needed to course correct there.&lt;/li&gt;
&lt;li&gt;Monday: I recapped why I think I need a naming language, and did some research for inspiration.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to shore up my homegrown conlanging code, because it is currently &lt;em&gt;dire&lt;/em&gt;.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="writing"></category><category term="worldbuilding"></category></entry><entry><title>Diary 2024-05-06</title><link href="https://mwchase.neocities.org/diary-2024-05-06" rel="alternate"></link><published>2024-05-06T04:00:00-04:00</published><updated>2024-05-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-05-06:/diary-2024-05-06</id><summary type="html">&lt;p class="first last"&gt;I think I should consider taking a vacation just to work on this stuff. I have a few things I'd like to take care of, first.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, things went late today, but I have done some research for the naming language that I want to use for the Fabula Ultima setting.
(This kind of thing &lt;em&gt;probably&lt;/em&gt; wouldn't work in a normal game, but I'm going to try to play solo, which... may end up involving a prohibitive amount of bookkeeping.
We'll see.)&lt;/p&gt;
&lt;p&gt;Basically, I'm trying to get inspiration from Old Norse, to match up with the &lt;em&gt;Dungeons and Dragons&lt;/em&gt; Standard Fantasy Races that make up &lt;em&gt;part&lt;/em&gt; of the setting.
I didn't really like my attempts to draw stuff directly from Old Norse, so instead I've just been researching the aesthetics, and I think I've gotten to the point where I understand things well enough to move on to my satisfaction.
(This could have been a more detailed understanding, if the explanations I'd found about phonotactics had been a bit longer.)&lt;/p&gt;
&lt;p&gt;Basically, I should have enough information on hand to put together a basic phonology, phonotactics, and structure for basic parts of speech, so then I can start playing around and coming up with word roots.&lt;/p&gt;
&lt;p&gt;Anyway, I should have been in bed ten minutes ago, oops.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="writing"></category><category term="worldbuilding"></category></entry><entry><title>Diary 2024-05-05</title><link href="https://mwchase.neocities.org/diary-2024-05-05" rel="alternate"></link><published>2024-05-05T04:00:00-04:00</published><updated>2024-05-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-05-05:/diary-2024-05-05</id><summary type="html">&lt;p class="first last"&gt;I feel like I'm having trouble getting momentum on this because I haven't been relaxing enough, but this is what I'm trying to do to relax...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, that wasn't too interesting.
Basically, I'm starting over from the &lt;em&gt;actual beginning&lt;/em&gt; of the &amp;quot;Press Start&amp;quot; chapter in Fabula Ultima, which before I had somewhat skipped over.
I figure it's a good idea to have down in writing stuff like &amp;quot;what I hope to accomplish&amp;quot;.
At this point, there are some bits I can try and go over again, but I think I'm ready to give the &amp;quot;World Creation&amp;quot; section another shot.&lt;/p&gt;
&lt;p&gt;I may try to make a simple naming language or something first, but at least I covered the very first of the session zero things this time.&lt;/p&gt;
&lt;p&gt;Anyway, it's late, so I'm going to wrap up for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="writing"></category><category term="I guess"></category></entry><entry><title>Diary 2024-05-04</title><link href="https://mwchase.neocities.org/diary-2024-05-04" rel="alternate"></link><published>2024-05-04T04:00:00-04:00</published><updated>2024-05-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-05-04:/diary-2024-05-04</id><summary type="html">&lt;p class="first last"&gt;I'm going to try and make tomorrow more interesting. Today... is not.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Ugh.
I ended up mostly zoned out today.
When I got some last-minute focus, I decided to spend it on stuff like getting my Bandcamp wishlist cleared out.&lt;/p&gt;
&lt;p&gt;I just realized that I did some somewhat major things &amp;quot;wrong&amp;quot; with the worldbuilding project I've been messing with, so I'm going to try to put together a fresh start.
Not going to worry about that right now, just try and start over tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-05-03</title><link href="https://mwchase.neocities.org/diary-2024-05-03" rel="alternate"></link><published>2024-05-03T04:00:00-04:00</published><updated>2024-05-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-05-03:/diary-2024-05-03</id><summary type="html">&lt;p class="first last"&gt;Safe to skip. In fact, please do.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I was kind of out of it today, so again, not much to say.
I'll try to get things a little bit more together tomorrow, but no promises.
It's late now, so I'm going to wrap things up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-05-02</title><link href="https://mwchase.neocities.org/diary-2024-05-02" rel="alternate"></link><published>2024-05-02T04:00:00-04:00</published><updated>2024-05-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-05-02:/diary-2024-05-02</id><summary type="html">&lt;p class="first last"&gt;Suddenly, my lack of knowledge of Old Norse is a pressing concern.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, it was another light day, but I'm making some initial attempts to address one or two of the issues I've noticed with the Fabula Ultima worldbuilding stuff.
See, I've got a bunch of &amp;quot;generic Dungeons and Dragons&amp;quot; tier sapient species, and some somewhat out-there ones I made up.
The &amp;quot;generic&amp;quot; species have horrible puns embedded in their worldbuilding, and I don't get all of them, and don't want to get rid of the worldbuilding side of the pun of the ones I &lt;em&gt;do&lt;/em&gt; get.
Concerning the ones I've come up with, there aren't any puns, and the names don't fit the aesthetic of the others.
Given all of this, I see two options:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Come up with thematically fitting names for the new species, and make sure they lead to puns.&lt;/li&gt;
&lt;li&gt;Pick a new aesthetic target for the names, thereby obscuring the puns, and making the new names more coherent with the old names.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm trying to do the latter, and it's... not looking &lt;em&gt;horrible&lt;/em&gt;, but I'm not quite gelling with it.
I'm going to need to think about this for a few days, or something.&lt;/p&gt;
&lt;p&gt;Anyway, I let things go late again, so I'm going to cut this here and get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="writing"></category><category term="worldbuilding"></category><category term="short post"></category></entry><entry><title>Diary 2024-05-01</title><link href="https://mwchase.neocities.org/diary-2024-05-01" rel="alternate"></link><published>2024-05-01T04:00:00-04:00</published><updated>2024-05-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-05-01:/diary-2024-05-01</id><summary type="html">&lt;p class="first last"&gt;Very safe to skip.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I had a busy-ish day at work today, so I ended up mostly just zoning out when I got home.
Nothing to really talk about as a result.
I'm not going to force things.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2024-04-30</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-04-30" rel="alternate"></link><published>2024-04-30T04:00:00-04:00</published><updated>2024-04-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-04-30:/weekly-roundup-2024-04-30</id><summary type="html">&lt;p class="first last"&gt;Gradually stumbling towards doing things in a sort of sensible manner.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I described four projects, and sort of implied I was going to alternate between them. That, um, didn't happen.&lt;/li&gt;
&lt;li&gt;Thursday: I tried to figure out how lunar orbital resonances do or do not relate to eclipse timing.&lt;/li&gt;
&lt;li&gt;Friday: I ran the numbers, and they didn't work.&lt;/li&gt;
&lt;li&gt;Saturday: I ran the numbers again, and they didn't work, but in a different way. In light of that, I decided to shift focus to more relevant aspects of the worldbuilding. First attempt didn't go great.&lt;/li&gt;
&lt;li&gt;Sunday: Not much luck yet.&lt;/li&gt;
&lt;li&gt;Monday: I went from not enough ideas to possibly too many. Then I decided to focus on research, and found out that ancient Rome had tower block apartments, so, like, how the heck do old-timey aesthetics even &lt;em&gt;work&lt;/em&gt;?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to do a proper job continuing with this stuff, but we'll see how it goes.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="writing"></category><category term="worldbuilding"></category></entry><entry><title>Diary 2024-04-29</title><link href="https://mwchase.neocities.org/diary-2024-04-29" rel="alternate"></link><published>2024-04-29T04:00:00-04:00</published><updated>2024-04-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-04-29:/diary-2024-04-29</id><summary type="html">&lt;p class="first last"&gt;You can tell which ones I came up with myself, because the names have problems.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Sapient species status: I may have too many now.
Oops.
I've got plenty more details to finish filling in there, but I've decided to try to shift focus to a few other areas.
However...&lt;/p&gt;
&lt;p&gt;It turns out that figuring out how to align the description of a world with &amp;quot;high-fantasy aesthetics&amp;quot; gets tricky when you decide to research things, and discover that, for example, the desire to shove as many poor renters as possible into tower-block housing predates modern construction techniques that make that &amp;quot;not a terrible idea&amp;quot; by... quite some time.
So, like, there needs to be a solid reason in my mind why that wouldn't happen, or the extremely visible high-rise buildings need to somehow maintain aesthetic cohesion with the rest of the high-fantasy cities they'd be in.&lt;/p&gt;
&lt;p&gt;Anyway, I don't have a quick answer to how to handle that right now, so I'm just going to think on it a bit.
I want to wind down properly now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="writing"></category><category term="worldbuilding"></category><category term="short post"></category></entry><entry><title>Diary 2024-04-28</title><link href="https://mwchase.neocities.org/diary-2024-04-28" rel="alternate"></link><published>2024-04-28T04:00:00-04:00</published><updated>2024-04-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-04-28:/diary-2024-04-28</id><summary type="html">&lt;p class="first last"&gt;Not sure where to look for inspiration on this.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Not much luck yet in figuring out how I want different sapient species to work in this setting.
Like, because of Reasons, I don't want there to be divine creation events, so I guess this setting (which isn't Earth: the moons are all wrong) has a long-term prehistory, in which humans evolved?
In which case, are other sapient species a case of nearby offshoots or convergent evolution, or did weird stuff happen in the sprawling backstory?&lt;/p&gt;
&lt;p&gt;(One thing that might tip the balance is the idea of the Ancient Evil getting resurrected, looking at one of the main characters, and going &amp;quot;Wait, what &lt;em&gt;are&lt;/em&gt; you?&amp;quot;)&lt;/p&gt;
&lt;p&gt;I've also been trying to figure out how to tune the available magic and technology to get the setting aesthetics right, but I'd kind of like to know what kind of people are existing in this setting.&lt;/p&gt;
&lt;p&gt;Anyway, I let things go late tonight because I was... doing... something?
So I'll just get to bed now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="writing"></category><category term="worldbuilding"></category><category term="short post"></category></entry><entry><title>Diary 2024-04-27</title><link href="https://mwchase.neocities.org/diary-2024-04-27" rel="alternate"></link><published>2024-04-27T04:00:00-04:00</published><updated>2024-04-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-04-27:/diary-2024-04-27</id><summary type="html">&lt;p class="first last"&gt;On to important things.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I have finally worked through my desire to have the draconic months in my constructed world be &amp;quot;rigorously based on something&amp;quot; by the fact that I've found two different formulas, which give wildly different results for the actual Moon, neither of which match the actual value.&lt;/p&gt;
&lt;p&gt;Therefore, nobody can prove that my numbers are wrong.&lt;/p&gt;
&lt;p&gt;Anyway, with that off my chest, I can focus on the populations and history of the world.
I've got some ideas here, though some of them, I think part of me is just being contrary.
Like, I'm coming up with this for Fabula Ultima, which is a tabletop role-playing game, with definite ideas about character advancement and abilities and such.
Some of the ideas I'm pondering ripping off from other people are almost certainly incompatible with the specifics.
I've got to come up with character backgrounds that are somewhat closer to how humans &lt;em&gt;interact&lt;/em&gt; with the world, if not necessarily close in terms of cognition.&lt;/p&gt;
&lt;p&gt;I'll just keep that in mind for now.
And get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="writing"></category><category term="worldbuilding"></category></entry><entry><title>Diary 2024-04-26</title><link href="https://mwchase.neocities.org/diary-2024-04-26" rel="alternate"></link><published>2024-04-26T04:00:00-04:00</published><updated>2024-04-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-04-26:/diary-2024-04-26</id><summary type="html">&lt;p class="first last"&gt;Going to have to make someone check my work...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, so, once I have the nodal precession rate of the moons calculated, I'll focus on stuff that's more pertinent to the story.
But.&lt;/p&gt;
&lt;p&gt;But.&lt;/p&gt;
&lt;p&gt;But the numbers I'm getting aren't making any sense!
Let's see if I can isolate the issue...&lt;/p&gt;
&lt;p&gt;Before anything else, I have to check whether the numbers for the moon make sense to me.
I keep on re-checking with the numbers for the Earth and the Moon, and the results keep on being off by four orders of magnitude.
I'll try to work this out later, and focus on other stuff for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="writing"></category><category term="worldbuilding"></category><category term="short post"></category></entry><entry><title>Diary 2024-04-25</title><link href="https://mwchase.neocities.org/diary-2024-04-25" rel="alternate"></link><published>2024-04-25T04:00:00-04:00</published><updated>2024-04-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-04-25:/diary-2024-04-25</id><summary type="html">&lt;p class="first last"&gt;Working on some weird side detail instead of the key areas? That's so unlike me, right?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today: RPG setting.
Not named yet, so no tag.&lt;/p&gt;
&lt;p&gt;I'm procrastinating on the thematically important worldbuilding (What factions are there? What is the history of their conflict?) by trying to eke out just a little bit more rigor regarding the orbital dynamics of the moons.&lt;/p&gt;
&lt;p&gt;I guess I should make the inciting incident to the story somehow revolve around a solar eclipse or something, or this is all going to feel &lt;em&gt;pointless&lt;/em&gt;.
(I mean, I can move the calendar and landmasses around however, so, um... look over there!)&lt;/p&gt;
&lt;p&gt;I've got nothing else for tonight.
Hopefully I get this out of my system tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="writing"></category><category term="worldbuilding"></category><category term="short post"></category></entry><entry><title>Diary 2024-04-24</title><link href="https://mwchase.neocities.org/diary-2024-04-24" rel="alternate"></link><published>2024-04-24T04:00:00-04:00</published><updated>2024-04-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-04-24:/diary-2024-04-24</id><summary type="html">&lt;p class="first last"&gt;Remember how I used to post about a different thing every day of the week? Yeah.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, let's see what I have to say...&lt;/p&gt;
&lt;p&gt;I've got a variety of &lt;em&gt;attempts&lt;/em&gt; at worldbuilding under my belt, some of which I'm kind of torn between &amp;quot;I'd like to revisit this&amp;quot; and &amp;quot;I have Problems with the stuff I decided to position as Definitely Canon&amp;quot;.&lt;/p&gt;
&lt;p&gt;But aside from those, I've managed to accumulate four ideas that I've decided to try to develop in parallel, using a justification that kind of sounds like crop rotation for thoughts, if you squint:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The backstory of a novel; this mostly focuses on transposing historical trends and ideas into a fantastical setting, for the purpose of really straightforward commentary&lt;/li&gt;
&lt;li&gt;A series of &lt;em&gt;extremely&lt;/em&gt; short stories in a setting that I'm deliberately leaving vague outside of what I can extrapolate from the text of the stories&lt;/li&gt;
&lt;li&gt;A speculative evolution project based on fantastical principles&lt;/li&gt;
&lt;li&gt;&amp;quot;This tabletop RPG has guidance for worldbuilding the setting, and I'm just going to read it, I'm not going to—okay, let's go&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The basic idea is that each of these &lt;em&gt;hopefully&lt;/em&gt; scratch a different kind of itch.
We'll see how that works out...
For now, I &lt;em&gt;really&lt;/em&gt; need to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="writing"></category><category term="worldbuilding"></category></entry><entry><title>Weekly Roundup 2024-04-23</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-04-23" rel="alternate"></link><published>2024-04-23T04:00:00-04:00</published><updated>2024-04-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-04-23:/weekly-roundup-2024-04-23</id><summary type="html">&lt;p class="first last"&gt;That was a weird little diversion.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: &amp;quot;Boy, it sure would be nice to have a free offline kanban app&amp;quot;&lt;/li&gt;
&lt;li&gt;Thursday: &amp;quot;How about using Flet?&amp;quot;&lt;/li&gt;
&lt;li&gt;Friday: &amp;quot;People care about version pinning via lockfiles, but it turns out that for this project, I can afford not to.&amp;quot;&lt;/li&gt;
&lt;li&gt;Saturday: &amp;quot;I'm understanding Automerge slightly better than I was before...&amp;quot;&lt;/li&gt;
&lt;li&gt;Sunday: &amp;quot;Understanding it still better...&amp;quot;&lt;/li&gt;
&lt;li&gt;Monday: &amp;quot;Ah, I caught up to stuff that Automerge's developers knew months/years ago; it's not ready for what I want to do with it here.&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, maybe I'll write up what else I was working on last week, maybe I'll focus on something else.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category></entry><entry><title>Coding 2024-04-22</title><link href="https://mwchase.neocities.org/coding-2024-04-22" rel="alternate"></link><published>2024-04-22T04:00:00-04:00</published><updated>2024-04-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-04-22:/coding-2024-04-22</id><summary type="html">&lt;p class="first last"&gt;Know when to fold them.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The backend prototype is about done, and thinking about it, I am fairly confident that the design is not sound.
If I'm reading the Automerge documentation correctly, &amp;quot;removing an value from an object&amp;quot; and &amp;quot;putting that value in another object&amp;quot; would be considered as distinct actions for the purpose of reconciling divergent edit histories.&lt;/p&gt;
&lt;p&gt;So, &lt;em&gt;if I'm understanding this right&lt;/em&gt;, then &lt;em&gt;the way I implemented the prototype&lt;/em&gt; allows for a situation where &amp;quot;a card is moved from position A to position B&amp;quot; and &amp;quot;a card is moved from position A to position C&amp;quot;, merges as &amp;quot;the card is simultaneously present at position B and position C&amp;quot;.&lt;/p&gt;
&lt;p&gt;I should actually test this, but I'm not sure how the current implementation &lt;em&gt;could&lt;/em&gt; do what I want.
I'm trying to figure out what &amp;quot;what I want&amp;quot; would look like.
Somehow representing a rotation of a sub-list as an atomic operation...
I'll let that idea percolate, but unless I come up with something, it's probably not worth building this on top of Automerge.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Having done some research, another option is that I could simply &lt;em&gt;wait&lt;/em&gt;, since the problem I hit is not something super-novel or surprising, and Automerge's maintainers are already working on a solution.&lt;/p&gt;
&lt;p&gt;Once that's in place, there are a few other things I'm still not sure how best to handle, but they &lt;em&gt;seem&lt;/em&gt; like smaller problems, and if I'm wrong, people are probably working on them.&lt;/p&gt;
&lt;p&gt;Let's see about putting this down for now, and picking up something else.
I've actually been working on something else for the past week, but it's been even more of a pain.
More on that later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category></entry><entry><title>Coding 2024-04-21</title><link href="https://mwchase.neocities.org/coding-2024-04-21" rel="alternate"></link><published>2024-04-21T04:00:00-04:00</published><updated>2024-04-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-04-21:/coding-2024-04-21</id><summary type="html">&lt;p class="first last"&gt;Frantic prototyping.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I spent a lot of today messing around with Automerge and figuring out whether I've been doing things wrong.&lt;/p&gt;
&lt;p&gt;I've implemented a bunch of functionality on the backend, but I'm still missing some key bits.
At this point, it's possible to create and delete all of the relevant elements, and do most of the actions related to rearranging them.
What's missing is the ability to update the various text fields that are in there.&lt;/p&gt;
&lt;p&gt;I haven't tested any of this code, so it's probably going to do something &lt;em&gt;hilarious&lt;/em&gt; the first time I try to put it all together.&lt;/p&gt;
&lt;p&gt;It's late enough that I shouldn't try to do anything else, so, time for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category></entry><entry><title>Coding 2024-04-20</title><link href="https://mwchase.neocities.org/coding-2024-04-20" rel="alternate"></link><published>2024-04-20T04:00:00-04:00</published><updated>2024-04-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-04-20:/coding-2024-04-20</id><summary type="html">&lt;p class="first last"&gt;I got very little code written, but I think I learned a lot.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I have attempted some prototyping.
I now have a slightly better idea of how I want to be using the CRDT library I'm using, Automerge.
For the specific idea I have in mind here of &amp;quot;here are cards, and they can be moved around&amp;quot;, I think I need to be focusing a lot on arenas.
This is because I don't see a way to move &lt;em&gt;an object&lt;/em&gt; around in Automerge, so I think whatever gets moved around has to be a scalar identifier.&lt;/p&gt;
&lt;p&gt;I'm not totally certain about how I want to be representing the objects in these arenas.
Like I probably want to be using the arena index as much as possible and only resolving it to an object id at the latest possible moment, but right now that's just a gut feeling, and I think to get any closer to understanding the situation, I need to take the pile of API methods I've noted that I'll need, and consider the signatures I want for them, which may be constrained in some manner by implementation details.&lt;/p&gt;
&lt;p&gt;We'll see what I can manage tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category></entry><entry><title>Coding 2024-04-19</title><link href="https://mwchase.neocities.org/coding-2024-04-19" rel="alternate"></link><published>2024-04-19T04:00:00-04:00</published><updated>2024-04-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-04-19:/coding-2024-04-19</id><summary type="html">&lt;p class="first last"&gt;Probably going to miff a bunch of people with some of &lt;em&gt;these&lt;/em&gt; opinions...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Current &amp;quot;pretend I'm working on the kanban app but I'm actually not&amp;quot; status:&lt;/p&gt;
&lt;p&gt;&amp;quot;Hmm, since this is an application, it sure would make sense to have some kind of lockfile.
I wonder if any of the choices for that right now don't somehow bother me.&amp;quot;&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Oof, big &amp;quot;everyone complains about / nobody uses&amp;quot; energy in the current state of things.
mousebender sounds nice and targeted in its focus, but it appears to be early days yet.
Aside from that, we've got:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Poetry&lt;/li&gt;
&lt;li&gt;PDM&lt;/li&gt;
&lt;li&gt;uv&lt;/li&gt;
&lt;li&gt;pip-tools&lt;/li&gt;
&lt;li&gt;Pipenv&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Doing a bit of research, I think I've found stuff to be unhappy about with all of them, so let's take a closer look at Flet's build process for Android and see if I can find a pragmatic choice for this particular scenario.&lt;/p&gt;
&lt;p&gt;Okay, so, I don't know what anyone more knowledgeable about the relevant parts of the Python ecosystem would think of the statement &amp;quot;&lt;tt class="docutils literal"&gt;p4a&lt;/tt&gt; is kind of like &lt;tt class="docutils literal"&gt;nuitka&lt;/tt&gt;&amp;quot;, but I'm just going to breeze past that so I have some kind of baseline idea of how this all works.
Flet requires the patch version of &lt;tt class="docutils literal"&gt;p4a&lt;/tt&gt; to be pinned lower than the current CPython release, which is a little spicy...
However, as far as guaranteeing functionality, I should be &amp;quot;okay&amp;quot; if I match the minor version in my development environment.
I'm not seeing a way to directly specify version constraints as part of &lt;tt class="docutils literal"&gt;p4a create &lt;span class="pre"&gt;--requirements&lt;/span&gt;&lt;/tt&gt;; the documentation only mentions names.
It is possible to specify pins through the setuptools integration, but this just seems &lt;em&gt;cursed&lt;/em&gt;...&lt;/p&gt;
&lt;p&gt;Wait, hold on, do I need to be packaging &lt;em&gt;all&lt;/em&gt; dependencies, or just compiled ones?
The Flet documentation makes it sound like any packages that &lt;em&gt;don't&lt;/em&gt; need a recipe can be installed automatically during the &lt;tt class="docutils literal"&gt;flet build&lt;/tt&gt; step, I think?&lt;/p&gt;
&lt;p&gt;However, there's an additional wrinkle: the CRDT library I want to try to use here is off in pre-release land right now, so pinning its version or somehow telling &lt;tt class="docutils literal"&gt;p4a&lt;/tt&gt; to take development versions is &lt;em&gt;necessary&lt;/em&gt; in order to make it... work.&lt;/p&gt;
&lt;p&gt;Remembering how I got &lt;em&gt;started&lt;/em&gt; on all of this, it is... helpful... to realize that I don't have any other non-Flet dependencies, so locking is kind of irrelevant.&lt;/p&gt;
&lt;p&gt;Ultimately, it makes better sense right now, I think, to make sure I can get all of this functionality working at all, on the desktop, and shelve the whole &amp;quot;get it nicely on my phone&amp;quot; idea for now.
(Unless I can turn it into a static site that's installable as a PWA, in which case, that's great.
Seems a little improbable, though.)&lt;/p&gt;
&lt;p&gt;So, I guess the right course of action right now is to...
Start actually prototyping stuff, and try to get a feel for these libraries.&lt;/p&gt;
&lt;p&gt;Okay, I'll get on that.
Tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category></entry><entry><title>Coding 2024-04-18</title><link href="https://mwchase.neocities.org/coding-2024-04-18" rel="alternate"></link><published>2024-04-18T04:00:00-04:00</published><updated>2024-04-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-04-18:/coding-2024-04-18</id><summary type="html">&lt;p class="first last"&gt;If anyone has a favored cross-platform UI framework for Python, please tell me about it on Cohost or Mastodon. I'm trying to get stuff done quickly, but I'm not confident I've made the best tech choices here.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hm.&lt;/p&gt;
&lt;p&gt;I got all set up in Flet, and after a bit of struggle, managed to preview my app on my phone, but as I look at and tinker with the preview, I'm skeptical that the app preview is telling me what I really want to know.
Like, if using the wrong version of a package causes import errors to pop up on my &lt;em&gt;laptop&lt;/em&gt; instead of my &lt;em&gt;phone&lt;/em&gt;, then that doesn't tell me anything about whether the Python packages I want to use can be cleanly packaged into an apk, right?
I guess the point is to make sure that the UI isn't just totally unusable on my phone.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;And from the radical step of &lt;em&gt;reading the documentation&lt;/em&gt;, I see that compiled packages are a problem, they did anticipate it, there is a solution, it's not turnkey for what I have in mind, but it doesn't look like bashing together something for my own use is a fundamentally &lt;em&gt;unreasonable&lt;/em&gt; proposition.
I won't have this all ready for when I want it all ready, but it seems likely I can get something sort of workable soonish, at least as far as Flet goes.&lt;/p&gt;
&lt;p&gt;So, that's some brief investigation, and I think I want to get off my laptop for tonight, so I'll focus on paper prototyping or reading.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;I did things in the wrong order.
So, that's some good barebones prototyping done, and a bit of research on Flet.
The one thing I'm concerned about is the whole &amp;quot;Oh, we layered imperative on top of Flutter's declarative, so you don't need to worry your silly little head about defining the UI as a function of the state&amp;quot; thing.
Like, I look at that, and I've got the twin dæmons of Spite and Pragmatism shaking hands and smirking over the concept of writing a function to regenerate the UI from scratch every time the state of the underlying data changes.
Like, I'm going to have enough trouble getting the drag-and-drop behavior (which I kind of need) to propagate down to the data, I don't want to be manually optimizing the updates to the &lt;em&gt;representation&lt;/em&gt; of that data.&lt;/p&gt;
&lt;p&gt;Anyway, really should rest my eyes now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category></entry><entry><title>Coding 2024-04-17</title><link href="https://mwchase.neocities.org/coding-2024-04-17" rel="alternate"></link><published>2024-04-17T04:00:00-04:00</published><updated>2024-04-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-04-17:/coding-2024-04-17</id><summary type="html">&lt;p class="first last"&gt;Getting ready to toss stuff together over the weekend.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Over the weekend, I ended up wanting to make a simple application (which got somewhat less simple as I iterated on my requirements), and I investigated a few options.&lt;/p&gt;
&lt;p&gt;Filed a bug report as a result of this of which the following two things are true:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The report ended up being &lt;em&gt;pretty bad&lt;/em&gt;, and this is my fault&lt;/li&gt;
&lt;li&gt;I'm still not interested in using the project in question for now&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(Aside: I installed a bunch of shells on both my computers, and set up some &lt;em&gt;probably&lt;/em&gt; unnecessarily complicated Lua code to switch between them.
I haven't figured out how to get it to work with the terminal emulator on my laptop though...
This is only important because it's what I was doing most of the day, aside from my job.)&lt;/p&gt;
&lt;p&gt;Anyway, the project I was looking into this for is to have an app that does the following:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Kanban board&lt;/li&gt;
&lt;li&gt;Local files&lt;/li&gt;
&lt;li&gt;Where I can find them&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lots of kanban board apps are like &amp;quot;just spin up the server in Docker&amp;quot;, and... no.&lt;/p&gt;
&lt;p&gt;Here's how things look for the details I've thought about:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Must work on linux&lt;/li&gt;
&lt;li&gt;Bonus if it works on Android&lt;/li&gt;
&lt;li&gt;Needs some kind of save format that is better than pickle&lt;/li&gt;
&lt;li&gt;CRDTs would be nice because then I could try to handle merging changes from different devices&lt;/li&gt;
&lt;li&gt;Otherwise, human-readable&lt;/li&gt;
&lt;li&gt;Handle format versioning somehow&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The tradeoff with &amp;quot;hey, what if I use CRDTs&amp;quot; is, I'm not sure how the usability of current CRDT libraries is.
Also, that might interfere somehow with the whole &amp;quot;what if I could also use it on my phone?&amp;quot; thing.&lt;/p&gt;
&lt;p&gt;So, I think the thing to do is to put together a toy CRDT-based app and try and figure out how to run it in the simulator, or whatever.&lt;/p&gt;
&lt;p&gt;Anyway, I desperately need to get to bed soon.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category></entry><entry><title>Weekly Roundup 2024-04-16</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-04-16" rel="alternate"></link><published>2024-04-16T04:00:00-04:00</published><updated>2024-04-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-04-16:/weekly-roundup-2024-04-16</id><summary type="html">&lt;p class="first last"&gt;Some good progress, then having to take a break.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I made enough progress on MOTR that I decided it was time for another break.&lt;/li&gt;
&lt;li&gt;Thursday: I picked up another project: making small improvements to someone else's code.&lt;/li&gt;
&lt;li&gt;Friday: That all worked out well enough.&lt;/li&gt;
&lt;li&gt;Saturday: Nothing much.&lt;/li&gt;
&lt;li&gt;Sunday: Nothing much.&lt;/li&gt;
&lt;li&gt;Monday: Nothing much.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I've got some other projects I want to look into.
We'll see how things go.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category></entry><entry><title>Diary 2024-04-15</title><link href="https://mwchase.neocities.org/diary-2024-04-15" rel="alternate"></link><published>2024-04-15T04:00:00-04:00</published><updated>2024-04-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-04-15:/diary-2024-04-15</id><summary type="html">&lt;p class="first last"&gt;Rough night, nothing interesting.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;We're back.
It's late.
I'm tired.&lt;/p&gt;
&lt;p&gt;I can't work my way up to trying to write anything, so that's that.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-04-14</title><link href="https://mwchase.neocities.org/diary-2024-04-14" rel="alternate"></link><published>2024-04-14T04:00:00-04:00</published><updated>2024-04-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-04-14:/diary-2024-04-14</id><summary type="html">&lt;p class="first last"&gt;Nothing to see here.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;On the road.
Gaming.&lt;/p&gt;
&lt;p&gt;My energy was directed at a bunch of stuff today, none of which &lt;em&gt;really&lt;/em&gt; makes sense to me to write about, so, eh.&lt;/p&gt;
&lt;p&gt;I'm going to wind down now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-04-13</title><link href="https://mwchase.neocities.org/diary-2024-04-13" rel="alternate"></link><published>2024-04-13T04:00:00-04:00</published><updated>2024-04-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-04-13:/diary-2024-04-13</id><summary type="html">&lt;p class="first last"&gt;Trying to take things easy, didn't really write anything.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's see.
I decided to take things easy today, and I should for the next few days as well.&lt;/p&gt;
&lt;p&gt;I don't have anything in mind to talk about right now.
Let's sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2024-04-12</title><link href="https://mwchase.neocities.org/coding-2024-04-12" rel="alternate"></link><published>2024-04-12T04:00:00-04:00</published><updated>2024-04-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-04-12:/coding-2024-04-12</id><summary type="html">&lt;p class="first last"&gt;It looks like a really good place to invest effort in a project is in restricting the scope of it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hm.
It turns out that updating a Python project to current standards is pretty easy, &lt;em&gt;if&lt;/em&gt; there isn't anything too exciting going on in the &lt;tt class="docutils literal"&gt;setup.py&lt;/tt&gt; file.
And the actual problems that were the whole motivation were pretty simple to fix.&lt;/p&gt;
&lt;p&gt;At this point, the bulk of the work is going to be discussing the changes I made.
I'm super not up for that right now.
I just want to lie down indefinitely, which unfortunately does not gel with my plans for tomorrow or the weekend.
Anyway, I'd better get what rest I can manage.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="short post"></category></entry><entry><title>Coding 2024-04-11</title><link href="https://mwchase.neocities.org/coding-2024-04-11" rel="alternate"></link><published>2024-04-11T04:00:00-04:00</published><updated>2024-04-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-04-11:/coding-2024-04-11</id><summary type="html">&lt;p class="first last"&gt;The extremely weird contexts in which I must force myself to be reasonable.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got a little bit of writing done today, but the big thing I started working on right now is preparing to update someone else's project to work a bit better in a few ways.
Getting this right means putting aside my own preferences about how the project &amp;quot;should work&amp;quot;, and researching only the tools they're already using (except also refreshing my memory on tox, because I cannot in good conscience make anyone else use MOTR yet).
I think I've got enough notes taken to get to work later, but for now I should have gotten to bed like half an hour ago, so, um... bye.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="short post"></category></entry><entry><title>Coding 2024-04-10</title><link href="https://mwchase.neocities.org/coding-2024-04-10" rel="alternate"></link><published>2024-04-10T04:00:00-04:00</published><updated>2024-04-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-04-10:/coding-2024-04-10</id><summary type="html">&lt;p class="first last"&gt;Big changes on the horizon.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I've got some changes I made, and now I'm feeling better about some of the names in MOTR.&lt;/p&gt;
&lt;p&gt;At this point, it remains to be seen whether there are more changes to make.
I could keep on this, but I feel like it makes sense to take a break for a few days and come back to this totally fresh, instead of mostly fresh, if that makes any sense.&lt;/p&gt;
&lt;p&gt;It's interesting that making these updates only involved changing a single file; that means I should be able to make further updates later if I feel the need, even after release.&lt;/p&gt;
&lt;p&gt;My last thought on this for now: I still haven't decided if I want to go through with untangling &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt; from &lt;tt class="docutils literal"&gt;matrix&lt;/tt&gt;.
It's like, that seems like it would be nice, but I'm not sure how exactly to do it without making some really messed-up names.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;One possibility would be to simply widen the type, since the mapping type is, &lt;em&gt;I think&lt;/em&gt;, a strict subset of other mapping types defined without reference to &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt;.
I'll turn that idea over in my head for a bit.&lt;/p&gt;
&lt;p&gt;For now, I want to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Weekly Roundup 2024-04-09</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-04-09" rel="alternate"></link><published>2024-04-09T04:00:00-04:00</published><updated>2024-04-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-04-09:/weekly-roundup-2024-04-09</id><summary type="html">&lt;p class="first last"&gt;I'd like it if I were going faster here, but oh well.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I considered how I want to rearrange MOTR.&lt;/li&gt;
&lt;li&gt;Thursday: I made some weird prototypes, and then took a look at the more grab-bag-y parts of MOTR's code.&lt;/li&gt;
&lt;li&gt;Friday: I found some &lt;em&gt;specific&lt;/em&gt; weird bits of the code and started thinking about them.&lt;/li&gt;
&lt;li&gt;Saturday: I did what I was thinking about, and then discovered that MOTR's validation suite had stopped passing because various dependencies updated in the last three months.&lt;/li&gt;
&lt;li&gt;Sunday: I made the required updates, and then found another change that I wanted to make to the code.&lt;/li&gt;
&lt;li&gt;Monday: I made the change, and took another look at the most obviously bad names.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'll try to keep this up, and maybe do something else as well.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2024-04-08</title><link href="https://mwchase.neocities.org/coding-2024-04-08" rel="alternate"></link><published>2024-04-08T04:00:00-04:00</published><updated>2024-04-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-04-08:/coding-2024-04-08</id><summary type="html">&lt;p class="first last"&gt;Still working on articulating what this stuff does beyond &amp;quot;be important&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I made the changes I was thinking of earlier, to give &lt;tt class="docutils literal"&gt;PathStr&lt;/tt&gt; its own module, and move around some &lt;tt class="docutils literal"&gt;TypeVar&lt;/tt&gt; definitions.
That went well enough, though I did get caught off-guard by a few imports I couldn't remove, or move to where I was thinking of moving them.&lt;/p&gt;
&lt;p&gt;In any case, my focus moved back around to fixing up the names in &lt;tt class="docutils literal"&gt;parametric_command&lt;/tt&gt;.
I'm still trying to rename that one protocol; maybe if I try to explain what it's for, I'll get some sudden insight I can apply later.&lt;/p&gt;
&lt;p&gt;So, there's a class called &lt;tt class="docutils literal"&gt;ParametricCommand&lt;/tt&gt;.
It can either represent a set of arguments to a Python module invoked via &lt;tt class="docutils literal"&gt;python &lt;span class="pre"&gt;-m&lt;/span&gt;&lt;/tt&gt;, or arguments to an executable command.
This is a helpful distinction because some Python tools offer a way to run that is &amp;quot;like &lt;tt class="docutils literal"&gt;python &lt;span class="pre"&gt;-m&lt;/span&gt;&lt;/tt&gt; &lt;em&gt;but&lt;/em&gt;&amp;quot;.
One of its attributes is either one of those &amp;quot;pass arguments to &lt;tt class="docutils literal"&gt;python &lt;span class="pre"&gt;-m&lt;/span&gt;&lt;/tt&gt;&amp;quot; instances, or a private wrapper class around a &amp;quot;&lt;tt class="docutils literal"&gt;matrix.SelectionDirectory&lt;/tt&gt;&amp;quot;, which is sort of a juiced-up/stripped-down &lt;tt class="docutils literal"&gt;matrix.Matrix&lt;/tt&gt;.
In this case, it holds information about how to determine the path to the installer script for the virtual environment the command executes in.&lt;/p&gt;
&lt;p&gt;Ultimately, this attribute determines stuff about the virtual environment path, the path generated reports get sent to, and probably something else, but I'm not sure.&lt;/p&gt;
&lt;p&gt;Food for thought.
Time for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2024-04-07</title><link href="https://mwchase.neocities.org/coding-2024-04-07" rel="alternate"></link><published>2024-04-07T04:00:00-04:00</published><updated>2024-04-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-04-07:/coding-2024-04-07</id><summary type="html">&lt;p class="first last"&gt;Still not ready to try to pull stuff out of the wastebasket taxa that MOTR is full of.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I fixed stuff up in MOTR:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I changed the &lt;tt class="docutils literal"&gt;&amp;#64;pytest.fixture()&lt;/tt&gt; lines to &lt;tt class="docutils literal"&gt;&amp;#64;pytest.fixture&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;I switched the &lt;tt class="docutils literal"&gt;ExceptionGroup&lt;/tt&gt; checking to using the &lt;tt class="docutils literal"&gt;trio.testing&lt;/tt&gt; version for now, and got rid of the &lt;tt class="docutils literal"&gt;exceptiongroup&lt;/tt&gt; package altogether.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At this point, one thing I need to do is really consider whether I want to go through with the idea of decoupling &lt;tt class="docutils literal"&gt;matrix&lt;/tt&gt; from &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt; through parameterization.
This is a tough call to make right now, because the purpose of the &lt;tt class="docutils literal"&gt;input&lt;/tt&gt; field on the axes is purely as part of the API surface, so whatever I do with it has to make sense to someone working with a motrfile.
(Unless I somehow come up with yet another layer of API to lather onto this.)&lt;/p&gt;
&lt;p&gt;One possibility would be to write a helper function in the &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt; module...&lt;/p&gt;
&lt;p&gt;It may be best to simply try to note down all of the relevant relations, and just work out how they all interact.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Poking at the code, I think the next big improvement I can make is to have a dedicated module for the &lt;tt class="docutils literal"&gt;PathStr&lt;/tt&gt; alias.
The &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt; module also defines some type variables that really should get defined in different modules.&lt;/p&gt;
&lt;p&gt;Making those changes would do good things, I think.
I'll try and get to work on them tomorrow.
For now, I want to get to sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2024-04-06</title><link href="https://mwchase.neocities.org/coding-2024-04-06" rel="alternate"></link><published>2024-04-06T04:00:00-04:00</published><updated>2024-04-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-04-06:/coding-2024-04-06</id><summary type="html">&lt;p class="first last"&gt;Lots of dependencies updating recently-ish.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I thought really hard, and I came up with the course of action I want for &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;parametric_command&lt;/tt&gt; in MOTR, and I executed on it, and then &lt;em&gt;that&lt;/em&gt; worked, near as I can tell, but then the MOTR run failed for unrelated reasons, and around the same time, my laptop battery dipped ridiculously low.
So, I'm going to try to get this all working tomorrow.&lt;/p&gt;
&lt;p&gt;The course of action I chose was to inline the function body where it was used in &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt;, and make the top-level function a private staticmethod.
This all basically makes sense, but I don't want to think about it any more tonight.
I'm going to read a bit and get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2024-04-05</title><link href="https://mwchase.neocities.org/coding-2024-04-05" rel="alternate"></link><published>2024-04-05T04:00:00-04:00</published><updated>2024-04-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-04-05:/coding-2024-04-05</id><summary type="html">&lt;p class="first last"&gt;I must have had a &lt;em&gt;reason&lt;/em&gt; for doing some of these things the way I did. Right?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I continued to pick at the scab that is the knot of cyclic dependencies surrounding the &lt;tt class="docutils literal"&gt;matrix&lt;/tt&gt; module, and I noticed something that I'm not quite sure what to make of it.
Let me see if I can explain what's up...&lt;/p&gt;
&lt;p&gt;There are four modules that appear to matter here:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;invocation_environment&lt;/tt&gt;, which defines a class that bundles expressive command-line specifications with the installer metadata required to convert the specifications to a concrete form&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;matrix&lt;/tt&gt;, which defines a bunch of classes, which are responsible for handling axes of variation and instantiating every combination of the relevant axes&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;parametric_command&lt;/tt&gt;, which models command-line specifications at the highest level of abstraction currently used in the project&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt;, which handles the details of coordinating the prerequisites and outputs of command-line invocations&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;dependent_mapping&lt;/tt&gt;, which is used all over the higher levels of the codebase, but is particularly relevant for the implementation of the &lt;tt class="docutils literal"&gt;matrix&lt;/tt&gt; classes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Five modules.&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;invocation_environment&lt;/tt&gt; has a transitive dependency on &lt;tt class="docutils literal"&gt;dependent_mapping&lt;/tt&gt;, but doesn't otherwise use any of the other mentioned modules.
Both &lt;tt class="docutils literal"&gt;parametric_command&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt; have a runtime dependency on it.&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;matrix&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt; have a runtime dependency on &lt;tt class="docutils literal"&gt;dependent_mapping&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;The other major chain is that, at runtime, &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt; depends on both &lt;tt class="docutils literal"&gt;parametric_command&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;matrix&lt;/tt&gt;, and &lt;tt class="docutils literal"&gt;parametric_command&lt;/tt&gt; depends on &lt;tt class="docutils literal"&gt;matrix&lt;/tt&gt;, and there are additional &lt;em&gt;type-time&lt;/em&gt; dependencies, frpm &lt;tt class="docutils literal"&gt;parametric_command&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt;, and &lt;tt class="docutils literal"&gt;matrix&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;The two links that really have my attention right now, for different reasons, are the type-time dependency from &lt;tt class="docutils literal"&gt;matrix&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt;, and the runtime dependency from &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;parametric_command&lt;/tt&gt;.
This is because breaking the type-time dependency is desirable aesthetically, but I think the natural way to do so would introduce a &lt;em&gt;runtime&lt;/em&gt; dependency from &lt;tt class="docutils literal"&gt;parametric_command&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt;, which would be a cycle, unless I can break the existing runtime dependency, and thinking about this highlights the fact that the existing runtime dependency is... strange.
&lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt; just needs one top-level function from &lt;tt class="docutils literal"&gt;parametric_command&lt;/tt&gt;, and &lt;em&gt;surely&lt;/em&gt; this function is doing something that would make it hard to move, right?&lt;/p&gt;
&lt;p&gt;Right?&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Pause for emphasis.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Well, &lt;tt class="docutils literal"&gt;invocation_environment&lt;/tt&gt; (remember &lt;tt class="docutils literal"&gt;invocation_environment&lt;/tt&gt;?) is the only module needed to implement the function.
In fact, it's somehow worse than that makes it sound.
This function is basically a restricted version of a &lt;em&gt;classmethod&lt;/em&gt; from that module.&lt;/p&gt;
&lt;p&gt;So, like, should I be trying to break the dependency?
Thinking about it, I suppose it comes down to figuring out the semantics.
It's a tough hypothetical, because this code seems so... elemental... but I need to figure out which module needs to change if I decide that the behavior relied on by &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt; needs to change.
The options I see now are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Inline the classmethod call in &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;Move the function definition to &lt;tt class="docutils literal"&gt;invocation_environment&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;Move the function definition to &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt;, and reverse the direction of the runtime dependency&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I've just put these choices together and I haven't had time to consider them all yet.
Hopefully I'll figure something out later.
For now, I want to get to sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2024-04-04</title><link href="https://mwchase.neocities.org/coding-2024-04-04" rel="alternate"></link><published>2024-04-04T04:00:00-04:00</published><updated>2024-04-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-04-04:/coding-2024-04-04</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Max, is this a cry for help?&amp;quot; I... don't know?&lt;/p&gt;
</summary><content type="html">&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;I've got some bad news about this one, folks.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Aw, come on!&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Show them what you decided to work on.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;But—&lt;/p&gt;
&lt;div class="admonition smiley smiley-glitchy"&gt;
&lt;p class="first admonition-title"&gt;:) (glitchy)&lt;/p&gt;
&lt;p class="last"&gt;Show them!&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Fine...&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;__future__&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;annotations&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;abc&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;typing&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Combinable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;typing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Protocol&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Protocol for classes whose instances can be combined.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;

    &lt;span class="nd"&gt;@abc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;abstractmethod&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;__other&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Combine two instances of the same type.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__other&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TypeVar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;T&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bound&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Combinable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;I can't help but notice that you're proposing to replace a single lambda with two lines of code.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;It's &lt;em&gt;unaesthetic&lt;/em&gt;.
Besides, I haven't actually touched any code yet.
That up there is the prototype.
This whole exchange was a rhetorical framework to give me an excuse to write the code.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Touché.
Regardless, it is impressive and horrifying how much nonsense mypy appears to be prepared to accept from you.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Yeah!
It's all like &amp;quot;So, you specifically want a &lt;em&gt;union&lt;/em&gt; to be considered to implement a protocol?
Yeah sure I'll add that to my worldview.&amp;quot;&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;&lt;em&gt;The point is.&lt;/em&gt;
What actually needs effort put into it is &lt;em&gt;isolating&lt;/em&gt; modules like this so it's possible to find common themes in what remains.
Updating the code in any way seems quite beside the point at this juncture.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;All right, I'll try to follow that advice, and not solely because I just got tired of typing this post in two voices.&lt;/p&gt;
&lt;p&gt;Looking for modules without many dependencies.
Let's see...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt;: definitely not&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;box&lt;/tt&gt;: an odd case; it only relies on some modules that are in this list for sure, but its actual usage is pretty specific to the &lt;tt class="docutils literal"&gt;matrix&lt;/tt&gt; concept&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;combinable&lt;/tt&gt;: for sure&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;entry&lt;/tt&gt;: doesn't import anything, but I doubt anyone else would &lt;em&gt;want&lt;/em&gt; to rely on it, so what would the value be in breaking it out further?&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;environment&lt;/tt&gt;: somehow tangled up in &amp;quot;core&amp;quot; logic, so presumably no&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;executable&lt;/tt&gt;: I mean, it would be possible to make a fully generic version of the data type and then simply specialize it, but that's the kind of code someone writes to win a really unimportant argument&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;installer&lt;/tt&gt;: the key thing here is the reliance on &lt;tt class="docutils literal"&gt;matrix&lt;/tt&gt;; which sounds like it should be generally useful, but actually isn't&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;invocation_environment&lt;/tt&gt;: builds on a &lt;em&gt;bunch&lt;/em&gt; of &amp;quot;core&amp;quot; code, which presumably somehow explains how this file manages to feel &amp;quot;short&amp;quot; at 200+ lines&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;label&lt;/tt&gt;: I would happily publish this in a standalone package, and nobody would use it; you may not like it, but this is what peak performance looks like&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;matrix&lt;/tt&gt;: on close inspection and consideration, this code is actually really close to being some kind of standalone thing; actually pushing it the rest of the way would involve some extra type variables, which this module already has in abundance, and also the API surface is currently not remotely stable&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;not_output&lt;/tt&gt;: not worth thinking about&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;parametric_command&lt;/tt&gt;: confusing and unstable&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;path_with&lt;/tt&gt;: if I can get &lt;tt class="docutils literal"&gt;combinable&lt;/tt&gt; out, I'd love to have this follow; it relies on various bits of code that don't specifically pertain to MOTR&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;program&lt;/tt&gt;: meh&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;runner&lt;/tt&gt;: &lt;em&gt;heavy&lt;/em&gt; usage of &amp;quot;core&amp;quot; functionality&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;selection&lt;/tt&gt;: it can go where box goes; which is, for now, right where it is&lt;/li&gt;
&lt;li&gt;bonus modules: &lt;tt class="docutils literal"&gt;dependent_mapping&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;validators&lt;/tt&gt;, which just make sense to give their own packages&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All in all, this only gives us a few packages with license to ignore them:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;combinable&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;dependent_mapping&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;label&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;path_with&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;validators&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The really valuable ones to remove are &lt;tt class="docutils literal"&gt;dependent_mapping&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt;, because they slow down testing.&lt;/p&gt;
&lt;p&gt;As far as organizing things, I'd &lt;em&gt;like&lt;/em&gt; to pull out the &lt;tt class="docutils literal"&gt;matrix&lt;/tt&gt; ecosystem into its own submodule at least, but the circular dependency between &lt;tt class="docutils literal"&gt;matrix&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt;, as well as &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt;'s various &amp;quot;core&amp;quot; dependencies makes me not like that.
Perhaps if I could find a non-obnoxious way to break the dependency.&lt;/p&gt;
&lt;p&gt;Anyway, one thing that's getting hammered home from inspecting the usages of the various modules is that I really should move &lt;tt class="docutils literal"&gt;cmd.PathStr&lt;/tt&gt; into some kind of generally usable module, because many modules import &lt;tt class="docutils literal"&gt;cmd&lt;/tt&gt; &lt;em&gt;only&lt;/em&gt; for &lt;tt class="docutils literal"&gt;PathStr&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;I think, ultimately, I can only take typing up notes so far.
I'm going to have to print out a module listing and scribble on it.&lt;/p&gt;
&lt;p&gt;Not right now, though.
I think I taxed my eyes a bit writing this, so I'm going to get away from my laptop.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2024-04-03</title><link href="https://mwchase.neocities.org/coding-2024-04-03" rel="alternate"></link><published>2024-04-03T04:00:00-04:00</published><updated>2024-04-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-04-03:/coding-2024-04-03</id><summary type="html">&lt;p class="first last"&gt;Planning to plan.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm not really focusing on coding right now, but I want to do some planning, at least.&lt;/p&gt;
&lt;p&gt;In my review of the code recently, I re-confirmed that there are various modules with no dependencies on the rest of the code, so it should be workable to separate those out.
The &lt;em&gt;hope&lt;/em&gt; is that doing so will make it easier to determine common themes in what remains.&lt;/p&gt;
&lt;p&gt;Actually handling all of this will probably be a bit confusing, because the &lt;em&gt;ideal form&lt;/em&gt; of the code exists in a sort of hypothetical octopus merge of multiple development topics and some changes that I haven't made yet because I haven't figured out what they actually are, so that's going to be interesting to notate.&lt;/p&gt;
&lt;p&gt;Anyway, I've let this go long enough tonight.
Longer, even.
I should get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2024-04-02</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-04-02" rel="alternate"></link><published>2024-04-02T04:00:00-04:00</published><updated>2024-04-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-04-02:/weekly-roundup-2024-04-02</id><summary type="html">&lt;p class="first last"&gt;I can't really anticipate these changes in focus either, in case anyone was wondering.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I did some planning related to Tsetatsatal, and thought of some nice-to-haves for the interactive IPA stuff.&lt;/li&gt;
&lt;li&gt;Thursday: I cut down on screen time at the exact moment I would have been writing a blog post.&lt;/li&gt;
&lt;li&gt;Friday: An invisible timer somewhere deep in my psyche went off, and I started looking at MOTR again.&lt;/li&gt;
&lt;li&gt;Saturday: I came up with some weird code golf stuff for MOTR that would probably be a bad idea.&lt;/li&gt;
&lt;li&gt;Sunday: Video Games&lt;/li&gt;
&lt;li&gt;Monday: Books&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'll see if I still have the urge to work on MOTR.
Also, I might as well tinker on Tsetatsatal stuff.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="conlanging"></category><category term="MOTR"></category><category term="Python"></category></entry><entry><title>Diary 2024-04-01</title><link href="https://mwchase.neocities.org/diary-2024-04-01" rel="alternate"></link><published>2024-04-01T04:00:00-04:00</published><updated>2024-04-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-04-01:/diary-2024-04-01</id><summary type="html">&lt;p class="first last"&gt;Safe to skip.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;And, we're back.&lt;/p&gt;
&lt;p&gt;It would be nice if I had something to say, but, eh.
I was reading books and thinking about those books.
Tomorrow, I'll keep on winding down, and then try to ramp things back up.&lt;/p&gt;
&lt;p&gt;But for now, I need to relax.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-03-31</title><link href="https://mwchase.neocities.org/diary-2024-03-31" rel="alternate"></link><published>2024-03-31T04:00:00-04:00</published><updated>2024-03-31T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-03-31:/diary-2024-03-31</id><summary type="html">&lt;p class="first last"&gt;Video Games&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Guess what, it's another travel weekend.
I did poke a little at MOTR, but I'd like to get back home before I try to do much with it.&lt;/p&gt;
&lt;p&gt;Besides that, I read a little and played video games a bunch.
Anyone wants to recommend Baba Is You or Patrick's Parabox levels, poke me on Mastodon or Cohost.
(Or other games, but I have &lt;em&gt;a lot&lt;/em&gt; of games...)&lt;/p&gt;
&lt;p&gt;Anyway, I should get to bed before it gets too much later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2024-03-30</title><link href="https://mwchase.neocities.org/coding-2024-03-30" rel="alternate"></link><published>2024-03-30T04:00:00-04:00</published><updated>2024-03-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-03-30:/coding-2024-03-30</id><summary type="html">&lt;p class="first last"&gt;This is the wrong amount of code. This idea either needs a bunch more supporting code, or it needs to not exist at all.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm looking at the code in MOTR to try to get a sense of how it all fits together, and naturally this means I've got a niggling voice in my head going,
&amp;quot;You know, you could remove a lot of this boilerplate by writing something like...&amp;quot;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;delegate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;typing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Concatenate&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;P&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;typing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Concatenate&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;P&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;T2&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="n"&gt;wrapped_class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="c1"&gt;# Some horrible nonsense I don&amp;#39;t want to go into.&lt;/span&gt;
    &lt;span class="nd"&gt;@functools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wraps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;wrapper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;T2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;P&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;P&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;T2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;attr&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;attrs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;asdict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;recurse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wrapped_class&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;attrs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
                &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Did not find a field of type &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;wrapped_class&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I'm &lt;em&gt;pretty skeptical&lt;/em&gt; that mypy will, accept this nonsense.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;I just got it to accept broadly equivalent dataclasses code.&lt;/p&gt;
&lt;p&gt;Oh dear, this could work.&lt;/p&gt;
&lt;p&gt;And the other boilerplate!
I could write a class decorator to convert a smattering of metadata into a standardized method.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p&gt;No!
Back away from the edge!
Mypy still doesn't handle class decorators that change the type of the class.
To get it to typecheck, you'd probably need to write metaclass or something.&lt;/p&gt;
&lt;p class="last"&gt;Also, this idea is completely deranged.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Ultimately, while I could try to golf things down a little, it makes more sense to get things documented and try to improve the names.
Annoyingly, this stuff is calling for some pretty intense precision in names, and I feel like the pre-existing concepts I'm trying to track tend to be referred to a bit more flexibly.
I'll have to come back to this when I'm a bit better rested.&lt;/p&gt;
&lt;p&gt;And I should get to work on getting rested.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Diary 2024-03-29</title><link href="https://mwchase.neocities.org/diary-2024-03-29" rel="alternate"></link><published>2024-03-29T04:00:00-04:00</published><updated>2024-03-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-03-29:/diary-2024-03-29</id><summary type="html">&lt;p class="first last"&gt;Looking at myself from three months ago like &amp;quot;What was going on? What was I &lt;em&gt;doing&lt;/em&gt;?&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Ugh.
My attention is drifting back towards trying to get MOTR working, and that means I need to remember what the heck I was doing.
&lt;tt class="docutils literal"&gt;hg log&lt;/tt&gt; informs me I spent over a month in a topic called &amp;quot;risky-renames&amp;quot; before putting the project down for three months.
Poking at it, I can't suss out the larger trend yet.&lt;/p&gt;
&lt;p&gt;It looks like, if I want to get anywhere with this, I need to start over with documenting the different names in the code and what I think of them.
And my last entry &lt;em&gt;claims&lt;/em&gt; I'd &amp;quot;finished&amp;quot; &lt;em&gt;something&lt;/em&gt;.
I can't tell if there are other issues besides the very obvious, so I'm going to do some surface-level analysis, then try and take some time away from my laptop.&lt;/p&gt;
&lt;p&gt;There are three topics I'm juggling right now:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;risky-renames&lt;/li&gt;
&lt;li&gt;87-test-coverage&lt;/li&gt;
&lt;li&gt;39-documentation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once risky-renames is ready, it gets integrated back into 87-test-coverage, and I merge the updates to 39-documentation.
At that point, I go back to 87-test-coverage, and get back to work on test coverage.
That bit's pretty self-explanatory.&lt;/p&gt;
&lt;p&gt;So, ultimately, I just need to get risky-renames into a state where I'm happy with it, and then I can move on.
(I'm not happy with it right now.
Some of these names are bad.)&lt;/p&gt;
&lt;p&gt;Anyway, time to try and clear my head.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="MOTR"></category></entry><entry><title>Diary 2024-03-28</title><link href="https://mwchase.neocities.org/diary-2024-03-28" rel="alternate"></link><published>2024-03-28T04:00:00-04:00</published><updated>2024-03-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-03-28:/diary-2024-03-28</id><summary type="html">&lt;p class="first last"&gt;Safe to skip, dealing with my body having Bad Vibes.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm not sure if I didn't get enough sleep or if it's something in the air, or what, but I'm feeling awful right now, so I'm going to step trying to do stuff on my computer, and start trying to do stuff on my e-reader.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2024-03-27</title><link href="https://mwchase.neocities.org/coding-2024-03-27" rel="alternate"></link><published>2024-03-27T04:00:00-04:00</published><updated>2024-03-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-03-27:/coding-2024-03-27</id><summary type="html">&lt;p class="first last"&gt;This stuff isn't totally nailed down, but I want to make like one more decision before I move on from it for now.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got some tables I want to make for Tsetatsatal, and they could potentially get very complicated, but first I want to figure out how much complication I need.&lt;/p&gt;
&lt;p&gt;Consonants, places of articulation:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;labial, possibly considering bilabial separately from labiodental&lt;/li&gt;
&lt;li&gt;alveolar&lt;/li&gt;
&lt;li&gt;palatal&lt;/li&gt;
&lt;li&gt;velar&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Consonants, manners of articulation:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;nasal&lt;/li&gt;
&lt;li&gt;plosive&lt;/li&gt;
&lt;li&gt;fricative&lt;/li&gt;
&lt;li&gt;affricate&lt;/li&gt;
&lt;li&gt;approximant&lt;/li&gt;
&lt;li&gt;tap/flap&lt;/li&gt;
&lt;li&gt;lateral approximant&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm going to have to figure out whether I want to add, remove, consolidate, or relocate stuff to deal with how sparse the chart is.&lt;/p&gt;
&lt;p&gt;Vowels are pretty straightforward: open, close-mid, close, and back rounded, front rounded, and front unrounded (not open (if I'm not confused here)).&lt;/p&gt;
&lt;p&gt;My want for the code I was planning to write is to support stuff like the weird set of spans that the Received Pronunciation vowel chart has on Wikipedia, but I can make do without that for both of these tables, so I might as well get on that.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Hm, as I contemplate the prospect of nasalizing all of these vowels, I realize that it would be nice to somehow apply diacritics to a full paradigm.
Like if I put them into the field whitespace-separated, and it just maps the diacritic over them.&lt;/p&gt;
&lt;p&gt;Okay, let's see.
I've copied a bunch of phones out, and I can try to fit them into whatever table I come up with, but it's late and I want to just work on that tomorrow or so.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="marimo"></category><category term="conlanging"></category></entry><entry><title>Weekly Roundup 2024-03-26</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-03-26" rel="alternate"></link><published>2024-03-26T04:00:00-04:00</published><updated>2024-03-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-03-26:/weekly-roundup-2024-03-26</id><summary type="html">&lt;p class="first last"&gt;Just about ready to move on for now.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I laid out the pulmonic consonants.&lt;/li&gt;
&lt;li&gt;Thursday: I laid out... something.&lt;/li&gt;
&lt;li&gt;Friday: I started trying to figure out what needs to be combining characters.
The answer is &amp;quot;a lot of things&amp;quot;.&lt;/li&gt;
&lt;li&gt;Saturday: I got everything that &lt;em&gt;wasn't&lt;/em&gt; those things basically squared away.&lt;/li&gt;
&lt;li&gt;Sunday: I gave some thought to how to lay out the fancier interfaces I'm going to want, and read marimo's documentation a little more closely.&lt;/li&gt;
&lt;li&gt;Monday: I got enough of the IPA stuff implemented for my current purposes, so I decided to leave the remainder as TODOs for now.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to implement some really weird-looking helper code, then actually touch Tsetatsal's documentation, maybe do some other writing as well.
Hm.
Maybe Tsetatsal could be part of that setting.
Can't prove it's not.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="marimo"></category><category term="conlanging"></category></entry><entry><title>Coding 2024-03-25</title><link href="https://mwchase.neocities.org/coding-2024-03-25" rel="alternate"></link><published>2024-03-25T04:00:00-04:00</published><updated>2024-03-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-03-25:/coding-2024-03-25</id><summary type="html">&lt;p class="first last"&gt;Okay, let's see about getting back on track. Soonish.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I've got a bunch of diacritics implemented.
At this point, I'm missing tones and contours, and general superscripts.
I don't need those for Tsetatsatal, so when I pick things back up, I'm going to work on the chart stuff.
First laying the groundwork with some helper code, then making the consonant and vowel charts for Tsetatsatal.&lt;/p&gt;
&lt;p&gt;I'm kind of out of it after putting those diacritics together, so I'm going to wrap things up for now and get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="marimo"></category><category term="conlanging"></category><category term="short post"></category></entry><entry><title>Coding 2024-03-24</title><link href="https://mwchase.neocities.org/coding-2024-03-24" rel="alternate"></link><published>2024-03-24T04:00:00-04:00</published><updated>2024-03-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-03-24:/coding-2024-03-24</id><summary type="html">&lt;p class="first last"&gt;Slow and steady progress. Also, &amp;quot;I really should learn marimo properly sometime, huh?&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I mostly took things easy today, but I did take some notes on how I want to handle combining characters etc in IPA.
It's not quite there yet.&lt;/p&gt;
&lt;p&gt;Here's the deal: a bunch of the ideas I have involve multiple text fields feeding into the output, with different purposes.
It more-or-less makes sense to put these text fields right next to each other, but then I'm not sure how to indicate the different purposes of them.
Like, maybe I should just stack them vertically to make room?
But putting them horizontally best indicates what's supposed to be going on with them.
Oh, wait, placeholder text.
There we go.&lt;/p&gt;
&lt;p&gt;I really should learn marimo properly sometime, huh?&lt;/p&gt;
&lt;p&gt;We'll see if I'm up for trying out these interfaces tomorrow; I was dealing with sensitive eyes all day, but maybe I'll do better tomorrow.
For now, I want to put my laptop away.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="marimo"></category><category term="conlanging"></category><category term="short post"></category></entry><entry><title>Coding 2024-03-23</title><link href="https://mwchase.neocities.org/coding-2024-03-23" rel="alternate"></link><published>2024-03-23T04:00:00-04:00</published><updated>2024-03-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-03-23:/coding-2024-03-23</id><summary type="html">&lt;p class="first last"&gt;So much done, so much much much more to do.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I believe I've coded in every part of the IPA that isn't some kind of modifier or combiner.
That's probably going to end up having been the easy part, because there are &lt;em&gt;so many&lt;/em&gt; diacritics and such in the IPA.
I'm going to have to figure out how to handle all of the details of that.&lt;/p&gt;
&lt;p&gt;For now, I want to get off my computer and go read ebooks.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="marimo"></category><category term="conlanging"></category><category term="short post"></category></entry><entry><title>Coding 2024-03-22</title><link href="https://mwchase.neocities.org/coding-2024-03-22" rel="alternate"></link><published>2024-03-22T04:00:00-04:00</published><updated>2024-03-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-03-22:/coding-2024-03-22</id><summary type="html">&lt;p class="first last"&gt;Having the wind vigorously rattling things all last night probably didn't contribute to this entry's length.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm doing prep work for the helper code: specifically, figuring out which of the remaining symbols are some kind of combining character.
The answer is: more than I thought, and I already thought &amp;quot;most of them&amp;quot;.&lt;/p&gt;
&lt;p&gt;The prep work also convinced me to reorganize the existing work a bunch, so that's... cool...&lt;/p&gt;
&lt;p&gt;Anyway, I drastically need to rest my eyes, so I'm going to wrap up early tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="marimo"></category><category term="conlanging"></category><category term="short post"></category></entry><entry><title>Coding 2024-03-21</title><link href="https://mwchase.neocities.org/coding-2024-03-21" rel="alternate"></link><published>2024-03-21T04:00:00-04:00</published><updated>2024-03-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-03-21:/coding-2024-03-21</id><summary type="html">&lt;p class="first last"&gt;Once again got too engrossed hand-coding HTML. It's not even vaguely styled well this time.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've coded in a bit more of the IPA stuff.
I should take some time and figure out which of the things I've yet to add, should be added as diacritics.&lt;/p&gt;
&lt;p&gt;It's late and I have nothing else to talk about.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="marimo"></category><category term="conlanging"></category><category term="short post"></category></entry><entry><title>Coding 2024-03-20</title><link href="https://mwchase.neocities.org/coding-2024-03-20" rel="alternate"></link><published>2024-03-20T04:00:00-04:00</published><updated>2024-03-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-03-20:/coding-2024-03-20</id><summary type="html">&lt;p class="first last"&gt;That's enough of that.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I've got the pulmonic consonants in, and unfortunately, I fried myself &lt;em&gt;a little&lt;/em&gt; by laying out the HTML for the table totally manually.
I'm going to have to give myself some time to cool off, and then I can work on copying more symbols in, half-assing the vowel trapezoid, and then figuring out how I want to handle the diacritics.&lt;/p&gt;
&lt;p&gt;It seems I have nothing else to say on this, so I'm going to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="marimo"></category><category term="conlanging"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2024-03-19</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-03-19" rel="alternate"></link><published>2024-03-19T04:00:00-04:00</published><updated>2024-03-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-03-19:/weekly-roundup-2024-03-19</id><summary type="html">&lt;p class="first last"&gt;I mean, it's fine, I guess...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I thought some about conlangs that have failed in their goals, or at least not succeeded persuasively.
I had some ideas about what &amp;quot;went wrong&amp;quot;, but I'm not sure if those ideas are more &amp;quot;insight&amp;quot; or &amp;quot;assuming my experiences are universal&amp;quot;.&lt;/li&gt;
&lt;li&gt;Thursday: I thought my plan for Tsetatsatal would &amp;quot;get less away from me&amp;quot; than my previous attempts.
Ahahahahaha.&lt;/li&gt;
&lt;li&gt;Friday: I made some progress on Tsetatsatal, and then fled the screens.&lt;/li&gt;
&lt;li&gt;Saturday: I don't remember what I did.&lt;/li&gt;
&lt;li&gt;Sunday: More progress on Tsetatsatal.&lt;/li&gt;
&lt;li&gt;Monday: I tried to get some idea of what would work for IPA characters, and mostly got ideas of what wouldn't work.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to put together basic stuff for the IPA, then helpers for phonetic charts, then get back to Tsetatsatal.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="conlanging"></category></entry><entry><title>Diary 2024-03-18</title><link href="https://mwchase.neocities.org/diary-2024-03-18" rel="alternate"></link><published>2024-03-18T04:00:00-04:00</published><updated>2024-03-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-03-18:/diary-2024-03-18</id><summary type="html">&lt;p class="first last"&gt;A lot of research, no action yet.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Starting this post early because I had stuff that can go in it on my mind...&lt;/p&gt;
&lt;p&gt;I had a look at just a few phonology sections on Wikipedia to refresh my memory, and from looking at them it looks clear to me that &amp;quot;just subset the IPA charts&amp;quot; is not going to work well.
My inclination is to say &amp;quot;people can come up with whatever rows and columns they like, although I'd like to provide some sensible defaults&amp;quot;.
And &amp;quot;it should be possible to nest heading cells in verious ways, and I'm not confident right now that I can figure out the proper manifestation of the nesting automatically&amp;quot;.
What goes in cells should be relatively freeform, but I'd like the ability to choose between &amp;quot;centered, left-justified, right-justified, some text left- and some text right- justified&amp;quot; on a per-cell basis.
As far as IPA symbols, that should be entirely freeform, but it would be good to have some helpers for stuff like aspiration and devoicing.&lt;/p&gt;
&lt;p&gt;And those helpers look to be a minor nightmare to put together, because the IPA symbols have a lot of &lt;em&gt;stuff&lt;/em&gt; going on, in terms of unicode representation.
And Wikipedia isn't helping, with the frankly bizarre styling it inflicted on the table I'd like to use, which seems to make it entirely unsuitable for printing.
(Also, there's &lt;em&gt;something&lt;/em&gt; going on with the click consonants that doesn't look right.
I don't have plans for click consonants in Tsetatsatal, but it would offend my sensibilities if I ignored them or got them wrong.
That said, it looks like so much of the details of click phonemes is represented through diacritics, that it looks to me like the sensible course of action initially would be to have a separate helper just for getting the IPA character for the place of articulation, and punt on filling in the rest of the details for now.)&lt;/p&gt;
&lt;p&gt;Those digressions aside, I think I have to acknowledge that, while it would be &lt;em&gt;cool&lt;/em&gt; to build up some of the IPA consonant representations in a sort of refinement process, it makes much more sense to create a hardcoded lookup table.
Sadly, even this isn't totally straightforward, because there's a lot of &lt;em&gt;stuff&lt;/em&gt; going on in the various IPA tables I'm looking at, and they also don't agree with each other in some significant ways.
Stuff like &amp;quot;do we call out dental plosives as distinct from alveolar plosives?&amp;quot; or &amp;quot;so what should the deal with sibilants be?&amp;quot; and especially &amp;quot;so what does it mean in these charts when the line between cells ends halfway between?&amp;quot;
At this stage, it seems like it would make more sense to simply embed the IPA chart in the supporting cells and be all &amp;quot;copy out the symbols that you want&amp;quot;.&lt;/p&gt;
&lt;p&gt;Plausible other things to work with would be stuff like &amp;quot;combining mark/spacer applier&amp;quot; or &amp;quot;superscript converter&amp;quot;.&lt;/p&gt;
&lt;p&gt;Looking at what I can find easily, there are a few issues, which I'll need to take some time to remedy.
I'll get to it in a few days, hopefully.
For now, I want to get off my computer.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="conlanging"></category></entry><entry><title>Diary 2024-03-17</title><link href="https://mwchase.neocities.org/diary-2024-03-17" rel="alternate"></link><published>2024-03-17T04:00:00-04:00</published><updated>2024-03-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-03-17:/diary-2024-03-17</id><summary type="html">&lt;p class="first last"&gt;More incremental progress.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Ugh, I was trying to fix some stuff I messed up on my Deck, and it turns out I was working with outdated directions, so that wasted a bunch of time.
I'll come back to it later, because I don't want to keep thinking about it right now.&lt;/p&gt;
&lt;p&gt;I made some progress on the conlang stuff, but mostly on the code side.
I think I need to add a bunch of placeholder entries so I have some idea of the scope of what needs to get filled in.
I'll try that now.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Mm, that's a bunch of work to do later...&lt;/p&gt;
&lt;p&gt;Thinking over how to move forward, I think I should be focusing on phoneme charts.
That'll help with the possibility of missing phonemes in words.&lt;/p&gt;
&lt;p&gt;Anyway, I'll think about that (it's probably going to end up with functions to generate the HTML explicitly), but right now, I'm going to switch gears for a bit.
What I've got in mind is not too interesting to talk about; it's just something simple that I want done.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="conlanging"></category></entry><entry><title>Diary 2024-03-16</title><link href="https://mwchase.neocities.org/diary-2024-03-16" rel="alternate"></link><published>2024-03-16T04:00:00-04:00</published><updated>2024-03-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-03-16:/diary-2024-03-16</id><summary type="html">&lt;p class="first last"&gt;Okay to skip.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I didn't get much done today, so I don't really have anything to talk about.
I'll just try to get something interesting to talk about tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2024-03-15</title><link href="https://mwchase.neocities.org/coding-2024-03-15" rel="alternate"></link><published>2024-03-15T04:00:00-04:00</published><updated>2024-03-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-03-15:/coding-2024-03-15</id><summary type="html">&lt;p class="first last"&gt;It's called Tsetatsatal currently, and unfortunately that spelling is slightly non-indicative.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, the good news is that I have put together some prototype code for dealing with conlang stuff in marimo (the stuff I'm doing works as a more general feature request, which I've filed and I intend to write up a recipe for replicating what I'm doing), and I've started adding lexicon entries.
It feels decent enough working with all of this, so that's all good.&lt;/p&gt;
&lt;p&gt;The bad news is that my head has hurt all day, and I should get away from screens again.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="marimo"></category><category term="conlanging"></category><category term="short post"></category></entry><entry><title>Diary 2024-03-14</title><link href="https://mwchase.neocities.org/diary-2024-03-14" rel="alternate"></link><published>2024-03-14T04:00:00-04:00</published><updated>2024-03-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-03-14:/diary-2024-03-14</id><summary type="html">&lt;p class="first last"&gt;The category is vibes, again.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I didn't think any more about the stuff I was thinking about yesterday.
Instead, I decided to start writing stuff down about the language I currently have in mind.&lt;/p&gt;
&lt;p&gt;The basic thing I'm trying to work out for myself is how far I can push the concept of stative verbs, in the direction I'm interested in.&lt;/p&gt;
&lt;p&gt;I'm also looking into writing up a conlang grammar in marimo, on the supposition that maybe that will get less away from me than trying to write a grammar in Sphinx.
It might have gotten away from me &lt;em&gt;a little&lt;/em&gt;, because I'm trying to work out how to handle stuff like phonetics charts and the lexicon.
Probably, I should just bite the bullet and do stuff by hand at first, then convert it all into stuff upstream.
But not right now, because I was messing around with other stuff earlier.
For now, I need to try again to rest.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="conlanging"></category><category term="short post"></category></entry><entry><title>Diary 2024-03-13</title><link href="https://mwchase.neocities.org/diary-2024-03-13" rel="alternate"></link><published>2024-03-13T04:00:00-04:00</published><updated>2024-03-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-03-13:/diary-2024-03-13</id><summary type="html">&lt;p class="first last"&gt;Trying not to ruffle feathers, because I'm not sure which feathers to ruffle right now.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm feeling really tired right now, going to have to deal with that somehow.&lt;/p&gt;
&lt;p&gt;I was thinking some today about the history of conlangs, and the way that the craft of conlanging has been entangled to varying degrees with utopian thinking.
I personally haven't had to deal with this any (except for from myself once like twenty years ago, when I was &lt;em&gt;sure&lt;/em&gt; I'd cracked the code to representing and manipulating concepts in a consistent framework with a simple phonetic representation...), so I'm thinking about this in terms of its historical legacy.&lt;/p&gt;
&lt;p&gt;I don't know if my thoughts are well-developed enough for me to go into much more detail without accidentally offending someone (I'd like it to be on purpose), but that is what I've been thinking about a lot.
And questions like...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Wait, how are we defining success?&lt;/li&gt;
&lt;li&gt;Will a new language meaningfully advance that goal?&lt;/li&gt;
&lt;li&gt;How have we determined what is wrong?&lt;/li&gt;
&lt;li&gt;How reliable are those methods of determination?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sadly, it turns out that linguistics ability is not a substitute for project management.
Lots of things aren't, like programming ability.&lt;/p&gt;
&lt;p&gt;Ugh, I'd like to end this post on a more definite note, but I'm feeling incredibly tired.
Like, all I can say for how I feel right now is that it &lt;em&gt;is&lt;/em&gt; possible to feel even more tired than this, which is not an impressive bar to clear.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="conlanging"></category></entry><entry><title>Weekly Roundup 2024-03-12</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-03-12" rel="alternate"></link><published>2024-03-12T04:00:00-04:00</published><updated>2024-03-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-03-12:/weekly-roundup-2024-03-12</id><summary type="html">&lt;p class="first last"&gt;&lt;em&gt;Definitely&lt;/em&gt; not doing this again.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I finished work on the conversion script, and rattled off a list of bugs I had to fix that probably made the script sound &lt;em&gt;extremely&lt;/em&gt; fake.
Like, I had problems with a custom parser, xpath handling, &lt;em&gt;and&lt;/em&gt; unpickling?
Ridiculous.&lt;/li&gt;
&lt;li&gt;Thursday: I had a rough day.&lt;/li&gt;
&lt;li&gt;Friday: I had another rough day.&lt;/li&gt;
&lt;li&gt;Saturday: I had a less rough day.&lt;/li&gt;
&lt;li&gt;Sunday: I tried to get back into writing, and didn't get too far.&lt;/li&gt;
&lt;li&gt;Monday: I was very sore, and not sure what I felt like doing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, maybe I'll get back to writing, maybe I'll mess around with other stuff.
We'll see.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="writing"></category><category term="burnout"></category></entry><entry><title>Diary 2024-03-11</title><link href="https://mwchase.neocities.org/diary-2024-03-11" rel="alternate"></link><published>2024-03-11T04:00:00-04:00</published><updated>2024-03-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-03-11:/diary-2024-03-11</id><summary type="html">&lt;p class="first last"&gt;My poor muscles... I didn't even &lt;em&gt;do anything&lt;/em&gt; that would make this somehow &amp;quot;worth it&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Uugh.
I have been sore all day.&lt;/p&gt;
&lt;p&gt;As a result, I didn't really focus on much.
While I've been trying to get back to the writing I was doing before, I feel like I'm kind of at the mercy of my whims, and my whims are inclined towards conlang stuff right now.
I've got some ideas I'm messing with, but nailing stuff down there is, um, more writing, so I figured the sensible thing to look into would be reading about other conlangs that strike my interest.&lt;/p&gt;
&lt;p&gt;Rather than drag out this entry any longer, I'm going to get off the laptop and try getting back to that.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="conlanging"></category></entry><entry><title>Diary 2024-03-10</title><link href="https://mwchase.neocities.org/diary-2024-03-10" rel="alternate"></link><published>2024-03-10T05:00:00-04:00</published><updated>2024-03-10T05:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-03-10:/diary-2024-03-10</id><summary type="html">&lt;p class="first last"&gt;Don't go too quickly...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Oh hey, it's the yearly &amp;quot;when is the right day to adjust the timestamps&amp;quot; moment.
I &lt;em&gt;think&lt;/em&gt; I switch them tomorrow.&lt;/p&gt;
&lt;p&gt;Anyway, I'm trying to ramp things up at a reasonable pace for now.
For writing, I've got &amp;quot;update the build pipeline&amp;quot; and &amp;quot;copy everything into the outline&amp;quot; as blocking things.
I tried to get stuff into the outline, and I had trouble with how un-fleshed-out the beginning is; I'll take another stab at it later, but for now I'm working on transferring setting notes.&lt;/p&gt;
&lt;p&gt;Right now, I want to get to sleep and deal with the time change.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="writing"></category></entry><entry><title>Diary 2024-03-09</title><link href="https://mwchase.neocities.org/diary-2024-03-09" rel="alternate"></link><published>2024-03-09T05:00:00-05:00</published><updated>2024-03-09T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-03-09:/diary-2024-03-09</id><summary type="html">&lt;p class="first last"&gt;Not sure when I'll be &amp;quot;done&amp;quot; with this, but I'm going to work not to repeat the experience.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Wow, I feel not-great at the moment.
At least I don't have a headache.&lt;/p&gt;
&lt;p&gt;My current hope is that this clears up by morning, and I can focus on destressing.&lt;/p&gt;
&lt;p&gt;But right now, bed sounds good.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-03-08</title><link href="https://mwchase.neocities.org/diary-2024-03-08" rel="alternate"></link><published>2024-03-08T05:00:00-05:00</published><updated>2024-03-08T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-03-08:/diary-2024-03-08</id><summary type="html">&lt;p class="first last"&gt;Let's see how things go tomorrow. Nothing here today, though.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm currently hoping that tomorrow, I'll be able to take care of the stuff I've been over-focusing on this last week.
Then coast through the weekend.&lt;/p&gt;
&lt;p&gt;I don't have anything else I want to talk about right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-03-07</title><link href="https://mwchase.neocities.org/diary-2024-03-07" rel="alternate"></link><published>2024-03-07T05:00:00-05:00</published><updated>2024-03-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-03-07:/diary-2024-03-07</id><summary type="html">&lt;p class="first last"&gt;Uuugh... boring...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well.
I currently lack the focus to do much, so I'm just going to publish this and get off my laptop to try and let my eyes recover.&lt;/p&gt;
&lt;p&gt;Got to stop staring at this like I might think of something else to add.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2024-03-06</title><link href="https://mwchase.neocities.org/coding-2024-03-06" rel="alternate"></link><published>2024-03-06T05:00:00-05:00</published><updated>2024-03-06T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-03-06:/coding-2024-03-06</id><summary type="html">&lt;p class="first last"&gt;Reaping, sowing, etc. Point is, my eyes hurt, and everyone could have anticipated this except for me, a week ago.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;To all indications, the conversion script works now.
Tally of bugs:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I needed to rework the code to extract node metadata, because the rinky-dink parser was failing to empty the stack, which prevented some metadata from being recorded.
(There may be Bonus Bugs hiding in here, because the parser is meant to handle input that I have no intention to produce, because I failed to rein in scope creep.)&lt;/li&gt;
&lt;li&gt;I copied code from another project to find elements using xpaths.
That code turned out to have never run, and it was slightly broken.&lt;/li&gt;
&lt;li&gt;I failed to anticipate the sheer number of ways that Python will pickle &amp;quot;a set full of strings&amp;quot;, and had to allow-list a bunch more opcodes.&lt;/li&gt;
&lt;li&gt;I realized that I'd allow-listed so many opcodes that I should also look into writing a custom unpickler that only loads trusted globals.
The first time, I forgot which global I actually needed to trust.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of this was ultimately not too bad.&lt;/p&gt;
&lt;p&gt;With all of that taken care of, I'm all set to start migrating text into the outline...
Except that my eyes hurt and I just really want to lie down and doodle.
So I'm going to go do that.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Leo"></category><category term="writing"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2024-03-05</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-03-05" rel="alternate"></link><published>2024-03-05T05:00:00-05:00</published><updated>2024-03-05T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-03-05:/weekly-roundup-2024-03-05</id><summary type="html">&lt;p class="first last"&gt;Good progress for how I was doing, but I should probably, like, sleep.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I pushed the conversion script in a somewhat more quick-and-dirty direction.&lt;/li&gt;
&lt;li&gt;Thursday: I got some stuff done to avoid worrying about recomputations in the conversion script, which is helpful for consolidating logic into one place.&lt;/li&gt;
&lt;li&gt;Friday: I made some more progress on the script, and started pondering some of the weird behaviors I've set myself up to think about.&lt;/li&gt;
&lt;li&gt;Saturday: I realized that I was approaching said weird behaviors in the wrong way, and found the right way (according to me).&lt;/li&gt;
&lt;li&gt;Sunday: I had still more weird design issues to work through, so I did.&lt;/li&gt;
&lt;li&gt;Monday: I got &lt;em&gt;probably&lt;/em&gt; the last of the big issues with the script, leaving just the little ones.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try and get the script and build process to the point where I'm comfortable migrating content from the flat file into the outline.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="Leo"></category><category term="writing"></category></entry><entry><title>Coding 2024-03-04</title><link href="https://mwchase.neocities.org/coding-2024-03-04" rel="alternate"></link><published>2024-03-04T05:00:00-05:00</published><updated>2024-03-04T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-03-04:/coding-2024-03-04</id><summary type="html">&lt;p class="first last"&gt;Bad habits for writing. I need to change them somehow.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay.
I was doing other stuff all day, and then in the last hour or so I rushed through implementing most of the stuff I think I need for the conversion script.
At this point, I just need to slap a click wrapper on top of all of this, and make sure I wire everything together properly inside.&lt;/p&gt;
&lt;p&gt;That shouldn't be too hard, but I want to get some sleep before trying.&lt;/p&gt;
&lt;p&gt;Also, this file is a complete mess by now.
If I don't give it some editing passes, it'll bother me how messed up it is.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to try and relax and sleep now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Leo"></category><category term="writing"></category><category term="short post"></category></entry><entry><title>Coding 2024-03-03</title><link href="https://mwchase.neocities.org/coding-2024-03-03" rel="alternate"></link><published>2024-03-03T05:00:00-05:00</published><updated>2024-03-03T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-03-03:/coding-2024-03-03</id><summary type="html">&lt;p class="first last"&gt;Thinking things through &amp;quot;out loud&amp;quot; to make progress.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hm.
I mostly messed around today, but I did get some more work done on the conversion script just now.
I've got &lt;em&gt;hopefully&lt;/em&gt; the right behavior for the title marker at each level of the tree.
I've got a bit of work to do in terms of figuring out the runtime checks that I want to try to ensure stylistic consistency.
But the big thing I need to work through is how to assemble the text of the different nodes together.
Things I think I need:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Some kind of matching argument at the top level&lt;/li&gt;
&lt;li&gt;A header helper that does things like temporarily increase the header level&lt;/li&gt;
&lt;li&gt;Probably this should all be generators or something?&lt;/li&gt;
&lt;li&gt;Chapters and books need to know their own number&lt;/li&gt;
&lt;li&gt;I need to figure out where I want end-of-node line breaks to be in all of this. Inserted programmatically, already in the outline, something else?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thinking about the line breaks...
There should be 2+ breaks between everything I think, because I'm not going to want to have multiple scenes in a paragraph, probably.
So, I can either emit those as I go, or say &amp;quot;okay, join on double newlines&amp;quot;.
Stuff to consider for later.&lt;/p&gt;
&lt;p&gt;Well, I can figure the rest out later, it's nothing I haven't done before.
For now, sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Leo"></category><category term="writing"></category></entry><entry><title>Coding 2024-03-02</title><link href="https://mwchase.neocities.org/coding-2024-03-02" rel="alternate"></link><published>2024-03-02T05:00:00-05:00</published><updated>2024-03-02T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-03-02:/coding-2024-03-02</id><summary type="html">&lt;p class="first last"&gt;Sometimes, I'm not sure how to do something, and the correct answer turns out to be &amp;quot;don't&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's see where I am now.&lt;/p&gt;
&lt;p&gt;At the level I'm currently considering, the most complicated logic is &amp;quot;there's an optional &lt;tt class="docutils literal"&gt;subtitle&lt;/tt&gt; node, and I want to properly handle all of the nodes that &lt;em&gt;are not&lt;/em&gt; &lt;tt class="docutils literal"&gt;subtitle&lt;/tt&gt;.&amp;quot;
I've got the vague sense that I'm doing something wrong with my design, which is pretty much just in my head right now.
Like, I'm currently leaning towards, there's some kind of dependence between the &lt;tt class="docutils literal"&gt;subtitle&lt;/tt&gt; property and the other attribute.
It feels to me like the current draft is wrong, because it's a relatively monolithic setup, and adapting it to the more complicated requirements means I need to duplicate and rework a lot of it.&lt;/p&gt;
&lt;p&gt;Let's see if I can divide this up a little...&lt;/p&gt;
&lt;p&gt;Hm.
I can certainly pull apart different ideas and make the individual units of code smaller, but it's not yet clear if I have the pieces I need to build back up what I want.
Thinking about it, the problem I was having before was kind of that I had &lt;em&gt;two&lt;/em&gt; monoliths...&lt;/p&gt;
&lt;p&gt;Okay, I consolidated a bunch of logic into a compound cached property, and then wrote additional properties to  pull out distinct parts of it.
This seems like a useful thing to do in this code, for whatever reason; I have some of this in the general &lt;tt class="docutils literal"&gt;Node&lt;/tt&gt; code as well.&lt;/p&gt;
&lt;p&gt;Anyway, with that, plus just knocking out all of the simpler child relationships quickly, I have the tree structure just about handled.
Next, I need to get the rest of the data for each node, and then I can work on presentation logic.
At that point, it should be ready to move into proper testing.&lt;/p&gt;
&lt;p&gt;But for now, I need to sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Leo"></category><category term="writing"></category></entry><entry><title>Coding 2024-03-01</title><link href="https://mwchase.neocities.org/coding-2024-03-01" rel="alternate"></link><published>2024-03-01T05:00:00-05:00</published><updated>2024-03-01T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-03-01:/coding-2024-03-01</id><summary type="html">&lt;p class="first last"&gt;Just changing things until this all seems to make sense. Not there yet.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I'm in a little better shape compared to yesterday, but I do need to hurry here.&lt;/p&gt;
&lt;p&gt;I've improved the basic wrapper class, and I think it's about ready.
I've written a mixin class for wrappers around that, which layer semantics around the the helper methods from the basic wrapper.
None of those semantics are written yet.
I'm aware that some of them are going to need some further tweaks; I haven't really thought about headings yet.
Most things are ready to be filled in, but there is one wrinkle I'm trying to figure out how I want to handle:&lt;/p&gt;
&lt;p&gt;Chapters can have several different types of children; their first child could be a subtitle, and their children (including the first) can be scenes or summaries.
I have an attempt at a helper for handling these constraints, but I don't know that I've hit the right design yet.
I'll think about that more later, because right now it's late.&lt;/p&gt;
&lt;p&gt;One last thing; here is what I think I need to get done:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Figure out how to handle headings&lt;/li&gt;
&lt;li&gt;Figure out the right way to handle children of chapters&lt;/li&gt;
&lt;li&gt;Actually write the code to process this stuff out&lt;/li&gt;
&lt;li&gt;Migrate draft from the text file to the outline&lt;/li&gt;
&lt;li&gt;Update build process&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That'll all take some time, and the right thing for me to do right now is sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Leo"></category><category term="writing"></category><category term="short post"></category></entry><entry><title>Coding 2024-02-29</title><link href="https://mwchase.neocities.org/coding-2024-02-29" rel="alternate"></link><published>2024-02-29T05:00:00-05:00</published><updated>2024-02-29T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-02-29:/coding-2024-02-29</id><summary type="html">&lt;p class="first last"&gt;Progress, and no time to explain it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was kind of out of it today, but I did make some quick improvements to the conversion script, just about getting &lt;tt class="docutils literal"&gt;cached_property&lt;/tt&gt; stuff set up so I can feel better about calling some of this code.&lt;/p&gt;
&lt;p&gt;Anyway, it's too late and I need to wrap up several minutes ago.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Leo"></category><category term="writing"></category><category term="short post"></category></entry><entry><title>Coding 2024-02-28</title><link href="https://mwchase.neocities.org/coding-2024-02-28" rel="alternate"></link><published>2024-02-28T05:00:00-05:00</published><updated>2024-02-28T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-02-28:/coding-2024-02-28</id><summary type="html">&lt;p class="first last"&gt;Getting closer to having the script be usable.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right.
I wasn't focused much on coding today, but I did put together a few things for the conversion script.
Basically, I realized, hey, this conversion script is super bespoke and not meant to be reused, so I don't need to take my usual stances against inheritance, so I made a base class for all of my node wrapper stuff, and once I've got that class in a nice place, I can subclass it into all of the wrappers and then focus on pulling out the relevant information.&lt;/p&gt;
&lt;p&gt;For now, though, I want to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Leo"></category><category term="writing"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2024-02-27</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-02-27" rel="alternate"></link><published>2024-02-27T05:00:00-05:00</published><updated>2024-02-27T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-02-27:/weekly-roundup-2024-02-27</id><summary type="html">&lt;p class="first last"&gt;Just did what I felt like, vibed.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I threw together some pretty rough validation code to stop the conversion script from getting pwned by malicious input that there is no obvious way for it to end up on my computer, then started thinking about the actual business logic.&lt;/li&gt;
&lt;li&gt;Thursday: I was so gobsmacked by what looks like the way I'm &amp;quot;supposed to&amp;quot; handle one of the requirements I set myself, that I put together a quick hack to see how I get struck down for my hubris.&lt;/li&gt;
&lt;li&gt;Friday: I did a little more work with that, and then got distracted by something else I could code up.&lt;/li&gt;
&lt;li&gt;Saturday: I prototyped something roughly analagous to μKanren, for... some reason.&lt;/li&gt;
&lt;li&gt;Sunday: Traveled out.&lt;/li&gt;
&lt;li&gt;Monday: Traveled back.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I don't know yet what I'll feel like working on; I'll just try to take things as I go.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category></entry><entry><title>Diary 2024-02-26</title><link href="https://mwchase.neocities.org/diary-2024-02-26" rel="alternate"></link><published>2024-02-26T05:00:00-05:00</published><updated>2024-02-26T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-02-26:/diary-2024-02-26</id><summary type="html">&lt;p class="first last"&gt;Extremely safe to skip.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Travel back.&lt;/p&gt;
&lt;p&gt;Video games.&lt;/p&gt;
&lt;p&gt;Nothing to write about.&lt;/p&gt;
&lt;p&gt;Oh well.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-02-25</title><link href="https://mwchase.neocities.org/diary-2024-02-25" rel="alternate"></link><published>2024-02-25T05:00:00-05:00</published><updated>2024-02-25T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-02-25:/diary-2024-02-25</id><summary type="html">&lt;p class="first last"&gt;Maybe this counts as recharging?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Traveled today, and then got way into video games.
I did do some shell programming this morning, but it's not worth talking about.&lt;/p&gt;
&lt;p&gt;It's late and I need to lie down now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2024-02-24</title><link href="https://mwchase.neocities.org/coding-2024-02-24" rel="alternate"></link><published>2024-02-24T05:00:00-05:00</published><updated>2024-02-24T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-02-24:/coding-2024-02-24</id><summary type="html">&lt;p class="first last"&gt;Awkward position where it's &lt;em&gt;based&lt;/em&gt; on Micro, but the code size is probably closer to Mini. Something something, stuff getting longer when you translate it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I didn't get anything done on the stuff I was working on just two days ago, so here's what happened instead:&lt;/p&gt;
&lt;p&gt;Every once in a while, I read about a programming concept, and just go through implementing it without any clear idea of what I'm going to do with it.
This time, it was getting reminded of the existence of &lt;a class="reference external" href="https://github.com/VPetukhov/miniKanren/blob/master/HemannMuKanren2013.pdf"&gt;μKanren&lt;/a&gt;, and trying to put together some Python implementations.&lt;/p&gt;
&lt;p&gt;The one that &lt;em&gt;probably&lt;/em&gt; works, (though I haven't actually tested all of the primitives, so there could be some really nasty surprises in there) is based around using &lt;a class="reference external" href="https://pyrsistent.readthedocs.io/en/latest/api.html"&gt;pyrsistent&lt;/a&gt; maps for states, an &lt;a class="reference external" href="https://www.attrs.org/en/stable/"&gt;attrs&lt;/a&gt; class that compares by identity for variables, and using iterators for streams.
That description basically locks down most of the implementation; I'll also note that I favored callable classes over closures.
What remains is the definition of unification, which, well...&lt;/p&gt;
&lt;blockquote&gt;
The definition of &lt;tt class="docutils literal"&gt;unify&lt;/tt&gt; and the terms of the language are orthogonal to the presentation of μKanren: both could be changed with limited consequence for the rest of the system.&lt;/blockquote&gt;
&lt;p&gt;So, naturally, I figured out how to make that all &lt;em&gt;extremely configurable&lt;/em&gt;.
Basically, there are some new operators, which register new implementations of unification for the purposes of the goal that they wrap.&lt;/p&gt;
&lt;p&gt;I am still not sure what to do with this, if anything, so I'm going to try to switch gears soon.
Anyway, I'm starting to feel a little stiff, so I'm going to wrap up now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Kanren"></category></entry><entry><title>Coding 2024-02-23</title><link href="https://mwchase.neocities.org/coding-2024-02-23" rel="alternate"></link><published>2024-02-23T05:00:00-05:00</published><updated>2024-02-23T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-02-23:/coding-2024-02-23</id><summary type="html">&lt;p class="first last"&gt;Got a bunch of work still ahead of me, so naturally I started another project.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, well.
I got distracted by something else that I don't feel like discussing right now, but I did make a little progress on the outline-to-draft converter.
Specifically:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&amp;quot;Hm, chapter subtitles should probably be a distinct node at the beginning.&amp;quot;&lt;/li&gt;
&lt;li&gt;And I tested out my weird janky parser. I am aware that it has shortcomings, but I have chosen to only care about them in the event that they become relevant.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Maybe later, I can describe what got me all distracted.
But right now, I'm having a bit more trouble than usual typing, so it's time to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Leo"></category><category term="writing"></category><category term="short post"></category></entry><entry><title>Coding 2024-02-22</title><link href="https://mwchase.neocities.org/coding-2024-02-22" rel="alternate"></link><published>2024-02-22T05:00:00-05:00</published><updated>2024-02-22T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-02-22:/coding-2024-02-22</id><summary type="html">&lt;p class="first last"&gt;Disbelief-driven programming&lt;/p&gt;
</summary><content type="html">&lt;p&gt;After yesterday's entry, I remembered that I want to handle Leo directives (by ignoring them) and reStructuredText bibliographic fields (which I'm not &lt;em&gt;overly&lt;/em&gt; concerned about getting right, by my standards, but I still need to do &lt;em&gt;stuff&lt;/em&gt;).
I'm right now trying to figure out the right way to handle bibliographic fields.
I could try to hack together a small portion of a reStructuredText parser to winnow them out, or I could attempt to use docutils to just get it parsed out for free.
I'm currently not sure which option would be more of a pain, and whether there's some better way.&lt;/p&gt;
&lt;p&gt;Let's take a look at the latter option, since it's easier to tell what that entails.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;parser = docutils.parsers.rst.Parser()&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;Store the input in a variable.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;document = &lt;span class="pre"&gt;docutils.utils.new_document(&amp;quot;programmatic&amp;quot;)&lt;/span&gt;&lt;/tt&gt; (not exactly right, but let's see how this trips me up first)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;parser.parse(input, document)&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Where the input looks something like&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nc"&gt;:key:&lt;/span&gt; value

Hold on, does something &lt;span class="ge"&gt;*weird*&lt;/span&gt; happen if I have an indented field list inside a code block?
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And my hope is that I can extract a mapping of bibliographic fields, and get back the literal text of the rest of it.
I do not know if that's a supported usage, so this might be a non-starter.
(If it's not, do I have to roundtrip it through &lt;tt class="docutils literal"&gt;xml2rst&lt;/tt&gt; or something?)&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;AttributeError: 'Values' object has no attribute 'pep_references'&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Clearly, I was a fool to trust the builtin documentation.&lt;/p&gt;
&lt;p&gt;Okay, maybe the mistake was specifically trusting the default behavior of the &lt;tt class="docutils literal"&gt;settings&lt;/tt&gt; argument.
Okay, that was it, had to get the proper default parser from the &lt;tt class="docutils literal"&gt;frontend&lt;/tt&gt; module.
Now, I have more information than I know what to do with.&lt;/p&gt;
&lt;p&gt;After playing around a bit, I see that there are &lt;tt class="docutils literal"&gt;field_list&lt;/tt&gt; objects, which contain the desired mapping information, several nodes deep.
It is &lt;em&gt;possible&lt;/em&gt;, then, to pull out those nodes and get the mapping, and &lt;em&gt;somehow&lt;/em&gt; convert what remains back to reStructuredText, but...&lt;/p&gt;
&lt;p&gt;It's truly impressive to me how this part of the Python ecosystem has managed to convince me that slopping together a rinky-dink little parser would be less trouble than wiring together existing libraries.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;It is now rather later than I would like, but I have tossed something together that looks plausible.
I'll have to try it out later, but it should be at least close.
And now, I rest.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Leo"></category><category term="writing"></category></entry><entry><title>Coding 2024-02-21</title><link href="https://mwchase.neocities.org/coding-2024-02-21" rel="alternate"></link><published>2024-02-21T05:00:00-05:00</published><updated>2024-02-21T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-02-21:/coding-2024-02-21</id><summary type="html">&lt;p class="first last"&gt;Decisive action, deferred.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, here we are, still dealing with whatever is going on in my head, sinuses, and wherever else.
I just threw together some validation code that should prevent my generator script from doing something weird in the face of a malicious pickle.
This is, I think, somewhere between hard and impossible to handle in the general case, but in this case, I'm specifically looking for a set of strings, so, like, I think there's less than a dozen opcodes that are valid for that purpose.&lt;/p&gt;
&lt;p&gt;The next thing I want to consider is how to handle all of the wrapper-type classes I wrote.
Currently, they have attributes that refer to the &amp;quot;child&amp;quot; classes, and keeping that would mean that the nodes would have to be converted eagerly.
This seems a little unreasonable when it comes to the case of &amp;quot;convert just part of the tree for spellcheck purposes&amp;quot;.
In that context, it's sort of justifiable to make the top level lazy, but I don't know which rationale wins at the lower levels:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;All use cases will require the whole thing eventually&lt;/li&gt;
&lt;li&gt;Doing it all lazily is more consistent&lt;/li&gt;
&lt;li&gt;Something about performance characteristics from allocating a bunch of memory up front versus interleaving more kinds of operations later&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm going to figure &amp;quot;calculating things on the fly means I can add new attributes as properties, instead of as more code in a constructor function&amp;quot;.
So, on the one hand, I know which way I want to go forward.
On the other hand, I've been thinking about this long enough that now it's late and I &lt;em&gt;really&lt;/em&gt; want to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Leo"></category><category term="writing"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2024-02-20</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-02-20" rel="alternate"></link><published>2024-02-20T05:00:00-05:00</published><updated>2024-02-20T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-02-20:/weekly-roundup-2024-02-20</id><summary type="html">&lt;p class="first last"&gt;I sort of forgot how long this was lasting...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I worked out why and how to generate ninja files. And got a headache.&lt;/li&gt;
&lt;li&gt;Thursday: I wrote some helper code for generating ninja files, which is unlikely to help anyone but me. And had a headache.&lt;/li&gt;
&lt;li&gt;Friday: I took that helper code and turned used it to write a Python script that generates the currently-used ninja file for my writing project. While I had a headache.&lt;/li&gt;
&lt;li&gt;Saturday: I switched gears to remembering how to traverse Leo files. And still had a headache.&lt;/li&gt;
&lt;li&gt;Sunday: I figured out how to extract relevant information from the elements in a Leo file. While having a headache.&lt;/li&gt;
&lt;li&gt;Monday: I wrote a Node class capable of traversing down, but not up, a Leo file, which &lt;em&gt;should&lt;/em&gt; be all I need. Still had the headache.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to look into building instances of the higher-level helper classes I wrote before, and into fleshing out their behavior so I can actually be useful.
And dabble with a few other projects.
And take some NSAIDs, sheesh.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="Leo"></category><category term="writing"></category></entry><entry><title>Coding 2024-02-19</title><link href="https://mwchase.neocities.org/coding-2024-02-19" rel="alternate"></link><published>2024-02-19T05:00:00-05:00</published><updated>2024-02-19T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-02-19:/coding-2024-02-19</id><summary type="html">&lt;p class="first last"&gt;Figuring out the way I want to handle XML in generating the outlines.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right.
I think I've covered the adaptation layer over lxml and Leo, so now what's left is taking my draft of the higher-level concepts, and fix them up so they work with the wrapper code I wrote.&lt;/p&gt;
&lt;p&gt;I figure I'll describe what I wrote today in a bit more detail:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;Node&lt;/tt&gt; class now just has an attribute I called &lt;tt class="docutils literal"&gt;t_ref&lt;/tt&gt;, which corresponds to the &lt;tt class="docutils literal"&gt;t&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;tx&lt;/tt&gt; attributes.&lt;/li&gt;
&lt;li&gt;Now there are a bunch of properties, which do things like:&lt;/li&gt;
&lt;li&gt;Get the xml element of type &lt;tt class="docutils literal"&gt;v&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;t&lt;/tt&gt;, depending on what's needed;&lt;/li&gt;
&lt;li&gt;Get the title&lt;/li&gt;
&lt;li&gt;Get the text&lt;/li&gt;
&lt;li&gt;Get the tags&lt;/li&gt;
&lt;li&gt;Get the children&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I've got nothing else I want to think about on this right now, so I'm going to wrap up this and work on other things for a bit.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Leo"></category><category term="writing"></category><category term="short post"></category></entry><entry><title>Coding 2024-02-18</title><link href="https://mwchase.neocities.org/coding-2024-02-18" rel="alternate"></link><published>2024-02-18T05:00:00-05:00</published><updated>2024-02-18T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-02-18:/coding-2024-02-18</id><summary type="html">&lt;p class="first last"&gt;Doing what I can while I deal with this headache or whatever.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I got inspired to look more into generating stuff from Leo files.
I think I mentioned I wanted to key some behavior off of tags, so here's what I found looking at the file.&lt;/p&gt;
&lt;p&gt;Node tags are stored in &lt;tt class="docutils literal"&gt;t&lt;/tt&gt; elements, in an attribute called &lt;tt class="docutils literal"&gt;__node_tags&lt;/tt&gt;.
This attribute contains a hex-encoded string; when decoded to bytes and unpickled, the result is a set containing the tags as strings.&lt;/p&gt;
&lt;p&gt;So, assuming I remember the relationship between &lt;tt class="docutils literal"&gt;v&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;t&lt;/tt&gt; elements correctly, &lt;tt class="docutils literal"&gt;v&lt;/tt&gt; tags lay out the tree structure, and point to &lt;tt class="docutils literal"&gt;t&lt;/tt&gt; elements, which contain the node text and other metadata.
Of the &lt;tt class="docutils literal"&gt;v&lt;/tt&gt; tags that point to a given &lt;tt class="docutils literal"&gt;t&lt;/tt&gt; element, just one contains the &lt;tt class="docutils literal"&gt;vh&lt;/tt&gt; element that gives the node title.
I could be wrong about this in hopefully subtle ways.&lt;/p&gt;
&lt;p&gt;However, for the purposes of this script, I'm going to generally &lt;em&gt;ignore&lt;/em&gt; the node titles, except to find the root of the outline.
So, I want to say &amp;quot;for each &lt;tt class="docutils literal"&gt;v&lt;/tt&gt; that is a &lt;em&gt;direct&lt;/em&gt; child of &lt;tt class="docutils literal"&gt;vnodes&lt;/tt&gt;, find all &lt;tt class="docutils literal"&gt;v&lt;/tt&gt; that are &lt;em&gt;descendants&lt;/em&gt; of &lt;tt class="docutils literal"&gt;vnodes&lt;/tt&gt;, such that their &lt;tt class="docutils literal"&gt;t&lt;/tt&gt; attributes match, and they contain a &lt;tt class="docutils literal"&gt;vh&lt;/tt&gt; element that contains the string &lt;tt class="docutils literal"&gt;&amp;quot;Draft&amp;quot;&lt;/tt&gt;&amp;quot;.
Looks like the child information follows the &lt;tt class="docutils literal"&gt;vh&lt;/tt&gt; element, so I &lt;em&gt;will&lt;/em&gt; need to perform that search in all cases, in case of something non-standard going on with the tree/graph layout.&lt;/p&gt;
&lt;p&gt;In terms of actually printing this stuff out, I should avoid loops, which my whole &amp;quot;tag what kind of node it is&amp;quot; idea should get me for free.&lt;/p&gt;
&lt;p&gt;Anyway, I've just about run out of juice for today, so I'm going to wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Leo"></category><category term="writing"></category><category term="short post"></category></entry><entry><title>Coding 2024-02-17</title><link href="https://mwchase.neocities.org/coding-2024-02-17" rel="alternate"></link><published>2024-02-17T05:00:00-05:00</published><updated>2024-02-17T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-02-17:/coding-2024-02-17</id><summary type="html">&lt;p class="first last"&gt;Quick refresher...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Still dealing with stuff today.
I'd like to work on the conversion code, and one part of that is reminding myself how I wrote some similar code.
Let's see what we've got here...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Parse the file&lt;/li&gt;
&lt;li&gt;Find &amp;quot;vnodes&amp;quot; and &amp;quot;tnodes&amp;quot;&lt;/li&gt;
&lt;li&gt;For all &amp;quot;v&amp;quot; in &amp;quot;vnodes&amp;quot;, I may need to use a helper function to get &amp;quot;the&amp;quot; copy of a &amp;quot;v&amp;quot;, the one with the &amp;quot;vh&amp;quot;&lt;/li&gt;
&lt;li&gt;The structure I'm going with wants the top-level &amp;quot;v&amp;quot; with &amp;quot;vh.text&amp;quot; of &amp;quot;Draft&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To get much further than this, I'm going to need to put together pseudocode for how this should all fit together, fill in the outline enough to be able to execute it, and work through it all manually-ish.&lt;/p&gt;
&lt;p&gt;I'll try to get on that tomorrow; I'm once again really sleepy.
I'm not totally sure I &lt;em&gt;stopped&lt;/em&gt; being sleepy today.
Therefore...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Leo"></category><category term="writing"></category><category term="short post"></category></entry><entry><title>Coding 2024-02-16</title><link href="https://mwchase.neocities.org/coding-2024-02-16" rel="alternate"></link><published>2024-02-16T05:00:00-05:00</published><updated>2024-02-16T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-02-16:/coding-2024-02-16</id><summary type="html">&lt;p class="first last"&gt;Hooray, I can now apply The Wonders Of Metaprogramming to my build process if I feel like it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hooray, I took the weird code I wrote yesterday, and created a version that will regenerate itself if I edit the Python script I wrote.&lt;/p&gt;
&lt;p&gt;At this point, there are a few directions I can take this.
If I can make a better &amp;quot;python&amp;quot; rule, then I can split up the script into smaller files and have them all properly tracked.
That seems pretty straightforward to specify and put together.
(Although if I push it too far, then it kind of makes a case to try switching to tup...)&lt;/p&gt;
&lt;p&gt;The bigger thing to look into is figuring out how I want the generation scripts for the actual artifacts to work.
I don't have the focus to think about that right now, so I should get ready for bed instead.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Leo"></category><category term="writing"></category><category term="short post"></category></entry><entry><title>Coding 2024-02-15</title><link href="https://mwchase.neocities.org/coding-2024-02-15" rel="alternate"></link><published>2024-02-15T05:00:00-05:00</published><updated>2024-02-15T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-02-15:/coding-2024-02-15</id><summary type="html">&lt;p class="first last"&gt;Was there really a point to this? No. Is it likely to make sense to anyone else? Also no. But I did it, and I feel like that counts for something.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I can't &lt;em&gt;really&lt;/em&gt; do too much today, but let's see what I can work out for later.&lt;/p&gt;
&lt;p&gt;I want to write a Python script to generate my &lt;tt class="docutils literal"&gt;build.ninja&lt;/tt&gt; file.
In service of this, I have installed the &amp;quot;ninja_syntax&amp;quot; package.
The key thing for me to use from that package is the &lt;tt class="docutils literal"&gt;Writer&lt;/tt&gt; class, which requires an object with a &lt;tt class="docutils literal"&gt;write(str)&lt;/tt&gt; method, and a &lt;tt class="docutils literal"&gt;close()&lt;/tt&gt; method.
A text file, basically.
I have a set of rules and build statements to generate.
My initial thought is that I should have some kind of helper method for the build statements, so I can just call &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;some_object.pandoc(&amp;quot;story.rst&amp;quot;,&lt;/span&gt; &lt;span class="pre"&gt;output=&amp;quot;build/story.html&amp;quot;)&lt;/span&gt;&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;The idea of wrapping these disparate objects around each other like a matryoshka doll is making my teeth itch a little.
Kind of makes me want to replicate the &lt;tt class="docutils literal"&gt;Compendium&lt;/tt&gt; creation code from MOTR, but that's probably extreme overkill, and yet...&lt;/p&gt;
&lt;p&gt;...
I have just discovered that the interface to ninja_syntax has changed somewhat over the versions, and I assume I should probably just vendor a version that matches my installed version of Ninja.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, after vendoring the file and doing the thing, I should be all set to start writing code to generate a &lt;tt class="docutils literal"&gt;build.ninja&lt;/tt&gt; file.
Sadly, it is late and I am feeling bad &lt;em&gt;in addition to&lt;/em&gt; feeling tired, so I'm going to go lie down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Leo"></category><category term="writing"></category><category term="short post"></category></entry><entry><title>Coding 2024-02-14</title><link href="https://mwchase.neocities.org/coding-2024-02-14" rel="alternate"></link><published>2024-02-14T05:00:00-05:00</published><updated>2024-02-14T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-02-14:/coding-2024-02-14</id><summary type="html">&lt;p class="first last"&gt;The screens have much information about how to build software artifacts, but also, they have the terrible terrible light.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Me several months ago: &amp;quot;Why does the Ninja documentation warn you against hand-writing the files? This is really easy and pleasant.&amp;quot;&lt;/p&gt;
&lt;p&gt;Me now: &amp;quot;The prospect of writing rules for anything remotely tricky makes my skin crawl. ... &lt;em&gt;Oooh...&lt;/em&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;So, yeah, I'm at a bit of a juncture here.
Either I can write code to generate some gnarly nonsense for Ninja to work with, or I can try out something else, like, see if &lt;a class="reference external" href="https://gittup.org/tup/index.html"&gt;tup&lt;/a&gt; acts any nicer when I have ideas like &amp;quot;well, I might want to change the code to translate the draft between different formats, and that should force the build to redo, so I guess I've got to write files like—&amp;quot;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;rule python
    command = python $args &amp;gt; $out

build build/preface.rst: python build.py draft.leo
    args = build.py --section preface draft.leo
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Or however Ninja works, I didn't actually try that out, in part because &lt;tt class="docutils literal"&gt;build.py&lt;/tt&gt; isn't fleshed out enough to do that yet.&lt;/p&gt;
&lt;p&gt;In any case, I think I basically understand how to try and put stuff together for generating Ninja code, which makes it somewhat unfortunate that I feel kind of bad right now actually, and just want to go lie down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Leo"></category><category term="writing"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2024-02-13</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-02-13" rel="alternate"></link><published>2024-02-13T05:00:00-05:00</published><updated>2024-02-13T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-02-13:/weekly-roundup-2024-02-13</id><summary type="html">&lt;p class="first last"&gt;Train of thought jumped the tracks and landed on another set of tracks.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I tried to get the logic right for handling &amp;quot;absolute convergence requires that only countably many values are non-zero&amp;quot;.&lt;/li&gt;
&lt;li&gt;Thursday: I wrote really weird code.&lt;/li&gt;
&lt;li&gt;Friday: I explained why I wrote the really weird code, and what I think makes it weird.&lt;/li&gt;
&lt;li&gt;Saturday: I got sidetracked away from Dafny to work on build pipelines for a novel draft.&lt;/li&gt;
&lt;li&gt;Sunday: I tried to figure out the minimum I need from these pipelines, so I can get back to writing.&lt;/li&gt;
&lt;li&gt;Monday: I went over what I'm trying to do there again, and put together the beginnings of a basic idea of how this all should work.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'll keep working on &lt;em&gt;something&lt;/em&gt;, that's for sure.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Dafny"></category><category term="Concrete Mathematics"></category><category term="Python"></category><category term="writing"></category></entry><entry><title>Coding 2024-02-12</title><link href="https://mwchase.neocities.org/coding-2024-02-12" rel="alternate"></link><published>2024-02-12T05:00:00-05:00</published><updated>2024-02-12T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-02-12:/coding-2024-02-12</id><summary type="html">&lt;p class="first last"&gt;Closing in on a design with a speed normally reserved for something that could get spooked.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;First pass at how to represent all of this:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;There is a &lt;strong&gt;draft&lt;/strong&gt;, made up of multiple &lt;strong&gt;documents&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The document type can be a union if need be, but I'd like to try to come up with a protocol.&lt;/li&gt;
&lt;li&gt;Specific types are... let's say &lt;tt class="docutils literal"&gt;FictionOutline&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;ReferenceWork&lt;/tt&gt;.
(The latter is needed for a factual description of the neopronoun usage. That... shouldn't have character arcs.)&lt;/li&gt;
&lt;li&gt;For now, I want to structure the &lt;tt class="docutils literal"&gt;ReferenceWork&lt;/tt&gt; pretty loosely; the current draft just has thirty-something lines of text that should appear in the preface, so I'd like to be able to just slap those into a node and call it done.
Hm.
Not sure how I want to set up the titles...
This all seemed obvious in my head, but somehow I ended up tying my mental model into knots.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Like, if I say &amp;quot;the pre-processing should strip out Leo's &lt;tt class="docutils literal"&gt;&amp;#64;&lt;/tt&gt; directives&amp;quot;, then I can include metadata at the topmost level and title it like that.&lt;/p&gt;
&lt;p&gt;All right, thinking about this more...
It might make sense to just work with undifferentiated node types to start with, and then work on narrowing things down as I find unique behavior/validation logic.
Although I can kind of anticipate some things.
Like &amp;quot;I want to define a bunch of metadata for each chapter, such that there is a set of key names for which any given key is either given a value by every chapter or none of them&amp;quot;.&lt;/p&gt;
&lt;p&gt;So, I can try working with:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Draft&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;ReferenceWork&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;FictionOutline&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;FictionBook&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;FictionChapter&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Scene&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Summary&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The next thing to figure out is where I put all of this stuff.
On reflection, it probably shouldn't be in the tasks file, since I'm going to want to call it from the ninja build, so I guess I need to set up a virtual environment and requirements file for this stuff.
I'll get on most of that later.
Right now, I once again need to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Leo"></category><category term="writing"></category></entry><entry><title>Coding 2024-02-11</title><link href="https://mwchase.neocities.org/coding-2024-02-11" rel="alternate"></link><published>2024-02-11T05:00:00-05:00</published><updated>2024-02-11T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-02-11:/coding-2024-02-11</id><summary type="html">&lt;p class="first last"&gt;Gathering requirements&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, writing this early in case my laptop has another little &lt;em&gt;accident&lt;/em&gt; like it did about half an hour ago.
I've currently shifted gears to considering how I might convert my disorganized draft file into a more comprehensible outline file.&lt;/p&gt;
&lt;p&gt;Here is the hierarchy as I see it at a glance:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Top-level: title&lt;/li&gt;
&lt;li&gt;Second-level: preface;
the preface contains explanatory notes about the word choices in the book(s);
it therefore is needed to understand/contextualize the story proper, but it does not fit into the structure of the rest of the outline;
spell-checking it will require a different dictionary from the rest of the book;
there are some parts of the &amp;quot;preface&amp;quot; that are more properly &amp;quot;notes&amp;quot;, and should be transcribed into a separate branch of the .leo file's tree structure.&lt;/li&gt;
&lt;li&gt;Second-level: main story;
the actual contents here are a muddle of notes-to-self, outline fragments, actual text meant to show up in the draft, and who knows what else;
of interest from the notes is that I call out how a specific event should be followed by a chapter break.&lt;/li&gt;
&lt;li&gt;Lower-level: chapters;
not currently planned out except in the broadest contours;
I'm aware that whether to have chapters is a choice, but the choice of chapter break I have in there is &lt;em&gt;really amusing&lt;/em&gt; to me, so it's a choice I'm making in the affirmative;
I'll reconsider if I end up with &amp;quot;Chapter 2: Everything Else&amp;quot;;
the other thing I need to ponder some is the question of chapter titles, subtitles, quotations, etc.&lt;/li&gt;
&lt;li&gt;Lower-level: &amp;quot;scenes&amp;quot; and &amp;quot;summary&amp;quot;;
Rather than my draft, this is based on the writing advice I've been reading;
The idea here is that I would like to reason about smaller parts of the narrative than a single chapter, so I should call them out here.&lt;/li&gt;
&lt;li&gt;Other levels: I am aware that I &lt;em&gt;could&lt;/em&gt; come up with groupings of chapters (I probably will end up needing &amp;quot;book&amp;quot; to be honest, because the draft ends on a sequel hook), but I don't want to get ahead of myself;
similarly, maybe there are divisions that I'd like between chapter and scene, or within scene, but my gut feeling is that I should try working with book-chapter-scene, and see what that gets me;
(the obvious things that occur to me are &amp;quot;paragraph&amp;quot; and &amp;quot;sentence&amp;quot;, which I hope illustrate why I think it may be best to hold off on dividing things up that finely).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If we assume that I'm going with book-chapter-scene, then I've got some ideas for what I need to get things right.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Books must have a title, and this title must end up in the generated documents.&lt;/li&gt;
&lt;li&gt;Chapters may have a title etc, which should end up in the generated documents.&lt;/li&gt;
&lt;li&gt;I would like chapters to be consistent about what such information they have associated with them.&lt;/li&gt;
&lt;li&gt;Chapters are also numbered.&lt;/li&gt;
&lt;li&gt;It is likely but not certain that I would like to associate different kinds of metadata with scenes, such as which arcs they relate to.&lt;/li&gt;
&lt;li&gt;Some of this metadata is best expressed through references to scenes in other parts of the tree.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Summing things up:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Every division between book and chapter, inclusive, represents a visible distinction in the final output, including, for example, specific formatting to call out the boundary.&lt;/li&gt;
&lt;li&gt;These nodes are to be named with a word or abbreviation indicating their role (for verification purposes), and a short summary of their contents, for aid in navigating the tree.&lt;/li&gt;
&lt;li&gt;The contents of these nodes are to consist of some lines of metadata, followed by a more detailed summary of the child nodes.&lt;/li&gt;
&lt;li&gt;The contents of a node should be fully accounted for by its direct children.&lt;/li&gt;
&lt;li&gt;For evaluating the outline, I would like the ability to mark specific nodes as &amp;quot;included literally&amp;quot; or something; such nodes should not be allowed to have child nodes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I wish to process all of this into a few different forms:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;preface only&lt;/li&gt;
&lt;li&gt;story without preface&lt;/li&gt;
&lt;li&gt;story with preface (which is then processed into other forms)&lt;/li&gt;
&lt;li&gt;absolutely everything (not sure the exact way this should present everything, so I'd like to hold off for now)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To accomplish this, I'm pretty sure I need:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Use of &lt;strong&gt;node tags&lt;/strong&gt; for repeated scalar or mostly-scalar metadata.&lt;/li&gt;
&lt;li&gt;Use of &lt;strong&gt;inline metadata&lt;/strong&gt; for key-value metadata, unless there is some alternative.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I think this is all solid as an idea, but I need to take some time to sketch it out on paper for a bit before I can implement it.
And none of that is happening now, because it's late again.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Leo"></category><category term="writing"></category></entry><entry><title>Coding 2024-02-10</title><link href="https://mwchase.neocities.org/coding-2024-02-10" rel="alternate"></link><published>2024-02-10T05:00:00-05:00</published><updated>2024-02-10T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-02-10:/coding-2024-02-10</id><summary type="html">&lt;p class="first last"&gt;The category and tags are all wonky now, but I feel committed, so oh well.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, this is interesting.
I don't have the proper context for putting things together in terms of absolute convergence, but when I tried drafting the required predicates, a few things jumped out at me:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The use of &amp;quot;counting&amp;quot; values makes the structure of the predicates simpler.&lt;/li&gt;
&lt;li&gt;This simplification means that I need different predicates supporting it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'll need some time to collect my thoughts on this.
So, for at least a little bit, I'm going to put this project down and focus on some other things.&lt;/p&gt;
&lt;p&gt;In particular, I've got a novel I've been writing, and the current draft document is unwieldy to navigate.
I've been reading about writing advice, and trying to figure out how to change my process to address the issues I'm having.&lt;/p&gt;
&lt;p&gt;Currently, I have a reStructuredText file that contains a combination of &amp;quot;actual draft text&amp;quot;, [text in brackets] that indicates summarized ideas of what could go in, and reStructuredText comments that indicate structure that doesn't have either of the former two backing it up.
I have a tasks.py file that defines tasks to check the spelling of the file; this is necessary because I need to allow some words, and forbid others.
(Weirdly enough, when I was trying to forbid particular words, hunspell wouldn't acknowledge those words, so I needed an extra step to find them with a regular expression.)
And another to convert the file to html and docx, as handled by &lt;a class="reference external" href="https://ninja-build.org/"&gt;ninja&lt;/a&gt;, via a hand-written file.&lt;/p&gt;
&lt;p&gt;What I'm considering trying to do is to convert the draft to an outline in &lt;a class="reference external" href="https://leoeditor.com/"&gt;Leo&lt;/a&gt;, and write code to process the .leo file into an rst file that can then feed through the other steps.
What I need to figure out before embarking on trying to do all that is, what structure do I want to put the outline in?
What would be helpful for me?&lt;/p&gt;
&lt;p&gt;Here are my quick thoughts, untested ideas:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Have the outline correspond to the hierarchical organization of the draft.&lt;/li&gt;
&lt;li&gt;Figure out how I might attempt to add in some helpful metadata, but don't worry too much if I can't figure out how to make that practical.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, going forward, not now, but soon, my plan would be to transcribe the draft and some scraps of exposition into a .leo file, with one section for the outline, and another for notes.
Sort of like a very un-flashy Scrivener file, since I don't feel like resuscitating an old laptop and trying to get Scrivener working again.
There are still some questions to answer here about the details of the structure, and I'll try to figure them out later.
For now, I've pushed things way too late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Dafny"></category><category term="Concrete Mathematics"></category></entry><entry><title>Coding 2024-02-09</title><link href="https://mwchase.neocities.org/coding-2024-02-09" rel="alternate"></link><published>2024-02-09T05:00:00-05:00</published><updated>2024-02-09T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-02-09:/coding-2024-02-09</id><summary type="html">&lt;p class="first last"&gt;It's a little weird that this works, except that there's no reason it &lt;em&gt;shouldn't&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Here we go, I've verified that my weird Dafny code appears to work, so I'm ready to talk about it.&lt;/p&gt;
&lt;p&gt;The goal:
Functions that return other functions which meaningfully depend on their outputs.&lt;/p&gt;
&lt;p&gt;The problem:
Dafny &lt;em&gt;appears&lt;/em&gt; not to support creating closures.
I tried the workaround of &amp;quot;make an object&amp;quot;, and that ran into &amp;quot;can't allocate in functions&amp;quot; (which, from my basic experience with Rust, I guess makes sense (please note that Rust functions and Dafny functions are pretty different things)), but also &amp;quot;I tried returning a bound function from an instance, and that didn't seem to work, oh well&amp;quot;.&lt;/p&gt;
&lt;p&gt;The messed-up workaround:
While Dafny, if I'm reading the grammar documentation correctly, doesn't have a way to declare a function inside a function, it does have the ability to use &lt;tt class="docutils literal"&gt;ensures&lt;/tt&gt; clauses to describe &lt;em&gt;what properties a function capable of doing such a thing would have&lt;/em&gt;, and then just, don't write a body for the function, and it will successfully reason about whatever currying-based nonsense you ask it to.&lt;/p&gt;
&lt;p&gt;I suppose another possible approach would be to write a predicate describing the desired relationships, then using the predicate with an assignment statement to create a fake closure through Prolog Nonsense.
I think that approach would be more flexible in some key ways, but I don't think I need them, so I'll keep on with what I'm doing now.
And if I do end up needing the flexibility, I can write the predicate, replace the &lt;tt class="docutils literal"&gt;ensures&lt;/tt&gt; clause with it, and move on.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;All right, I've put together a few more of these helper functions.
At this point, I'm just about ready to redo the absolute convergence predicates, knowing what I now know about how I want to set things up.
I could try getting on with that now, or...&lt;/p&gt;
&lt;p&gt;Or I could say &amp;quot;You know what, that's enough for now, I want a break from screens and to get ready for bed.&amp;quot;
Probably the smart play.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Dafny"></category><category term="Concrete Mathematics"></category></entry><entry><title>Coding 2024-02-08</title><link href="https://mwchase.neocities.org/coding-2024-02-08" rel="alternate"></link><published>2024-02-08T05:00:00-05:00</published><updated>2024-02-08T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-02-08:/coding-2024-02-08</id><summary type="html">&lt;p class="first last"&gt;A potential victory in the fight against Dafny's syntax(!)&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, so.&lt;/p&gt;
&lt;p&gt;It turns out one of the things I wanted to do last time isn't straightforward to accomplish in Dafny, but I may have found a way to do it.
An extremely cursed, messed-up-seeming way.&lt;/p&gt;
&lt;p&gt;I don't feel like describing what I was trying to do, or verifying that my attempt at a fix actually works.
I'll do that later.&lt;/p&gt;
&lt;p&gt;For now, I'm going to read and wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Dafny"></category><category term="Concrete Mathematics"></category><category term="short post"></category></entry><entry><title>Coding 2024-02-07</title><link href="https://mwchase.neocities.org/coding-2024-02-07" rel="alternate"></link><published>2024-02-07T05:00:00-05:00</published><updated>2024-02-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-02-07:/coding-2024-02-07</id><summary type="html">&lt;p class="first last"&gt;Pardon my extremely unmotivated notational choices.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, last time, I—&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Ahem&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;mentioned that working with absolute convergence requires coming up with a means of counting the non-zero elements of an infinite set.&lt;/p&gt;
&lt;p&gt;So, to try to formalize this before I trip all over myself in the code...&lt;/p&gt;
&lt;p&gt;Given a set &lt;tt class="docutils literal"&gt;S&lt;/tt&gt; and a partial function &lt;tt class="docutils literal"&gt;σ&lt;/tt&gt; from &lt;tt class="docutils literal"&gt;S&lt;/tt&gt; to ℝ.
We want a pair of functions between &lt;tt class="docutils literal"&gt;S&lt;/tt&gt; and ℕ, such that:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;For a given &lt;tt class="docutils literal"&gt;s&lt;/tt&gt; in &lt;tt class="docutils literal"&gt;S&lt;/tt&gt;, if &lt;tt class="docutils literal"&gt;σ(s)&lt;/tt&gt; is non-zero, &lt;tt class="docutils literal"&gt;s&lt;/tt&gt; is mapped to an integer &lt;tt class="docutils literal"&gt;n&lt;/tt&gt;, and &lt;tt class="docutils literal"&gt;n&lt;/tt&gt; is mapped back to &lt;tt class="docutils literal"&gt;s&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;σ(s)&lt;/tt&gt; is defined for all &lt;tt class="docutils literal"&gt;s&lt;/tt&gt; in &lt;tt class="docutils literal"&gt;S&lt;/tt&gt;; extend &lt;tt class="docutils literal"&gt;σ&lt;/tt&gt; by giving it a zero value for all input values not in &lt;tt class="docutils literal"&gt;S&lt;/tt&gt;, thereby producing a total function.&lt;/li&gt;
&lt;li&gt;For a given &lt;tt class="docutils literal"&gt;n&lt;/tt&gt; in ℕ, if &lt;tt class="docutils literal"&gt;n&lt;/tt&gt; is mapped to an &lt;tt class="docutils literal"&gt;s&lt;/tt&gt; in &lt;tt class="docutils literal"&gt;S&lt;/tt&gt; such that &lt;tt class="docutils literal"&gt;σ(s)&lt;/tt&gt; is non-zero, then &lt;tt class="docutils literal"&gt;s&lt;/tt&gt; is mapped back to &lt;tt class="docutils literal"&gt;n&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The computational artifact of interest is the mapping from ℕ to &lt;tt class="docutils literal"&gt;S&lt;/tt&gt;.
Let us assume it can be a partial function.
We can combine such a mapping with &lt;tt class="docutils literal"&gt;σ&lt;/tt&gt; to obtain a &lt;em&gt;total&lt;/em&gt; function from ℕ to ℝ, which, if the sum is absolutely convergent, it is identical to summing over &lt;tt class="docutils literal"&gt;S&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;We can avoid having to define an explicit inverse function, by using existential quantifiers, I think.&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;σ(s)&lt;/tt&gt; is non-zero implies that there exists an &lt;tt class="docutils literal"&gt;n&lt;/tt&gt;, and this &lt;tt class="docutils literal"&gt;n&lt;/tt&gt; must be unique, which is equivalent to &amp;quot;for all &lt;tt class="docutils literal"&gt;n'&lt;/tt&gt; that correspond to &lt;tt class="docutils literal"&gt;s&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;n == n'&lt;/tt&gt;&amp;quot;.&lt;/p&gt;
&lt;p&gt;I'm going to need to think carefully about whether the first and third bullet points are equivalent, because I tried to relax the requirements from &amp;quot;inverse functions&amp;quot;, and it's muddling my thinking.
Right now I'm leaning towards &amp;quot;the previous paragraph is all I need&amp;quot;, but, we'll see after I've had some rest.&lt;/p&gt;
&lt;p&gt;(Since I've thought about this hard enough that now I just really really want to switch gears and let it all percolate for a bit.)&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Dafny"></category><category term="Concrete Mathematics"></category></entry><entry><title>Weekly Roundup 2024-02-06</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-02-06" rel="alternate"></link><published>2024-02-06T05:00:00-05:00</published><updated>2024-02-06T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-02-06:/weekly-roundup-2024-02-06</id><summary type="html">&lt;p class="first last"&gt;I accomplished a quantity of things that I find somewhat surprising.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I wrote up a list of properties a binary relation can have, that seemed either useful or easy to describe.&lt;/li&gt;
&lt;li&gt;Thursday: I learned the basics of Dafny project files, which seem really useful for anything involving more than one file, &lt;em&gt;and&lt;/em&gt; anything involving particular tweaks to the verification process.&lt;/li&gt;
&lt;li&gt;Friday: I tried to prove some bedrock theorems in Dafny, and had a bad time with that, but I did learn a little about the module system.&lt;/li&gt;
&lt;li&gt;Saturday: My day was too busy to do much that interested me.&lt;/li&gt;
&lt;li&gt;Sunday: I pulled Demiurgent Business out of mothballs to publish the jam and jam-adjacent versions, which aren't really fleshed-out, or tested, but they are &lt;em&gt;short&lt;/em&gt;, at least.&lt;/li&gt;
&lt;li&gt;Monday: I figured out how to prove that bedrock stuff from earlier.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, maybe I'll keep on with this, maybe I'll wind up glomming onto one of the other half-dozen-plus projects I have lying around.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Dafny"></category><category term="game design"></category></entry><entry><title>Coding 2024-02-05</title><link href="https://mwchase.neocities.org/coding-2024-02-05" rel="alternate"></link><published>2024-02-05T05:00:00-05:00</published><updated>2024-02-05T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-02-05:/coding-2024-02-05</id><summary type="html">&lt;p class="first last"&gt;The whole setup still looks a little strange.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right.
I don't have time to explain it, but, by following some suggestions online, I managed to prove that summing from a series with indices drawn from a set, the order that the indices are chosen doesn't matter.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Only abstractly, and not with IEEE floats as the output, of course.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Anyway, with that, and a few other things I wrote, I'm most of the way towards being ready to work on the absolute convergence stuff again.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Doesn't the focus on countable sets in the context of absolute convergence require some form of bijective mapping to the naturals, thereby rendering the whole detour to avoid imposing an ordering on the sets of indices pointless?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;At least I got some experience wrangling Dafny.&lt;/p&gt;
&lt;p&gt;Anyway, it's late and I'm tired.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Dafny"></category><category term="Concrete Mathematics"></category><category term="short post"></category></entry><entry><title>Demiurgent Business 2024-02-04</title><link href="https://mwchase.neocities.org/demiurgent-business-2024-02-04" rel="alternate"></link><published>2024-02-04T05:00:00-05:00</published><updated>2024-02-04T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-02-04:/demiurgent-business-2024-02-04</id><summary type="html">&lt;p class="first last"&gt;Life hack: write the bulk of the post like three months ago, and then, this is the important part, &lt;em&gt;actually publish it&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;This weekend is probably going to be a bit of a wash, so I decided to put out some stuff I put on my tumblr a few months ago.
See, during my NaNo (which failed for various reasons that I want to think about at some point...), there was a 200-word RPG jam, and I ended up taking some time to strip Demiurgent Business to the barest essentials.
I ended up with two versions:&lt;/p&gt;
&lt;div class="section" id="jam-version-1"&gt;
&lt;h2&gt;Jam-version-1&lt;/h2&gt;
&lt;div class="section" id="demiurgent-business"&gt;
&lt;h3&gt;Demiurgent Business&lt;/h3&gt;
&lt;p&gt;For 3+ players&lt;/p&gt;
&lt;p&gt;Each player picks 1 [Supernatural] trait and 1 [Character] trait, then names and describes the resulting character.&lt;/p&gt;
&lt;p&gt;Example [Supernatural] traits:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Time-traveling&lt;/li&gt;
&lt;li&gt;Android&lt;/li&gt;
&lt;li&gt;Psychic&lt;/li&gt;
&lt;li&gt;Alien&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example [Character] traits:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Honor student&lt;/li&gt;
&lt;li&gt;Athlete&lt;/li&gt;
&lt;li&gt;Slacker&lt;/li&gt;
&lt;li&gt;Tech whiz&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The group designs the Demiurge: agree on two [Character] traits, then name and describe the resulting character.&lt;/p&gt;
&lt;p&gt;One player starts as the Demiurge; pass the role clockwise when a new scene begins.&lt;/p&gt;
&lt;p&gt;When a scene begins, set Gnosis to 0.
The Demiurge describes the scene's goal.
The other players help the Demiurge fulfill that goal.&lt;/p&gt;
&lt;p&gt;The Demiurge describes obstacles that arise.
The other players describe how their characters resolve the obstacle.
For every [Character] trait involved in the resolution, decrement Gnosis to a minimum of 0.
Then, for every [Supernatural] trait involved, increment Gnosis.
Whenever Gnosis increases to 3, the Demiurge may make 1 mundane change to the setting.
Whenever Gnosis increases to 6, the Demiurge may make 1 mundane or miraculous change to the setting.
When Gnosis increases to 9, the Demiurge achieves Apotheosis; the Demiurge's current player wins.
Otherwise, the scene ends when the other players determine that the goal is completed, or impossible.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="too-long-to-be-jam-version-2"&gt;
&lt;h2&gt;Too-long-to-be-jam-version-2&lt;/h2&gt;
&lt;div class="section" id="demiurgent-business-1"&gt;
&lt;h3&gt;Demiurgent Business&lt;/h3&gt;
&lt;p&gt;For 3+ players&lt;/p&gt;
&lt;p&gt;Each player picks 1 [Supernatural] trait and 1 [Character] trait, then names and describes the resulting character.&lt;/p&gt;
&lt;p&gt;Example [Supernatural] traits:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Time-traveling&lt;/li&gt;
&lt;li&gt;Android&lt;/li&gt;
&lt;li&gt;Psychic&lt;/li&gt;
&lt;li&gt;Alien&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example [Character] traits:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Honor student&lt;/li&gt;
&lt;li&gt;Athlete&lt;/li&gt;
&lt;li&gt;Slacker&lt;/li&gt;
&lt;li&gt;Tech whiz&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The group designs the Demiurge: agree on two [Character] traits, then name and describe the resulting character.&lt;/p&gt;
&lt;p&gt;One player starts as the Demiurge; when a new scene begins, the player who relied most on their [Supernatural] trait in the previous scene becomes the Demiurge.&lt;/p&gt;
&lt;p&gt;When a scene begins, set Gnosis to 0.
The Demiurge describes the scene's goal.
The other players help the Demiurge fulfill that goal.&lt;/p&gt;
&lt;p&gt;The Demiurge describes obstacles that arise.
The other players describe how their characters resolve the obstacle.
For every [Character] trait involved in the resolution, decrement Gnosis to a minimum of 0.
Then, for every [Supernatural] trait involved, increment Gnosis.
Whenever Gnosis increases to 3, the Demiurge may make 1 mundane change to the setting.
Whenever Gnosis increases to 6, the Demiurge may make 1 mundane or miraculous change to the setting.
When Gnosis increases to 9, the Demiurge achieves Apotheosis; the Demiurge's current player wins.
Otherwise, the scene ends when the other players determine that the goal is completed, or impossible.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="commentary"&gt;
&lt;h2&gt;Commentary&lt;/h2&gt;
&lt;p&gt;First off, I haven't tested either version of this, so it probably has &lt;em&gt;issues&lt;/em&gt;.
In particular, there's the issues around the differences between the two versions.
I made the changes because I wanted to try to make play more fast-paced and competitive, but I'm worried it could lead to a kingmaker dynamic.&lt;/p&gt;
&lt;p&gt;Going forward, I want to try to come up with tables to roll on for [Supernatural] and [Character] traits, as well as the ability to mad-libs together a scene's goal, so that sometimes the players have to figure out what sub-goals and obstacles there may be to accomplish &amp;quot;Film a Website&amp;quot;.&lt;/p&gt;
&lt;p&gt;And once that's done, there's the possibility of putting together alternative tables for [Character] traits and goals, allowing for supplements that are somewhat analogous to Fiasco playbooks, thus allowing for scenarios like &amp;quot;The Demiurge is Beret Guy from xkcd, and the player characters are employees at his strange start-up.&amp;quot;&lt;/p&gt;
&lt;p&gt;Anyway, I'll keep that all in mind.
For now, I'm actually writing this early and basically banking it against tonight.
Maybe I'll add something after we travel, maybe not.
We'll see.&lt;/p&gt;
&lt;p&gt;Nah, I'm good.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
&lt;/div&gt;
</content><category term="Demiurgent Business"></category><category term="release"></category></entry><entry><title>Diary 2024-02-03</title><link href="https://mwchase.neocities.org/diary-2024-02-03" rel="alternate"></link><published>2024-02-03T05:00:00-05:00</published><updated>2024-02-03T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-02-03:/diary-2024-02-03</id><summary type="html">&lt;p class="first last"&gt;Oh well, maybe tomorrow, but leaning towards not.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I had a whole bunch of stuff that I had or wanted to take care of today, and that ultimately translated into &amp;quot;No time to consider stuff for Dafny.&amp;quot;&lt;/p&gt;
&lt;p&gt;I'm traveling tomorrow and the day after, and my plan with that is to either get &lt;em&gt;something&lt;/em&gt; done with Dafny (either proving some basic facts, or fixing up the files I wrote before I understood what project files were capable of), or to write up some stuff from a few months ago that I may as well at some point, hopefully soon.&lt;/p&gt;
&lt;p&gt;Right now, though, I want to close stuff down and get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2024-02-02</title><link href="https://mwchase.neocities.org/coding-2024-02-02" rel="alternate"></link><published>2024-02-02T05:00:00-05:00</published><updated>2024-02-02T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-02-02:/coding-2024-02-02</id><summary type="html">&lt;p class="first last"&gt;Question: is Dafny &amp;quot;of the belief&amp;quot; that the ghost version takes on a single value? Because, if so, why isn't the lemma &amp;quot;obvious&amp;quot;, and if not, what the heck does any of this &lt;em&gt;mean&lt;/em&gt;?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Instead of rewriting my following-along code, I wrote an &lt;tt class="docutils literal"&gt;IsTotalOrder&lt;/tt&gt; predicate in terms of named properties, and now I'm thinking about the finite sum stuff.
What I'd like to figure out is if there's some way to establish the equivalence between the explicitly ordered non-ghost version, and the unordered ghost version.&lt;/p&gt;
&lt;p&gt;Going to speculate on ways to do that.&lt;/p&gt;
&lt;p&gt;Suppose I do induction that &amp;quot;builds up&amp;quot; stuff.
Given a set &lt;tt class="docutils literal"&gt;s&lt;/tt&gt; and an order &lt;tt class="docutils literal"&gt;r&lt;/tt&gt;, I want to build things up something like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;If &lt;tt class="docutils literal"&gt;s == {}&lt;/tt&gt;, then both versions sum to &lt;tt class="docutils literal"&gt;0.0&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Suppose both versions have the same sum for some &lt;tt class="docutils literal"&gt;s&lt;/tt&gt;.
Now, given an element &lt;tt class="docutils literal"&gt;k&lt;/tt&gt; (not in &lt;tt class="docutils literal"&gt;s&lt;/tt&gt;?), I want to try establishing that &lt;tt class="docutils literal"&gt;s + {k}&lt;/tt&gt; increases both results by &lt;tt class="docutils literal"&gt;summand(k)&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hm, I've got some time to try this out.
I also need to get a handle on the import system in Dafny, but I want to work that out at some point anyway...&lt;/p&gt;
&lt;p&gt;&amp;quot;By default (in the absence of any export set declarations) all the names declared in a module are available outside the module using the &lt;tt class="docutils literal"&gt;import&lt;/tt&gt; mechanism.&amp;quot;&lt;/p&gt;
&lt;p&gt;Neat, thank you for that.&lt;/p&gt;
&lt;p&gt;&amp;quot;&lt;tt class="docutils literal"&gt;Error: module Relation does not exist&lt;/tt&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;No thank you for &lt;em&gt;that&lt;/em&gt;.
What am I doing wrong here...
Tinker, fiddle...&lt;/p&gt;
&lt;p&gt;&amp;quot;&lt;tt class="docutils literal"&gt;Error: Import declaration uses same name as a module in the same scope: Relation&lt;/tt&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;Huh.
That implies that it doesn't really work the way that I think it does...
Let's try what it looks like that should allow.&lt;/p&gt;
&lt;p&gt;Huh, yeah, module names are just globally available, and import does rebinding?
That... freaks me out a little bit.&lt;/p&gt;
&lt;p&gt;Anyway, I got the code reuse wrangled, copied over the code, and now I'm working on constructing a lemma to prove that addition of a finite collection of numbers works the way everyone knows it does.
Dafny does not yet know it, at least not in a way germane to the way I phrased the lemma.&lt;/p&gt;
&lt;p&gt;Unfortunately, it's now late, and I'll have to wait until sometime tomorrow to get this worked out, if not later.&lt;/p&gt;
&lt;p&gt;Bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Dafny"></category><category term="Concrete Mathematics"></category><category term="short post"></category></entry><entry><title>Coding 2024-02-01</title><link href="https://mwchase.neocities.org/coding-2024-02-01" rel="alternate"></link><published>2024-02-01T05:00:00-05:00</published><updated>2024-02-01T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-02-01:/coding-2024-02-01</id><summary type="html">&lt;p class="first last"&gt;Extremely excited to rewrite my &lt;tt class="docutils literal"&gt;tasks.py&lt;/tt&gt; file to run &lt;tt class="docutils literal"&gt;dafny verify path/to/dfyconfig.toml&lt;/tt&gt; as much as possible.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was kind of out of it today, but I managed to get all of the baseline definitions I was thinking about in.
At this point, I just need to define the total order stuff, and move along.&lt;/p&gt;
&lt;p&gt;The more important thing is, I now get the (very very very) basics of Dafny projects.
At this point, it makes sense to try to rewrite my existing &amp;quot;following-along&amp;quot; code to be consistent with the style guide, and to try to handle verifying it with as few project files as possible.&lt;/p&gt;
&lt;p&gt;Well, I'll get to that later, and get to bed now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Dafny"></category><category term="Concrete Mathematics"></category><category term="short post"></category></entry><entry><title>Coding 2024-01-31</title><link href="https://mwchase.neocities.org/coding-2024-01-31" rel="alternate"></link><published>2024-01-31T05:00:00-05:00</published><updated>2024-01-31T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-01-31:/coding-2024-01-31</id><summary type="html">&lt;p class="first last"&gt;Hoarding property definitions like a &lt;em&gt;really weird&lt;/em&gt; dragon.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got other stuff I want to put up entries about this week, but today was a lot, so instead I'm going to do some planning for the module separation I want to do.&lt;/p&gt;
&lt;p&gt;I'm right now focusing on the total ordering relation, and for the fun(?) of it, I'd like to define that predicate in the context of other predicates applying to binary relations.
Let's see which properties may be of interest:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Reflexive and irreflexive&lt;/li&gt;
&lt;li&gt;Antisymmetric, asymmetric, symmetric&lt;/li&gt;
&lt;li&gt;Connected and strongly connected&lt;/li&gt;
&lt;li&gt;Dense&lt;/li&gt;
&lt;li&gt;Transitive and antitransitive&lt;/li&gt;
&lt;li&gt;Quasitransitive? Like, I can define it, but I'm not sure offhand what I'd do with it.&lt;/li&gt;
&lt;li&gt;Serial? Like, sure.&lt;/li&gt;
&lt;li&gt;Euclidean?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These properties should be a good baseline for putting things together, and then building more elaborate properties on top of them.&lt;/p&gt;
&lt;p&gt;I'll try to get on that in the next few days.
For now...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Dafny"></category><category term="Concrete Mathematics"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2024-01-30</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-01-30" rel="alternate"></link><published>2024-01-30T05:00:00-05:00</published><updated>2024-01-30T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-01-30:/weekly-roundup-2024-01-30</id><summary type="html">&lt;p class="first last"&gt;Actually trying to work with some of this rigorously is still a real shock to the system.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I had some troubles with Dafny, so I set my sights a little lower.&lt;/li&gt;
&lt;li&gt;Thursday: Screen headache.&lt;/li&gt;
&lt;li&gt;Friday: I started trying to take rigorous definitions of limits, and convert them to Dafny code.&lt;/li&gt;
&lt;li&gt;Saturday: I came up with a game plan for (part of) the infinite limit representation.&lt;/li&gt;
&lt;li&gt;Sunday: I ran into bizarre issues with Dafny that sound like bugs, or at least missing features, but I lack the context to understand the stuff about how it's &amp;quot;supposed to work&amp;quot;, so eh.&lt;/li&gt;
&lt;li&gt;Monday: I got past the issues, made everything verify, then looked at the file and thought &amp;quot;that's too big; I should learn how Dafny projects work so I can break this into at least four files&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'll probably do that; I also have a few other things that I've started messing with recently, and a few things that I've been messing with on and off.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Concrete Mathematics"></category><category term="Dafny"></category></entry><entry><title>Coding 2024-01-29</title><link href="https://mwchase.neocities.org/coding-2024-01-29" rel="alternate"></link><published>2024-01-29T05:00:00-05:00</published><updated>2024-01-29T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-01-29:/coding-2024-01-29</id><summary type="html">&lt;p class="first last"&gt;I'm not retyping those names.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did a bunch of admin work stuff today, and then played video games, so I haven't done a ton of work with the Dafny code.
Instead of trying to rush into anything, I'm going to plan a little for later:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;IsTotalOrder&lt;/tt&gt; seems like a generally useful predicate.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;ThereIsAMinimum&lt;/tt&gt; seems like a special-purpose lemma, which should get bundled up as a private member of the module that provides...&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;SumOver&lt;/tt&gt;, which I would like to figure out some way to provide an equivalent &lt;tt class="docutils literal"&gt;ghost&lt;/tt&gt; version of that doesn't need an ordering.
(The trick is &lt;em&gt;proving&lt;/em&gt; that the two versions are equivalent.)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;LessEqual&lt;/tt&gt; is a basic helper predicate that bundles with some of the predicates below, but I wouldn't mind getting rid of it if I work out the proof I mention above.&lt;/li&gt;
&lt;li&gt;I've got a bunch of helper things that I don't know how generally useful they are: &lt;tt class="docutils literal"&gt;HasMinimum&lt;/tt&gt;, and &lt;tt class="docutils literal"&gt;Minumum&lt;/tt&gt; are needed for how I'm trying to define absolute convergence, but I don't know if anything else has reason to refer to them.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;IRHelper&lt;/tt&gt; is only needed because &lt;tt class="docutils literal"&gt;InclusiveRange&lt;/tt&gt; was having troubles; wait, can I define nested functions in Dafny, because that would be handy here.
Either way, these together represent a single coherent concept that seems generally useful.
(Part of that usefulness is that I couldn't be bothered to figure out the right number theory proof for &amp;quot;there are a finite number of integers between any two integers, and if your response to that is &amp;quot;that sounds like something that the set comprehension heuristics should give you for free&amp;quot;, the answer to that is &amp;quot;somehow, not the way I was using them&amp;quot;.)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;SetUntil&lt;/tt&gt; is a helper for absolute convergence stuff, but it's probably needed as part of proving absolute convergence in any specific case.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;NonNegativeAtValues&lt;/tt&gt; is a predicate needed for absolute convergence stuff; I'm not sure offhand that there's any use exposing it.&lt;/li&gt;
&lt;li&gt;Then, I've finally got three predicates with really unwieldy names; these build up to the idea of absolute convergence, and until I try actually establishing absolute convergence of basic series, I won't know how generally useful they are to refer to.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, that works out to four-ish modules I want to break this stuff into:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;total order and anything related to that somehow&lt;/li&gt;
&lt;li&gt;finite sums&lt;/li&gt;
&lt;li&gt;inclusive ranges&lt;/li&gt;
&lt;li&gt;limits of absolutely convergent sums&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And, with that, I'm going to call things done for now, and get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Dafny"></category><category term="Concrete Mathematics"></category><category term="short post"></category></entry><entry><title>Coding 2024-01-28</title><link href="https://mwchase.neocities.org/coding-2024-01-28" rel="alternate"></link><published>2024-01-28T05:00:00-05:00</published><updated>2024-01-28T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-01-28:/coding-2024-01-28</id><summary type="html">&lt;p class="first last"&gt;Cutting edge technology, in that there are many edges to cut oneself on.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, after a lot of struggle (something seems to be &lt;em&gt;wrong&lt;/em&gt; with the whole &amp;quot;heuristics&amp;quot; thing that set comprehensions have, and some of my efforts to fix it landed me on StackOverflow reading about &amp;quot;triggers&amp;quot;, and completely confused because this was happening in set comprehensions rather than a &lt;tt class="docutils literal"&gt;forall&lt;/tt&gt;, so I couldn't figure out how to translate the stuff about triggers into this context), I've got the functions from last night implemented and the code somewhat cleaned up.&lt;/p&gt;
&lt;p&gt;Now, for the rest of the cleanup, I need to figure out how to set up modules and imports so I can slim down these files and come up with better names.&lt;/p&gt;
&lt;p&gt;For the moment, I need to wind down, now that I've accomplished a bunch of stuff, at great psychic cost.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Dafny"></category><category term="Concrete Mathematics"></category><category term="short post"></category></entry><entry><title>Coding 2024-01-27</title><link href="https://mwchase.neocities.org/coding-2024-01-27" rel="alternate"></link><published>2024-01-27T05:00:00-05:00</published><updated>2024-01-27T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-01-27:/coding-2024-01-27</id><summary type="html">&lt;p class="first last"&gt;I don't intend to inflict these names on anyone else more than this post already does so.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, shortly after last entry, I remembered that &lt;tt class="docutils literal"&gt;forall&lt;/tt&gt; exists, which will probably be helpful to writing this stuff up in Dafny.&lt;/p&gt;
&lt;p&gt;The challenge I have now is that I'm not sure what to call some of the predicates I'll be writing.&lt;/p&gt;
&lt;p&gt;The major thing I want to work towards is a predicate for &amp;quot;this value is the limit of this increasing series as the index increases to infinity&amp;quot;.&lt;/p&gt;
&lt;p&gt;This is equivalent to &amp;quot;for every positive real number, there is a finite number of terms that add up to between that number and the limit, but no finite number of terms that adds up to strictly more than the limit&amp;quot;.&lt;/p&gt;
&lt;p&gt;So, we want to say that, given a positive real number and everything else, we can find a minimum value above which the series is bounded between the limit and the limit minus the epsilon.&lt;/p&gt;
&lt;p&gt;And finally, we want to say whether, given a &lt;em&gt;specific&lt;/em&gt; minimum and everything else, that set of values describes a valid example of the definition of a limit.&lt;/p&gt;
&lt;p&gt;From this, we can then build out predicates for more interesting sets and summands.&lt;/p&gt;
&lt;p&gt;I'm not going to try and implement this right now, but I'd at least like to try to come up with some names.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;InfiniteLimitOfIncreasingSeries&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;IndexBeyondWhichIncreasingSeriesIsBounded&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;BoundsOfIncreasingSeriesBeyondIndex&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Or something like that.&lt;/p&gt;
&lt;p&gt;I've got nothing more in me tonight, so I'm going to try to wrap up soon.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Dafny"></category><category term="Concrete Mathematics"></category><category term="short post"></category></entry><entry><title>Coding 2024-01-26</title><link href="https://mwchase.neocities.org/coding-2024-01-26" rel="alternate"></link><published>2024-01-26T05:00:00-05:00</published><updated>2024-01-26T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-01-26:/coding-2024-01-26</id><summary type="html">&lt;p class="first last"&gt;No idea if this will work. Slightly worried it'll drain my battery. Oh well.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I feel awful, but I also feel &lt;em&gt;stubborn&lt;/em&gt;.
Let's see what I can make of infinite sums that converge absolutely.&lt;/p&gt;
&lt;p&gt;First off, this is all ghost functions unless I get &lt;em&gt;seriously inspired&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Next off, a lot of the math for this (somewhat reasonably) involves infinite limits.
But those only make sense when the set being summed over is a subset of the integers.
The dream is that there is a general notion of convergence, and a lemma or something that shows that constructs involving limits satisfy it.&lt;/p&gt;
&lt;p&gt;Before anything else, let's consider what's needed to express one of these limits, because that's probably going to be tricky.&lt;/p&gt;
&lt;p&gt;For these infinite limits, let's start by only caring about positive infinity.
And assume that the inputs to the primitive version we start with are non-negative.
These assumptions will probably have to be unbundled later, but I need to prototype &lt;em&gt;something&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;With all of this, if we say that some infinite sum over a subset of the integers with a minimum value (another assumption), then the limit of that sum as more integers are included is...&lt;/p&gt;
&lt;p&gt;Ugh...&lt;/p&gt;
&lt;p&gt;Given an epsilon, we can determine an N, such that the sum of the subset up to any number &lt;em&gt;above&lt;/em&gt; N will always be within epsilon of the limit.&lt;/p&gt;
&lt;p&gt;This sounds like a negative statement, and I'm not sure where establishing a negative in Dafny stands in terms of pain level, ranging from &amp;quot;trivial&amp;quot; through &amp;quot;confusing&amp;quot; to &amp;quot;impossible&amp;quot;.
Perhaps some form of inductive proof...
Like, if I can establish that, for a given function, having the inequality hold for some number M means I can establish that it also holds for M+1...&lt;/p&gt;
&lt;p&gt;So, that provides a way forward to answering the question; now I just need to figure out how to &lt;em&gt;ask&lt;/em&gt; it.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;So, we need a subset of the integers.&lt;/li&gt;
&lt;li&gt;We need a function from the integers to the reals.&lt;/li&gt;
&lt;li&gt;We need the values of the function to be non-negative for every integer in the set.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, function plus infinite set &lt;em&gt;does not&lt;/em&gt; have a general algorithm.
So, I &lt;em&gt;think&lt;/em&gt; this needs to be some form of lemma or predicate or something.&lt;/p&gt;
&lt;p&gt;Like, a predicate that requires some inductive stuff.&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;ghost predicate Lim(nums: iset&amp;lt;int&amp;gt;, summand: (int) &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; real, limit: real, epsilon: real, N: int)&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Or something.
The idea is that it would require the &lt;tt class="docutils literal"&gt;nums&lt;/tt&gt; set to have a lowest element, that every element &lt;tt class="docutils literal"&gt;k&lt;/tt&gt; in &lt;tt class="docutils literal"&gt;nums&lt;/tt&gt; has a non-negative value for &lt;tt class="docutils literal"&gt;summand(k)&lt;/tt&gt;, and that if we take the finite subset of &lt;tt class="docutils literal"&gt;nums&lt;/tt&gt; less than &lt;tt class="docutils literal"&gt;N&lt;/tt&gt;, then the &lt;em&gt;finite sum&lt;/em&gt; of &lt;tt class="docutils literal"&gt;summand&lt;/tt&gt; applied to the elements of that subset must be less than &lt;tt class="docutils literal"&gt;limit&lt;/tt&gt;, and that sum plus &lt;tt class="docutils literal"&gt;epsilon&lt;/tt&gt; must be &lt;em&gt;greater than&lt;/em&gt; &lt;tt class="docutils literal"&gt;limit&lt;/tt&gt;, and the same predicate must hold except with &lt;tt class="docutils literal"&gt;N+1&lt;/tt&gt; instead of &lt;tt class="docutils literal"&gt;N&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;I'm not sure if I'm able, at my current level of abilities or in general, to express that idea and make use of it, but it seems like a promising avenue.&lt;/p&gt;
&lt;p&gt;And, I am wiped out for tonight and ready to take a break.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Dafny"></category><category term="Concrete Mathematics"></category></entry><entry><title>Diary 2024-01-25</title><link href="https://mwchase.neocities.org/diary-2024-01-25" rel="alternate"></link><published>2024-01-25T05:00:00-05:00</published><updated>2024-01-25T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-01-25:/diary-2024-01-25</id><summary type="html">&lt;p class="first last"&gt;Uuuuuugh again&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I messed myself up today staring at screens, so now I need to &lt;em&gt;stop looking at my laptop&lt;/em&gt;, and I'm not currently doing a great job of that.&lt;/p&gt;
&lt;p&gt;It would be nice if I thought of something else for this entry, but nope.&lt;/p&gt;
&lt;p&gt;I need to go grab a book or something.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2024-01-24</title><link href="https://mwchase.neocities.org/coding-2024-01-24" rel="alternate"></link><published>2024-01-24T05:00:00-05:00</published><updated>2024-01-24T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-01-24:/coding-2024-01-24</id><summary type="html">&lt;p class="first last"&gt;I really hope &amp;quot;if you're missing certain asserts, it just spins its wheels forever&amp;quot; is something that's going to go away.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Guys, it is &lt;em&gt;really hard&lt;/em&gt; to write this stuff incrementally when I assume that &amp;quot;not filling in the branches of an if statement&amp;quot; will result in some kind of verification error, and instead it just makes my laptop fans try to launch it through the ceiling.&lt;/p&gt;
&lt;p&gt;I've changed things up a bit:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;a ghost function to specify behavior; I think it assumes that Dafny's &lt;tt class="docutils literal"&gt;real&lt;/tt&gt; type is associative and commutative under addition&lt;/li&gt;
&lt;li&gt;a ghost predicate for stating that a dyadic function acts as a total ordering&lt;/li&gt;
&lt;li&gt;a lemma stating that any finite set has a minimum according to a given total ordering&lt;/li&gt;
&lt;li&gt;a summation method that requires a total ordering to fix the order of execution&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I am doing &lt;em&gt;something&lt;/em&gt; wrong with the last bit, but I can't tell what.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;A-ha!
I neglected to invoke the lemma in the method, which caused Dafny to go into an infinite loop because I don't know!&lt;/p&gt;
&lt;p&gt;A few more tweaks later, and now I just need to determine why Dafny appears to think that &lt;tt class="docutils literal"&gt;0.0&lt;/tt&gt; might not be equal to &lt;tt class="docutils literal"&gt;0.0&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;I think I understand the gap between what I'm trying to get Dafny to accept and what it has available to work with, but I don't want to deal with it...&lt;/p&gt;
&lt;p&gt;So I didn't.
I stripped out the ghost function and made the &amp;quot;regular&amp;quot; function be the entire implementation.
I'll try not to care about that too much.&lt;/p&gt;
&lt;p&gt;Once I got the code all verifying, I figured out which asserts I could get rid of, which turns out to be risky because the ones I couldn't get rid of put it into an infinite loop again.&lt;/p&gt;
&lt;p&gt;So, the code is, if not clean, at least sort of short.
Maybe I'll clean it up later.
Maybe I'll move on to other bits of code.
Maybe I'll decide to do something else entirely.&lt;/p&gt;
&lt;p&gt;I'll work that all out later, and for now get to bed, because sleepy.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Dafny"></category><category term="Concrete Mathematics"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2024-01-23</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-01-23" rel="alternate"></link><published>2024-01-23T05:00:00-05:00</published><updated>2024-01-23T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-01-23:/weekly-roundup-2024-01-23</id><summary type="html">&lt;p class="first last"&gt;It's not a great feeling to run into these sharp edges, but whatever.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I started looking into summation, and thinking about how to handle it in Dafny.&lt;/li&gt;
&lt;li&gt;Thursday: I narrowed in on the thing that I absolutely need to figure out how to do in Dafny, in order to use it for verifying this math.&lt;/li&gt;
&lt;li&gt;Friday: I took another look at the chapter in the textbook, and things ended up going a little out of control.&lt;/li&gt;
&lt;li&gt;Saturday: I discovered that interacting with sets in Dafny is... strange.&lt;/li&gt;
&lt;li&gt;Sunday: I found a few things that I had been doing wrong with Dafny, and then ended up doing a few other things wrong.&lt;/li&gt;
&lt;li&gt;Monday: Got sick.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm not sure what I feel like doing.
I did discover that whatever I'm doing wrong with Dafny is orphaning z3 processes that are squatting on one core each-ish, so that's... not ideal.
As far as Dafny goes, I want to try and figure out at which point the hang is coming into play.
As far as other things go...
I'm not sure, we'll see.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Dafny"></category><category term="Concrete Mathematics"></category></entry><entry><title>Diary 2024-01-22</title><link href="https://mwchase.neocities.org/diary-2024-01-22" rel="alternate"></link><published>2024-01-22T05:00:00-05:00</published><updated>2024-01-22T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-01-22:/diary-2024-01-22</id><summary type="html">&lt;p class="first last"&gt;Uuuuuugh&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I'd been thinking of trying to work on Concrete Mathematics and Dafny today, but I relaxed most of the day, and tonight, my body came up with other, much less pleasant plans.&lt;/p&gt;
&lt;p&gt;Now it's much later than I meant to be up, and there's no way I can get anything else done.
I'm going to hope that things work out a little better tomorrow, but let's not force anything.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2024-01-21</title><link href="https://mwchase.neocities.org/coding-2024-01-21" rel="alternate"></link><published>2024-01-21T05:00:00-05:00</published><updated>2024-01-21T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-01-21:/coding-2024-01-21</id><summary type="html">&lt;p class="first last"&gt;I should not be trusted to know what is not possible with Dafny.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, still getting to grips with Dafny.
It's not a fast process when I'm just doing a little a day, I guess.
In any case, I now understand something that had me a little confused.
The meaning of the keywords kind of changed around between Dafny 3 and 4, and a lot of the stuff I'm reading happens to be for 3, but I'm using 4 because I wanted to make some use of the standard library.&lt;/p&gt;
&lt;p&gt;In particular, what 3 expresses via &lt;tt class="docutils literal"&gt;function method&lt;/tt&gt; is just &lt;tt class="docutils literal"&gt;function&lt;/tt&gt; in 4, while what 3 calls &lt;tt class="docutils literal"&gt;function&lt;/tt&gt; is &lt;tt class="docutils literal"&gt;ghost function&lt;/tt&gt; in 4.&lt;/p&gt;
&lt;p&gt;In light of this, I've slightly updated my existing files to make sure that they're actually expressing what they're supposed to; basically just making sure that the recurrent forms are &lt;em&gt;ghost&lt;/em&gt; functions.&lt;/p&gt;
&lt;p&gt;I also ran across some documentation about telling Dafny to generate counterexamples; I'll have to try that out later.&lt;/p&gt;
&lt;p&gt;Aside from that, I tried to put together some flexibly generic code for summing over sets, using a short guide I found about &lt;a class="reference external" href="https://leino.science/papers/krml275.html"&gt;iterating over a collection&lt;/a&gt;, and I'm not sure what I'm doing wrong, but my attempts to follow the directions seem to be putting Dafny in another infinite loop, so that'll be some kind of pain to troubleshoot.&lt;/p&gt;
&lt;p&gt;(At least the infinite version should be &amp;quot;easier&amp;quot;, since I think that &lt;em&gt;has&lt;/em&gt; to be ghost.)&lt;/p&gt;
&lt;p&gt;Also, thinking about this, I'm going to have to remember how to rigorously prove convergence, and that could be... a thing.&lt;/p&gt;
&lt;p&gt;I may end up needing to take a break from this and focus on somewhat less intimidating pursuits.
For the moment, I should get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Dafny"></category><category term="Concrete Mathematics"></category><category term="short post"></category></entry><entry><title>Coding 2024-01-20</title><link href="https://mwchase.neocities.org/coding-2024-01-20" rel="alternate"></link><published>2024-01-20T05:00:00-05:00</published><updated>2024-01-20T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-01-20:/coding-2024-01-20</id><summary type="html">&lt;p class="first last"&gt;I can't tell if it needs to be like that.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&amp;quot;Hey, what if I handle finite sums as a simple function, since those don't need to worry about convergence tests?&amp;quot;&lt;/p&gt;
&lt;p&gt;&amp;quot;Hey, why don't I make the baseline implementation use finite sets, for flexibility?&amp;quot;&lt;/p&gt;
&lt;p&gt;&amp;quot;... I don't understand how to iterate over a set in Dafny, possibly because I'm now too tired to read the documentation properly.&amp;quot;&lt;/p&gt;
&lt;p&gt;&amp;quot;After writing that last line, I figured out where to look in the documentation, and now I kind of wish I hadn't?&amp;quot;&lt;/p&gt;
&lt;p&gt;Okay, so, if I want to do all of this in a function, I need to extract an element via a bizarre sequence of glyphs, then set difference it out and recurse?
At least I don't need to worry myself about tail recursion, since I'm not planning to execute this.
I might do it anyway, just because it's not like I can make this &lt;em&gt;any harder&lt;/em&gt; to grasp.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to consider it a win that I worked out that much, and try to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Concrete Mathematics"></category><category term="short post"></category></entry><entry><title>Coding 2024-01-19</title><link href="https://mwchase.neocities.org/coding-2024-01-19" rel="alternate"></link><published>2024-01-19T05:00:00-05:00</published><updated>2024-01-19T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-01-19:/coding-2024-01-19</id><summary type="html">&lt;p class="first last"&gt;Regrettably, I'm just getting started. This notation and its uses are... flexible.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's see.&lt;/p&gt;
&lt;p&gt;Delimited summation notation has a lower and upper bound on an integer, and a function from an integer to a real.&lt;/p&gt;
&lt;p&gt;Generalized summation notation has an &lt;tt class="docutils literal"&gt;iset&lt;/tt&gt; (should there be something separate for specifically a &lt;tt class="docutils literal"&gt;set&lt;/tt&gt;?) of some type &lt;tt class="docutils literal"&gt;T&lt;/tt&gt;, and a function from &lt;tt class="docutils literal"&gt;T&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;real&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;It may be pleasant to include a form that combines bounds with predicates, but I'm not sure how many &amp;quot;nice-to-haves&amp;quot; there are to lay out.
Like, a single integer index, with lower and upper bounds, &lt;em&gt;plus&lt;/em&gt; a predicate, seems sensible.&lt;/p&gt;
&lt;p&gt;Then I read a little further, and remember some things that make it not clear to me how things should proceed.
Like, working in Python-style pseudocode because I don't want to look stuff up, suppose we have &lt;tt class="docutils literal"&gt;Sigma(a, p)&lt;/tt&gt;, and I want to change it to &lt;tt class="docutils literal"&gt;Sigma(lambda k: a(k + 1), lambda k: p(k + 1))&lt;/tt&gt;...
That looks vaguely reasonable, although for the actual code I'll probably want something like a shift operator for this specific case?&lt;/p&gt;
&lt;p&gt;The sense I'm getting is that this should be a &amp;quot;sandwich&amp;quot; type of thing, where the &amp;quot;boundaries&amp;quot; prefer simple delimited summation to delimited summation with a predicate, to summation with a predicate or iset or something.&lt;/p&gt;
&lt;p&gt;Now, the chapter is discussing Iverson brackets, which I want to represent as a function from &lt;tt class="docutils literal"&gt;bool&lt;/tt&gt; to a function from &lt;tt class="docutils literal"&gt;real&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;real&lt;/tt&gt;.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;A tape player?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Moving right along, I suppose the second function there would ideally have a default value of &lt;tt class="docutils literal"&gt;1.0&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Although, maybe it's not a function, because we see also the possibility of &amp;quot;summation with no explicit predicates, but a bunch of Iverson brackets in the summand&amp;quot;.
How all of &lt;em&gt;that&lt;/em&gt; gets represented depends on how much Dafny can &amp;quot;look inside&amp;quot; functions to pull stuff out.
I'll have to experiment with that later.
For now, let's assume it can, and try to contrive a situation where it's obvious if that's wrong.&lt;/p&gt;
&lt;p&gt;Anyway, I got distracted and it's late.
Better get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Dafny"></category><category term="Concrete Mathematics"></category><category term="short post"></category></entry><entry><title>Coding 2024-01-18</title><link href="https://mwchase.neocities.org/coding-2024-01-18" rel="alternate"></link><published>2024-01-18T05:00:00-05:00</published><updated>2024-01-18T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-01-18:/coding-2024-01-18</id><summary type="html">&lt;p class="first last"&gt;If I can't figure out how to do this one thing in Dafny, I'll have to switch to some other system where I can.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right.
Skimmed to the end of the Sums chapter, and now it's time to look at it again, more carefully.&lt;/p&gt;
&lt;p&gt;I'm currently sort of vacillating between &amp;quot;in Dafny, just go all in on doing arithmetic with &lt;tt class="docutils literal"&gt;real&lt;/tt&gt; values&amp;quot; (and hope there aren't precision issues when it comes to doing purely verification), and &amp;quot;okay, but the chapter mentioned complex numbers, so I should really try to define traits to support algebras&amp;quot; (I have no experience writing traits in Dafny).&lt;/p&gt;
&lt;p&gt;The reasonable course of action is to see how far I can get with &amp;quot;a data type that includes integral bounds, optional predicates, and a function from integers to reals&amp;quot;.
It's been really easy for me to get caught up in thinking about stuff like &amp;quot;Oh, this operator is basically a predicate followed by &lt;tt class="docutils literal"&gt;and&lt;/tt&gt; in Python&amp;quot;, and lose sight of the fact that it's just as important, if not moreso, to have tools for &lt;em&gt;manipulating&lt;/em&gt; these forms, and not just &lt;em&gt;evaluating&lt;/em&gt; them.&lt;/p&gt;
&lt;p&gt;It's way too late to mess around with code right now, but here's the main question I think I'd like to address:&lt;/p&gt;
&lt;p&gt;Given some format for expressing an infinite sum, is it possible to express the predicate &amp;quot;this sum converges absolutely&amp;quot;?
Furthermore, can I properly express the &lt;em&gt;implications&lt;/em&gt; of that for reasoning?
If I can't figure out how to do that, then it's probably not worth trying to manipulate the sums programmatically.&lt;/p&gt;
&lt;p&gt;We'll see where I get with that in a few days, hopefully.
For now, it's later than I meant to be writing this.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Dafny"></category><category term="Concrete Mathematics"></category><category term="short post"></category></entry><entry><title>Coding 2024-01-17</title><link href="https://mwchase.neocities.org/coding-2024-01-17" rel="alternate"></link><published>2024-01-17T05:00:00-05:00</published><updated>2024-01-17T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-01-17:/coding-2024-01-17</id><summary type="html">&lt;p class="first last"&gt;I don't remember reading this chapter before, which is kind of weird.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm reading up on sums right now, and putting together plans for stuff to represent them in Python and Dafny.
It's pretty straightforward to write Python code to evaluate concrete examples, but there are some wrinkles when it comes to writing stuff up in Dafny.&lt;/p&gt;
&lt;p&gt;Stuff like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I don't know whether Dafny has a rational datatype&lt;/li&gt;
&lt;li&gt;A very very very quick skim of the Dafny documentation didn't reveal a way to define new semantics for existing operators... (And a slightly less quick skim indicates that this is explicitly not a thing you can do in Dafny.)&lt;/li&gt;
&lt;li&gt;So an equivalent of sigma notation that may involve rational functions of the index values would seem to require some kind of usage of &amp;quot;traits&amp;quot;.&lt;/li&gt;
&lt;li&gt;Maybe it would make sense to write something that works in the integer domain to start with, and get some idea of the kinds of operations that I end up using?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, I'll hopefully finish skimming this chapter soon, and then go back to the beginning and read it more carefully.
It's sort of interesting how trying to take an &amp;quot;implementation&amp;quot; perspective causes me to notice things that the text doesn't focus on.
Like, if you're working with numbers mentally, going from the integers to the rationals is often not that big a deal (unless you're doing something with raising things to the powers of natural numbers, and that's the bit that gets changed).
In software, that can be scary.&lt;/p&gt;
&lt;p&gt;Anyway, I don't want to stay up any longer, so I'm going to wrap things up abruptly.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Dafny"></category><category term="Concrete Mathematics"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2024-01-16</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-01-16" rel="alternate"></link><published>2024-01-16T05:00:00-05:00</published><updated>2024-01-16T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-01-16:/weekly-roundup-2024-01-16</id><summary type="html">&lt;p class="first last"&gt;Good job with Dafny, bad luck with time management.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I didn't have a good time going back into work.&lt;/li&gt;
&lt;li&gt;Thursday: I tried using marimo and Dafny to verify stuff related to &lt;em&gt;Concrete Mathematics&lt;/em&gt;. It didn't go great to start with.&lt;/li&gt;
&lt;li&gt;Friday: I got Dafny working much better.&lt;/li&gt;
&lt;li&gt;Saturday: Too much work. (Remember that I date these the day after I write them...)&lt;/li&gt;
&lt;li&gt;Sunday: I ran into some issues with Dafny; I basically had to declare a helper function &amp;quot;closed form&amp;quot; by fiat, even though it's not, I don't think.&lt;/li&gt;
&lt;li&gt;Monday: I took a look at the harder problems from &lt;em&gt;Concrete Mathematics&lt;/em&gt;, and decided, you know what, I don't &lt;em&gt;need&lt;/em&gt; to do those right now.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to keep up with that, try to work on lore for my wife's writing, maybe get back to my own writing, and maybe get a better handle on audio editing because I have some weird ideas to get out.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Dafny"></category><category term="marimo"></category><category term="Concrete Mathematics"></category></entry><entry><title>Coding 2024-01-15</title><link href="https://mwchase.neocities.org/coding-2024-01-15" rel="alternate"></link><published>2024-01-15T05:00:00-05:00</published><updated>2024-01-15T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-01-15:/coding-2024-01-15</id><summary type="html">&lt;p class="first last"&gt;No actual coding today, but I didn't want to put this entry out of context.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hm.
I'm about to the first set of exam questions in &lt;em&gt;Concrete Mathematics&lt;/em&gt;, and, hm.
Wow.
I'm going to have the smiley do a dramatic reenactment of what probably &lt;em&gt;would have&lt;/em&gt; happened if I'd ever gotten questions like these on an exam.&lt;/p&gt;
&lt;div class="admonition smiley smiley-glitchier"&gt;
&lt;p class="first admonition-title"&gt;:) (glitchier)&lt;/p&gt;
&lt;p&gt;What?&lt;/p&gt;
&lt;p&gt;What‽&lt;/p&gt;
&lt;p&gt;Breathing too quickly...&lt;/p&gt;
&lt;p class="last"&gt;World... going faint.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I hadn't realized how poorly that would translate from my thoughts to text, but oh well.&lt;/p&gt;
&lt;p&gt;Looking over the other problems, these are all pretty intimidating.
Maybe I should move along for now...&lt;/p&gt;
&lt;p&gt;In any case, it's late and I should get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Concrete Mathematics"></category><category term="short post"></category></entry><entry><title>Coding 2024-01-14</title><link href="https://mwchase.neocities.org/coding-2024-01-14" rel="alternate"></link><published>2024-01-14T05:00:00-05:00</published><updated>2024-01-14T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-01-14:/coding-2024-01-14</id><summary type="html">&lt;p class="first last"&gt;It's going to be really jarring when I'm not just checking the book's work for going from recurrence relations to closed forms.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hm.
I'm a little further along representing the Josephus problem in marimo and Dafny, but I'm not sure that what I have really constitutes a closed form.&lt;/p&gt;
&lt;p&gt;I didn't figure out a way to use the standard library for this, so instead I ended up writing a helper that zeroes out the lower digits.
If I can figure out a faster version of that, then I'll be happy, but I think for now I'll move on.&lt;/p&gt;
&lt;p&gt;Also, I continue to thank Dafny for just how much math it seems to be able to do.&lt;/p&gt;
&lt;p&gt;In any case, I think I managed to read the text closely enough to move onto generalizing it some.
Let's see how that goes.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Hm.&lt;/p&gt;
&lt;p&gt;I'm at the end of the section, and I haven't got code for this last example.
Actually representing it looks like a bit much.
I need to have &lt;tt class="docutils literal"&gt;d&lt;/tt&gt; values of beta and &lt;tt class="docutils literal"&gt;d - 1&lt;/tt&gt; values of alpha, along with a value for &lt;tt class="docutils literal"&gt;c&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Whatever, I'll figure that part out later.
For the moment, I can take a look at the exercises, and go &amp;quot;oh, past me did most of these, so there's really not much to be done here&amp;quot;.&lt;/p&gt;
&lt;p&gt;But &lt;em&gt;really&lt;/em&gt; for the moment, I should get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Concrete Mathematics"></category><category term="marimo"></category><category term="Dafny"></category></entry><entry><title>Diary 2024-01-13</title><link href="https://mwchase.neocities.org/diary-2024-01-13" rel="alternate"></link><published>2024-01-13T05:00:00-05:00</published><updated>2024-01-13T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-01-13:/diary-2024-01-13</id><summary type="html">&lt;p class="first last"&gt;Don't want to go through that again.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Good news: new toy arrived in the mail today.&lt;/p&gt;
&lt;p&gt;Bad news: epically long day at work today, so I ended up too exhausted to set it up.
I'll have to do it in the morning.&lt;/p&gt;
&lt;p&gt;Nothing else worth talking about; work was &lt;em&gt;massive&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2024-01-12</title><link href="https://mwchase.neocities.org/coding-2024-01-12" rel="alternate"></link><published>2024-01-12T05:00:00-05:00</published><updated>2024-01-12T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-01-12:/coding-2024-01-12</id><summary type="html">&lt;p class="first last"&gt;Let's see how well the Mystery Code I installed to get this post to render works.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Things are going... very well with Dafny.
I've got a general form that I'm doing, and I don't know whether it's idiomatic, but it seems to work for my purposes.&lt;/p&gt;
&lt;p&gt;Basically, I define the recurrence relation I'm trying to solve stuff for as a function, define another function for the closed form if applicable, define a lemma that just handles the recursive case because the base case has been trivial every time so far, and write a method that is required to satisfy the recurrence relation, but is implemented by invoking the closed form, and passing the result to the lemma.&lt;/p&gt;
&lt;p&gt;That was all pretty abstract.
Let's try to make things a bit more concrete.&lt;/p&gt;
&lt;p&gt;..smiley:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Heyo!
&lt;/pre&gt;
&lt;p&gt;... Suppose we want to verify a closed form equation for the number of regions we can divide the plane into, given &lt;tt class="docutils literal"&gt;n&lt;/tt&gt; straight lines.
To start with, we need the recurrence relation, and the method that implements equivalent semantics:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;regions_from_lines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
  &lt;span class="k"&gt;requires&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;regions_from_lines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;method&lt;/span&gt; &lt;span class="nf"&gt;RegionsFromLines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;returns&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;requires&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;
  &lt;span class="k"&gt;ensures&lt;/span&gt; &lt;span class="n"&gt;regions&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;regions_from_lines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Should you be using &lt;tt class="docutils literal"&gt;nat&lt;/tt&gt;?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I don't know, maybe?
Probably?&lt;/p&gt;
&lt;p&gt;Anyway, I'm conceptualizing this as the general template that I'm going to try to fit stuff into.
Obviously, it doesn't currently verify, because I didn't write the code.
Let's go through all of the steps, including the intermediate bits.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;regions_from_lines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;nat&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;nat&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;regions_from_lines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;method&lt;/span&gt; &lt;span class="nf"&gt;RegionsFromLines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;nat&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;returns&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;nat&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;ensures&lt;/span&gt; &lt;span class="n"&gt;regions&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;regions_from_lines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;regions&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Technically, I could do a return statement here, but I'm going to stick the lemma afterwards, so this is easier to write later.
Now, this, of course, does not verify, because Dafny isn't going to proactively try to validate the Mystery Formulas I give it.
The next step, then, is to create an inductive lemma that validates the relationship between the recurrence relation and the Mystery Formula.
Because this lemma will involve the Mystery Formula in its &lt;tt class="docutils literal"&gt;requires&lt;/tt&gt; line, I'll define it as a function so I don't have to get it exactly in sync with itself:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;regions_from_lines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;nat&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;nat&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;regions_from_lines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;closed_form&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;lemma&lt;/span&gt; &lt;span class="nf"&gt;RegionInduction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;nat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;regions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;requires&lt;/span&gt; &lt;span class="n"&gt;regions&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;closed_form&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;ensures&lt;/span&gt; &lt;span class="n"&gt;regions&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;regions_from_lines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;method&lt;/span&gt; &lt;span class="nf"&gt;RegionsFromLines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;nat&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;returns&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;nat&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;ensures&lt;/span&gt; &lt;span class="n"&gt;regions&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;regions_from_lines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;regions&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;closed_form&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;RegionInduction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;regions&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This moves the verification failures from the method into the lemma.
At this point, I should probably emphasize that I haven't gotten any help or guidance from another person on this currently, so I could be putting together something that is excessively verbose, or inefficient, or just somehow hard to read.
Regardless, the next step is to fill in the lemma with enough information for Dafny to carry out an inductive argument.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;regions_from_lines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;nat&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;nat&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;regions_from_lines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;closed_form&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;lemma&lt;/span&gt; &lt;span class="nf"&gt;RegionInduction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;nat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;regions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;requires&lt;/span&gt; &lt;span class="n"&gt;regions&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;closed_form&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;ensures&lt;/span&gt; &lt;span class="n"&gt;regions&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;regions_from_lines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;RegionInduction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lines&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;regions&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;method&lt;/span&gt; &lt;span class="nf"&gt;RegionsFromLines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;nat&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;returns&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;nat&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;ensures&lt;/span&gt; &lt;span class="n"&gt;regions&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;regions_from_lines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;regions&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;closed_form&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;RegionInduction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;regions&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And, assuming I copied everything over correctly, we're done.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;This seems like cheating somehow.
You just ignored the base case, and the inductive step is just running the recurrence relation backwards?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;It turns out that, once you've figured out which water to lead Dafny to, it &lt;em&gt;will&lt;/em&gt; drink.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p&gt;Even so, I feel like being skeptical.
All you've shown us is that some layouts of file verify, while others do not.
This could all be some kind of souped-up regular expression.&lt;/p&gt;
&lt;p class="last"&gt;&amp;quot;Pray, Mr. Babbage, if you put into the machine wrong figures, will the right answers come out?&amp;quot;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Okay, let's see what happens if I sabotage the closed form.
Comment out the denominator, and...
Hm.
I'll have to see later if there's some way to make Dafny go into more detail, but it does catch the issue.&lt;/p&gt;
&lt;p&gt;Anyway, with all that said and done, I've got some cleanup to do to the code(?) I've written, and then it's time to tackle the next section of the textbook.
Very carefully and deliberately.&lt;/p&gt;
&lt;p&gt;For now, better wind down and rest.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Concrete Mathematics"></category><category term="Dafny"></category></entry><entry><title>Coding 2024-01-11</title><link href="https://mwchase.neocities.org/coding-2024-01-11" rel="alternate"></link><published>2024-01-11T05:00:00-05:00</published><updated>2024-01-11T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-01-11:/coding-2024-01-11</id><summary type="html">&lt;p class="first last"&gt;Still a little rough around the edges...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I had this whole neat idea about doing exploratory coding in marimo, and then verifying ideas using Dafny, but my initial attempts in this area have so far gone... not great.&lt;/p&gt;
&lt;p&gt;Marimo is fine so far, but when I gave Dafny a recurrence relation and closed form for the optimal number of moves for a tower of Hanoi puzzle, I expected it to either get something à la &amp;quot;Even a computer could discover this&amp;quot;, or to quickly bail out because I gave it almost nothing to work with.
Instead it just... sat there, with no indication of what it was doing, or how long it would take.&lt;/p&gt;
&lt;p&gt;Just checked, and it's at least possible for Dafny to successfully verify a file, so it's not &lt;em&gt;obviously&lt;/em&gt; an issue that occurs every time.&lt;/p&gt;
&lt;p&gt;After a little more poking, this does have something to do with the method specifically, but I'm, like, not sure what to do with that yet.
I'll have to think about it, I guess.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Hold up, I searched the issues for some key words, found stuff that eventually led me to the experimental &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--disable-nonlinear-arithmetic&lt;/span&gt;&lt;/tt&gt; flag.
I pass it in, and...&lt;/p&gt;
&lt;p&gt;Yay!
It fails!&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Yay?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I needed it to commit to a course of action.&lt;/p&gt;
&lt;p&gt;So, given that verification is failing, I think I need to write a lemma, and have it work via induction?
I'll try to figure this out later.
For now, I want to sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Concrete Mathematics"></category><category term="Dafny"></category><category term="marimo"></category></entry><entry><title>Diary 2024-01-10</title><link href="https://mwchase.neocities.org/diary-2024-01-10" rel="alternate"></link><published>2024-01-10T05:00:00-05:00</published><updated>2024-01-10T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-01-10:/diary-2024-01-10</id><summary type="html">&lt;p class="first last"&gt;Maybe if I turn up the lights when I get home...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;First day back in the office.
Uuuuuuuuuugh.&lt;/p&gt;
&lt;p&gt;I've got a few things I want to try to look into, but it's pretty hard to work up the energy for that when the sun's down by the time I get home.
The main thing is trying to find a good mind-mapping tool, because I tried to map stuff out about my writing in a notebook, and the result was totally unreadable.
Another is getting back into Concrete Mathematics, and trying to work on the exercises in marimo.
Hopefully, I'll be able to transfer stuff there to calendars for worldbuilding, and balancing incremental games.&lt;/p&gt;
&lt;p&gt;Anyway, I need to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2024-01-09</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-01-09" rel="alternate"></link><published>2024-01-09T05:00:00-05:00</published><updated>2024-01-09T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-01-09:/weekly-roundup-2024-01-09</id><summary type="html">&lt;p class="first last"&gt;I am preparing to slack off &lt;em&gt;so much&lt;/em&gt;, you guys.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: We got home, and I got a few small things done and started.&lt;/li&gt;
&lt;li&gt;Thursday: I talked some about a project I've been working on in various forms for a while now.&lt;/li&gt;
&lt;li&gt;Friday: I continued to work on that project.&lt;/li&gt;
&lt;li&gt;Saturday: Nothing much happened, and this frustrated me.&lt;/li&gt;
&lt;li&gt;Sunday: I got a few things done, and called that a win.&lt;/li&gt;
&lt;li&gt;Monday: I got a bit more done, and then took it easy.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to probably be messing around with writing projects, but we'll see.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="travel"></category><category term="writing"></category></entry><entry><title>Diary 2024-01-08</title><link href="https://mwchase.neocities.org/diary-2024-01-08" rel="alternate"></link><published>2024-01-08T05:00:00-05:00</published><updated>2024-01-08T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-01-08:/diary-2024-01-08</id><summary type="html">&lt;p class="first last"&gt;A good day, but nothing to write about.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I finished up with the list I put together for yesterday, and then took things easy.
I guess we'll have to see what starting work back up tomorrow feels like; probably really disorienting.&lt;/p&gt;
&lt;p&gt;For the moment, I'm tired and having trouble writing, so oh well, cutting this short so I'm not obsessing over it all night.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="writing"></category></entry><entry><title>Diary 2024-01-07</title><link href="https://mwchase.neocities.org/diary-2024-01-07" rel="alternate"></link><published>2024-01-07T05:00:00-05:00</published><updated>2024-01-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-01-07:/diary-2024-01-07</id><summary type="html">&lt;p class="first last"&gt;Slightly more done than I committed to, hooray.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, that was an interesting mixed bag.
After the last entry, I put together a list of things I want to accomplish soon.
I got the stuff that I considered highest priority done, so I guess today was successful.
The rest of the list should be workable to take care of tomorrow morning, so I'll get that done when the time comes.&lt;/p&gt;
&lt;p&gt;One of those things was finally reading the stuff I wrote to my wife.
Got some positive feedback there.
I'd like to write some more, but my current feeling is that I should try to take all of the names and people I made up, and figure out how they fit together.
Stuff in the text and explicit speculation only; not going to write lore.&lt;/p&gt;
&lt;p&gt;Anyway, I let things get late, which is part of the reason I didn't do the lower-priority stuff while I was putting this entry together.
It'll all be fine.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="writing"></category></entry><entry><title>Diary 2024-01-06</title><link href="https://mwchase.neocities.org/diary-2024-01-06" rel="alternate"></link><published>2024-01-06T05:00:00-05:00</published><updated>2024-01-06T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-01-06:/diary-2024-01-06</id><summary type="html">&lt;p class="first last"&gt;This is frustrating. Don't look.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Every day since we got back, I've thought &amp;quot;Well, I'll get a bunch done today.&amp;quot; and it hasn't happened yet.&lt;/p&gt;
&lt;p&gt;So, fine, I'm going to lower my expectations and/or perform reverse psychology, and declare that I'm going to take things &lt;em&gt;super easy&lt;/em&gt; tomorrow, and see how that works out!&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2024-01-05</title><link href="https://mwchase.neocities.org/diary-2024-01-05" rel="alternate"></link><published>2024-01-05T05:00:00-05:00</published><updated>2024-01-05T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-01-05:/diary-2024-01-05</id><summary type="html">&lt;p class="first last"&gt;It'd be really weird if this turned out to represent a consistent shift in pronunciation.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't really have &amp;quot;momentum&amp;quot; today, but I did manage to do a trial read of the writing using YSK.
It's mostly fine, but one thing I wasn't expecting is that using these words that aren't part of standard English caused my pronunciation of the letter R to shift?
Like &amp;quot;These words aren't English, so I'd better pronounce things like some other language?&amp;quot; I guess...&lt;/p&gt;
&lt;p&gt;I don't have anything else in mind to talk about, so I'm just going to post and wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="writing"></category><category term="neopronouns"></category><category term="YSK"></category><category term="short post"></category></entry><entry><title>Diary 2024-01-04</title><link href="https://mwchase.neocities.org/diary-2024-01-04" rel="alternate"></link><published>2024-01-04T05:00:00-05:00</published><updated>2024-01-04T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-01-04:/diary-2024-01-04</id><summary type="html">&lt;p class="first last"&gt;In addition to the words I made up, I also had fun with &amp;quot;gravely misunderstood&amp;quot; and &amp;quot;rectify&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Seems like I'm not ramping back up in any impressive way.
I've got some writing that I'm revising.
That's not ready until I've read it out loud to check for issues with how it flows.
At least it's not metrical poetry, so I'm not going to be sounding it out and going &amp;quot;Well, formally, this fits the meter, but I can't actually pronounce it with that emphasis.&amp;quot;&lt;/p&gt;
&lt;p&gt;I might as well talk a little bit more about this project.
From an inspiration perspective, I've got some inspirations, and things that I think I should read for inspiration, that I think sound pretty impressive, and I suspect that the result will be... not.
I think it could speak to some people, but this kind of feels different from other projects, where a lot of the time I could imagine it getting a lot of traction and influence—&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;If it came out decades ago into a world where its own inspirations somehow didn't exist.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Yes, yes, that.&lt;/p&gt;
&lt;p&gt;But the point is, this project, which I haven't properly named yet, feels like it has a much smaller ambition.
I don't want to talk too much about the content; I'd rather let it speak for itself when I'm comfortable releasing it.
However, I can talk about one of the reasons I'm putting effort into something that's intentionally &amp;quot;smaller&amp;quot;.&lt;/p&gt;
&lt;p&gt;This writing, and some other writing I've done in the previous year (some of it more on the ambitious side of the scale), is meant as a vehicle for... I guess I'll call it an experimental variant of English?
Swap out three or four basic word roots for, let's say three new roots, doing the work of six.&lt;/p&gt;
&lt;p&gt;The point of all of this, the entire reason, the thing that, if you don't understand it, will render &lt;em&gt;everything I am doing here incomprehensible&lt;/em&gt;&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Pay attention, this bit is important.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;is that one of the major obstacles I've encountered in writing over the past few years is feeling slowed down by the fact that I have to commit to a character's gender identity if I want to use pronouns for them, &lt;em&gt;and be able to use multiple pronouns to be able to differentiate between them&lt;/em&gt;.
I know this problem probably won't resonate with a lot of people, and I don't always have it, but I have it enough that I just wanted a break.&lt;/p&gt;
&lt;p&gt;So, I devised what I'm calling the &amp;quot;YSK paradigm&amp;quot;, named after the first letter of each of the roots for the new pronouns.
I don't feel like going into detail about spelling/pronunciation right now (there's a non-zero chance I'll end up revising the current version), but I'll lay out the basic idea:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The &amp;quot;Y&amp;quot; pronouns indicate &amp;quot;this person or people&amp;quot;&lt;/li&gt;
&lt;li&gt;The &amp;quot;S&amp;quot; pronouns indicate &amp;quot;that person or people&amp;quot;&lt;/li&gt;
&lt;li&gt;The &amp;quot;K&amp;quot; pronouns indicate &amp;quot;that person or people over there&amp;quot;&lt;/li&gt;
&lt;li&gt;There are singular and plural versions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, I've failed to explain this before, and in an attempt to anticipate that failure mode, I'd like to say, if one of the thoughts you have after reading the last few paragraphs is &amp;quot;If you're using these, it would help to have a table beforehand explaining which characters get which pronouns&amp;quot;, then you have gravely misunderstood me, and if you wish to rectify that, you should reread from after the smiley box.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;&amp;quot;smiley box&amp;quot;?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Well, what's anyone &lt;em&gt;supposed&lt;/em&gt; to call that thing ↑?&lt;/p&gt;
&lt;p&gt;Anyway, maybe I'll have stuff using these put out publicly soon, maybe not.
We'll see.&lt;/p&gt;
&lt;p&gt;For now, I once again need to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="writing"></category><category term="neopronouns"></category><category term="YSK"></category></entry><entry><title>Diary 2024-01-03</title><link href="https://mwchase.neocities.org/diary-2024-01-03" rel="alternate"></link><published>2024-01-03T05:00:00-05:00</published><updated>2024-01-03T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-01-03:/diary-2024-01-03</id><summary type="html">&lt;p class="first last"&gt;About two weeks of not being in our usual bed. Eesh.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, we're back.
Time to relax a bit.&lt;/p&gt;
&lt;p&gt;I found the color stuff I was looking for; it was &lt;a class="reference external" href="https://reasonable.work/colors/"&gt;Reasonable Colors&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Aside from working that stuff out, I didn't get too much done today.
I discussed some lore for a project my wife is working on.
We made some important progress there, but nothing that would look big if we pointed at it, if that makes sense.&lt;/p&gt;
&lt;p&gt;And now it's late, and I'd like to get things wrapped up in the next few minutes.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2024-01-02</title><link href="https://mwchase.neocities.org/weekly-roundup-2024-01-02" rel="alternate"></link><published>2024-01-02T05:00:00-05:00</published><updated>2024-01-02T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-01-02:/weekly-roundup-2024-01-02</id><summary type="html">&lt;p class="first last"&gt;Post-holiday rundown&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I made some progress with MOTR, at least in terms of planning changes.&lt;/li&gt;
&lt;li&gt;Thursday: I executed the plans, and ran into issues, which I eventually fixed.&lt;/li&gt;
&lt;li&gt;Friday: I got to a point with MOTR where I need a break; I &lt;em&gt;may&lt;/em&gt; have some plans to look into later.&lt;/li&gt;
&lt;li&gt;Saturday: I took things easy.&lt;/li&gt;
&lt;li&gt;Sunday: I complained about Vue.js. Oh well.&lt;/li&gt;
&lt;li&gt;Monday: I explained what I was looking into Vue.js for, and how I'm looking into restricted color palettes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, we're heading back home, then I'll work more on writing or something.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="MOTR"></category><category term="JavaScript"></category></entry><entry><title>Diary 2024-01-01</title><link href="https://mwchase.neocities.org/diary-2024-01-01" rel="alternate"></link><published>2024-01-01T05:00:00-05:00</published><updated>2024-01-01T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2024-01-01:/diary-2024-01-01</id><summary type="html">&lt;p class="first last"&gt;I have googled so many things with no luck...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's see.
It's kind of late now, but we'll probably be up for a while longer.
Thinking about the stuff I was talking around yesterday.&lt;/p&gt;
&lt;p&gt;I've got a few ideas for incremental games that I want to mess with, and I think that &lt;a class="reference external" href="https://github.com/Acamaeda/The-Modding-Tree"&gt;The Modding Tree&lt;/a&gt; would be a good fit for them in terms of functionality, but.
The visuals make my head hurt.
Too much contrast, too small text.
Sometimes far too little contrast.
From a layout perspective, things &lt;em&gt;can&lt;/em&gt; get really janky.&lt;/p&gt;
&lt;p&gt;So, I want to try to rethink a lot of the visual language, and part of that is restricting the color scheme so that there's more &amp;quot;accent colors&amp;quot; and less &amp;quot;the color of this layer is an animated gif&amp;quot;.
I'm thinking of doing this based on &lt;a class="reference external" href="https://github.com/jan-warchol/selenized"&gt;Selenized&lt;/a&gt;, but I was also thinking about trying to use a color palette that I'm having trouble finding, and it's bothering me...&lt;/p&gt;
&lt;p&gt;We'll see if I ever remember, but for now, I want to shut things down now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2023-12-31</title><link href="https://mwchase.neocities.org/diary-2023-12-31" rel="alternate"></link><published>2023-12-31T05:00:00-05:00</published><updated>2023-12-31T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-12-31:/diary-2023-12-31</id><summary type="html">&lt;p class="first last"&gt;I feel like it shouldn't be allowed for &amp;quot;When does this variable end up pointing to an object that has these fields?&amp;quot; to be so hard for me to answer.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I could have made this into a coding entry, but I didn't.
The main thing worth talking about that I did today was to take a VueJS 2 project that I'm passingly familiar with, and try to create a fork using VueJS 3.
I very, very quickly ended up out of my depth, and decided, you know what, I'm going to focus on the other things I want out of this project.&lt;/p&gt;
&lt;p&gt;(The problem I ran into was how to convert &lt;tt class="docutils literal"&gt;set&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;delete&lt;/tt&gt; calls into uses of proxy objects, when I was having trouble tracking down which code actually populates the values that need to be replaced with proxies.
If someone can point me (on Mastodon or Cohost or whatever) to a resource that explains how to deal with this in an unfamiliar codebase, I think that's all I'd actually need to attempt the update again.
No advanced libraries or anything complicating the migration.)&lt;/p&gt;
&lt;p&gt;Anyway, the more significant thing I wanted to work on with this was a comprehensive overhaul of the visual language, because it's kind of a bad sign, I think, when I have to squint at small numbers on weird contrast backgrounds that give me crazy afterimages.&lt;/p&gt;
&lt;p&gt;I'll try and explain what I'm on about later; I want to wrap things up right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2023-12-30</title><link href="https://mwchase.neocities.org/diary-2023-12-30" rel="alternate"></link><published>2023-12-30T05:00:00-05:00</published><updated>2023-12-30T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-12-30:/diary-2023-12-30</id><summary type="html">&lt;p class="first last"&gt;Just kind of did whatever.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hm.
Not too organized today.
The most significant thing I did was some research for a project I may write up here, we'll see.&lt;/p&gt;
&lt;p&gt;Aside from that, I'm futzing around with games to maybe play.
Maybe later, I'll play them, and maybe I'll write something about them.
We'll see.
Maybe that'll wait until I have access to a controller again.&lt;/p&gt;
&lt;p&gt;I think I must be just recovering from some of the issues I ran into trying to update MOTR.
We'll see what I'm up for doing in the next few days.&lt;/p&gt;
&lt;p&gt;For now, I really should get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2023-12-29</title><link href="https://mwchase.neocities.org/coding-2023-12-29" rel="alternate"></link><published>2023-12-29T05:00:00-05:00</published><updated>2023-12-29T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-12-29:/coding-2023-12-29</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Ooh, nameless things, how spooky...&amp;quot; They're really confusing and frustrating, is what they are.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay.
Okay.
Okay.&lt;/p&gt;
&lt;p&gt;I've finished up the current round of code reorganization, and this has successfully excised that one branch I didn't want to write tests for.
Good.&lt;/p&gt;
&lt;p&gt;Unfortunately, this has left the code in a state of... chaos would be a strong word.
Basically, I've been isolating the code into logical units based on how different pieces of data relate to each other, and I've basically ended up with more of these logical units than I have concepts.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Believe it.
One of the new classes is literally just named &lt;tt class="docutils literal"&gt;Foo&lt;/tt&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;So, obviously, I would like to address that.
But I've got plenty of experience from while I was doing the recent rewrites, of &lt;em&gt;trying to do just that&lt;/em&gt;, and bouncing off.
Now, &lt;em&gt;hopefully&lt;/em&gt; this will be easier following the rewrites, but I think for sure I need to take a break and look at this with fresh eyes.&lt;/p&gt;
&lt;p&gt;I've also got some out-there ideas that might not work, which could simplify things a little, potentially.
(Initial simplified tests indicate that it could help.
The idea is to try to cut down on the absurd proliferation of type variables, by, um, creating more type variables.)
Here's the playground code I wrote so I hopefully remember what I was thinking of doing:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Generic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TypeVar&lt;/span&gt;

&lt;span class="n"&gt;L&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TypeVar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;L&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bound&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TypeVar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;T&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Generic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fst&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Hello&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;NotImplementedError&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Anyway.
I can try to get into other coding projects, or I can get back to some writing that I kind of left myself hanging on.
We'll see.&lt;/p&gt;
&lt;p&gt;For now, though, it's not worth trying to do any more tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2023-12-28</title><link href="https://mwchase.neocities.org/coding-2023-12-28" rel="alternate"></link><published>2023-12-28T05:00:00-05:00</published><updated>2023-12-28T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-12-28:/coding-2023-12-28</id><summary type="html">&lt;p class="first last"&gt;Trust nobody, not even yourself.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Oh boy.
I've gotten so close to getting this stuff working, I just need to figure out what I did to make Mypy unhappy with the code related to —
Aw man, I figured it out, that was awful.&lt;/p&gt;
&lt;p&gt;See, I've got &lt;tt class="docutils literal"&gt;GenericRunner&lt;/tt&gt;, which has specializations to &lt;tt class="docutils literal"&gt;Runner&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;ModuleRunner&lt;/tt&gt;, and doing that was perhaps not the best idea, because of stuff like &amp;quot;accidentally passing an unbound method reference scoped to &lt;tt class="docutils literal"&gt;Runner&lt;/tt&gt; instead of &lt;tt class="docutils literal"&gt;GenericRunner&lt;/tt&gt;&amp;quot;.
Ugh, oh well.&lt;/p&gt;
&lt;p&gt;With that bit of insight obtained, I've gotten Mypy to accept the required upstream changes, and gotten the tests to pass.
Once I have the many flake8 issues that I have doubtless introduced addressed, I can finally make the changes I intended to make in the &lt;tt class="docutils literal"&gt;GenericRunner&lt;/tt&gt; class itself, and see how that shakes out.
Once those are in, it's one more round of renames, and then I can merge this to the coverage topic, then have a completely awful merge up to the future topic.&lt;/p&gt;
&lt;p&gt;Wish me luck...&lt;/p&gt;
&lt;p&gt;Anyway, that's all happening later.
Right now I'm going to get to bed so I'm not up super-late again.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2023-12-27</title><link href="https://mwchase.neocities.org/coding-2023-12-27" rel="alternate"></link><published>2023-12-27T05:00:00-05:00</published><updated>2023-12-27T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-12-27:/coding-2023-12-27</id><summary type="html">&lt;p class="first last"&gt;I confused myself several times working this out.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hoo boy...
I just roughed out the Protocol for handling the different behavior needed for &lt;tt class="docutils literal"&gt;ParametricCommand&lt;/tt&gt; stuff, and keeping straight what it does is going to be a nightmare.
I'll try to run through it quick before I get ready for bed.
Basically, there's one method that takes a &lt;tt class="docutils literal"&gt;Matrix&lt;/tt&gt;, and &lt;em&gt;may&lt;/em&gt; modify it.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;If the method is called on the newtype-style wrapper, it must pass back its argument, unchanged.&lt;/li&gt;
&lt;li&gt;If the method is called, specifically on a &lt;tt class="docutils literal"&gt;ParametricCommand[Module, _program.T, _installer.T, _runner.T]&lt;/tt&gt;, it must accept a &lt;tt class="docutils literal"&gt;Matrix[ModuleRunner[_entry.T, Any, _installer.T]&lt;/tt&gt;, and return a &lt;tt class="docutils literal"&gt;Matrix[GenericRunner[_entry.T, _program.T, _installer.T, _runner.T]]&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Strictly speaking, it probably doesn't have to be quite so detailed with the types, but every &lt;tt class="docutils literal"&gt;Any&lt;/tt&gt; makes it harder to think about.
Either way, I'll see if I'm up for implementing all this tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2023-12-26</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-12-26" rel="alternate"></link><published>2023-12-26T05:00:00-05:00</published><updated>2023-12-26T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-12-26:/weekly-roundup-2023-12-26</id><summary type="html">&lt;p class="first last"&gt;A hectic week.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: Bad time management.&lt;/li&gt;
&lt;li&gt;Thursday: I messed around with a few things, but nothing in enough detail to write about.&lt;/li&gt;
&lt;li&gt;Friday: I started tinkering with MOTR again.&lt;/li&gt;
&lt;li&gt;Saturday: Bad time management.&lt;/li&gt;
&lt;li&gt;Sunday: Decent time management, but due to factors, I still didn't have anything to write about.&lt;/li&gt;
&lt;li&gt;Monday: I got some insight into changes I'm going to want to make to MOTR.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to get stuff done, now that we're not rushing around.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="writing"></category></entry><entry><title>Coding 2023-12-25</title><link href="https://mwchase.neocities.org/coding-2023-12-25" rel="alternate"></link><published>2023-12-25T05:00:00-05:00</published><updated>2023-12-25T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-12-25:/coding-2023-12-25</id><summary type="html">&lt;p class="first last"&gt;Ah, back to &lt;em&gt;extremely&lt;/em&gt; inside baseball.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay.
So.
I'm in the middle of some kind of big weird rewrite regarding what used to be &lt;tt class="docutils literal"&gt;CommandBuilder&lt;/tt&gt; and is currently &lt;tt class="docutils literal"&gt;Runner&lt;/tt&gt;, because that name's not &lt;em&gt;great&lt;/em&gt;, but it's &lt;em&gt;better&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The actually important change is that I added a parameter to &lt;tt class="docutils literal"&gt;Runner&lt;/tt&gt; to replace one of its &lt;tt class="docutils literal"&gt;Optional&lt;/tt&gt; fields.
The upshot of doing that &lt;em&gt;locally&lt;/em&gt; is that I get to delete a conditional branch that was &lt;em&gt;really bothering me&lt;/em&gt;.
However, actually going through with this change incurs a lot of costs, and I figured I'd try to pay those costs before getting too attached to the benefits.
Currently, I'm squirreled up in the &lt;tt class="docutils literal"&gt;parametric_command&lt;/tt&gt; code.&lt;/p&gt;
&lt;p&gt;Let's quick lay out what's going on there, because if I just try to touch the code without planning, I'll probably mess it up.
So, there are two axes of variation I care about.
They're on the &lt;tt class="docutils literal"&gt;ParametricCommand&lt;/tt&gt; class, which has two fields: a &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;ParametricCommandMeta[...]&lt;/span&gt;&lt;/tt&gt;, and a &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;ParametricCommand[...]&lt;/span&gt; | &lt;span class="pre"&gt;SelectionDirectory[...]&lt;/span&gt;&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Now that the &lt;tt class="docutils literal"&gt;ParametricCommandMeta&lt;/tt&gt; class has a &lt;tt class="docutils literal"&gt;_runner.T&lt;/tt&gt; parameter, it's necessary to look at how the actions there interact with the union members.
The answer is, that if &lt;tt class="docutils literal"&gt;_runner.T&lt;/tt&gt; is &lt;tt class="docutils literal"&gt;None&lt;/tt&gt;, then the union can't be a &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;ParametricCommand[...]&lt;/span&gt;&lt;/tt&gt;, because that branch of the union represents something being run as a module.&lt;/p&gt;
&lt;p&gt;Now, the interesting question is whether the opposite case should also be disallowed.
I'm going to go with a firm maybe: I should go with whatever makes the implementation easier.&lt;/p&gt;
&lt;p&gt;And speaking of the implementation, if I'm going to change this union into something that keys off of the &lt;tt class="docutils literal"&gt;_runner.T&lt;/tt&gt;, I'm going to need to write a parametric protocol to handle that, and to make that work, I'm going to need to write a wrapper class for the &lt;tt class="docutils literal"&gt;SelectionDirectory&lt;/tt&gt;.
Then, if I've got a protocol &lt;em&gt;anyway&lt;/em&gt;, I might as well leverage it by rewriting all of the &lt;tt class="docutils literal"&gt;ParametricCommand&lt;/tt&gt; methods that currently dispatch on the union branch into protocol methods.&lt;/p&gt;
&lt;p&gt;Key note for my future self: because the wrapper class is going to basically be the newtype pattern, I don't need to explicitly expose the class to the rest of the code; I can just apply it in the &lt;tt class="docutils literal"&gt;with_directory()&lt;/tt&gt; function, keeping the calling interface the same.&lt;/p&gt;
&lt;p&gt;I think that covers everything I was thinking about.
I'd try to do it now, but, as usual when I'm writing these, it's late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Diary 2023-12-24</title><link href="https://mwchase.neocities.org/diary-2023-12-24" rel="alternate"></link><published>2023-12-24T05:00:00-05:00</published><updated>2023-12-24T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-12-24:/diary-2023-12-24</id><summary type="html">&lt;p class="first last"&gt;Sort of meant to be back somewhat sooner, but oh well.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;As anticipated, there was a bunch of travel today that kind of got in the way of having much to write about.
I have made some minor progress on a few things, but nothing yet worth discussing.&lt;/p&gt;
&lt;p&gt;The travel led to a good time, but being on the road for so long, it's hard to deal with it.&lt;/p&gt;
&lt;p&gt;I'm not thinking too clearly, so I'm going to try to get ready for bed soon.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2023-12-23</title><link href="https://mwchase.neocities.org/diary-2023-12-23" rel="alternate"></link><published>2023-12-23T05:00:00-05:00</published><updated>2023-12-23T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-12-23:/diary-2023-12-23</id><summary type="html">&lt;p class="first last"&gt;Maybe I need to stop playing The Modding Tree games...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I ended up not having much today to write about.
I'm going to be on the road a bunch tomorrow, so I'm not going to have much tomorrow, either.
These next few days are going to have a lot going on, so now I'm thinking about, once I'm through all of that, I'm going to need to figure out how to actually get stuff done.&lt;/p&gt;
&lt;p&gt;I'm done for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2023-12-22</title><link href="https://mwchase.neocities.org/coding-2023-12-22" rel="alternate"></link><published>2023-12-22T05:00:00-05:00</published><updated>2023-12-22T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-12-22:/coding-2023-12-22</id><summary type="html">&lt;p class="first last"&gt;I remember seeing someone advocate for every product type having just two members. Kind of moving in that direction...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did a few things today, but one of them was picking MOTR back up from where I left off.
This basically boiled down to fixing all of the Mypy and other errors caused by removing a single default value.&lt;/p&gt;
&lt;p&gt;If I remember what I was thinking when I took a break, the next step is to consolidate the field that I changed with the one after it, into yet another new data class.
Then I can add a new type parameter to the class that &lt;em&gt;still&lt;/em&gt; needs to be renamed, and then I get to fix a new set of Mypy errors.
I remain hopeful that this will all resolve into an improved layout and data flow, but it is hard to deny that the process of getting to wherever the endpoint is, kind of looks like someone deconstructed all of a multi-course meal...&lt;/p&gt;
&lt;p&gt;Anyway, I need to wrap things up and get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Diary 2023-12-21</title><link href="https://mwchase.neocities.org/diary-2023-12-21" rel="alternate"></link><published>2023-12-21T05:00:00-05:00</published><updated>2023-12-21T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-12-21:/diary-2023-12-21</id><summary type="html">&lt;p class="first last"&gt;Yay, incremental progress.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, I've got more time tonight, and I have &lt;em&gt;something&lt;/em&gt; to write about this time.&lt;/p&gt;
&lt;p&gt;I've been messing around with writing really short-form stuff in a vague ambiguously-fantasy setting.
I'm trying to draw from the early works of Lord Dunsany, from Invisible Cities, and from Tlön, Uqbar, Orbis Tertius.&lt;/p&gt;
&lt;p&gt;I feel like this is kind of hemming in some of my worldbuilding-related excesses, because the &amp;quot;point&amp;quot; of the setting is to raise questions, more or less, so it doesn't &lt;em&gt;help&lt;/em&gt; me any to try to &amp;quot;stockpile&amp;quot; answers.&lt;/p&gt;
&lt;p&gt;There's another point to all of this writing, but I don't feel like I can explain it coherently right now.
I've tried to explain it to a few people in the past, and got frustrated when stuff that I thought was completely clear just got, like, glossed over.&lt;/p&gt;
&lt;p&gt;But I shouln't focus on that right now, because the main thing I'm feeling right now is tired.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="writing"></category></entry><entry><title>Diary 2023-12-20</title><link href="https://mwchase.neocities.org/diary-2023-12-20" rel="alternate"></link><published>2023-12-20T05:00:00-05:00</published><updated>2023-12-20T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-12-20:/diary-2023-12-20</id><summary type="html">&lt;p class="first last"&gt;Oops.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;It's late.&lt;/p&gt;
&lt;p&gt;I did unimportant stuff for most of the day.&lt;/p&gt;
&lt;p&gt;I have less than no time to write this, so I'm not going to.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2023-12-19</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-12-19" rel="alternate"></link><published>2023-12-19T05:00:00-05:00</published><updated>2023-12-19T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-12-19:/weekly-roundup-2023-12-19</id><summary type="html">&lt;p class="first last"&gt;A few time many &amp;quot;Whoops it's 11 PM&amp;quot;s this week...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I didn't have much to say because I was distracted. Miscellaneous bits of work.&lt;/li&gt;
&lt;li&gt;Thursday: I rewrote some code for representing playing cards. It had issues.&lt;/li&gt;
&lt;li&gt;Friday: I found some things that marimo never claimed to be suited for, and definitely isn't.&lt;/li&gt;
&lt;li&gt;Saturday: More progress on the card code, and then I decided to step away from it until I figure out what it's &lt;em&gt;for&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Sunday: I made some minor progress writing.&lt;/li&gt;
&lt;li&gt;Monday: Terrible time management.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to hopefully get more on top of all of these projects.
We'll see.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="marimo"></category><category term="writing"></category></entry><entry><title>Diary 2023-12-18</title><link href="https://mwchase.neocities.org/diary-2023-12-18" rel="alternate"></link><published>2023-12-18T05:00:00-05:00</published><updated>2023-12-18T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-12-18:/diary-2023-12-18</id><summary type="html">&lt;p class="first last"&gt;Time management my insufficiently beloved...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&amp;quot;Haha, why don't I play some silly browser games and oh no it is 11 PM.&amp;quot;&lt;/p&gt;
&lt;p&gt;Anyway, I also found some good inspiration stuff for my writing; I'll talk about that later.
For now, I need to salvage things by getting into bed as soon as I can.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2023-12-17</title><link href="https://mwchase.neocities.org/diary-2023-12-17" rel="alternate"></link><published>2023-12-17T05:00:00-05:00</published><updated>2023-12-17T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-12-17:/diary-2023-12-17</id><summary type="html">&lt;p class="first last"&gt;I really should try to explain what I'm trying to do with this writing sometime...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did some short-form writing that I think it helping me with the stuff I intend it to help with.
This stuff is all so short that I should probably try to figure out some way to turn it into poems, or better-structured &amp;quot;flash fiction&amp;quot;.&lt;/p&gt;
&lt;p&gt;I let things get late, and I don't have anything else to say on the matter, really.
Good night.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="writing"></category></entry><entry><title>Coding 2023-12-16</title><link href="https://mwchase.neocities.org/coding-2023-12-16" rel="alternate"></link><published>2023-12-16T05:00:00-05:00</published><updated>2023-12-16T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-12-16:/coding-2023-12-16</id><summary type="html">&lt;p class="first last"&gt;Trying to figure out what I actually want to do with this code...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The card code is shaping up a bit.
I &lt;em&gt;thought&lt;/em&gt; I was going to change the &amp;quot;design&amp;quot; somewhat, but I ended up just improving the implementation of the existing interface.
I added some helpers and a new type, and then created a bunch more decks.&lt;/p&gt;
&lt;p&gt;I think I should try to change gears from this for a while, but when I come back to it, I should &lt;em&gt;probably&lt;/em&gt; try to figure out how to write pretty-printers for decks.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to stop thinking about that, and try to focus on writing instead.
I've got some stuff I need to focus on, but some of the details there are flexible.
Anyway, I've been spacing out listening to utterly cursed song remixes for too long, so I'm just going to cut this off abruptly.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="marimo"></category><category term="short post"></category></entry><entry><title>Coding 2023-12-15</title><link href="https://mwchase.neocities.org/coding-2023-12-15" rel="alternate"></link><published>2023-12-15T05:00:00-05:00</published><updated>2023-12-15T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-12-15:/coding-2023-12-15</id><summary type="html">&lt;p class="first last"&gt;I'll have to look for other ways to do code sketching.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's see...&lt;/p&gt;
&lt;p&gt;I was looking into doing Tkinter prototyping in marimo.
I think I would not recommend this; I anticipated the obvious caveats, but there were some non-obvious issues, that I'm not sure what to think of.
(Basically, I wanted to put the &lt;tt class="docutils literal"&gt;mainloop()&lt;/tt&gt; calls in a UI callback so there's like, a &amp;quot;setup&amp;quot; phase, and then I can trigger the actual window stuff with a button.
This doesn't work, but I don't know why it doesn't and if it &amp;quot;should&amp;quot;.)&lt;/p&gt;
&lt;p&gt;Anyway, I messed around with the card code as well, and I'm stuck against, like, I need to take this rough prototype and then properly think through how it should all relate.
Even with some of my attempts to clean stuff up, it's still a bit of a mess.
I'm tired now, so I'm going to wrap up and try to figure out the design I should be aiming for.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="marimo"></category><category term="short post"></category></entry><entry><title>Coding 2023-12-14</title><link href="https://mwchase.neocities.org/coding-2023-12-14" rel="alternate"></link><published>2023-12-14T05:00:00-05:00</published><updated>2023-12-14T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-12-14:/coding-2023-12-14</id><summary type="html">&lt;p class="first last"&gt;Not sure what I want to &lt;em&gt;do&lt;/em&gt; with this, but I &lt;em&gt;want&lt;/em&gt; it. At least it didn't cost me much to write.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Oof, partied too hard today, in a way that was imperceptible at the time.
Let's see how much I'm up for.&lt;/p&gt;
&lt;p&gt;I dusted off some of my old hobby code today, copying it from a Jupyter notebook into marimo.
Along the way, I made some changes.
See, the original version had a bunch of type-level &lt;em&gt;stuff&lt;/em&gt; going on, and I ended up replacing what I was trying to do there with runtime validation.
This was &lt;em&gt;mostly&lt;/em&gt; fine in my opinion, but I think I swung the pendulum &lt;em&gt;slightly&lt;/em&gt; too far, and I need to find some way to recover the marker-y nonsense I had going on, to a limited extent.&lt;/p&gt;
&lt;p&gt;Anyway, the code itself.
I can't explain &lt;em&gt;why&lt;/em&gt;, but I wanted to have a minimal toolkit for expressing arbitrary decks of cards.
Currently, I've got code that can generate a normal 52-card deck plus any number of jokers, and both Japanese and Korean hanafuda/hwatu decks.
My &lt;em&gt;assumption&lt;/em&gt; is that that's enough flexibility to handle most traditional decks; I'm not intending to handle anything that has a regular release schedule, for example.&lt;/p&gt;
&lt;p&gt;So, what's left to do before I ponder trying to library-ize this code?&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Get some type-marker-y stuff in, and tighten up some annotations.&lt;/li&gt;
&lt;li&gt;Figure out how to pretty-print card names, and generally how to write multimethods against them.
Right now, I'm using the default &lt;tt class="docutils literal"&gt;attrs&lt;/tt&gt; methods for printing, which are way too verbose for most purposes, but any replacement is going to need some form of contextual information that I'm not sure how to provide.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, I'll think about that, and other things, and try to make it to the weekend.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="marimo"></category></entry><entry><title>Diary 2023-12-13</title><link href="https://mwchase.neocities.org/diary-2023-12-13" rel="alternate"></link><published>2023-12-13T05:00:00-05:00</published><updated>2023-12-13T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-12-13:/diary-2023-12-13</id><summary type="html">&lt;p class="first last"&gt;Got distracted. I guess I'm unwinding or whatever.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I wasn't really organized enough to have a single post to write today.
I've been reading a bunch, and I should be done with that book soon.
In any case, I messed around with a few other things.&lt;/p&gt;
&lt;p&gt;I made some further attempts at musical arrangement, and the result is... it sounds okay so far in aggregate, but it becomes much weaker when broken down to its basic components, which bothers me somewhat.&lt;/p&gt;
&lt;p&gt;I also did some worldbuilding stuff, and I'm making some progress there.
The specific stuff I'm working on, I'm probably not going to pick back up, so I'll try to switch focus there to some projects that are more relevant to me.&lt;/p&gt;
&lt;p&gt;For now, though, I really need to be getting to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2023-12-12</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-12-12" rel="alternate"></link><published>2023-12-12T05:00:00-05:00</published><updated>2023-12-12T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-12-12:/weekly-roundup-2023-12-12</id><summary type="html">&lt;p class="first last"&gt;I'm not sure, but I think my efforts to get more dang sleep are paying off.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I investigated the basic sounds of some common chord loops.&lt;/li&gt;
&lt;li&gt;Thursday: I made a little more progress with that, but not much more.&lt;/li&gt;
&lt;li&gt;Friday: I fiddled around with marimo, and had some weird ideas about stuff I could try to do with it.&lt;/li&gt;
&lt;li&gt;Saturday: I wrote some very normal Python code. There is no need to look at the post to confirm this.&lt;/li&gt;
&lt;li&gt;Sunday: Traveled out, didn't have much to say.&lt;/li&gt;
&lt;li&gt;Monday: Traveled back, had slightly more to say, which still wasn't much.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I've got a few things lined up.
I'm attempting to arrange some simple music for, um, nine parts...
And I've got some stuff ready to mess around with for some worldbuilding from months ago...
And I've got some other worldbuilding I'm trying to put together for some stuff my wife is working on.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="music"></category><category term="worldbuilding"></category><category term="Python"></category></entry><entry><title>Diary 2023-12-11</title><link href="https://mwchase.neocities.org/diary-2023-12-11" rel="alternate"></link><published>2023-12-11T05:00:00-05:00</published><updated>2023-12-11T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-12-11:/diary-2023-12-11</id><summary type="html">&lt;p class="first last"&gt;Oh also my laptop freaked out again this morning. Not happy about that...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Travel back.&lt;/p&gt;
&lt;p&gt;I did research on a few things I was interested in, and I think I'm getting a better handle on them, but I don't feel like I have anything interesting to say about them yet.&lt;/p&gt;
&lt;p&gt;One thing: as far as music goes, I'm going to try arranging existing pieces for combinations of instruments I'm interested in, and see if I learn anything from that.
As far as that goes, I feel like I just need to do some minor research and thinking to handle &lt;em&gt;most&lt;/em&gt; of the instruments, but I don't know anything about arranging for percussion, so that's going to be a thing.&lt;/p&gt;
&lt;p&gt;I do have some work I want to do on other things, but I don't know if I have the energy to talk about it now, so I'm not sure about doing it.
But, I'm spacing out right now, so I'd better wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2023-12-10</title><link href="https://mwchase.neocities.org/diary-2023-12-10" rel="alternate"></link><published>2023-12-10T05:00:00-05:00</published><updated>2023-12-10T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-12-10:/diary-2023-12-10</id><summary type="html">&lt;p class="first last"&gt;Nothing interesting in this one.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;More travel today.&lt;/p&gt;
&lt;p&gt;I'm still pondering ways to push my usage of marimo, but I don't have anything to &lt;em&gt;show&lt;/em&gt; for that yet.
Hopefully I'll have something there in a few days.&lt;/p&gt;
&lt;p&gt;Aside from that, tonight was a lot, and I'll just hurt myself if I push really hard.
It's time to chill out.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2023-12-09</title><link href="https://mwchase.neocities.org/coding-2023-12-09" rel="alternate"></link><published>2023-12-09T05:00:00-05:00</published><updated>2023-12-09T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-12-09:/coding-2023-12-09</id><summary type="html">&lt;p class="first last"&gt;Granted, the error was &amp;quot;Stop that, you can't do that&amp;quot;; I simply chose to ignore it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Still doing stuff in marimo.
The bug I reported got fixed, which I'm glad about.
It &lt;em&gt;sounded&lt;/em&gt; like it wouldn't be too hard to address, &lt;em&gt;given familiarity with the code&lt;/em&gt;, and I think that's how it ended up.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Hm, yeah, looks very much like a &amp;quot;small change, but you have to know &lt;em&gt;which&lt;/em&gt; small change&amp;quot;.&lt;/p&gt;
&lt;p&gt;Aside from that bug, I wrote some extremely normal code.&lt;/p&gt;
&lt;div class="admonition smiley smiley-glitchy"&gt;
&lt;p class="first admonition-title"&gt;:) (glitchy)&lt;/p&gt;
&lt;p class="last"&gt;You have to show them. It's &lt;em&gt;hilarious&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;You know, there are languages where this functionality would be completely unremarkable.&lt;/p&gt;
&lt;div class="admonition smiley smiley-glitchy"&gt;
&lt;p class="first admonition-title"&gt;:) (glitchy)&lt;/p&gt;
&lt;p class="last"&gt;I want you to make them imagine the calibre of Mypy plugin that would be required to make this even vaguely okay.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;It only raised one error in the playground!&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Fine.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GenericEnumType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;enum&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EnumType&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__getitem__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="fm"&gt;__getitem__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__class_getitem__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition smiley smiley-glitchier"&gt;
&lt;p class="first admonition-title"&gt;:) (glitchier)&lt;/p&gt;
&lt;p class="last"&gt;yes... ha ha ha... YES&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I will say that I really do appreciate how marimo made it easier to prototype these Metaprogramming Crimes.
Just regenerating everything downstream when I want to quick try out another approach.
That would be a nightmare in a REPL or (to a somewhat lesser extent) in Jupyter.&lt;/p&gt;
&lt;p&gt;Although, on that note, I'd kind of like to apologize to the marimo team for taking the capabilities they gave me, gave everyone, and doing... that.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Yeah, how do you sleep at night?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Soon&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="marimo"></category></entry><entry><title>Coding 2023-12-08</title><link href="https://mwchase.neocities.org/coding-2023-12-08" rel="alternate"></link><published>2023-12-08T05:00:00-05:00</published><updated>2023-12-08T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-12-08:/coding-2023-12-08</id><summary type="html">&lt;p class="first last"&gt;Not really sure where any of this will, or can, go, but whatever.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The inscrutable exhortations of my soul told me to transcribe mathematical functions from a book into a marimo notebook, so I guess that's what I did today.
I'm right now at a point where I need to decide how I want to represent some numbers; this is likely to result in a significant amount of thought for very little change in the behavior of the code, and I'm at peace with that.&lt;/p&gt;
&lt;p&gt;I am, for reasons, not going to go into much more detail about this code, so let's see if anything else occurs to me...&lt;/p&gt;
&lt;p&gt;Here's an idea that might be questionable: with the right design, an interactive fiction library compatible with Python could use marimo to do output validation similar to the &amp;quot;&lt;a class="reference external" href="https://ganelson.github.io/inform-website/book/WI_1_7.html"&gt;Skein&lt;/a&gt;&amp;quot; concept from Inform.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;So, I just looked into interactive fiction in Python, and nothing leapt out at me as &amp;quot;this is well-suited for what I was thinking of&amp;quot;.
I'll just let this idea stew for a bit, and focus on other things for the time being.&lt;/p&gt;
&lt;p&gt;For the immediate future, though, oof, sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="marimo"></category><category term="short post"></category></entry><entry><title>Music Theory 2023-12-07</title><link href="https://mwchase.neocities.org/music-theory-2023-12-07" rel="alternate"></link><published>2023-12-07T05:00:00-05:00</published><updated>2023-12-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-12-07:/music-theory-2023-12-07</id><summary type="html">&lt;p class="first last"&gt;If anyone wants to recommend me tutorials via Mastodon or whatever, that'd be cool.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Still messing around with basic stuff.
I think I need to get a little bolder with my melodies, since the stuff I had before was pretty much all stepwise motion.&lt;/p&gt;
&lt;p&gt;There is a major obstacle to self-directed stuff here, and that is that my ability to judge how well something works seems to be hampered by a deep sense of satisfaction as a result of &amp;quot;hear one thing three times, then something else, then repeat from the beginning&amp;quot;.
Maybe I can build that up somehow?&lt;/p&gt;
&lt;p&gt;I'll have to think about it later, because it's once again really late and I'm tired.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Music Theory"></category><category term="composition"></category><category term="chord loops"></category><category term="short post"></category></entry><entry><title>Music Theory 2023-12-06</title><link href="https://mwchase.neocities.org/music-theory-2023-12-06" rel="alternate"></link><published>2023-12-06T05:00:00-05:00</published><updated>2023-12-06T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-12-06:/music-theory-2023-12-06</id><summary type="html">&lt;p class="first last"&gt;This feels like it should be harder, so I'm pretty sure I'm missing something.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Wow, the last post in this category was a while ago.
Anyway, I started small with this whole &amp;quot;music&amp;quot; thing.
I came up with some rhythmic ideas I thought were interesting, put them over basic chord loops, found stable-enough scale degrees to put in the melody, and ended up with minimal cores of what could potentially become a song.
The thing I need to deal with is just how much heavy lifting the choice of chord loop seems to do:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Royal_road_progression"&gt;Royal Road progression&lt;/a&gt; → sounds like it could be from some random OVA I saw ten years ago and forgot about.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://en.wikipedia.org/wiki/I%E2%80%93V%E2%80%93vi%E2%80%93IV_progression"&gt;The progression that's been common in pop music&lt;/a&gt; → a pop song.&lt;/li&gt;
&lt;li&gt;The same progression, but in minor key → a pop song, but it's sad now.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It's kind of weird to think about how much saying &amp;quot;these chords in this order&amp;quot; seems to constrain what the song sounds like.
Like, does it end up with &amp;quot;choose the chords to set the tone, put the desired melody on top, and then just puzzle-game the voicing into place&amp;quot;?
Is that how this works?
I &lt;em&gt;must&lt;/em&gt; be erasing some vital nuance here.&lt;/p&gt;
&lt;p&gt;Anyway, I'll leave that to tomorrow, because it's late and I meant to already be in bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Music Theory"></category><category term="composition"></category><category term="chord loops"></category></entry><entry><title>Weekly Roundup 2023-12-05</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-12-05" rel="alternate"></link><published>2023-12-05T05:00:00-05:00</published><updated>2023-12-05T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-12-05:/weekly-roundup-2023-12-05</id><summary type="html">&lt;p class="first last"&gt;Mostly I just realized just how tired I've consistently been lately, and how I should do something about that.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I came to a decision in MOTR that I didn't want to rush, so I'm going to be focusing on other things for the duration of this roundup. I thought about looking into some programming languages besides Python. (And then &lt;em&gt;mostly&lt;/em&gt; didn't.)&lt;/li&gt;
&lt;li&gt;Thursday: I dusted off one of my old projects, and immediately got confused by the Python standard library.&lt;/li&gt;
&lt;li&gt;Friday: I figured out what was going on with the stuff I was confused by, but I was really tired, so, not much happened.&lt;/li&gt;
&lt;li&gt;Saturday: Even more tired.&lt;/li&gt;
&lt;li&gt;Sunday: I switched &amp;quot;projects to try working on in marimo&amp;quot; again.&lt;/li&gt;
&lt;li&gt;Monday: A bit more marimo, including a very specific bug report. I resolved to back-burner the &amp;quot;algorithmic music&amp;quot; stuff I was aiming towards, in favor of getting more non-algorithmic experience.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, we'll see what I can manage there.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category></entry><entry><title>Coding 2023-12-04</title><link href="https://mwchase.neocities.org/coding-2023-12-04" rel="alternate"></link><published>2023-12-04T05:00:00-05:00</published><updated>2023-12-04T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-12-04:/coding-2023-12-04</id><summary type="html">&lt;p class="first last"&gt;The tags are... not really accurate, but whatever.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I've been poking at a few marimo notebooks today, (and filed another bug; don't worry about it), but I've ended up in a frame of mind again where I want to totally overdo the architecture of music-related stuff.
Maybe if I describe what I'm thinking about there, it'll alleviate the urges somewhat.&lt;/p&gt;
&lt;p&gt;So, background.
Historically, the intervals between different notes were rational numbers with small-enough numerators and denominators; this &lt;em&gt;basically&lt;/em&gt; equates to &amp;quot;sounding consonant&amp;quot;.
Using rational numbers for this purpose has some good qualities, and some qualities that made it hard to compose certain kinds of music.
In the western musical tradition, this system was overtaken by one based on the twelfth root of two.
This greatly simplified composition and tuning, though it did result in some intervals sounding off.
However, they're &lt;em&gt;consistently&lt;/em&gt; off, so that's good enough, especially now that people are used to them.&lt;/p&gt;
&lt;p&gt;Now, that's all well and good if you're not a &lt;em&gt;huge nerd&lt;/em&gt;, but I'm over here wondering about stuff like &amp;quot;But what would it sound like to use one of the old systems?&amp;quot;
(Yes, systems, plural.
There were varying ideas about &amp;quot;the right way&amp;quot; to choose rational intervals.)
&amp;quot;In the context of roots, what if we use a different root than twelfth, or a different base than two?&amp;quot;&lt;/p&gt;
&lt;p&gt;There has already been a lot of investigation into this, and a bunch of existing software.
From a modeling perspective, it would be &amp;quot;nice&amp;quot; to be able to track intervals in terms of fractional powers of primes, but actually doing all of this is a bunch of effort that other people have figured out the right way to go to.&lt;/p&gt;
&lt;p&gt;While I was writing that paragraph, I had a look at the &lt;a class="reference external" href="https://en.xen.wiki/w/List_of_music_software"&gt;tools page on the Xenharmonic wiki&lt;/a&gt;, and tried some of them out.
With what I've found in the course of a few minutes, here is what I've decided is the sensible thing to do:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Focus on &amp;quot;traditional&amp;quot; (twelve equal divisions of the octave) stuff at first, in whatever tools feel good.&lt;/li&gt;
&lt;li&gt;Figure out what it takes to replicate the basics of such compositions in a tool that supports xenharmonics.&lt;/li&gt;
&lt;li&gt;Start tweaking things to make use of less traditional tunings.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That's, like, effort and stuff, compared to trying to come up with weird algebraic representations that only need to work in theory, but it really would be better to focus on practical matters.&lt;/p&gt;
&lt;p&gt;Later, because it's late now and I'm tired.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="marimo"></category></entry><entry><title>Coding 2023-12-03</title><link href="https://mwchase.neocities.org/coding-2023-12-03" rel="alternate"></link><published>2023-12-03T05:00:00-05:00</published><updated>2023-12-03T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-12-03:/coding-2023-12-03</id><summary type="html">&lt;p class="first last"&gt;Trying to give myself enough rest that my expectations for myself become reasonable again.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm still messing with marimo for, I'm going to call it &amp;quot;sketching&amp;quot; with Python.
It's working out well for that.
I decided to change focus from [NOT VERY EXCITING SECRET] to &lt;a class="reference external" href="https://pedrokroger.net/mfgan"&gt;Music for Geeks and Nerds&lt;/a&gt;.
I'd previously messed with it, or possibly tried to reinvent things from first principles, but those efforts were plagued by overthinking.
I'm going to see what I can accomplish by just following along with the book, and &amp;quot;sketching&amp;quot; code rather than putting together elaborate scaffolding.&lt;/p&gt;
&lt;p&gt;Anyway, if I'm honest with myself, I'm actually pretty tired, even if it's &amp;quot;early&amp;quot; by my usual standards, so I'm going to wrap things up and try to get a reasonable amount of rest.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="short post"></category><category term="marimo"></category></entry><entry><title>Diary 2023-12-02</title><link href="https://mwchase.neocities.org/diary-2023-12-02" rel="alternate"></link><published>2023-12-02T05:00:00-05:00</published><updated>2023-12-02T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-12-02:/diary-2023-12-02</id><summary type="html">&lt;p class="first last"&gt;I should stop &lt;em&gt;thinking&lt;/em&gt; about napping, and nap...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was pretty out of it today, so I'm not going to push myself.
This is in part (or maybe a lot) because (I'm pretty sure) I haven't been getting enough sleep lately, so, like, I should get to work on that.&lt;/p&gt;
&lt;p&gt;First step on that: start moving towards bed earlier.
I'm already super tired, so, like, if I keep up, I'll be &lt;em&gt;really&lt;/em&gt; unhappy.
Okay, that's enough justifying my decisions.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2023-12-01</title><link href="https://mwchase.neocities.org/coding-2023-12-01" rel="alternate"></link><published>2023-12-01T05:00:00-05:00</published><updated>2023-12-01T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-12-01:/coding-2023-12-01</id><summary type="html">&lt;p class="first last"&gt;I should have figured out a way to cram in a nap.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I think I have a better understanding of the enum stuff from yesterday, and I can put things together more nicely, later.&lt;/p&gt;
&lt;p&gt;All told though, my verdict on today is that I was pretty tired, and I managed to get some stuff planned out in spite of that.
I can potentially get some stuff done before tomorrow, but I'm not going to force myself.
I'll just see what I can manage while this entry publishes.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="short post"></category></entry><entry><title>Coding 2023-11-30</title><link href="https://mwchase.neocities.org/coding-2023-11-30" rel="alternate"></link><published>2023-11-30T05:00:00-05:00</published><updated>2023-11-30T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-11-30:/coding-2023-11-30</id><summary type="html">&lt;p class="first last"&gt;The question I had the smiley ask is actually not quite fair, but in my defense, this code is a maze.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I haven't really touched the languages I was talking about last time, but I have thought of something to attempt with them that should be more interesting than running through a couple of basic introductory exercises.
I have a book, which documents some code, which I wish to adapt for purposes outside of its original design.
I could try to work with the code in its original language, but I... don't want to.
So, let's try working with it in those languages.&lt;/p&gt;
&lt;p&gt;My plan is to try to express things in a marimo notebook for prototyping, and then try to transplant that design to the other languages.
We'll see how that goes; when I was thinking about this earlier, I remembered running into Weird Problems because I was trying to customize Python's &lt;tt class="docutils literal"&gt;enum&lt;/tt&gt; support in a very specific way that must not have been expected.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;I tracked down the problem I ran into, and now this is just going to bother me.
Basically, I was trying to make an &lt;tt class="docutils literal"&gt;Enum&lt;/tt&gt; where the &lt;tt class="docutils literal"&gt;auto&lt;/tt&gt; values start at 0 instead of 1, and the code has both:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The way to do this that seemed elegant and obvious to me&lt;/li&gt;
&lt;li&gt;and the viscerally disgusting hack that I used when the elegant and obvious option had no clear effect.
(Also included is light diagnostic code confirming the necessity of the hack.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Found it.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_generate_next_value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_member_names&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_last_values&lt;/span&gt;&lt;span class="p"&gt;[:],&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition smiley smiley-glitchy"&gt;
&lt;p class="first admonition-title"&gt;:) (glitchy)&lt;/p&gt;
&lt;p class="last"&gt;Why does the staticmethod take an argument if it's always going to be a constant?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I'm not sure why the interface is like that, but now I hypothesize that the &amp;quot;hack&amp;quot; is almost the right version, and I should &lt;em&gt;remove&lt;/em&gt; the &amp;quot;elegant fix&amp;quot;, because it's subtly breaking one of the interfaces.
I'll see what I think tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="marimo"></category></entry><entry><title>Coding 2023-11-29</title><link href="https://mwchase.neocities.org/coding-2023-11-29" rel="alternate"></link><published>2023-11-29T05:00:00-05:00</published><updated>2023-11-29T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-11-29:/coding-2023-11-29</id><summary type="html">&lt;p class="first last"&gt;If there isn't a plan to change typing support for attrs the way I want, I'm not sure where the discussion should start.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;My laptop hasn't done anything too objectionable since last time.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;So far&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Anyway, I poked a bit more at MOTR, and it's going well, but I need to make a decision.
There is an attribute that is currently optional, and I want to change the type from a union to a bound typevar.
This is incompatible (&lt;a class="reference external" href="https://peps.python.org/pep-0696/"&gt;currently&lt;/a&gt;? I'm not sure if this PEP would change that) with supplying a default value to attrs, so I need to make it a required argument, but it kind of sucks to make downstream stuff explicitly pass &lt;tt class="docutils literal"&gt;None&lt;/tt&gt;, so I'd like to have some alternative constructors, and then I need to work out what those should look like.
I'm somewhat leaning towards a minimal default constructor, and then &amp;quot;fluent&amp;quot; modification methods to open the type space back up, but this feels like something I need to think about, at least subconsciously.&lt;/p&gt;
&lt;p&gt;So, I'm going to let that sit for a bit, and also ponder the other languages I'm considering looking at.
The initial field was pretty weird and uneven, but right now it's narrowed down to Rust, TypeScript via Deno, and Kotlin.
I'm not sure if the criteria I used were applied consistently or really make any sense, so please don't consider any of the choices I made or didn't make to be significant.&lt;/p&gt;
&lt;p&gt;I'll have to look into doing something with them later.
For now, I'm going to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Weekly Roundup 2023-11-28</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-11-28" rel="alternate"></link><published>2023-11-28T05:00:00-05:00</published><updated>2023-11-28T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-11-28:/weekly-roundup-2023-11-28</id><summary type="html">&lt;p class="first last"&gt;Surprising amount of work on MOTR for not intending to focus on it.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I messed around a little with marimo, a Python project that wants to compete with Jupyter. I didn't do anything that really evaluated how well it competes, but I did find some minor rough edges, which eventually translated into a documentation update.&lt;/li&gt;
&lt;li&gt;Thursday: I followed up on marimo, and then I got some messed-up behavior out of Mypy.&lt;/li&gt;
&lt;li&gt;Friday: I fixed some Mypy issues by ignoring them. (And putting a bug URL in a comment.)&lt;/li&gt;
&lt;li&gt;Saturday: More progress on MOTR.&lt;/li&gt;
&lt;li&gt;Sunday: I kept on splitting up stuff in MOTR.&lt;/li&gt;
&lt;li&gt;Monday: I continued on that, and things worked out well.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to see how much further I can take that.
However, I finally put together some obvious conclusions about how to put together a tech stack for hobby stuff, so I've got research to do.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="marimo"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-11-27</title><link href="https://mwchase.neocities.org/coding-2023-11-27" rel="alternate"></link><published>2023-11-27T05:00:00-05:00</published><updated>2023-11-27T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-11-27:/coding-2023-11-27</id><summary type="html">&lt;p class="first last"&gt;Lightly poked the codebase, and it responded well.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;We had more travel today, and some technical issues with the laptop.
However, I had time to start tweaking the class structure in MOTR, and it improved some code that I hadn't been thinking about, so that's a good sign.
I'll see how far I can chase this, and then &lt;em&gt;finally&lt;/em&gt; look for something else to focus on.&lt;/p&gt;
&lt;p&gt;I just now got ready for some of the changes that will end up potentially being much more complicated, but they promise to eliminate two lines of missed coverage, so I'm going to consider them worth it, because I really don't want to cover those lines.&lt;/p&gt;
&lt;p&gt;Anyway, I need to wind down, and recover from stuff like the technical issues.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2023-11-26</title><link href="https://mwchase.neocities.org/coding-2023-11-26" rel="alternate"></link><published>2023-11-26T05:00:00-05:00</published><updated>2023-11-26T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-11-26:/coding-2023-11-26</id><summary type="html">&lt;p class="first last"&gt;Three new okay names, but still haven't replaced the bad one...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, after messing with other stuff all day, I am taking a closer look at the increasingly-ineptly-named &lt;tt class="docutils literal"&gt;CommandBuilder&lt;/tt&gt; class, and I think I'm getting some ideas for how to go forward.
(No, for whatever reason, I am not tired of this.)&lt;/p&gt;
&lt;p&gt;The &lt;tt class="docutils literal"&gt;CommandBuilder&lt;/tt&gt; has five fields, but the address a number of interlocking roles.
First up, there's &lt;tt class="docutils literal"&gt;executable&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;partial_invocation&lt;/tt&gt;, which are processed together to produce an &lt;tt class="docutils literal"&gt;InvocationEnvironment&lt;/tt&gt;.
Then, &lt;tt class="docutils literal"&gt;allowed_codes&lt;/tt&gt; (which I recall is renamed in the future topic, but eh), &lt;tt class="docutils literal"&gt;pass_module_codes&lt;/tt&gt;, and &lt;tt class="docutils literal"&gt;module_args&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;There are a few things going on with those.
One is that &lt;tt class="docutils literal"&gt;module_args&lt;/tt&gt; is a &lt;tt class="docutils literal"&gt;Union&lt;/tt&gt;, but I want to turn it into a constrained type variable.
This would have some downstream effects that I haven't thought all the way through, but if I &lt;em&gt;can&lt;/em&gt; put the distinction between &amp;quot;has module args&amp;quot; and &amp;quot;doesn't&amp;quot; into the type system, I want to.
However, looking at these fields with fresh eyes, I see that &lt;tt class="docutils literal"&gt;pass_module_codes&lt;/tt&gt; doesn't mean anything when &lt;tt class="docutils literal"&gt;module_args&lt;/tt&gt; is &lt;tt class="docutils literal"&gt;None&lt;/tt&gt;, so those fields should really be a single field that can contain a product type.
Furthermore, the purpose of &lt;tt class="docutils literal"&gt;pass_module_codes&lt;/tt&gt; is just to control the evolution of the &lt;tt class="docutils literal"&gt;allowed_codes&lt;/tt&gt; variable, so it should be bundled together as well.&lt;/p&gt;
&lt;p&gt;This works out to: &lt;tt class="docutils literal"&gt;ModuleInfo&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;CodeInfo&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;ExecutableAndInvocation&lt;/tt&gt;, and...&lt;/p&gt;
&lt;p&gt;And...&lt;/p&gt;
&lt;p&gt;And...&lt;/p&gt;
&lt;div class="admonition smiley smiley-glitchier"&gt;
&lt;p class="first admonition-title"&gt;:) (glitchier)&lt;/p&gt;
&lt;p class="last"&gt;Out with it.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I don't know!
Somehow, using &amp;quot;command&amp;quot; in some capacity still seems to make sense, because this is the first level where it's looping back around to the scope of information in the task class, which is called &lt;tt class="docutils literal"&gt;Cmd&lt;/tt&gt;.
But keeping it feels like a copout.
It's kind of like, these new names aren't great, they're fine, but not great, and bringing them together like this pushes them to the breaking point.&lt;/p&gt;
&lt;p&gt;Well, I've thought about this for a long time now, and no luck.
Maybe I need to just actually try it, either tomorrow or in a few days.
For now, rest.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-11-25</title><link href="https://mwchase.neocities.org/coding-2023-11-25" rel="alternate"></link><published>2023-11-25T05:00:00-05:00</published><updated>2023-11-25T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-11-25:/coding-2023-11-25</id><summary type="html">&lt;p class="first last"&gt;I didn't have time to properly describe anything I did.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Still tweaking MOTR and managing my time poorly.
With a little more messing around, I should have the renames propagated all the way up the layers, and get back to imlementing wrappers.
Sadly, even though I am making progress, it's slow going, and it looks likely I'll need a few more passes once I've got the module structure sorted out.&lt;/p&gt;
&lt;p&gt;Regardless, it is way too late and I should get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2023-11-24</title><link href="https://mwchase.neocities.org/coding-2023-11-24" rel="alternate"></link><published>2023-11-24T05:00:00-05:00</published><updated>2023-11-24T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-11-24:/coding-2023-11-24</id><summary type="html">&lt;p class="first last"&gt;Yet more incremental progress, some of it via just slapping a &lt;tt class="docutils literal"&gt;type: ignore&lt;/tt&gt; on.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, as far as marimo goes, we agreed on a documentation change rather than a code change; it's not onerous to get the right behavior once you understand what can make the behavior wrong, but the factors that can make the behavior wrong are subtle.
So, documentation.&lt;/p&gt;
&lt;p&gt;Besides that, I cleared up some issues with MOTR.
At this point, I either get back to working on the names, or I find some other project to make progress on.&lt;/p&gt;
&lt;p&gt;I would have liked to get more done today, but Thanksgiving is always pretty disruptive.&lt;/p&gt;
&lt;p&gt;I'm (still? I forget) trying to figure out if there's some better way to accomplish what I want from MOTR.
The painful truth, though, is that I can't see how any of the alternatives could compete with the hacked-together motrfile that MOTR itself currently uses.
So, it's like, it's the best at delivering what I want, but still not good enough.&lt;/p&gt;
&lt;p&gt;I've reviewed the state of the code, and the obvious place to work on is where I've been focusing already, so, eh...
I think I need to find something else to work on as a distraction, but we'll see how things go.
Later.
For now, I get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="marimo"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2023-11-23</title><link href="https://mwchase.neocities.org/coding-2023-11-23" rel="alternate"></link><published>2023-11-23T05:00:00-05:00</published><updated>2023-11-23T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-11-23:/coding-2023-11-23</id><summary type="html">&lt;p class="first last"&gt;Mypy is punishing me for my hubris, for some reason.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Update on marimo: one of my concerns about it was unfounded, and another is intended to be worked on.
Here's the quick summary: &lt;em&gt;do not&lt;/em&gt; use &lt;tt class="docutils literal"&gt;from __future__ import annotations&lt;/tt&gt;, because marimo code implicitly has it.
There are a few rough edges around this, but they're working on it.
I haven't tried using anything like Pydantic in this environment, and I'm not sure what would happen, so that's the main concern I'd have about usability.&lt;/p&gt;
&lt;p&gt;I took another look at MOTR, and found some more issues I need to fix in the plugin, but then I ended up with some issues that confuse me, and I think I did something wrong outside of the plugin.
It's hard to describe what's really going on, besides &amp;quot;It's pretty weird&amp;quot;, so I'm going to have to sleep on it.&lt;/p&gt;
&lt;p&gt;I'm going to do some writing while this publishes.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="marimo"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2023-11-22</title><link href="https://mwchase.neocities.org/coding-2023-11-22" rel="alternate"></link><published>2023-11-22T05:00:00-05:00</published><updated>2023-11-22T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-11-22:/coding-2023-11-22</id><summary type="html">&lt;p class="first last"&gt;This is not a great job of evaluating marimo, but I didn't hate it even though I was arguably kind of misusing it, so that's cool.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I ended up not focusing on much today.
Mainly, I messed around with some of the tech I was interested in messing with.
Specifically, &lt;a class="reference external" href="https://marimo.io/"&gt;marimo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As I understand it, marimo is trying to be a replacement for Jupyter in terms of exploratory data processing and visualization.
That... was not what I used it for, so the overall experience was mostly illuminating in terms of &amp;quot;Boy, Python sure can be used in a lot of ways, and the resulting code can look very different.&amp;quot;&lt;/p&gt;
&lt;p&gt;To get a feel for marimo, I looked over some code I'd written as a Jupyter notebook that, to be clear, never needed to be a Jupyter notebook, so getting it into marimo was mostly not interesting, except for all of the typos that I found because the code was never actually run.&lt;/p&gt;
&lt;p&gt;From the perspective of my own code, my main takeaways were that working with annotations felt not-great, and I'd have to look over the code to understand how some of this all works.
Like, looking at the generated Python file, I'm not sure how the code representing the cells gets dealt with as something to &lt;em&gt;actually run&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Mostly, I've come away with a greater sense of how much the purpose or tooling can change the look of the code.
Like, I'd never write something that looks like a marimo notebook &amp;quot;by accident&amp;quot;, and there are at least aspects of the Python that Dafny generates that &lt;em&gt;I&lt;/em&gt; wouldn't think to write like.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;If you haven't taken a look at the Python code that Dafny generates, please understand that that was a self-directed burn that does not intend to disrespect the Dafny project.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Overall, I'm very interested in the &amp;quot;automatic literate programming&amp;quot; aspect of marimo, but I'm seeing some teething problems for &lt;em&gt;specific styles of code&lt;/em&gt;.
If you're not using annotations, I doubt you'll hit any of the issues I did.
(Although it occurs to me now that I think some Python code may be outright syntactically invalid to put in a marimo notebook, like star imports.)&lt;/p&gt;
&lt;p&gt;Sadly, I don't have anything to say about the &lt;tt class="docutils literal"&gt;marimo&lt;/tt&gt; module, because I... didn't try to use it.
This code was really not meant for notebooks, but having it in a weird interface helps to dull the itching sensation I get when Python code is neither a fully standalone script, nor a version control repository with a full test harness set up.&lt;/p&gt;
&lt;p&gt;Potentially, there's some better tool out there for that specific use case.
&amp;quot;Make it easier to set up a repository with test harnesses&amp;quot; isn't it for me, because I am several years worth of rabbit hole into writing a task runner that accords with my sensibilities, and I haven't run across anything that obsoletes my work on MOTR.
So, my best hope is probably &lt;em&gt;something&lt;/em&gt; in the notebook space, but I'm not sure what.
Maybe I just need to think more about what I'm trying to accomplish here...&lt;/p&gt;
&lt;p&gt;Anyway, the one thing I'd really like to change so far about marimo is the tab completion bindings, but maybe that's just a matter of &amp;quot;it's not working how Kakoune works&amp;quot;.
Aside from that, I'm interested in trying to use it the next time I need to do actual notebook stuff.&lt;/p&gt;
&lt;p&gt;For now, I'm going to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="marimo"></category></entry><entry><title>Weekly Roundup 2023-11-21</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-11-21" rel="alternate"></link><published>2023-11-21T05:00:00-05:00</published><updated>2023-11-21T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-11-21:/weekly-roundup-2023-11-21</id><summary type="html">&lt;p class="first last"&gt;Suddenly, I made progress.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I filed a Mypy bug, in case the behavior in question is actually considered a bug; and tried to work around it in the meantime.&lt;/li&gt;
&lt;li&gt;Thursday: I explained what the code involved is doing, why that requires a plugin, how the plugin is currently breaking, and how I'm trying to get insight into all of this.&lt;/li&gt;
&lt;li&gt;Friday: I got a little distracted with some runtime and plugin improvements that are out of scope.&lt;/li&gt;
&lt;li&gt;Saturday: I zoned out all day.&lt;/li&gt;
&lt;li&gt;Sunday: I kept on considering stuff for the plugin that makes sense from the perspective of &amp;quot;generally usable library&amp;quot;, but is out-of-scope for &amp;quot;I didn't want to keep on writing virtually the same wrapper code&amp;quot;.&lt;/li&gt;
&lt;li&gt;Monday: We traveled, and I didn't get much done.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'll figure out what I want to work on next, since I managed to update the plugin after the last entry, but that just exposed a non-plugin-related bug.
I'm thinking either back to music, some strange fanfiction I thought of, or trying to do planning work for some of the project ideas I have kicking around.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="Mypy"></category></entry><entry><title>Diary 2023-11-20</title><link href="https://mwchase.neocities.org/diary-2023-11-20" rel="alternate"></link><published>2023-11-20T05:00:00-05:00</published><updated>2023-11-20T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-11-20:/diary-2023-11-20</id><summary type="html">&lt;p class="first last"&gt;On the road again...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;We had travel today, but I did get to think some about the plugin for MOTR.&lt;/p&gt;
&lt;p&gt;I just threw together a few more typing tests, and honestly they just raised more questions, like, was all of this code necessary in the first place?&lt;/p&gt;
&lt;p&gt;Hopefully, I'll have answers in a few days.
For now, I should wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2023-11-19</title><link href="https://mwchase.neocities.org/coding-2023-11-19" rel="alternate"></link><published>2023-11-19T05:00:00-05:00</published><updated>2023-11-19T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-11-19:/coding-2023-11-19</id><summary type="html">&lt;p class="first last"&gt;I'm not sure how many distinct configurations this adds up to...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, so.
I ended up taking things easy today, but I did put together a list of things to investigate for the dependent mapping plugin in MOTR.
Basically, I need to consider:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Which methods the plugin works with, and the types of their arguments&lt;/li&gt;
&lt;li&gt;How the methods are to be invoked&lt;/li&gt;
&lt;li&gt;Whether a given type is to be a single concrete type, or something more complex.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There is a lot of &lt;em&gt;stuff&lt;/em&gt; to be written to get all of this testable.
Some weird combinatorial explosion, considering that I'm working with parametric types that I then want to see working sensibly in unions and the like.&lt;/p&gt;
&lt;p&gt;Anyway, it's late and I need to sleep a lot.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Diary 2023-11-18</title><link href="https://mwchase.neocities.org/diary-2023-11-18" rel="alternate"></link><published>2023-11-18T05:00:00-05:00</published><updated>2023-11-18T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-11-18:/diary-2023-11-18</id><summary type="html">&lt;p class="first last"&gt;Time management fell off a cliff. Okay to skip this one.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I had no focus today, so there's nothing to write about, and I want to finish this up quickly.
I'll see what I manage to do tomorrow, but absolutely nothing else is getting done right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2023-11-17</title><link href="https://mwchase.neocities.org/coding-2023-11-17" rel="alternate"></link><published>2023-11-17T05:00:00-05:00</published><updated>2023-11-17T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-11-17:/coding-2023-11-17</id><summary type="html">&lt;p class="first last"&gt;Figuring out a good developer experience for myself.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I got distracted, but I do have a few notes.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Currently, calling a method from the &lt;tt class="docutils literal"&gt;DependentMapping&lt;/tt&gt; protocol does not (I assume) work at run time.&lt;/li&gt;
&lt;li&gt;But I can make it work.&lt;/li&gt;
&lt;li&gt;So it's mainly a question of what it would take to make it work in the plugin.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;What exactly does &amp;quot;making it work&amp;quot; entail?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Um...&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__add__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition smiley smiley-glitchy"&gt;
&lt;p class="first admonition-title"&gt;:) (glitchy)&lt;/p&gt;
&lt;p class="last"&gt;MmmMMmmmm, that's the &lt;em&gt;good stuff&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Getting that in would require some minor investment in terms of testing because suddenly the method bodies would need to be executed.&lt;/p&gt;
&lt;p&gt;Anyway, I need to get back into the guts of this code to figure out how to change it properly.
Something that just occurred to me is that I can define a &amp;quot;notes&amp;quot; variable inside my debug hook, breakpoint after it, and then I'll be able to get to the breakpoint by running Mypy, at which point I can remind myself what I was just doing by printing the notes variable, so it's all right there in front of me.&lt;/p&gt;
&lt;p&gt;Anyway, I let it get late, so I'll just wrap up for now and see what I can do with this in the coming days.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-11-16</title><link href="https://mwchase.neocities.org/coding-2023-11-16" rel="alternate"></link><published>2023-11-16T05:00:00-05:00</published><updated>2023-11-16T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-11-16:/coding-2023-11-16</id><summary type="html">&lt;p class="first last"&gt;Maybe this will be helpful to someone else who wants to write plugins for supporting utterly wretched code.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, like I said, I filed the bug report, and then realized &amp;quot;Wait, I bet I can handle this.&amp;quot;
So here's the general idea:
I've written a plugin for handling the concept of a dependent mapping, a mapping where the type of a value depends on the type of the corresponding key.
I'm allowing for arbitrary relationships, which &lt;em&gt;should&lt;/em&gt; require a concept along the lines of higher-kinded types, which Python's typing ecosystem mostly does not have.
Now, a higher-kinded type is basically like, you have a type-level function between types, and you can write type-level functions that operate on type-level functions instead of plain types.
So, you could have &lt;tt class="docutils literal"&gt;list[T]&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;T | None&lt;/tt&gt;, and you'd like to be able to pass them around.
This turns out to not really work; you can't pass around &amp;quot;a generic type with a hole in it&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;However&lt;/em&gt;, we can instead take a type-level function, and turn it into the type of a function that transforms types the way we'd like it to.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;What?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Let's turn those examples above into what I'm talking about.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ListOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Protocol&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__call__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;__k&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Maybe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Protocol&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__call__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;__k&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now, these callable protocols are entirely concrete, of course; just look at the &lt;tt class="docutils literal"&gt;class&lt;/tt&gt; lines.&lt;/p&gt;
&lt;p&gt;Now, these callable protocols are entirely generic, of course; just look at the &lt;tt class="docutils literal"&gt;def&lt;/tt&gt; lines.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;There's no way Mypy is cool with this.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Absolutely not; why do you think we're in this mess?&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;We?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Anyway, I could imagine various uses for this idiom; actually implementing these protocols could be useful for some kind of data processing pipeline, potentially.
But I've instead been using them as the type arguments of a generic protocol, which is like &lt;tt class="docutils literal"&gt;Mapping&lt;/tt&gt;, but is not &lt;tt class="docutils literal"&gt;Mapping&lt;/tt&gt;.
Most of the methods on the protocol actually typecheck perfectly fine, and to bridge the gap, I had to write a plugin that transforms a select few signature and method accesses, pulling up variables hidden inside the protocols.&lt;/p&gt;
&lt;p&gt;This worked perfectly fine for a few versions, but with Mypy 1.7.0, some new type inference code became the default, and it gives those methods much less helpful default signatures.
At first I thought &amp;quot;Well, I need the signatures to go back the way they were&amp;quot;, but then I realized that most of the information is still intact, just not where I want it to be, and there is a finite set of methods to update, so I can hardcode rather a lot if I need to.&lt;/p&gt;
&lt;p&gt;Let's have a look at what I've put together so far.
Now, none of this is functional code changes; it doesn't really work to rush into writing a Mypy plugin; getting small details wrong can crash it outright.
So, I'm currently focused on diagnostics.
Print-based diagnostics.
Just stick a print statement in the plugin code, and it shows up in the command-line output.
EZ.&lt;/p&gt;
&lt;p&gt;Here's what I've got currently:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;CALLABLE_SLOTS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;arg_types&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;arg_kinds&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;arg_names&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;min_args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;ret_type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;definition&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;variables&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;is_ellipsis_args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;implicit&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;special_sig&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;from_type_type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;bound_args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;def_extras&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;type_guard&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;from_concatenate&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;imprecise_arg_kinds&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;unpack_kwargs&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;pprint_callable_type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;callable_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;when&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;when&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;(&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;slot&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;CALLABLE_SLOTS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;slot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;=&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;callable_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;slot&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;debug_hook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hook&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;new_hook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self_arg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self_arg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;__call__&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;before&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;default_signature&lt;/span&gt;
        &lt;span class="n"&gt;pprint_callable_type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;before&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;before&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;after&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;pprint_callable_type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;after&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;after&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;after&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;new_hook&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Most of the hooks in the plugin focus on rewriting the method signature, so I've written a diagnostic decorator that details the information relevant to the plugin's functionality, and how the hook transforms the information that it's supposed to transform.
Because it's a decorator, I can put it on a hook, and take it off, without worrying about messing up the hook's body.&lt;/p&gt;
&lt;p&gt;I've put together a small synthetic test file, and am comparing the debug output with and without the new type inference.
So far, I'm seeing that the output is &lt;em&gt;mostly&lt;/em&gt; the same; it's just that &lt;tt class="docutils literal"&gt;arg_types&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;ret_type&lt;/tt&gt; have &lt;tt class="docutils literal"&gt;Never&lt;/tt&gt; instead of anything useful.&lt;/p&gt;
&lt;p&gt;And... I just discovered a crash that was latent in the plugin code all along.
I'm going to have to figure out how to convert that into a proper call, or at least a reasonable error telling people &amp;quot;Hey, you can't use the plugin like that. Stop it.&amp;quot;&lt;/p&gt;
&lt;p&gt;Anyway, it's going to take some more work and a bunch of notes to put together a plan for how to handle this stuff.
I'd better put this entry down and see what I'm up for the rest of the night.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Diary 2023-11-15</title><link href="https://mwchase.neocities.org/diary-2023-11-15" rel="alternate"></link><published>2023-11-15T05:00:00-05:00</published><updated>2023-11-15T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-11-15:/diary-2023-11-15</id><summary type="html">&lt;p class="first last"&gt;Maybe there are other ways to turn the code eldritch.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I just filed a bug that I'm not confident will get fixed—&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;&amp;quot;fixed&amp;quot;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;But I figured I'd at least ask.&lt;/p&gt;
&lt;p&gt;That said, now that I've thought about it some more, there may be an alternative on my end to changing the behavior.
If I can reach inside...&lt;/p&gt;
&lt;p&gt;Hm...&lt;/p&gt;
&lt;p&gt;Yes, it does appear that nearly all of the information I need is still available, and I &amp;quot;just&amp;quot; need to hardcode the remainder.
I think this will end up being &amp;quot;switch to the old type inference, get information about what the signature 'should' look like, and add that information in&amp;quot;.&lt;/p&gt;
&lt;p&gt;We'll see what that ends up being like later.
For now, I need to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="bug reporting"></category></entry><entry><title>Weekly Roundup 2023-11-14</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-11-14" rel="alternate"></link><published>2023-11-14T05:00:00-05:00</published><updated>2023-11-14T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-11-14:/weekly-roundup-2023-11-14</id><summary type="html">&lt;p class="first last"&gt;I got more done on MOTR than expected, but now I'm taking a break really for real.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I made and planned some improvements to MOTR.&lt;/li&gt;
&lt;li&gt;Thursday: I ran into some complications, and tried to work out the best way to deal with them.&lt;/li&gt;
&lt;li&gt;Friday: I didn't really make concrete progress, but I did keep thinking.&lt;/li&gt;
&lt;li&gt;Saturday: Eh, rough day apparently.&lt;/li&gt;
&lt;li&gt;Sunday: I discovered bugs in Mypy, both comprehensible and incomprehensible.&lt;/li&gt;
&lt;li&gt;Monday: I finished updating MOTR, ignoring the Mypy issues for now. It was a very easy update once the code was in place.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to psych myself up to file one of those Mypy bugs.
And probably other things, I don't know.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-11-13</title><link href="https://mwchase.neocities.org/coding-2023-11-13" rel="alternate"></link><published>2023-11-13T05:00:00-05:00</published><updated>2023-11-13T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-11-13:/coding-2023-11-13</id><summary type="html">&lt;p class="first last"&gt;I had to update one line of test code, and then the tests passed. Spooky.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got MOTR's code cleaned up in the rewrite branch.
Now, I &lt;em&gt;could&lt;/em&gt; get back in there trying to continue the updates or tweak the names I came up with.
(Those names are overall better than what came before, but not great.)
But I think I'd like to step back and find other stuff to focus on, at least until we get a new Mypy release or two.&lt;/p&gt;
&lt;p&gt;It's probably best for me to work on getting thoughts written down for music, but I felt like trying to learn a bit about Dafny today, so I did.
There are two categories of thing I'm interested in with Dafny: what kind of code does it make sense to write in Dafny, and what does it take to integrate that code with other code bases?
Looking at the output from the Python builder, I'm fairly certain this code won't cleanly slot into my usual Python workflows, though there are a few niche applications where there &lt;em&gt;could&lt;/em&gt; be potential.
But in general, it seems like it'd make more sense to have Dafny target faster code and then FFI into it.
I don't know how hard that actually is, though.&lt;/p&gt;
&lt;p&gt;As far as what to write, I think I need to learn more than the basics of the data model.&lt;/p&gt;
&lt;p&gt;Anyway, I took too long with this post, so I'm going to cut it off abruptly.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-11-12</title><link href="https://mwchase.neocities.org/coding-2023-11-12" rel="alternate"></link><published>2023-11-12T05:00:00-05:00</published><updated>2023-11-12T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-11-12:/coding-2023-11-12</id><summary type="html">&lt;p class="first last"&gt;Mypy somehow managed to infer types that shouldn't even exist...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Things that have happened with MOTR:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The Mypy 1.7 update broke things; fortunately somebody else already filed a bug.&lt;/li&gt;
&lt;li&gt;I'm deep into the rewrite; it'll be interesting to see how badly the tests go, once the code looks reasonable.&lt;/li&gt;
&lt;li&gt;I ran into an absolutely inexplicable Mypy bug that I'll try to get a reproducer for once everything else is cleaned up.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Fortunately, I'm doing most of this on a branch.
I had a sense that the update could be hairy, and it has been so, so much worse than I was anticipating.&lt;/p&gt;
&lt;p&gt;Anyway, it's late and I'm tired.
We'll see how this ends up tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Diary 2023-11-11</title><link href="https://mwchase.neocities.org/diary-2023-11-11" rel="alternate"></link><published>2023-11-11T05:00:00-05:00</published><updated>2023-11-11T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-11-11:/diary-2023-11-11</id><summary type="html">&lt;p class="first last"&gt;Meh, whatever.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I poked a little at MOTR, but not enough to write about.
I think I'm going to need to put it down in favor of something else for a while.&lt;/p&gt;
&lt;p&gt;I've got some things I can mess with, but I think I mostly need to find some way to unwind.
We'll see how that goes.
I'm going to start by not trying very hard with this post.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2023-11-10</title><link href="https://mwchase.neocities.org/coding-2023-11-10" rel="alternate"></link><published>2023-11-10T05:00:00-05:00</published><updated>2023-11-10T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-11-10:/coding-2023-11-10</id><summary type="html">&lt;p class="first last"&gt;No significant progress.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Still thinking.
Need to tease out the concepts.
Invocation to represent launching a command; add implicit artifacts to represent dependencies; add installers to convert executables to dependencies...&lt;/p&gt;
&lt;p&gt;I still need to think about it, yeah.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2023-11-09</title><link href="https://mwchase.neocities.org/coding-2023-11-09" rel="alternate"></link><published>2023-11-09T05:00:00-05:00</published><updated>2023-11-09T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-11-09:/coding-2023-11-09</id><summary type="html">&lt;p class="first last"&gt;Looks like the old layout was &lt;em&gt;almost&lt;/em&gt; right, which is a shame, because I still have no idea what to call these things...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hm.
It turns out that things aren't &lt;em&gt;quite&lt;/em&gt; as easy as switching to &lt;tt class="docutils literal"&gt;Invocation&lt;/tt&gt;, because there are various pieces of data that have to get passed around and worked with.
Like, however you create a &lt;tt class="docutils literal"&gt;Cmd&lt;/tt&gt; task, doing so requires four pieces of information:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;the arguments&lt;/li&gt;
&lt;li&gt;the environment&lt;/li&gt;
&lt;li&gt;the implicit artifacts&lt;/li&gt;
&lt;li&gt;the failure codes that shouldn't abort&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I've got a &lt;em&gt;sense&lt;/em&gt; for how this should all fit together with some of the high-level stuff, but I'm not confident in my gut feelings here.
Those gut feelings are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;arguments + environment -&amp;gt; invocation; this is known&lt;/li&gt;
&lt;li&gt;invocation + implicit -&amp;gt; ???; this type would convert failure codes to facts&lt;/li&gt;
&lt;li&gt;??? + installer mapping -&amp;gt; ????; this type would downconvert to a ??? suitable for the above; this type (modulo layout) is currently called &lt;tt class="docutils literal"&gt;Metadata&lt;/tt&gt;, but, no.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I think I need to let this percolate for a bit, and I do have some other things to focus on in the meantime, so let's do that...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2023-11-08</title><link href="https://mwchase.neocities.org/coding-2023-11-08" rel="alternate"></link><published>2023-11-08T05:00:00-05:00</published><updated>2023-11-08T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-11-08:/coding-2023-11-08</id><summary type="html">&lt;p class="first last"&gt;I think this made coverage go up, as well?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I guess my plans ended up being for just a week in the future.
My plan now is to create an &lt;tt class="docutils literal"&gt;Invocation&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;InvocationParameters&lt;/tt&gt; or something like that, a container describing the information required to dispatch a command.
Next, rewrite the upper layers in terms of that, and see what falls out.&lt;/p&gt;
&lt;p&gt;I'd hoped to get more done tonight, but I at least got the environment variable representation fully cut over, so that's nice.&lt;/p&gt;
&lt;p&gt;For now, I'm going to chill out and read stuff.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2023-11-07</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-11-07" rel="alternate"></link><published>2023-11-07T05:00:00-05:00</published><updated>2023-11-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-11-07:/weekly-roundup-2023-11-07</id><summary type="html">&lt;p class="first last"&gt;New plan for writing: no more than one week of drafting at a time.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I made some plans for how to reorganize parts of MOTR.&lt;/li&gt;
&lt;li&gt;Thursday: I made a promising start on the NaNo.&lt;/li&gt;
&lt;li&gt;Friday: I was tired.&lt;/li&gt;
&lt;li&gt;Saturday: I caught back up, but still tired.&lt;/li&gt;
&lt;li&gt;Sunday: Tired.&lt;/li&gt;
&lt;li&gt;Monday: I ran out of runway on the NaNo, and realized there were serious issues, and, like, if I don't have a plan to address the issues, how can I charge ahead writing?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to switch to some smaller projects (MOTR is made up of many small projects, okay?).
For one, I want to try to put some of those changes to MOTR into practice; I think I can do something a little cleaner than what I had in mind at first.
For another, I'm looking into messing around with music composition again.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="writing"></category></entry><entry><title>Diary 2023-11-06</title><link href="https://mwchase.neocities.org/diary-2023-11-06" rel="alternate"></link><published>2023-11-06T05:00:00-05:00</published><updated>2023-11-06T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-11-06:/diary-2023-11-06</id><summary type="html">&lt;p class="first last"&gt;Really not sure where to take this...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, so, NaNo.
I'm not &lt;em&gt;definitely&lt;/em&gt; giving up on it, but I'm not going to finish it the way I'm going currently.
There are a few problems here:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I have painfully low energy and just want to lie down forever.&lt;/li&gt;
&lt;li&gt;I've more-or-less exhausted the stuff I pre-planned.&lt;/li&gt;
&lt;li&gt;I'm not sure if the stuff I want to write about merits something novella-length on its own.&lt;/li&gt;
&lt;li&gt;I'm trying to show off some fancy worldbuilding I came up with, but every character currently alive is looking at it and going &amp;quot;So, it's a &lt;em&gt;bad idea&lt;/em&gt; to engage with that&amp;quot;.
At the same time, if a character &lt;em&gt;did&lt;/em&gt; do the irresponsible thing, it would probably render the narrative too confusing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ultimately, what I really wanted to get out of this was a test of some insultingly simple command-line tools I put together for writing, and the ultimate verdict on those so far is a resounding &amp;quot;maybe&amp;quot;.
Like, for sure, they don't get in the way in the way that any minimally functional editor does, but I guess I can't really evaluate how well they worked without trying to put the output through a bunch of editing passes.&lt;/p&gt;
&lt;p&gt;Basically, if I can address all of the points above in the next few days, I'll get back into it, and otherwise I'll let it be.
(Not like I wasn't already sneaking in work on other things anyway.
Maybe this whole &amp;quot;work on just one thing for a month&amp;quot; thing isn't for me any more...)&lt;/p&gt;
&lt;p&gt;Anyway, for now, I'm going to print some stuff out so I can get off my laptop and try to take things easy.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="writing"></category></entry><entry><title>Diary 2023-11-05</title><link href="https://mwchase.neocities.org/diary-2023-11-05" rel="alternate"></link><published>2023-11-05T04:00:00-05:00</published><updated>2023-11-05T04:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-11-05:/diary-2023-11-05</id><summary type="html">&lt;p class="first last"&gt;It's hard to come up with stuff to say beyond &amp;quot;still on par, wish I could get a buffer, but I'm not going to beat myself up over it&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I hit par today, and after that, I'm trying to take things easy, because I'm dealing with a lot of stress.&lt;/p&gt;
&lt;p&gt;At least I'm relaxing.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="writing"></category></entry><entry><title>Diary 2023-11-04</title><link href="https://mwchase.neocities.org/diary-2023-11-04" rel="alternate"></link><published>2023-11-04T04:00:00-04:00</published><updated>2023-11-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-11-04:/diary-2023-11-04</id><summary type="html">&lt;p class="first last"&gt;A mathematically average day of writing, for what it's worth.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm doing a little better now, I guess.
As far as writing, I'm staying on par.
I wanted to try to get ahead, but it's late enough that I'm not going to try to force it.
I'm a little worried I've written myself into a corner, so I'm going to hope that sleeping gives me some inspiration.&lt;/p&gt;
&lt;p&gt;As for the rest of tonight...
There is nothing else.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="writing"></category></entry><entry><title>Diary 2023-11-03</title><link href="https://mwchase.neocities.org/diary-2023-11-03" rel="alternate"></link><published>2023-11-03T04:00:00-04:00</published><updated>2023-11-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-11-03:/diary-2023-11-03</id><summary type="html">&lt;p class="first last"&gt;Had a bad day, just hoping for some good days to balance it out.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So.
I was really tired today, and I didn't keep pace, but at least I'm over par.
I should have a few days to properly divide between rest and writing, and we'll see where that leaves me.&lt;/p&gt;
&lt;p&gt;Right now, though, I'm just going to read.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="writing"></category></entry><entry><title>Diary 2023-11-02</title><link href="https://mwchase.neocities.org/diary-2023-11-02" rel="alternate"></link><published>2023-11-02T04:00:00-04:00</published><updated>2023-11-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-11-02:/diary-2023-11-02</id><summary type="html">&lt;p class="first last"&gt;I put most of my words today into a text file called &amp;quot;draft&amp;quot;, so there aren't many in this post.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Good start out the gate with NaNoWriMo today.
Nothing too flashy, just a solid batch of words over the course of a few hours.
I'm... not totally certain what I'm going to fill the overall wordcount with, but I'm going to try not to worry about that.&lt;/p&gt;
&lt;p&gt;I'm really tired, but that's just my system being all out of sorts from whatever messed-up stomach bug I picked up somewhere.
All the same, I want to get off my laptop for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="writing"></category></entry><entry><title>Coding 2023-11-01</title><link href="https://mwchase.neocities.org/coding-2023-11-01" rel="alternate"></link><published>2023-11-01T04:00:00-04:00</published><updated>2023-11-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-11-01:/coding-2023-11-01</id><summary type="html">&lt;p class="first last"&gt;Making plans for a few weeks from now, hopefully.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm going to switch gears tomorrow, but until then, I've been having a look at the parts of MOTR that I want to update, and one thing that I have to deal with is that I'm not sure what my endgame was seven or eight months ago.
My goal &lt;em&gt;currently&lt;/em&gt; is to put together a tower of types, based on constructing types like &lt;tt class="docutils literal"&gt;GeneralizedType = SpecializedType[SomeType | T]&lt;/tt&gt;.
It looks like my thought process at the time was &amp;quot;So, I want to devise a more specialized type for environment variables, because the higher layers in the stack need that, and it [apparently] makes sense to plumb that back down to the lowest layer where it's relevant; oh, but I should make sure to avoid breaking backwards compatibility&amp;quot;.
Frankly, it looks like I was wrong about that last bit, because my current motrfile doesn't seem to set any environment variables.
That means I should be able to mess with it however I want.&lt;/p&gt;
&lt;p&gt;And what I'm currently thinking is:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Ditch the &lt;tt class="docutils literal"&gt;LegacyEnvVar&lt;/tt&gt; concept, and get everything working with &lt;tt class="docutils literal"&gt;EnvVar&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Create a compound type that works with arguments and environment variables via a single type variable.&lt;/li&gt;
&lt;li&gt;Create another compound type that bundles that type with the implicit io, using a separate type variable. (Might not go with this, not sure.)&lt;/li&gt;
&lt;li&gt;Make a new helper function to take these new types.&lt;/li&gt;
&lt;li&gt;Propagate these types up the layers of abstraction.&lt;/li&gt;
&lt;li&gt;(NOTE: I cannot change the &lt;tt class="docutils literal"&gt;Cmd&lt;/tt&gt; type currently, because it's being used directly by the Motrfile.)&lt;/li&gt;
&lt;li&gt;This should get rid of a &lt;tt class="docutils literal"&gt;Metadata&lt;/tt&gt; type, at the cost of potentially adding more fields to another class that needs a redesign anyway.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I won't try to work on this tonight; at some point I'll be back on this.
For now, I should wrap up, and figure out how sick I am or am not...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Weekly Roundup 2023-10-31</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-10-31" rel="alternate"></link><published>2023-10-31T04:00:00-04:00</published><updated>2023-10-31T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-10-31:/weekly-roundup-2023-10-31</id><summary type="html">&lt;p class="first last"&gt;If I need to do renames to be motivated to get the coverage up, I'll have to do renames.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I was sick a week ago. Guess what's happening now!&lt;/li&gt;
&lt;li&gt;Thursday: I pondered some more renames for MOTR.&lt;/li&gt;
&lt;li&gt;Friday: I made some progress on planning for MOTR, but didn't implement the plans just yet.&lt;/li&gt;
&lt;li&gt;Saturday: There was enough of a plan, so I put it into effect, then made some other improvements.&lt;/li&gt;
&lt;li&gt;Sunday: I realized that some of the code in MOTR is probably needlessly strict, so I need to look into what contracts actually need to be upheld.&lt;/li&gt;
&lt;li&gt;Monday: I finally remembered what &lt;tt class="docutils literal"&gt;command.Metadata&lt;/tt&gt; is meant to accomplish. Such is the obfuscatory power of a really, really bad name.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to spend a little time planning out the changes needed to remove &lt;tt class="docutils literal"&gt;command.Metadata&lt;/tt&gt;.
However, after tomorrow (keeping in mind the weird dating system for these blog posts), I'm going to have another place I'm going to be trying to put my focus...&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-10-30</title><link href="https://mwchase.neocities.org/coding-2023-10-30" rel="alternate"></link><published>2023-10-30T04:00:00-04:00</published><updated>2023-10-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-10-30:/coding-2023-10-30</id><summary type="html">&lt;p class="first last"&gt;Still gradually coming up with plans to improve the structure of the code...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay.
I've got some more insight on one of the &lt;tt class="docutils literal"&gt;Metadata&lt;/tt&gt; classes, but it hasn't translated into a new name yet.&lt;/p&gt;
&lt;p&gt;Here's the deal:&lt;/p&gt;
&lt;p&gt;A command, like you'd dispatch on the shell, has some arguments, and environment variables associated with the execution.
It also may rely on or cause side effects that are not specifically mentioned in the arguments or environment variables.
This is expressed within the low-level interfaces exposed in current releases of MOTR.&lt;/p&gt;
&lt;p&gt;A concept at a higher level is an &lt;tt class="docutils literal"&gt;Executable&lt;/tt&gt;, which is approximately &amp;quot;anything that requires some kind of installation process that MOTR is to handle, and is capable of processing arguments, environment variables, etc&amp;quot;
This could be either a shell script, or the slightly less obvious &amp;quot;argument to &lt;tt class="docutils literal"&gt;python &lt;span class="pre"&gt;-m&lt;/span&gt;&lt;/tt&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;The &lt;tt class="docutils literal"&gt;Metadata&lt;/tt&gt; class sort of combines these, by having containers corresponding to the lower-level ideas, but allowing &lt;tt class="docutils literal"&gt;Executable&lt;/tt&gt;s in addition to the normal data types.
It then provides facilities to convert these &lt;tt class="docutils literal"&gt;Executable&lt;/tt&gt;s down to the normal data types.&lt;/p&gt;
&lt;p&gt;So, the problem is, &lt;em&gt;obviously&lt;/em&gt; &lt;tt class="docutils literal"&gt;Metadata&lt;/tt&gt; is a bad name for this, and I should come up with something better.
But I'm not sure what yet.
One possibility is to push some of the concepts to the lower level, which would effectively remove the class, via converting its functionality into a single function.
Ultimately this wouldn't get rid of the problem of naming a class, but it would &lt;em&gt;simplify&lt;/em&gt; it, by making the class to be named smaller and more focused.&lt;/p&gt;
&lt;p&gt;I think that'll get things in a good position, though it'll be a rough merge up to the future topic.
For now, I'll be glad I've come up with a plan.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-10-29</title><link href="https://mwchase.neocities.org/coding-2023-10-29" rel="alternate"></link><published>2023-10-29T04:00:00-04:00</published><updated>2023-10-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-10-29:/coding-2023-10-29</id><summary type="html">&lt;p class="first last"&gt;Soon I should get some more improved names out of this...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, let's see.
More coverage for MOTR, and now I'm staring at some of the remaining lines, and thinking &amp;quot;Hm, it seems like some of this validation is too strict.&amp;quot;
That's going to take some careful thought to be sure of one way or the other.&lt;/p&gt;
&lt;p&gt;Like, the &lt;tt class="docutils literal"&gt;matrix.directory&lt;/tt&gt; decorator combines together some amount of &lt;tt class="docutils literal"&gt;SelectionDirectory&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Matrix&lt;/tt&gt; objects, along with a function to map the values all together.
The question I need to consider is, what can go wrong when it's guaranteed or possible that the matrix will allow iteration over labels outside of the directories?
To address that, I'm going to need to once again trace out the code that can potentially be hit by the highest levels of abstraction in this system.
For now, I'm not up for doing that work; maybe tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2023-10-28</title><link href="https://mwchase.neocities.org/coding-2023-10-28" rel="alternate"></link><published>2023-10-28T04:00:00-04:00</published><updated>2023-10-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-10-28:/coding-2023-10-28</id><summary type="html">&lt;p class="first last"&gt;The increased coverage is improving the code, by the way. When I hit these error cases in tests, I have to actually write messages for them.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Did the simplest possible layout that I'm comfortable with; the result is a little iffy currently, and I might rework it slightly later, but it's fine for now.&lt;/p&gt;
&lt;p&gt;All of that cleanup got me comfortable writing more tests for the &lt;tt class="docutils literal"&gt;matrix&lt;/tt&gt; module.
Just a few more tests, and it should be covered, and I can start working on other modules.&lt;/p&gt;
&lt;p&gt;For now, though, I'm just going to take things easy.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2023-10-27</title><link href="https://mwchase.neocities.org/coding-2023-10-27" rel="alternate"></link><published>2023-10-27T04:00:00-04:00</published><updated>2023-10-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-10-27:/coding-2023-10-27</id><summary type="html">&lt;p class="first last"&gt;Grudges so petty, even I can't believe I'm still holding them.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did a little research, and I've decided to go with &lt;tt class="docutils literal"&gt;DependentMapping&lt;/tt&gt;.
I'm still trying to figure out how to organize things.
Because, I want to bring in sample magmas that other code can drop into &lt;tt class="docutils literal"&gt;update_with()&lt;/tt&gt; calls.&lt;/p&gt;
&lt;p&gt;I think I want this to look something like&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;dependent_mapping.magmas&lt;/span&gt;

&lt;span class="o"&gt;...&lt;/span&gt;

&lt;span class="n"&gt;CustomMapping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dependent_mapping&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DependentMapping&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;_CustomCallableProtocol&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That's straightforward enough to describe, but I've lost track of the guidance on what's acceptable to put in &lt;tt class="docutils literal"&gt;__init__.py&lt;/tt&gt; files, and the &lt;tt class="docutils literal"&gt;DependentMapping&lt;/tt&gt; protocol is... beefy.
(That said, some of the opinions I remember seeing about &lt;tt class="docutils literal"&gt;__init__.py&lt;/tt&gt; came from people who also said that slash args were useless, which is a &lt;em&gt;fascinating&lt;/em&gt; position to take with respect to a project I was working on at the time, which contained some functions that needed to take a limited number of positional arguments, and totally arbitrary keyword arguments.)&lt;/p&gt;
&lt;p&gt;So, I'm going to publish this entry, and start reading up on what is and isn't acceptable in &lt;tt class="docutils literal"&gt;__init__.py&lt;/tt&gt; files.
And get to bed at a somewhat reasonable time.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-10-26</title><link href="https://mwchase.neocities.org/coding-2023-10-26" rel="alternate"></link><published>2023-10-26T04:00:00-04:00</published><updated>2023-10-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-10-26:/coding-2023-10-26</id><summary type="html">&lt;p class="first last"&gt;I swear all this polish is going to pay off in like a few months.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm feeling better now.
More focused.
Let's not squander it.&lt;/p&gt;
&lt;p&gt;I tried out those renames I was thinking of for MOTR, and I think that they did improve things.
To be sure, I'm going to need to step away from the code for a bit, then read over the modules I changed to see if they're any clearer.&lt;/p&gt;
&lt;p&gt;After getting those changes in, I find myself focusing on a helper function that I wrote into &lt;tt class="docutils literal"&gt;Axes.combine&lt;/tt&gt;.
That function clearly needs to go together with the whole... &amp;quot;functions only defined on finite sets&amp;quot; concept that ties a lot of the new layers of MOTR together.
To me, that means that the relevant module needs to be moved higher in the tree, next to the &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt; module.
And that suggests that I should try to come up with a non-awkward name for it.&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;per_item_parametric_mapping&lt;/tt&gt; to...
Hm.
Basically, the idea is that this type represents the same concept as a parametrically typed function, but it's only defined for values that are specifically set.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p&gt;...
What's this paper?&lt;/p&gt;
&lt;p&gt;...
All right.&lt;/p&gt;
&lt;p class="last"&gt;&amp;quot;But, Max.
Mypy doesn't let you define a type that acts like that.&amp;quot;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Not without &lt;em&gt;convincing&lt;/em&gt; it doesn't.&lt;/p&gt;
&lt;p&gt;Anyway, what to call this...
After the renames I've done, shortening it to &lt;tt class="docutils literal"&gt;ParametricMapping&lt;/tt&gt; doesn't sound &lt;em&gt;unreasonable&lt;/em&gt; to me.
Need to figure out the right naming conventions around the magmas, though.
The annoying thing about &lt;tt class="docutils literal"&gt;ParamatricMapping&lt;/tt&gt;, when I think about it, is that you need to look at it and think &amp;quot;Well, &lt;tt class="docutils literal"&gt;Mapping&lt;/tt&gt; is already parametric, so how is this different?&amp;quot;&lt;/p&gt;
&lt;p&gt;Well, I'll take some time to think about this, and see what I feel like doing.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Diary 2023-10-25</title><link href="https://mwchase.neocities.org/diary-2023-10-25" rel="alternate"></link><published>2023-10-25T04:00:00-04:00</published><updated>2023-10-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-10-25:/diary-2023-10-25</id><summary type="html">&lt;p class="first last"&gt;Being sick is weird.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was too tired to focus today, and there's no way I can improve the situation by trying to force something now.
For what it's worth, I did pile in a few more project ideas, so things promise to get &lt;em&gt;interesting&lt;/em&gt; in a few months.&lt;/p&gt;
&lt;p&gt;Hopefully I'll have more energy tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2023-10-24</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-10-24" rel="alternate"></link><published>2023-10-24T04:00:00-04:00</published><updated>2023-10-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-10-24:/weekly-roundup-2023-10-24</id><summary type="html">&lt;p class="first last"&gt;Time is a flat circle.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I thought about names in MOTR, and wasn't sure if I wanted to go the finally-obvious route.&lt;/li&gt;
&lt;li&gt;Thursday: I still wasn't sure about the names, but I was able to write some code that will eventually be useful, I think.&lt;/li&gt;
&lt;li&gt;Friday: I came up with absurdly many projects to work on... at some point.&lt;/li&gt;
&lt;li&gt;Saturday: &amp;quot;Well, let's get back into MOTR for now... but also attempt NaNoWriMo.&amp;quot;&lt;/li&gt;
&lt;li&gt;Sunday: Settling on the obvious name gave me the motivation I needed to write tests again.&lt;/li&gt;
&lt;li&gt;Monday: I got more test coverage... but ran back into having problems with the names.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to keep on pondering the name ideas, and see how I feel.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-10-23</title><link href="https://mwchase.neocities.org/coding-2023-10-23" rel="alternate"></link><published>2023-10-23T04:00:00-04:00</published><updated>2023-10-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-10-23:/coding-2023-10-23</id><summary type="html">&lt;p class="first last"&gt;Still trying to come up with evocative names.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hmmph.
I'm pushing up the coverage on the &lt;tt class="docutils literal"&gt;matrix&lt;/tt&gt; module, but it's getting to the point where I have to consider the names of things before I feel comfortable writing more tests.&lt;/p&gt;
&lt;p&gt;See, there are a few supplemental classes in that module that I'm not feeling totally on-board with the current names of: &lt;tt class="docutils literal"&gt;AdaptiveMatrix&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;MappedSelection&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Let's consider &lt;tt class="docutils literal"&gt;MappedSelection&lt;/tt&gt; first.
Basically, it's a single selection label, plus a function to map from the type of the selection label to something that can be slotted into a &lt;tt class="docutils literal"&gt;Path&lt;/tt&gt;.
Put together, it allows for the creation of two matrices which can be freely combined because they have the same axis structure.
The label itself and the matrices are relevant in different parts of the code.&lt;/p&gt;
&lt;p&gt;One of those parts of the code is the &lt;tt class="docutils literal"&gt;AdaptiveMatrix&lt;/tt&gt;, which combines a variable-length tuple of &lt;tt class="docutils literal"&gt;MappedSelection&lt;/tt&gt;s with a &lt;tt class="docutils literal"&gt;Matrix[T]&lt;/tt&gt;, which is constrained to iterate over exactly the same labels as are present in the tuple of &lt;tt class="docutils literal"&gt;MappedSelection&lt;/tt&gt;s.
The &lt;tt class="docutils literal"&gt;AdaptiveMatrix&lt;/tt&gt; is one of three possible things that can end up in a sequence of command-line arguments(ish):&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;static text&lt;/li&gt;
&lt;li&gt;the paths of artifacts passed between commands&lt;/li&gt;
&lt;li&gt;auxiliary data required by specific matrix values (&lt;tt class="docutils literal"&gt;AdaptiveMatrix&lt;/tt&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This sounds niche, but everything breaks if I don't have it, so.&lt;/p&gt;
&lt;p&gt;When I look at the code, I think this could potentially get a bunch more complicated, but maybe not...&lt;/p&gt;
&lt;p&gt;Anyway.&lt;/p&gt;
&lt;p&gt;The key perspectives of the &lt;tt class="docutils literal"&gt;MappedSelection&lt;/tt&gt;:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;It can provide a &lt;tt class="docutils literal"&gt;Matrix&lt;/tt&gt; that exposes a value of an arbitrary type.&lt;/li&gt;
&lt;li&gt;It can provide a &lt;tt class="docutils literal"&gt;Matrix&lt;/tt&gt; that exposes a value suitable to use as a directory name, and these matrices are perfectly correlated.&lt;/li&gt;
&lt;li&gt;It can provide a &lt;tt class="docutils literal"&gt;selection.Label&lt;/tt&gt; that is used to constrain and determine the structure of other matrices.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm not going to put in the effort tonight, but now I wonder if something like &lt;tt class="docutils literal"&gt;SelectedDirectory&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;MatrixDirectory&lt;/tt&gt; would strike me better.
I'll sleep on it.
For now, I've got other stuff I'll focus on for a bit to clear my head.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-10-22</title><link href="https://mwchase.neocities.org/coding-2023-10-22" rel="alternate"></link><published>2023-10-22T04:00:00-04:00</published><updated>2023-10-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-10-22:/coding-2023-10-22</id><summary type="html">&lt;p class="first last"&gt;Well, somehow I ended up making progress.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, so I gave myself sort of a break today, focusing on improving various bits of MOTR.
I finally settled on calling it a &lt;tt class="docutils literal"&gt;Matrix&lt;/tt&gt;, and this cascaded into a bunch of renames that made things clearer.
And made a few other changes.&lt;/p&gt;
&lt;p&gt;That added up to enough clarity and motivation that I finally added a line of test coverage.
Now, I'm not sure how best to handle the remaining lines in the &lt;tt class="docutils literal"&gt;matrix&lt;/tt&gt; module, because the vast majority of those lines are validation failures or similar.
I guess there's nothing for it but to carefully construct a bunch of axes &amp;quot;wrong&amp;quot; to make sure they hit the validation errors...&lt;/p&gt;
&lt;p&gt;To get that done, I guess I just need to be in the right frame of mind to power through the monotony.
Anyway, it's past time I meant to post this; I need to get to bed now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="short post"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-10-21</title><link href="https://mwchase.neocities.org/coding-2023-10-21" rel="alternate"></link><published>2023-10-21T04:00:00-04:00</published><updated>2023-10-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-10-21:/coding-2023-10-21</id><summary type="html">&lt;p class="first last"&gt;Possibly too many plans.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The document of ideas is even longer now, so that's... a thing.
I've come up with some ideas to integrate some Python libraries with the way that I, and, near as I can tell, nobody else, write tests, so that'll be really interesting.
Unfortunately, I still don't have the discipline to Just Use tox, Nox, or Hatch's matrices.&lt;/p&gt;
&lt;p&gt;With that in mind, I'm going to try to put some renames into practice in MOTR, now that I know what one of the &lt;tt class="docutils literal"&gt;Metadata&lt;/tt&gt; classes should be called instead.
(I just checked, and there are apparently just two?
I must be using them &lt;em&gt;a lot&lt;/em&gt;, because it feels like they're everywhere.)&lt;/p&gt;
&lt;p&gt;With that said, however...
Due to a confluence of factors, I'm interested in giving NaNoWriMo another try this year.
(The factors in question are, I have finally &amp;quot;properly&amp;quot; developed an idea that I have been utterly failing to explain to people for like a decade, and I just threw together some tools for drafting that I want to see in serious action.)&lt;/p&gt;
&lt;p&gt;So, the &lt;em&gt;plan&lt;/em&gt; is to kind of disappear for a month.
That is things working as intended.&lt;/p&gt;
&lt;p&gt;We'll see how things actually go when the time comes.
For now, sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="short post"></category></entry><entry><title>Coding 2023-10-20</title><link href="https://mwchase.neocities.org/coding-2023-10-20" rel="alternate"></link><published>2023-10-20T04:00:00-04:00</published><updated>2023-10-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-10-20:/coding-2023-10-20</id><summary type="html">&lt;p class="first last"&gt;The document I produced working on this has some turbo-cursed questions in it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I messed with last night's &amp;quot;greenfield development&amp;quot; a little; it should be about ready to by put into use, assuming Mypy doesn't have any weird objections to it.&lt;/p&gt;
&lt;p&gt;For now, though, I suddenly had &lt;em&gt;a bunch&lt;/em&gt; of ideas for stuff to work on besides MOTR, so I'm going to focus on categorizing and prioritizing &lt;em&gt;dozens&lt;/em&gt; of things I &lt;em&gt;could&lt;/em&gt; be looking into.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;I managed to roughly bin everything.
I haven't prioritized them yet.
In terms of concrete goals, there are three-ish things I can look into:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Music theory and synthesis stuff, with an eye towards stuff besides 12EDO&lt;/li&gt;
&lt;li&gt;Prototyping interpreters for Impliciula&lt;/li&gt;
&lt;li&gt;Going back to my dice rollers project&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We'll see if I manage to settle on one.
One serious obstacle I have is that, unless someone just &lt;em&gt;gives me&lt;/em&gt; a toxfile or a noxfile, I'll probably end up longing for MOTR, so the best bet may actually be looking into the options that specifically don't involve Python...&lt;/p&gt;
&lt;p&gt;Anyway, I don't want to stick around too much longer right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="short post"></category></entry><entry><title>Coding 2023-10-19</title><link href="https://mwchase.neocities.org/coding-2023-10-19" rel="alternate"></link><published>2023-10-19T04:00:00-04:00</published><updated>2023-10-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-10-19:/coding-2023-10-19</id><summary type="html">&lt;p class="first last"&gt;A little greenfield development, as a treat.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Quick name thought: some CI products call it a &amp;quot;matrix&amp;quot;, but...
On the one hand, I want to say &amp;quot;tensor&amp;quot; because more dimensions, but apparently a tensor is more identified with a generalization of a linear transformation, and linear transformations can be represented by matrices, but the grids the CI products generate don't have anything to do with linear transformations.&lt;/p&gt;
&lt;p&gt;What we have is some kind of generalized Cartesian product and the ability to map over the result.
I mean, except that the Cartesian-product-like-thing is idempotent, and commutative, and associative.
So, like, at that point, what is it?
(I guess if an ordering is defined over the labels, then we can fold the Cartesian product over an ordered set of labels mapped to typed sets?)&lt;/p&gt;
&lt;p&gt;Anyway, I want to change gears, so I'm going to prototype some code that I won't be able to use for a while.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, done for now, got a few things to think about while I wait to be able to use this.
Basically, I wanted a wrapper around &lt;tt class="docutils literal"&gt;contextvars&lt;/tt&gt;, using &lt;tt class="docutils literal"&gt;contextlib&lt;/tt&gt;, so I can have context managers controlling the values of &lt;tt class="docutils literal"&gt;box&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;selection&lt;/tt&gt; instead of passing them through every function, mostly unchanged.
This is pretty easy to throw together, but I did add just enough functionality to raise questions.
Like, the basic functionality is to have a &lt;tt class="docutils literal"&gt;get()&lt;/tt&gt; helper method, and a &lt;tt class="docutils literal"&gt;set()&lt;/tt&gt; method that returns a context manager.
But I anticipate that I'll want to express the logic a lot of the time as &amp;quot;update whatever value there is, with this function&amp;quot; rather than &amp;quot;temporarily replace the current value with one that happens to be related to it&amp;quot;.
So I wrote an &lt;tt class="docutils literal"&gt;update()&lt;/tt&gt; context manager, and it's like, if there isn't a value in the variable currently, do I want that to fail outright, for the caller to specify a default value to &lt;tt class="docutils literal"&gt;get()&lt;/tt&gt;, or for the caller to provide a default value that &lt;em&gt;replaces&lt;/em&gt; the act of calling the function passed in?&lt;/p&gt;
&lt;p&gt;I guess I'll need to figure out what I want to happen in my actual use cases for this stuff.
I think I'd want the &lt;tt class="docutils literal"&gt;get()&lt;/tt&gt; to fail, and a helper function in the stack to catch the &lt;tt class="docutils literal"&gt;LookupError&lt;/tt&gt; and convert it to something MOTR-specific?
Which is certainly easy to implement from the standpoint of the code I'm looking at now...&lt;/p&gt;
&lt;p&gt;Anyway, I'm tired and foggy.
Time to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2023-10-18</title><link href="https://mwchase.neocities.org/coding-2023-10-18" rel="alternate"></link><published>2023-10-18T04:00:00-04:00</published><updated>2023-10-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-10-18:/coding-2023-10-18</id><summary type="html">&lt;p class="first last"&gt;I &lt;em&gt;really&lt;/em&gt; care about names, okay?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I discussed naming concepts in MOTR with my wife, and I came up with A Breakthrough.
Just need a couple more...&lt;/p&gt;
&lt;p&gt;In short (because I want to rest my eyes), one of the key concepts in (the high level code in) MOTR is currently called &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt;, and has an attribute just called &lt;tt class="docutils literal"&gt;metadata&lt;/tt&gt;, which is... a &lt;tt class="docutils literal"&gt;Metadata&lt;/tt&gt;.
After a bunch of discussion, I realized that the &lt;tt class="docutils literal"&gt;Metadata&lt;/tt&gt; is roughly analagous to the concept of &amp;quot;shape&amp;quot; or &amp;quot;axes&amp;quot; of a multi-dimensional array.
Which, you'd think would settle &amp;quot;what to rename &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt;&amp;quot;, but...&lt;/p&gt;
&lt;p&gt;Okay, so, &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt; corresponds to what some continuous integration systems call a &amp;quot;matrix&amp;quot;, but when I searched on the web, it seemed like this usage is, in some sense, common but not standard, if that makes any sense?
I was looking because I'm used to thinking of &amp;quot;a matrix with an arbitrary number of axes&amp;quot; as &amp;quot;a tensor&amp;quot; (though I admittedly don't use tensors much), but I thought to myself &amp;quot;If I call it a 'tensor', I bet people will ask why I didn't call it a 'matrix'&amp;quot;.&lt;/p&gt;
&lt;p&gt;Anyway, even if I'm not sure what I want to call it, that line of thinking did get me thinking about some potential features I could add.
Basically, it wouldn't be &lt;em&gt;too&lt;/em&gt; hard to support excluding particular combinations of axis values, though it would be easier after a planned refactor that I don't want to do while I've got the kind of coverage gaps I've had for months.&lt;/p&gt;
&lt;p&gt;Final thought: staring at the code relevant to that feature idea is forcing me to re-ponder the tension between &amp;quot;Wanting the Mypy coverage report to look good&amp;quot; and &amp;quot;Heehee &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;itertools.product(*(itertools.zip_longest(...)&lt;/span&gt; for x in y))&lt;/tt&gt; go brrrrrrrr&amp;quot;.
Like, really, that &amp;quot;line&amp;quot; of code needs an essay explaining what's going on...&lt;/p&gt;
&lt;p&gt;Anyway, I have nothing more to say, and no coherent exit strategy, so,&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2023-10-17</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-10-17" rel="alternate"></link><published>2023-10-17T04:00:00-04:00</published><updated>2023-10-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-10-17:/weekly-roundup-2023-10-17</id><summary type="html">&lt;p class="first last"&gt;Maybe if I give this stuff better names, more of it will fit in my head.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I ran into Problems with MOTR, which were, on balance, mostly self-inflicted.&lt;/li&gt;
&lt;li&gt;Thursday: I did some unpleasant work on MOTR, and did some easier stuff to take the edge off.&lt;/li&gt;
&lt;li&gt;Friday: I finished up with the easy stuff, and then I was tired...&lt;/li&gt;
&lt;li&gt;Saturday: &amp;quot;You know what would be fun? Cataloguing every global name, attribute, and function name in the code base.&amp;quot;&lt;/li&gt;
&lt;li&gt;Sunday: I went several layers deep trying to figure out which names need to be changed first.&lt;/li&gt;
&lt;li&gt;Monday: I circled back around to names that have given me trouble before.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, maybe I'll keep on messing with the names, or maybe I'll come up with something else to do.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-10-16</title><link href="https://mwchase.neocities.org/coding-2023-10-16" rel="alternate"></link><published>2023-10-16T04:00:00-04:00</published><updated>2023-10-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-10-16:/coding-2023-10-16</id><summary type="html">&lt;p class="first last"&gt;I'm not sure where I'm going with this.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Traveled back, and had time to consider the names in MOTR.
I've ended up having to reconsider something that was bothering me last time:
I've managed to build part of the system thoroughly and pervasively around a concept that I can't figure out a good name for.
It's as if I'm a carpenter who is perfectly skilled on a technical level, but I don't know the word for &amp;quot;join&amp;quot;, so I have no idea how to explain what I'm doing.&lt;/p&gt;
&lt;p&gt;Basically, suppose you have a data type called a &lt;tt class="docutils literal"&gt;Label&lt;/tt&gt;, which has a type parameter with no run-time effect, and it compares by identity instead of by structure.
This means you can (provided the proper plugin code exists) construct containers that map a &lt;tt class="docutils literal"&gt;Label[M[T]]&lt;/tt&gt; to a &lt;tt class="docutils literal"&gt;N[T]&lt;/tt&gt;, for some &lt;tt class="docutils literal"&gt;M&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;N&lt;/tt&gt;.
I call the type mapping &lt;tt class="docutils literal"&gt;Label[T]&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;T&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;Box&lt;/tt&gt;.
The metaphor here is that the box has a label on it, and the label indicates what's in there.
Now, suppose &lt;tt class="docutils literal"&gt;M[T]&lt;/tt&gt; is &lt;tt class="docutils literal"&gt;tuple[T, &lt;span class="pre"&gt;...]&lt;/span&gt;&lt;/tt&gt;.
If you apply the corresponding label to a &lt;tt class="docutils literal"&gt;Box&lt;/tt&gt;, then the value is a collection of &lt;tt class="docutils literal"&gt;T&lt;/tt&gt;.
But if you have a container with the given &lt;tt class="docutils literal"&gt;M&lt;/tt&gt;, but &lt;tt class="docutils literal"&gt;N[T]&lt;/tt&gt; is just &lt;tt class="docutils literal"&gt;T&lt;/tt&gt;, then that same label maps to a single &lt;tt class="docutils literal"&gt;T&lt;/tt&gt;.
This could be a choice of &lt;tt class="docutils literal"&gt;T&lt;/tt&gt; from the collection in the &lt;tt class="docutils literal"&gt;Box&lt;/tt&gt;, and because it's a choice, I call it a &lt;tt class="docutils literal"&gt;Selection&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;I went a little crazy with custom container types once I got the plugin working, but those two types end up enabling a lot.
Clearly, once you have these types, and the right labels, you can convert a function that takes values of types into a function that takes a &lt;tt class="docutils literal"&gt;Box&lt;/tt&gt;.
And if some of the labels are to collections where you just need one value, you can get that value out of a &lt;tt class="docutils literal"&gt;Selection&lt;/tt&gt;.
In the context where I'm using these functions, it makes sense to want them to, instead of returning a value directly, actually return a generator that yields something called &lt;tt class="docutils literal"&gt;Fact&lt;/tt&gt;s, and then terminates with the value.
There are some obvious questions here about whether these values can actually be expected to be in the relevant containers, and pinning down the answers to those questions is where a lot of the code at this level of abstraction comes from.
But the first question I think I need to answer here is, given a function that takes a box and a selection, and yields facts before stopping with a value, what do we call that?&lt;/p&gt;
&lt;p&gt;(There are some changes I want to make to the code later that will somewhat obscure this relationship at a syntactic level, but I'd rather ignore that caveat.)&lt;/p&gt;
&lt;p&gt;The idea of all of this is that the top-level invocation will yield the facts associated with every possible selection that can be made from the box.
(Where the definition of &amp;quot;every possible selection&amp;quot; is actually very subtle and fiddly.)&lt;/p&gt;
&lt;p&gt;I wonder if one of those parenthesized statements could help.
Like, if the underlying function is just a nullary function that returns a generator.
(Or possibly just an arbitrarily resumable generator...)
That object is now wholly defined by its output behavior, which is to calculate a value and yield facts as a side effect.&lt;/p&gt;
&lt;p&gt;This feels like there's something to figure out from this perspective, but it's like I'm missing a piece...&lt;/p&gt;
&lt;p&gt;I'll just have to think about it later, because it's getting late and I feel my mind fogging up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-10-15</title><link href="https://mwchase.neocities.org/coding-2023-10-15" rel="alternate"></link><published>2023-10-15T04:00:00-04:00</published><updated>2023-10-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-10-15:/coding-2023-10-15</id><summary type="html">&lt;p class="first last"&gt;Not too convenient to only be remembering scattered pieces of how this is supposed to work. I suppose I could review my old blog posts...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I got distracted today, and there was travel, so this is going to be a quick entry.
I worked through the names in MOTR a little more, and I'm right now in the area of the &lt;tt class="docutils literal"&gt;Artifact&lt;/tt&gt; protocol, along with some of the helper classes it relies on.
The &lt;tt class="docutils literal"&gt;Artifact&lt;/tt&gt; protocol is suffering from a lack of evocativeness, with method names like &lt;tt class="docutils literal"&gt;convert&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;forbid_narrowing&lt;/tt&gt;, and &lt;tt class="docutils literal"&gt;exposed_selections&lt;/tt&gt;.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;convert&lt;/tt&gt; just needs a more evocative name&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;forbid_narrowing&lt;/tt&gt; should be better aligned with what the implementations ultimately do, which is focused around the &amp;quot;exclusive fields&amp;quot; of a &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;exposed_selections&lt;/tt&gt; points towards the &lt;tt class="docutils literal"&gt;parametric.MappedSelection&lt;/tt&gt; helper class, which stands out to me as the biggest problem here.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The point of &lt;tt class="docutils literal"&gt;MappedSelection&lt;/tt&gt; is that it extracts a value from a &lt;tt class="docutils literal"&gt;Selection&lt;/tt&gt; container, but it also offers a way to convert that value to a segment of a string-based path.
It is made via the &lt;tt class="docutils literal"&gt;parametric.map_over&lt;/tt&gt; decorator and the &lt;tt class="docutils literal"&gt;installer.adaptor&lt;/tt&gt; helper, which is a name that extra needs to be updated, because it hasn't gotten to the current round of naming yet...&lt;/p&gt;
&lt;p&gt;Anyway, I think that class isn't being used to its full potential yet, which complicates things, but it is being used.
It's too late right now for me to determine more.
I'll try to understand this code better in the morning.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2023-10-14</title><link href="https://mwchase.neocities.org/coding-2023-10-14" rel="alternate"></link><published>2023-10-14T04:00:00-04:00</published><updated>2023-10-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-10-14:/coding-2023-10-14</id><summary type="html">&lt;p class="first last"&gt;Just needed a new perspective on some of this stuff.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well.
I ended up looking over some of the tests representing what a typical motrfile would look like, and I concluded that it wasn't great.
I took some notes on reducing clutter and making it easier to get the code right, but what I ended up deciding the code needs, is a holistic look at all of the names, and how they fit together, or sometimes, really don't.
So, I've started to catalogue every global variable, class, field, function, and parameter name in the project by module, and to include any notes I come up with on what to do with the names.&lt;/p&gt;
&lt;p&gt;I've already come up with a few ideas for improvements, so let's see about getting those in before I write up too much more of this stuff.&lt;/p&gt;
&lt;p&gt;For now, though, sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2023-10-13</title><link href="https://mwchase.neocities.org/coding-2023-10-13" rel="alternate"></link><published>2023-10-13T04:00:00-04:00</published><updated>2023-10-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-10-13:/coding-2023-10-13</id><summary type="html">&lt;p class="first last"&gt;Let's see if I can remember which names are supposed to be &amp;quot;the good ones&amp;quot;...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I've made all of the obvious typing-related changes to MOTR's code.
If I'm not going to write tests for plugin-related cases I can't figure out how to hit, I guess I need to go between improving test coverage and improving names.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;I suppose one other thing I can do is work on documenting the &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt; plugin thoroughly enough that I feel confident using it, and then getting test coverage up that way...&lt;/p&gt;
&lt;p&gt;Anyway, I'll see what I'm up for later, because I'm really tired now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2023-10-12</title><link href="https://mwchase.neocities.org/coding-2023-10-12" rel="alternate"></link><published>2023-10-12T04:00:00-04:00</published><updated>2023-10-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-10-12:/coding-2023-10-12</id><summary type="html">&lt;p class="first last"&gt;Unanticipated benefit of rebuilding my environment: I get to up the version of requirements, and play with new toys.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay.
I managed to find an acceptable workaround for the Mypy 1.6 stuff, though I remain somewhat salty.
I did a merge up to future just to hopefully make subsequent merges a little less bad, and now I'm staring at the missing coverage in the plugins, thinking &amp;quot;Do I actually care? Is this a condition that can actually be hit?&amp;quot;&lt;/p&gt;
&lt;p&gt;Probably the sensible thing to do for now is to focus on documentation and deriving test cases.
Then, later, I can reconsider these uncovered lines, and either figure out tests for them, or ask for help with those parts of the plugins.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Wait a sec.
I bumped the Python version in the dev environment.
That means I'm good to update more of the typing syntax.
Necessary, no, but nice-to-have, yes.&lt;/p&gt;
&lt;p&gt;I'll get on that tomorrow, because right now I need to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2023-10-11</title><link href="https://mwchase.neocities.org/coding-2023-10-11" rel="alternate"></link><published>2023-10-11T04:00:00-04:00</published><updated>2023-10-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-10-11:/coding-2023-10-11</id><summary type="html">&lt;p class="first last"&gt;I have tried all of the workarounds that have been obvious to me so far.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I regret to inform that getting back into MOTR is super-cursed.
Things I ran into:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;It only works on Python 3.11 because of reasons.&lt;/li&gt;
&lt;li&gt;I somehow managed to write the motrfile against a version that I never published, so I had to monkeypatch the internals at the beginning of the motrfile.&lt;/li&gt;
&lt;li&gt;Mypy 1.6 has a behavior change that I want to call a regression.
Basically, it breaks using &lt;tt class="docutils literal"&gt;overload&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;singledispatchmethod&lt;/tt&gt; together, under &lt;em&gt;some circumstances&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt; plugin had a bug, and I never noticed until I happened to throw together a test case that demonstrated it.
Unpleasantly, the bug was in one of the cases that aren't even a little hexed on a conceptual level, so I don't even have the excuse that the relevant behaviors are confusing; the code was just wrong, and it may still be wrong...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I need to wrap up, because I'm having a bad time right now, and if I stay up any longer, I'll just make it worse.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2023-10-10</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-10-10" rel="alternate"></link><published>2023-10-10T04:00:00-04:00</published><updated>2023-10-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-10-10:/weekly-roundup-2023-10-10</id><summary type="html">&lt;p class="first last"&gt;Those were good ideas, maybe this is a bad idea...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I got enough help to be comfortable switching to Kakoune.&lt;/li&gt;
&lt;li&gt;Thursday: That said, there is still something wrong with my custom rc file. However, I decided to think about other things.&lt;/li&gt;
&lt;li&gt;Friday: I pondered some more how to streamline my Python setup.&lt;/li&gt;
&lt;li&gt;Saturday: I got enough pondered to be ready for the switchover, more or less.&lt;/li&gt;
&lt;li&gt;Sunday: The switchover went off without a hitch. Neat.&lt;/li&gt;
&lt;li&gt;Monday: Now that my Python setup isn't, like, kind of unreasonable, I considered trying to get back into Python development, which got me considering the elephant in the room...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to be reviewing the code for MOTR again.
According to my memories, if I can get the &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt; plugin to be reasonable, then I shouldn't have any major trouble understanding and testing the rest of the new code.
So, it goes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Review the generic attrs code in Mypy, and check for any changes since I last touched the &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt; plugin.&lt;/li&gt;
&lt;li&gt;Update the &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt; plugin and associated tests.&lt;/li&gt;
&lt;li&gt;Once I have that working and covered, merge up to the documentation branch, study the diffs, and document anything that is confusing to me.&lt;/li&gt;
&lt;li&gt;Use that knowledge to plan new tests.&lt;/li&gt;
&lt;li&gt;Try to get to a point where I can finally cut new releases again.&lt;/li&gt;
&lt;/ul&gt;
</content><category term="Weekly Roundup"></category><category term="Kakoune"></category><category term="Python"></category></entry><entry><title>Coding 2023-10-09</title><link href="https://mwchase.neocities.org/coding-2023-10-09" rel="alternate"></link><published>2023-10-09T04:00:00-04:00</published><updated>2023-10-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-10-09:/coding-2023-10-09</id><summary type="html">&lt;p class="first last"&gt;Still working on tool setup, not much interesting to say.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I futzed around with tooling a bunch today.
I think I need to get back to writing in order to try this software out.&lt;/p&gt;
&lt;p&gt;One thing I'm going to need to consider, as I look over this and think about doing Python development again, is whether I'm going to be comfortable with an existing task runner, or if I'm going to end up trying to revive MOTR, which may need some help to get running with the new stack.&lt;/p&gt;
&lt;p&gt;Oh well, I tried to come up with much more to say, and I didn't.
We'll see how I feel about all of this later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="short post"></category></entry><entry><title>Coding 2023-10-08</title><link href="https://mwchase.neocities.org/coding-2023-10-08" rel="alternate"></link><published>2023-10-08T04:00:00-04:00</published><updated>2023-10-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-10-08:/coding-2023-10-08</id><summary type="html">&lt;p class="first last"&gt;Nice to see prep work paying off.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, if you're reading this, that means that switching my Python stack worked.
I believe I verified this earlier today, but one more test can't hurt.
I'm excited to see how my new systems work out, because I don't yet have much hands-on experience with them.
I'd like to say more about this, but it's late, and I don't know what else I'd say right now.&lt;/p&gt;
&lt;p&gt;Let's see what I think of tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="short post"></category></entry><entry><title>Coding 2023-10-07</title><link href="https://mwchase.neocities.org/coding-2023-10-07" rel="alternate"></link><published>2023-10-07T04:00:00-04:00</published><updated>2023-10-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-10-07:/coding-2023-10-07</id><summary type="html">&lt;p class="first last"&gt;When I get this all put together, it'll be interesting to see what kinds of things no longer happen and oblige me to go &amp;quot;This actually makes sense and is good, because of the reasons why.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've put together all of the pseudocode I think I'll need to close the gaps in functionality I'll feel from switching off of pyenv.
I've looked up most of the information I'll need to translate that pseudocode into fish shell functions.&lt;/p&gt;
&lt;p&gt;I should be good to carry out the switchover tomorrow, but I'd better do it early, because the code supporting this blog is easily the most convoluted environment I'm going to want to have up and running.&lt;/p&gt;
&lt;p&gt;I'm trying to think of whether there's anything else from today that I'd lke to talk about now, and nothing comes to mind.
I'm going to go read.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="short post"></category></entry><entry><title>Coding 2023-10-06</title><link href="https://mwchase.neocities.org/coding-2023-10-06" rel="alternate"></link><published>2023-10-06T04:00:00-04:00</published><updated>2023-10-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-10-06:/coding-2023-10-06</id><summary type="html">&lt;p class="first last"&gt;Working more on tooling...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I kind of gave myself a rough time today, so I'm going to try to go a little easier on myself right now.&lt;/p&gt;
&lt;p&gt;I mentioned yesterday wanting to rework my Python setup.
My goal is to put together a better experience than I have currently.
Right now, my Python installs are provided by pyenv, and, through a mix of existing and hand-rolled plugins, I manually-ish set up virtual environments for running scripts and having the requirements for projects.&lt;/p&gt;
&lt;p&gt;Problems with this include: too many Pythons, and, relatedly-ish, something is always outdated.&lt;/p&gt;
&lt;p&gt;One aspect that I don't have a plan for yet is that I can set a virtual environment per directory.
(I do have an idea, which is &amp;quot;copy the stuff I'm doing with &lt;tt class="docutils literal"&gt;opam&lt;/tt&gt;&amp;quot; (&amp;quot;and also try not to think too hard about how my OCaml tooling is set up in NeoVim but not Kakoune&amp;quot;))&lt;/p&gt;
&lt;p&gt;Aside from that, though, here's the idea:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Stop activating pyenv in my &lt;tt class="docutils literal"&gt;config.fish&lt;/tt&gt; file, but leave the entire directory tree in place&lt;/li&gt;
&lt;li&gt;Get Python from deadsnakes PPA&lt;/li&gt;
&lt;li&gt;Punt on installing PyPy because I don't use it for much&lt;/li&gt;
&lt;li&gt;Configure pip to require an activated virtualenv&lt;/li&gt;
&lt;li&gt;Create virtualenv for pipx and install it, set up shell integration&lt;/li&gt;
&lt;li&gt;Install a bunch of binaries&lt;/li&gt;
&lt;li&gt;Figure out the logic for directory-based virtualenvs, and do it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of that kind of has to be in one day so I can actually publish my post when I'm done, so I'm going to try to do that last step tomorrow, then pull the trigger on all of this over the weekend.
For now, I'm going to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="short post"></category></entry><entry><title>Coding 2023-10-05</title><link href="https://mwchase.neocities.org/coding-2023-10-05" rel="alternate"></link><published>2023-10-05T04:00:00-04:00</published><updated>2023-10-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-10-05:/coding-2023-10-05</id><summary type="html">&lt;p class="first last"&gt;Working on tooling...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I now understand Kakoune a little better, but I'm still doing something wrong, but, like, just exactly wrong enough that it seems to work perfectly when I paste the commands in, but fail when I run the command that eventually invokes them.
I haven't made sense of that yet; I'll formulate a question for IRC eventually.&lt;/p&gt;
&lt;p&gt;Aside from that, I'm pondering reworking my Python setup; I have some ideas, but I need to do more research and go over exactly what my requirements are.
Regardless, I don't have it in me to write anything else now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Kakoune"></category><category term="short post"></category></entry><entry><title>Coding 2023-10-04</title><link href="https://mwchase.neocities.org/coding-2023-10-04" rel="alternate"></link><published>2023-10-04T04:00:00-04:00</published><updated>2023-10-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-10-04:/coding-2023-10-04</id><summary type="html">&lt;p class="first last"&gt;A lot of the functionality is questionable, but it's good enough to get on with.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Got some help from IRC, and now I'm blogging in Kakoune.
There are a few things I have yet to work out:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;What is the workflow for using &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;next-hunk&lt;/span&gt;&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;prev-hunk&lt;/span&gt;&lt;/tt&gt;?
I don't have any evidence that my code isn't translated properly, but the first issue to address is that I still don't know how to use the Git version.&lt;/li&gt;
&lt;li&gt;I broke &lt;tt class="docutils literal"&gt;annotate&lt;/tt&gt; (&lt;tt class="docutils literal"&gt;blame&lt;/tt&gt;).
I'm not sure how, but I did.
For extra infuriation points, this is code that I specifically tested manually because it looked so gnarly, and it worked fine then!&lt;/li&gt;
&lt;li&gt;There's probably other messed-up stuff in there that I don't know about.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That said, it makes more sense to me to focus on getting more experience with Kakoune, and I can come back and try to fix the rc file later.&lt;/p&gt;
&lt;p&gt;Aside from that, I'm going to try to wind down a little early tonight, because of scheduling nonsense.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Kakoune"></category></entry><entry><title>Weekly Roundup 2023-10-03</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-10-03" rel="alternate"></link><published>2023-10-03T04:00:00-04:00</published><updated>2023-10-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-10-03:/weekly-roundup-2023-10-03</id><summary type="html">&lt;p class="first last"&gt;Weird litte grab-bag there...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I tried to sketch out Impliciula's AST based on vibes, and learned that sketching out an AST based on vibes is probably a bad idea.&lt;/li&gt;
&lt;li&gt;Thursday: I discovered an OCaml feature that I hadn't suspected the existence of (in part because I'm not reading the documentation in any kind of order), and had to go lie down.&lt;/li&gt;
&lt;li&gt;Friday: I figured out some of the things to be done with that feature, meaning that the presentational barriers to implementing it are probably down, so I just need to deal with the technical aspects...&lt;/li&gt;
&lt;li&gt;Saturday: I started looking into what it would take to make pre-commit work with Mercurial along with Git. I would take &lt;em&gt;a lot&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Sunday: I redid my towncrier fork for the heck of it.&lt;/li&gt;
&lt;li&gt;Monday: A little more prep work for pre-commit, that has me thinking now that whatever cursed shims are required should probably exist in their own package, to avoid saddling the project with tech debt.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I've got some ideas for what to work on, but I'm not totally sure yet.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category><category term="pre-commit"></category><category term="Kakoune"></category><category term="towncrier"></category></entry><entry><title>Coding 2023-10-02</title><link href="https://mwchase.neocities.org/coding-2023-10-02" rel="alternate"></link><published>2023-10-02T04:00:00-04:00</published><updated>2023-10-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-10-02:/coding-2023-10-02</id><summary type="html">&lt;p class="first last"&gt;Getting through all of the basically easy stuff...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I would like my laptop to stop crapping out.
Not in the sense that it no longer turns on at all, mind you...&lt;/p&gt;
&lt;p&gt;Anyway.&lt;/p&gt;
&lt;p&gt;I finished the towncrier changes, but they're not tested, so what happens on usage is a surprise.
I've got it handy to mess with later, but I didn't actually have anything I want to use it with currently.&lt;/p&gt;
&lt;p&gt;I went over the different hook types used by the pre-commit tool, and tried to match them up with the hooks provided by Mercurial.
The ways to do so are not always obvious...&lt;/p&gt;
&lt;p&gt;Anyway, unless I find some guidance on Kakoune, I'm going to have to find something else to do next week.
I'll think about that some after I post this.
Nothing more to talk about tonight, though.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="towncrier"></category><category term="pre-commit"></category><category term="short post"></category></entry><entry><title>Coding 2023-10-01</title><link href="https://mwchase.neocities.org/coding-2023-10-01" rel="alternate"></link><published>2023-10-01T04:00:00-04:00</published><updated>2023-10-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-10-01:/coding-2023-10-01</id><summary type="html">&lt;p class="first last"&gt;The several hundred commits from upstream are less of a problem, and more of an opportunity. Still a little bit of a problem, though.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right.
Quick post because I got distracted.&lt;/p&gt;
&lt;p&gt;I went through the syntax highlight in my &lt;tt class="docutils literal"&gt;hg.kak&lt;/tt&gt; file, and hopefully got it all properly updated.
Now all that remains to clear up is &lt;em&gt;when I can expect to usefully use&lt;/em&gt; &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;next-hunk&lt;/span&gt;&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;prev-hunk&lt;/span&gt;&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Failing that, since my account is in limbo, I took a look at towncrier.&lt;/p&gt;
&lt;p&gt;It turns out my branch is so hopelessly out-of-date that it made more sense to make my modifications completely from scratch.
I've just gotten started with that, but I believe what I end up with is going to make more sense than my original modifications.
In part because I looked up a few more of Mercurial's help files, and in part because some code changes mean that my changes slot in a little more nicely, at least for now.&lt;/p&gt;
&lt;p&gt;I'll try and get it all put together tomorrow, because it should hopefully be pretty quick, now that I understand the basics of what's changed.&lt;/p&gt;
&lt;p&gt;Anyway, it's late and I should get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Kakoune"></category><category term="towncrier"></category><category term="short post"></category></entry><entry><title>Coding 2023-09-30</title><link href="https://mwchase.neocities.org/coding-2023-09-30" rel="alternate"></link><published>2023-09-30T04:00:00-04:00</published><updated>2023-09-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-09-30:/coding-2023-09-30</id><summary type="html">&lt;p class="first last"&gt;This kind of shouldn't be so hard, but oh well.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Sometimes I have simple desires with complicated realizations.
Like, what does it take for me to be able to get away with using Mercurial as a GitHub client?
One thing I want is Mercurial support in towncrier, which I have in a fork that is probably woefully out-of-date.&lt;/p&gt;
&lt;p&gt;Somewhat more generally used, however, is pre-commit.
If I could install the pre-commit hooks in a clone made with hg-git, that'd be the dream.
Looking at the way the internal git module is used within the pre-commit repository...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;main.py: &lt;tt class="docutils literal"&gt;git.get_root&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;git.check_for_cygwin_mismatch&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;story.py: &lt;tt class="docutils literal"&gt;git.init_repo&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;no_git_env&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;staged_files_only.py: &lt;tt class="docutils literal"&gt;get.intent_to_add_files&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;commands/run.py: &lt;tt class="docutils literal"&gt;git.get_changed_files&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;git.get_all_files&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;git.is_in_merge_conflict&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;git.get_conflicted_files&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;git.get_staged_files&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;commands/autoupdate.py: &lt;tt class="docutils literal"&gt;git.init_repo&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;git.get_best_candidate_tag&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;commands/try_repo.py: &lt;tt class="docutils literal"&gt;git.head_rev&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;git.git_path&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;git.get_staged_files&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;git.commit&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;meta_hooks/check_hooks_apply.py: &lt;tt class="docutils literal"&gt;git.get_all_files&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;meta_hooks/check_useless_excludes.py: &lt;tt class="docutils literal"&gt;git.get_all_files&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;commands/install_uninstall.py: &lt;tt class="docutils literal"&gt;git.get_git_common_dir&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;git.has_core_hookpaths_set&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But also a bunch of places that use git inline...&lt;/p&gt;
&lt;p&gt;In addition, there are the questions of how to translate between &amp;quot;hooks are script files&amp;quot; and &amp;quot;hooks are configuration entries&amp;quot;, and between different hook names.&lt;/p&gt;
&lt;p&gt;Unfortunately, it's late now.
I'll see what I can get planned to do tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="pre-commit"></category><category term="short post"></category></entry><entry><title>Coding 2023-09-29</title><link href="https://mwchase.neocities.org/coding-2023-09-29" rel="alternate"></link><published>2023-09-29T04:00:00-04:00</published><updated>2023-09-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-09-29:/coding-2023-09-29</id><summary type="html">&lt;p class="first last"&gt;Getting real tired of being jiggled around a bunch six times a week.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay.
Polymorphic variants.
I've come up with an expression syntax that I think is acceptable, and that I don't have anything else I'd want to use it for, so that's part of that language feature worked out: if I want it, it's possible to write the expressions concisely.&lt;/p&gt;
&lt;p&gt;Now let's look at the types.
My whole &amp;quot;symbol to English translation&amp;quot; schtick means that &lt;tt class="docutils literal"&gt;|&lt;/tt&gt; becomes &lt;tt class="docutils literal"&gt;or&lt;/tt&gt; as usual; furthermore, &lt;tt class="docutils literal"&gt;&amp;amp;&lt;/tt&gt; seems like it should become &lt;tt class="docutils literal"&gt;and&lt;/tt&gt;, and &lt;tt class="docutils literal"&gt;&amp;gt;&lt;/tt&gt; becomes &lt;tt class="docutils literal"&gt;open&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;&amp;lt;&lt;/tt&gt; becomes &lt;tt class="docutils literal"&gt;closed&lt;/tt&gt;, maybe.
At least as a first draft.&lt;/p&gt;
&lt;p&gt;I would like to get some hands-on experience with these ideas, but that's going to have to wait, because my energy levels just crashed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2023-09-28</title><link href="https://mwchase.neocities.org/coding-2023-09-28" rel="alternate"></link><published>2023-09-28T04:00:00-04:00</published><updated>2023-09-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-09-28:/coding-2023-09-28</id><summary type="html">&lt;p class="first last"&gt;Is this worth the trouble it would take to implement it, and to &lt;em&gt;have implemented it&lt;/em&gt;?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;My phone and my NAS conspired to delete a file I was working on, and the latest backup was missing stuff from yesterday, so I had to rewrite that section.
A little annoying, but whatever.&lt;/p&gt;
&lt;p&gt;Anyway, let's take a look at how to put together a syntax...
Transcribing stuff from the OCaml reference, and...
Hold up...
What's a &amp;quot;polymorphic variant&amp;quot; &lt;em&gt;for&lt;/em&gt;?&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;OCaml has type unions.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Why am I surprised?&lt;/p&gt;
&lt;p&gt;Okay, before I do anything else here, I need to work out what I think this would look like in Impliciula.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;It seems to me like I can either keep the lack of explicit declarations, but require a new sigil (and I'm now thinking about whether it's possible to avoid the sigil that I'm already using), or avoid a new sigil, but need some kind of special type declaration form.&lt;/p&gt;
&lt;p&gt;I'm going to need to think about this more, to see if I want to do anything besides &amp;quot;not implement this&amp;quot;.
But for now, I'm tired.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2023-09-27</title><link href="https://mwchase.neocities.org/coding-2023-09-27" rel="alternate"></link><published>2023-09-27T04:00:00-04:00</published><updated>2023-09-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-09-27:/coding-2023-09-27</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Don't worry about it, I built it based on vibes.&amp;quot; It collapses.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, getting answers about Kakoune is &lt;em&gt;presumably&lt;/em&gt; going to happen at some point.
I could try to work out the syntax highlighting, but I ended up thinking about Impliciula.&lt;/p&gt;
&lt;p&gt;What I think makes sense for Impliciula is to translate my various ideas so far into a specification of the abstract syntax tree.
This has the advantage of being &lt;em&gt;mostly&lt;/em&gt; isolated from the gambles I'm taking with the surface syntax.
This should end up being a relatively streamlined expression syntax, with some somewhat baroque statement syntax.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;I was trying to kind of wing it and put together something equivalent to (a subset of) what OCaml can express from memory and vibes, and having tried that, I would recommend... not doing that.
When I have the energy and focus handy, I need to basically try to straight translate bits of the syntax specifications for OCaml and Koka.&lt;/p&gt;
&lt;p&gt;Once I have the abstract syntax types, then I can experiment with developing a basic interpreter, to answer questions such as &amp;quot;can I actually give Impliciula a well-defined semantics?&amp;quot;
For now, though, I need to rest my eyes and get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2023-09-26</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-09-26" rel="alternate"></link><published>2023-09-26T04:00:00-04:00</published><updated>2023-09-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-09-26:/weekly-roundup-2023-09-26</id><summary type="html">&lt;p class="first last"&gt;I hope I never have to use some of the things I have learned for any other purpose than this.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I wrote some standard library code in Impliciula, and considered how it was coming out.&lt;/li&gt;
&lt;li&gt;Thursday: I got deep into a rabbit hole around naming and implementing &amp;quot;&lt;tt class="docutils literal"&gt;fold&lt;/tt&gt;&amp;quot; operations.&lt;/li&gt;
&lt;li&gt;Friday: I developed more questions about how to do things in Impliciula, and started looking into other text editors, because at this point, I only use Neovim to write this blog.&lt;/li&gt;
&lt;li&gt;Saturday: I finally realized that multimethods and gradual typing are a tricky combination. I also looked into Kakoune a bit.&lt;/li&gt;
&lt;li&gt;Sunday: I thought more about Impliciula and Kakoune.&lt;/li&gt;
&lt;li&gt;Monday: I replaced an AWK script in Kakoune with a shell invocation of Mercurial which constructs a Kakoune scripting command using a template. It was hard to face the world after that.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to wrap up the Mercurial helper for Kakoune, and switch to using Kakoune for blogging, and try to switch back to it for things that I ended up using Kate for somehow.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category><category term="Kakoune"></category></entry><entry><title>Coding 2023-09-25</title><link href="https://mwchase.neocities.org/coding-2023-09-25" rel="alternate"></link><published>2023-09-25T04:00:00-04:00</published><updated>2023-09-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-09-25:/coding-2023-09-25</id><summary type="html">&lt;p class="first last"&gt;Don't try to think about how many levels of nesting that line has.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;What remains to be done for the Mercurial helper for Kakoune:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Figure out the differences between Git and Mercurial relevant to the syntax highlighting definitions.&lt;/li&gt;
&lt;li&gt;Figure out how &lt;tt class="docutils literal"&gt;jump_hunk()&lt;/tt&gt; is supposed to, like, &lt;em&gt;do&lt;/em&gt; anything.
Like, when do I want to be using the sub-commands that invoke this function?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other than that, it's overall been a pretty straightforward update with nothing too crazy.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;&lt;em&gt;A-hem&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Come on, they don't need to see—&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Paste the line, Max.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;... &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;evaluate-commands&lt;/span&gt; %sh{ hg annotate &lt;span class="pre"&gt;&amp;quot;$&amp;#64;&amp;quot;&lt;/span&gt; &lt;span class="pre"&gt;-T&lt;/span&gt; &lt;span class="pre"&gt;&amp;quot;set-option&lt;/span&gt; global hg_annotate_flags &lt;span class="pre"&gt;%val\{timestamp}{lines&lt;/span&gt; % ' &lt;span class="pre"&gt;\'{lineno}|{node|short}&lt;/span&gt; {date|isodatesec} &lt;span class="pre"&gt;{user|person}\''}&amp;quot;}&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Yay!&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The eagle-eyed among you will notice that this should be slower than the code it's replacing, since I couldn't find an equivalent to the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--incremental&lt;/span&gt;&lt;/tt&gt; flag.
Eh, at least the code is shorter.&lt;/p&gt;
&lt;p&gt;Anyway, quick Impliciula thought: I'm doubting that I can make &amp;quot;gradual typing in the sense of a particular shape of the type system&amp;quot; work, but maybe I can do &amp;quot;gradual typing in the sense of carrying out local type inference&amp;quot;.
This is a compromise in terms of library design, but it should still allow tossing off short scripts without thinking too hard.&lt;/p&gt;
&lt;p&gt;Anyway, I'm tired, and I'd like a good night's sleep without the vaccine side effects, so let's wrap this up...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category><category term="Kakoune"></category><category term="short post"></category></entry><entry><title>Coding 2023-09-24</title><link href="https://mwchase.neocities.org/coding-2023-09-24" rel="alternate"></link><published>2023-09-24T04:00:00-04:00</published><updated>2023-09-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-09-24:/coding-2023-09-24</id><summary type="html">&lt;p class="first last"&gt;I'm going to be really peeved if there was documentation on this code somewhere, and I just didn't know about it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Quick thought on the problems I was pondering about Impliciula: possibly, values could be tagged with a type that includes all of the relevant information.
It's not obvious to me how this would get filled in under some circumstances, though.
I'm going to need to find papers on this kind of thing...&lt;/p&gt;
&lt;p&gt;Anyway, I spent more effort today on my attempt to convert Kakoune's Git helper to Mercurial.
Currently, I'm trying to figure out what the AWK function in the blame handler does, and to what extent I can just, like, ignore it.
Like, it kind of looks like I should be able to construct the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;line-specs&lt;/span&gt;&lt;/tt&gt; data directly using a properly laid-out template?
Hopefully I get that figured out in the next few days.
For the moment, I have to once again try to sleep off the vaccine side effects.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category><category term="Kakoune"></category><category term="short post"></category></entry><entry><title>Coding 2023-09-23</title><link href="https://mwchase.neocities.org/coding-2023-09-23" rel="alternate"></link><published>2023-09-23T04:00:00-04:00</published><updated>2023-09-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-09-23:/coding-2023-09-23</id><summary type="html">&lt;p class="first last"&gt;Right now, I've got hard problems, and annoying problems...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;As I was thinking about other aspects of Impliciula, I realized that I've been glossing over an issue that has foundational implications: various features that I want depend on the exact type of expressions, which means that the resolution associated with those features has to happen before any type erasure.
I'm not sure what options I have for satisfying that kind of design constraint in a dynamic context.&lt;/p&gt;
&lt;p&gt;My basic suspicion is that I outright cannot support dynamic multimethod resolution without something &lt;em&gt;really clever&lt;/em&gt; to keep the type names under control.&lt;/p&gt;
&lt;p&gt;Anyway, I'll keep thinking about whether there's some way around that, but aside from that, I've been looking at Kakoune's built-in Git scripting, and trying to convert it to Mercurial scripting.
Frustratingly, this involves getting a better understanding of Git, just so I know what some of the commands even are.&lt;/p&gt;
&lt;p&gt;Frankly, with the vaccine side effects doing their thing, I'm a little amazed that I got as far as I did, and I'm going to wind down for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category><category term="Kakoune"></category><category term="short post"></category></entry><entry><title>Coding 2023-09-22</title><link href="https://mwchase.neocities.org/coding-2023-09-22" rel="alternate"></link><published>2023-09-22T04:00:00-04:00</published><updated>2023-09-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-09-22:/coding-2023-09-22</id><summary type="html">&lt;p class="first last"&gt;I will not be taking questions on how one &amp;quot;accidentally&amp;quot; does that.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Minor meta note: I somehow accidentally stopped using &lt;a class="reference external" href="https://neovim.io/"&gt;Neovim&lt;/a&gt; for most purposes.
&lt;em&gt;So&lt;/em&gt;, while I'm in that situation, I figured I might as well look into alternatives.
I've been hearing stuff about &lt;a class="reference external" href="http://kakoune.org/"&gt;Kakoune&lt;/a&gt; and &lt;a class="reference external" href="https://helix-editor.com/"&gt;Helix&lt;/a&gt;, and because I literally only use Git in depth when I'm being paid for it, I decided to look into Kakoune since it should in theory be more amenable to getting it working with Mercurial and maybe Pijul.
But doing that means I &lt;em&gt;immediately&lt;/em&gt; need to understand how to write a &lt;tt class="docutils literal"&gt;.kak&lt;/tt&gt; file, so that's... a thing.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Anyway&lt;/em&gt;, I was thinking some more about the whole catamorphism rabbit hole I went down yesterday, and I realized something that I need to deal with...
Impliciula currently inherits Koka's usage of curly braces for blocks/anonymous functions, so it's not obvious to me how to make OCaml-style records work, but the &lt;em&gt;interesting&lt;/em&gt; syntax I'm trying to make work means that I can't have Koka-style structs.
I have an inkling of an idea for how to make this work nicely, but it needs some time to stew.
I'll at least try to explain it for now...&lt;/p&gt;
&lt;p&gt;I'm right now working under the assumption that blocks can have different internal semantics, and even syntax, in different contexts, where context is indicated by a prefix.
So, for example, a &lt;tt class="docutils literal"&gt;signature&lt;/tt&gt; block can contain a bare &lt;tt class="docutils literal"&gt;type&lt;/tt&gt; declaration, while a &lt;tt class="docutils literal"&gt;structure&lt;/tt&gt; block has to assign a type expression.
As such, the easy solution is to come up with &amp;quot;record&amp;quot; and &amp;quot;record type&amp;quot; blocks, and see if I can come up with better names.&lt;/p&gt;
&lt;p&gt;I don't have anything else in me for tonight, so let's leave it there and hope I'm vaguely rested tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category></entry><entry><title>Coding 2023-09-21</title><link href="https://mwchase.neocities.org/coding-2023-09-21" rel="alternate"></link><published>2023-09-21T04:00:00-04:00</published><updated>2023-09-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-09-21:/coding-2023-09-21</id><summary type="html">&lt;p class="first last"&gt;This is &lt;em&gt;really confusing&lt;/em&gt;, okay?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I tried to come up with a nice way to deal with some of the OCaml standard library code that I was having trouble translating to Impliciula, and I think I just made more problems for myself.&lt;/p&gt;
&lt;p&gt;Here's the deal: various standard library types have a &lt;tt class="docutils literal"&gt;fold&lt;/tt&gt; function defined which, in the cases I've looked at, takes named arguments that are named after the different constructors for the type, and those arguments are functions that convert the relevant variants to a return value.
I was looking at this like &amp;quot;I do not want to figure out what kind of noun phrase would accommodate those parameters&amp;quot;.
&amp;quot;... But what if, all of those named arguments were packed into a record type?&amp;quot;
At that point, the record type is *checks the giant pile of open web browser tabs* ... isomorphic to the evaluation function in an F-algebra?
I think?&lt;/p&gt;
&lt;p&gt;Now, the normal way to define an F-algebra is to put together an endofunctor that, I think, represents the partially applied computation.
The equivalent with a record type for the evaluation function is to represent the partial evaluations as parameters of each function in the record.
So each function in the record would be receiving a destructured variant and the intermediate calculation, and those can be cut down based on the variant...&lt;/p&gt;
&lt;p&gt;I'm going to need to try sketching implementations both ways, because I can't figure out whether I prefer to be closer to how the OCaml functions sort of look, or to the theoretical description.
Like, is it better for all implementors to put together a &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;when-is-be&lt;/span&gt;&lt;/tt&gt; block, or to construct it in one place per type using raw materials from everywhere?
The former is more flexible, but the latter was clearly (at least to me) good enough for OCaml.&lt;/p&gt;
&lt;p&gt;Yeah, this is definitely something that I need to take a good, clear look at, which is not happening right now.
I should go to bed as soon as I can.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category></entry><entry><title>Coding 2023-09-20</title><link href="https://mwchase.neocities.org/coding-2023-09-20" rel="alternate"></link><published>2023-09-20T04:00:00-04:00</published><updated>2023-09-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-09-20:/coding-2023-09-20</id><summary type="html">&lt;p class="first last"&gt;Punctuating run-on sentences with linebreaks. Sure.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've written a bunch of Impliciula code.
It's not ready to show off yet, but it is making me question whether the whole &amp;quot;make code more like sentences than mathematical notation&amp;quot; concept is actually feasible.
Some of these lines are over 100 characters, so one thing I need to salvage this is some idea of where line breaks are workable from a parsing perspective, and helpful from a punctuation perspective.
I just tried something that looks helpful, but it's still all a little breathless.&lt;/p&gt;
&lt;p&gt;Syntax aside, something occurred to me about semantics:&lt;/p&gt;
&lt;p&gt;If I keep up the whole gradual typing idea, then code that isn't being accelerated should need to specify the resume behavior of effects at definition time.
I think.
Like, yes, when the code is being accelerated, it's helpful to guarantee that the fastest/smallest paths allowable get baked in, but in the dynamic regime, the handlers need to be tracked dynamically, so...&lt;/p&gt;
&lt;p&gt;Maybe the way to do this is to just allow using &lt;tt class="docutils literal"&gt;_&lt;/tt&gt; when specifying what kind of resume behavior an effect has...&lt;/p&gt;
&lt;p&gt;In any case, I guess I should focus on the effect syntax, because once I have a version of that that I'm comfortable with, I can put out some more concrete stuff here and elsewhere.&lt;/p&gt;
&lt;p&gt;Anyway, I should stop looking at my screen.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category></entry><entry><title>Weekly Roundup 2023-09-19</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-09-19" rel="alternate"></link><published>2023-09-19T04:00:00-04:00</published><updated>2023-09-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-09-19:/weekly-roundup-2023-09-19</id><summary type="html">&lt;p class="first last"&gt;Just got to keep going...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I asked for some help with Impliciula. As of now, there have been... no takers.&lt;/li&gt;
&lt;li&gt;Thursday: I thought about a new project that I could start.&lt;/li&gt;
&lt;li&gt;Friday: I was tired.&lt;/li&gt;
&lt;li&gt;Saturday: I had brain fog.&lt;/li&gt;
&lt;li&gt;Sunday: One of my ideas for dealing with the brain fog didn't work out, so we kind of tweaked it, and we'll see at some point.&lt;/li&gt;
&lt;li&gt;Monday: I don't want to go into details, but it sucked, and continues to suck.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I might have it in me to sketch out standard library modules for Impliciula.
It'd be nice if someone expressed interest, but maybe I can just inflict them on a Discord server or some part of the fediverse.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category><category term="life"></category></entry><entry><title>Diary 2023-09-18</title><link href="https://mwchase.neocities.org/diary-2023-09-18" rel="alternate"></link><published>2023-09-18T04:00:00-04:00</published><updated>2023-09-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-09-18:/diary-2023-09-18</id><summary type="html">&lt;p class="first last"&gt;At some point, life will run out of curveballs...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I got some bad news today.
Something that I thought was bad, was actually worse.
Oh well.
Nothing to be done for now, so far as I know.&lt;/p&gt;
&lt;p&gt;Aside from that, I'm trying to balance &amp;quot;needing to take things easy&amp;quot; with &amp;quot;wanting to get work done on &lt;em&gt;something&lt;/em&gt;&amp;quot;.
I think I did all right today, but I'll do better if I just cut things short now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2023-09-17</title><link href="https://mwchase.neocities.org/diary-2023-09-17" rel="alternate"></link><published>2023-09-17T04:00:00-04:00</published><updated>2023-09-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-09-17:/diary-2023-09-17</id><summary type="html">&lt;p class="first last"&gt;Some really frustrating days for me.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, the ways I tried to improve things today didn't really work out, but we've got something slightly different that we're going to try later.
Just need to take things a day at a time and not try to rush to the end, I guess.&lt;/p&gt;
&lt;p&gt;Relatedly, I did get some other stuff done today, although I would have liked to have done more.
Oh well.&lt;/p&gt;
&lt;p&gt;I should stop writing and try to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2023-09-16</title><link href="https://mwchase.neocities.org/diary-2023-09-16" rel="alternate"></link><published>2023-09-16T04:00:00-04:00</published><updated>2023-09-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-09-16:/diary-2023-09-16</id><summary type="html">&lt;p class="first last"&gt;I'm going through stuff, I guess.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Ugh...&lt;/p&gt;
&lt;p&gt;I really want to work on stuff, but my mind feels... tangled.
Like a tightly wound spring that's rusted together.&lt;/p&gt;
&lt;p&gt;I'm trying to think of ways to get out of this state, and there are some things I can try, but the only sensible course of action to begin with is to cut this entry off here and get some sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2023-09-15</title><link href="https://mwchase.neocities.org/diary-2023-09-15" rel="alternate"></link><published>2023-09-15T04:00:00-04:00</published><updated>2023-09-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-09-15:/diary-2023-09-15</id><summary type="html">&lt;p class="first last"&gt;i cri evry tiem&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Tired...&lt;/p&gt;
&lt;p&gt;Just wanna sleep forever...&lt;/p&gt;
&lt;p&gt;Not gonna get to...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2023-09-14</title><link href="https://mwchase.neocities.org/diary-2023-09-14" rel="alternate"></link><published>2023-09-14T04:00:00-04:00</published><updated>2023-09-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-09-14:/diary-2023-09-14</id><summary type="html">&lt;p class="first last"&gt;Secrets...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hm.
This is awkward.
I was coming up with stuff to work on later, but I don't really have much to talk about from that yet...&lt;/p&gt;
&lt;p&gt;I mean I guess I can drop a few things in here...
I want to retool Missable Mysteries, in part because I'm no longer vibing with the name.
Ideally, I want something that is a little more up-front about its currently hidden agenda, which is to armchair-diagnose a celebrity with dyscalculia.&lt;/p&gt;
&lt;p&gt;But I had some thoughts about math stuff I could talk about without having a weird hidden agenda, and I'm currently trying to put together an outline for &amp;quot;alternative representations of numbers, especially ones that easily express things that we don't normally think of as numbers&amp;quot;.
Like &amp;quot;a notation that treats numbers as a special case of matrices&amp;quot; or &amp;quot;this is an extension to (a subset of) the rationals, which breaks ordering, but &lt;em&gt;not&lt;/em&gt; the way that complex numbers do&amp;quot;.
One thing I need to work out with this idea is how much theory to frontload...&lt;/p&gt;
&lt;p&gt;Anyway, I've got nothing else in me for today, so it's time to wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2023-09-13</title><link href="https://mwchase.neocities.org/coding-2023-09-13" rel="alternate"></link><published>2023-09-13T04:00:00-04:00</published><updated>2023-09-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-09-13:/coding-2023-09-13</id><summary type="html">&lt;p class="first last"&gt;Please take a look; I don't think I can do this alone.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've decided that I don't see a way forward for Impliciula without someone to discuss it with, so I put out posts on &lt;a class="reference external" href="https://cohost.org/mwchase/post/2825088-request-for-someone"&gt;Cohost&lt;/a&gt; and &lt;a class="reference external" href="https://im-in.space/&amp;#64;mwchase/111055743741723732"&gt;Mastodon&lt;/a&gt; asking for anyone who's interested in discussing a weird programming language idea.
If that describes you, please take a look.&lt;/p&gt;
&lt;p&gt;Anyway, I spaced out until it was way late, so I'm not going to post anything else.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category><category term="short post"></category><category term="asking for help"></category></entry><entry><title>Weekly Roundup 2023-09-12</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-09-12" rel="alternate"></link><published>2023-09-12T04:00:00-04:00</published><updated>2023-09-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-09-12:/weekly-roundup-2023-09-12</id><summary type="html">&lt;p class="first last"&gt;Maybe I should have done less, I don't know...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I looked over some of the fiddly corners of OCaml's syntax.&lt;/li&gt;
&lt;li&gt;Thursday: I looked at Koka, specifically the syntax for defining effects. I don't know what most of it does.&lt;/li&gt;
&lt;li&gt;Friday: I thought a little about how to handle effects.&lt;/li&gt;
&lt;li&gt;Saturday: I chilled out because I was feeling terrible.&lt;/li&gt;
&lt;li&gt;Sunday: I had some ideas about how to divide up the kinds of effects.&lt;/li&gt;
&lt;li&gt;Monday: I had some thoughts about what effect syntax would be compatible with how I'm planning to make the syntax of Impliciula.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm not sure what I'll be focusing on.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category><category term="Koka"></category><category term="OCaml"></category></entry><entry><title>Coding 2023-09-11</title><link href="https://mwchase.neocities.org/coding-2023-09-11" rel="alternate"></link><published>2023-09-11T04:00:00-04:00</published><updated>2023-09-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-09-11:/coding-2023-09-11</id><summary type="html">&lt;p class="first last"&gt;It's good enough, I think.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Quick thoughts about how to do effects in Impliciula:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The form of the effects has to be visible at the handler definition somehow.&lt;/li&gt;
&lt;li&gt;I think this &amp;quot;should&amp;quot; be done with something akin to a match construction.&lt;/li&gt;
&lt;li&gt;And a perform builtin to dispatch the effect.&lt;/li&gt;
&lt;li&gt;This does prevent the development of the &lt;tt class="docutils literal"&gt;val&lt;/tt&gt; sugar.&lt;/li&gt;
&lt;li&gt;It would be nice to be able to construct handlers as values.&lt;/li&gt;
&lt;li&gt;However this works, it goes in a block construct...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These handler ideas sound about right, and I suppose the perform idea is about right...&lt;/p&gt;
&lt;p&gt;Potentially effect interleaving could be handled by some form of newtype wrapper?
That's probably not scalable, but I'm not sure.
I don't fully understand the approach that the paper I was reading was taking, so I don't think I can come up with something comparable yet.
I'll have to keep on reading that paper, I guess.&lt;/p&gt;
&lt;p&gt;Anyway, it is very late now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2023-09-10</title><link href="https://mwchase.neocities.org/coding-2023-09-10" rel="alternate"></link><published>2023-09-10T04:00:00-04:00</published><updated>2023-09-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-09-10:/coding-2023-09-10</id><summary type="html">&lt;p class="first last"&gt;The pitch for this stuff works really easy on me, but actually designing it? Hard.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;It's late, but I want to see what I can do quickly to lay the groundwork for working on the effect system later.&lt;/p&gt;
&lt;p&gt;The minimal effect system in terms of syntax is to simply have one way to define operations.&lt;/p&gt;
&lt;p&gt;This is problematic for two related reasons, both deriving from the fact that I want expressive power on the level of Koka for this:
Effects that strong use a continuation that can be called arbitrarily many times, which means that the straightforward implementation would have to basically use &amp;quot;heap frames&amp;quot; instead of stack frames, which would both make performance pretty bad in general, and complicate reasoning about behavior.&lt;/p&gt;
&lt;p&gt;(Another issue with having such &amp;quot;simple&amp;quot; syntax is that it doesn't allow for specifying that a particular operation should be handled by a handler other than the nearest one.)&lt;/p&gt;
&lt;p&gt;One possible course of action that occurs to me is to try to express this stuff in terms of modular implicits somehow.
I'm not totally sure if that makes sense, but let's see...&lt;/p&gt;
&lt;p&gt;Doing stuff with &amp;quot;normal&amp;quot; modular implicits means that you're relying on matching up an implicitly available module to the input types, and &lt;em&gt;potentially&lt;/em&gt; that module could define functions with effects.
One question I need to consider is whether it works to vary the effects in different versions of the module...
I &lt;em&gt;think&lt;/em&gt; that kind of thing at least needs to be considered with modules in general, so, just as a module can define a type, a module can also define an effect.&lt;/p&gt;
&lt;p&gt;Okay, trying to get past that diversion, what matters is that &lt;strong&gt;a function that has an effect, is relying on its caller to provide a handler; that handler can be given various abilities to resume the computation&lt;/strong&gt;.
My quick read on what are possible amounts of resumption to allow is that the cases that are meaningfully distinct are &amp;quot;never, once, more than once&amp;quot;.
These can come together as:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Resumption is never allowed.&lt;/li&gt;
&lt;li&gt;Resumption is allowed up to once.&lt;/li&gt;
&lt;li&gt;Resumption is allowed an arbitrary number of times.&lt;/li&gt;
&lt;li&gt;Resumption is allowed exactly once.&lt;/li&gt;
&lt;li&gt;Resumption is allowed once or more.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;quot;It must be resumed more than once&amp;quot; doesn't sound sensible, so I'm going to put it aside for now.&lt;/p&gt;
&lt;p&gt;One of the things I need to understand here is, what assumptions I need to relax when considering multiple resumption...&lt;/p&gt;
&lt;p&gt;And I think I need to read over the Koka documentation again to understand what questions I should even be asking...&lt;/p&gt;
&lt;p&gt;Anyway, that's all I have time for right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category></entry><entry><title>Diary 2023-09-09</title><link href="https://mwchase.neocities.org/diary-2023-09-09" rel="alternate"></link><published>2023-09-09T04:00:00-04:00</published><updated>2023-09-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-09-09:/diary-2023-09-09</id><summary type="html">&lt;p class="first last"&gt;This was not a day for doing things.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, I had (or have) a migraine, and I took measures to deal with it.
They seem to have worked, but they do mean that I lack the focus to write in any detail.
We'll see what I'm capable of tomorrow, but I can tell that &amp;quot;trying harder&amp;quot; isn't going to do anything in the next hour, so, like, don't push myself.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2023-09-08</title><link href="https://mwchase.neocities.org/coding-2023-09-08" rel="alternate"></link><published>2023-09-08T04:00:00-04:00</published><updated>2023-09-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-09-08:/coding-2023-09-08</id><summary type="html">&lt;p class="first last"&gt;Small insight, but skippable.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I had a bit more of a look at the paper I mentioned last entry, and I've come to the conclusion that I'm probably not going to get anywhere unless I start putting together strawman syntax and semantics examples.&lt;/p&gt;
&lt;p&gt;Anyway, I am sick or something so I'm going to go lie down byyyyyyye.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category><category term="short post"></category></entry><entry><title>Coding 2023-09-07</title><link href="https://mwchase.neocities.org/coding-2023-09-07" rel="alternate"></link><published>2023-09-07T04:00:00-04:00</published><updated>2023-09-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-09-07:/coding-2023-09-07</id><summary type="html">&lt;p class="first last"&gt;I'm not even sure I'm reading the right paper.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm looking at the Koka documentation on effects, and here are the way things look offhand:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;An effect can be &lt;tt class="docutils literal"&gt;named&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;An effect can be &lt;tt class="docutils literal"&gt;linear&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;An effect can be &lt;tt class="docutils literal"&gt;rec&lt;/tt&gt;ursive.&lt;/li&gt;
&lt;li&gt;An effect can have a &amp;quot;kind&amp;quot;.&lt;/li&gt;
&lt;li&gt;An effect can be &amp;quot;in&amp;quot; a type.&lt;/li&gt;
&lt;li&gt;An effect can define any number of operations, including zero.&lt;/li&gt;
&lt;li&gt;An operation can be &lt;tt class="docutils literal"&gt;pub&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;An operation can be &lt;tt class="docutils literal"&gt;val&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;fun&lt;/tt&gt;, or &lt;tt class="docutils literal"&gt;ctl&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;A handler can define a &lt;tt class="docutils literal"&gt;finally&lt;/tt&gt; clause, even though &lt;tt class="docutils literal"&gt;finally&lt;/tt&gt; is also a function???
Like, Impliciula would be able to get away with this, because one would be spelled &lt;tt class="docutils literal"&gt;finally&lt;/tt&gt; and one would be spelled &lt;tt class="docutils literal"&gt;finally::&lt;/tt&gt;, but Koka has more conventional syntax, so I'm confused.&lt;/p&gt;
&lt;p&gt;Anyway, I'm trying to read about the implications of all of this, but it's late and I'm tired.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category></entry><entry><title>Coding 2023-09-06</title><link href="https://mwchase.neocities.org/coding-2023-09-06" rel="alternate"></link><published>2023-09-06T04:00:00-04:00</published><updated>2023-09-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-09-06:/coding-2023-09-06</id><summary type="html">&lt;p class="first last"&gt;Going to have to keep in mind that &amp;quot;wanting the documentation to make intuitive sense&amp;quot; won't be enough to make it so.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I decided to switch back to Impliciula, and there's a &lt;em&gt;chance&lt;/em&gt; that I'll switch back again soon because... one sec.&lt;/p&gt;
&lt;p&gt;So, because I've got rough equivalents for a lot of OCaml syntax together, I went through the language extensions to see what I need to figure out how to include.
There are a few definite yeses, a few things that sound important, and a few things that sound mainly like the horrifying stuff that people figured out how to do with the &lt;tt class="docutils literal"&gt;coding:&lt;/tt&gt; directive in Python.&lt;/p&gt;
&lt;p&gt;I don't understand all of the extensions, in part due to the intensely abbreviated presentation in that part of the manual, but I've got initial notes on all of the extensions, even if one extension just got notes of &amp;quot;Yo what the fuck&amp;quot;.&lt;/p&gt;
&lt;p&gt;Now, I need to put some time into reviewing Koka's syntax and shoring up my understanding.&lt;/p&gt;
&lt;p&gt;Note to self, document an &amp;quot;explicit subset&amp;quot; of Impliciula's syntax when the time comes, and then gradually explain how to abbreviate that.
That seems like it would &lt;em&gt;hopefully&lt;/em&gt; be less mysterious than the presentation of the Koka book.
Although, maybe the Koka book just feels like that to me when I'm trying to use it as &amp;quot;the wrong kind of documentation&amp;quot;?
I'll think about all of that later, starting with &amp;quot;how should defining and handling effects look?&amp;quot;
(One thing I'd like to keep in mind is whether it's possible to somehow describe &amp;quot;effects that only propagate outwards&amp;quot;, if that makes any sense.
Like, if I want to use a comparison function that logs to somewhere.)&lt;/p&gt;
&lt;p&gt;Anyway, I'm not getting anything else done right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category></entry><entry><title>Weekly Roundup 2023-09-05</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-09-05" rel="alternate"></link><published>2023-09-05T04:00:00-04:00</published><updated>2023-09-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-09-05:/weekly-roundup-2023-09-05</id><summary type="html">&lt;p class="first last"&gt;That was a good gear-switch.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I switched gears to writing, and described some of the stuff I'm working through with Sundered Empire.&lt;/li&gt;
&lt;li&gt;Thursday: I continued on with that.&lt;/li&gt;
&lt;li&gt;Friday: I did a bit more writing, and pondered whether I'm going to end up cutting a bunch of the stuff that I was working on.&lt;/li&gt;
&lt;li&gt;Saturday: I mentioned some of the character traits I hope to avoid, and pondered what's necessary to avoid overcorrection.&lt;/li&gt;
&lt;li&gt;Sunday: Travel, but I published the chosts.&lt;/li&gt;
&lt;li&gt;Monday: Tired.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I don't yet know what I'll feel like working on.
We'll see.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="writing"></category></entry><entry><title>Diary 2023-09-04</title><link href="https://mwchase.neocities.org/diary-2023-09-04" rel="alternate"></link><published>2023-09-04T04:00:00-04:00</published><updated>2023-09-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-09-04:/diary-2023-09-04</id><summary type="html">&lt;p class="first last"&gt;Feel free to skip.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't end up doing anything worth writing about today, so I'm just going to have another short nothing entry.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2023-09-03</title><link href="https://mwchase.neocities.org/diary-2023-09-03" rel="alternate"></link><published>2023-09-03T04:00:00-04:00</published><updated>2023-09-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-09-03:/diary-2023-09-03</id><summary type="html">&lt;p class="first last"&gt;There's not much... here.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;We traveled today, and I don't feel great.
But I decided to shove all my Cohost drafts out the door, so here's &lt;a class="reference external" href="https://cohost.org/mwchase"&gt;my Cohost&lt;/a&gt;.
Have a look, see what you think, comment on it if you have an account.&lt;/p&gt;
&lt;p&gt;I don't think I have anything else to say.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Cohost"></category><category term="short post"></category></entry><entry><title>Diary 2023-09-02</title><link href="https://mwchase.neocities.org/diary-2023-09-02" rel="alternate"></link><published>2023-09-02T04:00:00-04:00</published><updated>2023-09-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-09-02:/diary-2023-09-02</id><summary type="html">&lt;p class="first last"&gt;One time the original She-Ra cartoon managed to do a White Savior episode with only pale-skinned characters. I think about that sometimes.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Getting to some good stuff in writing, but I need to think some about where to take it next.
I've got some travel and stuff coming up in the next few days, so maybe I'll end up switching gears for a bit again soon.&lt;/p&gt;
&lt;p&gt;One thing I'll need to ponder is a way to give the original main character a chance to shine again.
The (not-quite-drafted) introductory sequence has them doing cool stuff, and then being brought low.
I'm going to need to figure out how to showcase their skills, because they're mostly way outside of a context where their skills would reasonably apply.&lt;/p&gt;
&lt;p&gt;Like, this is pulp-inspired, and I'm trying to avoid the &amp;quot;hypercompetent outsider&amp;quot; concept, but they should be good for something besides moral support.
I'll have to think about this.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="writing"></category><category term="short post"></category></entry><entry><title>Diary 2023-09-01</title><link href="https://mwchase.neocities.org/diary-2023-09-01" rel="alternate"></link><published>2023-09-01T04:00:00-04:00</published><updated>2023-09-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-09-01:/diary-2023-09-01</id><summary type="html">&lt;p class="first last"&gt;Asymptotically approaching the &amp;quot;explaining nuclear physics in caveman speak&amp;quot; bit.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got a bit more writing done.
Once I get the lines I want written, maybe I should skip ahead a bit, because it feels a little like I'm spinning my wheels here.&lt;/p&gt;
&lt;p&gt;Like, I'm concerned with whether the new stuff I'm writing is fulfilling to read, whether it's adding anything beyond a recap of what the reader recently read.
I may be accidentally recreating the conventions related to the serialized nature of the kind of science fiction I'm trying to emulate.
And, if so, is that a problem?
Maybe I should try to figure out a way to release this stuff serially?
I dunno.&lt;/p&gt;
&lt;p&gt;Anyway, I am tired and I don't want to prolong this post.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="writing"></category><category term="short post"></category></entry><entry><title>Diary 2023-08-31</title><link href="https://mwchase.neocities.org/diary-2023-08-31" rel="alternate"></link><published>2023-08-31T04:00:00-04:00</published><updated>2023-08-31T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-08-31:/diary-2023-08-31</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Being-in-space deficiency&amp;quot; is admittedly a weird way to express the concept of &amp;quot;muscular and skeletal atrophy&amp;quot;, but I stand by it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I haven't heard anything about &lt;em&gt;not making us go into the office for, frankly, no good reason&lt;/em&gt;, even as the trend lines bend back upwards.
This sucks.&lt;/p&gt;
&lt;p&gt;I tried to distract myself from that by doing some writing.
I've gone a but further forward in the Sundered Empire stuff, at least chronologically, but I keep on setting the characters challenges and puzzles that then I have to figure out how they'd tackle them.&lt;/p&gt;
&lt;p&gt;Like, okay, someone shows up from space, and, through heroic efforts at communication, conveys to you that they were sent to do something, and whether they succeed or fail, both outcomes are bad.
What do you do with that information?
How do you determine whether they're running some kind of con?
Suppose it seems reasonable that the outcomes would be, in fact, bad, but it's not clear whether those outcomes will actually come about.&lt;/p&gt;
&lt;p&gt;I suppose also I'm worried that all of this caution might read as strange to some of the audience, but I think it makes sense, and I don't want things to go super-easy for the main characters.
I'm definitely not going to take it as far as &amp;quot;and now they have a knock-down brawl&amp;quot;, not least because the one from space needs physical therapy to deal with being-in-space deficiency.&lt;/p&gt;
&lt;p&gt;I guess I'll just have to sleep on it.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="writing"></category></entry><entry><title>Diary 2023-08-30</title><link href="https://mwchase.neocities.org/diary-2023-08-30" rel="alternate"></link><published>2023-08-30T04:00:00-04:00</published><updated>2023-08-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-08-30:/diary-2023-08-30</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Isotopes on planet, like fingerprint in chemicals.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I'm still &lt;em&gt;thinking&lt;/em&gt; about Impliciula, but I don't think I'm up for the amount of documentation I'd need to read to figure out what capabilities it needs to have, and how they should be expressed.&lt;/p&gt;
&lt;p&gt;So, writing.
I have no idea how well I did on the scene I'm drafting currently, but it's not something I have much experience with, so that's interesting to me.
Two characters are trying to communicate, but they have one language in common, which neither of them are entirely fluent in.
One has a broad vocabulary but mostly uses the language informally, resulting in &amp;quot;uneducated-sounding&amp;quot; grammar.
The other can remember what words mean after hearing them used, but as far as speaking, can only remember entire sentences meant to be used as cocktail-party witticisms.&lt;/p&gt;
&lt;p&gt;I'm trying to go for a contrast between an expert in various matters who ends up talking &amp;quot;like a caveman&amp;quot;, and someone who can sound &amp;quot;high-bred&amp;quot; but has minimal relevant knowledge.
I don't know how well I pulled it off, but whatever.
The one thing I still want to do in this area is to have a technobabble lecture in caveman-speak.&lt;/p&gt;
&lt;p&gt;But for now, I need to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="writing"></category></entry><entry><title>Weekly Roundup 2023-08-29</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-08-29" rel="alternate"></link><published>2023-08-29T04:00:00-04:00</published><updated>2023-08-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-08-29:/weekly-roundup-2023-08-29</id><summary type="html">&lt;p class="first last"&gt;I worked on this stuff just enough to feel like I don't want to for a while.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I did some work considering how to get syntax highlighting for Impliciula in Cohost.&lt;/li&gt;
&lt;li&gt;Thursday: I did some work specifically on the lexer needed for syntax highlighting.&lt;/li&gt;
&lt;li&gt;Friday: I improved the lexer.&lt;/li&gt;
&lt;li&gt;Saturday: I filled in some more gaps in the lexer.&lt;/li&gt;
&lt;li&gt;Sunday: I figured out the answer to a bunch of technical issues with Cohost.&lt;/li&gt;
&lt;li&gt;Monday: I decided to take a break from this, and work on something else.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to somehow blog about the stuff I'm writing.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category><category term="Cohost"></category></entry><entry><title>Diary 2023-08-28</title><link href="https://mwchase.neocities.org/diary-2023-08-28" rel="alternate"></link><published>2023-08-28T04:00:00-04:00</published><updated>2023-08-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-08-28:/diary-2023-08-28</id><summary type="html">&lt;p class="first last"&gt;Just trying to be in tune with my intuitions about when to drop something for like a week or two.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;After all of the Cohost stuff I worked out, I still need to give those drafts some editing passes, but I don't wanna...
So, for this next week, I'm going to try to focus on writing, to take my focus off the Cohost drafts.&lt;/p&gt;
&lt;p&gt;I'm going to need to work on having stuff to say about this writing, or the next week's worth of entries are going to be &lt;em&gt;really boring&lt;/em&gt;.
Oh well.&lt;/p&gt;
&lt;p&gt;I'll see what I can do right now, then get this published.&lt;/p&gt;
&lt;p&gt;The setting for the story I'm working on is called the Sundered Empire.
Centuries before the story starts, the lines of communication and commerce in an interstellar empire were severed by a series of rebellions, dividing the empire into many smaller states.
In the years since, the different states developed their own identities; when the connections began to be re-established, the different states refused to re-integrate.
At the time the story starts, fully reunifying the empire is a pipe dream, a topic of idle conversation among the upper class.
However, one ambitious noble comes across hints of lost technology that could obliterate the borders between the states, and enlists the services of a legendary thief to recover it.
The trail leads to a planet that has been left alone since the time of the Sundering, where the thief meets and eventually befriends an accomplished polymath who leads a small tribe living in the jungle.
&lt;em&gt;Stuff happens&lt;/em&gt;, and then they discover the lost technology and turning it on makes everything more complicated and precarious.&lt;/p&gt;
&lt;p&gt;So, um, that's the first book, and, spoilers, maybe, I dunno.
My hope is that I can get the readers through the whole &amp;quot;legendary thief on a strange planet&amp;quot; plot without ever &lt;em&gt;overwhelming&lt;/em&gt; them with the &amp;quot;former empire&amp;quot; backstory.&lt;/p&gt;
&lt;p&gt;We'll see how I do with expanding on that summary in a few days.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="writing"></category></entry><entry><title>Diary 2023-08-27</title><link href="https://mwchase.neocities.org/diary-2023-08-27" rel="alternate"></link><published>2023-08-27T04:00:00-04:00</published><updated>2023-08-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-08-27:/diary-2023-08-27</id><summary type="html">&lt;p class="first last"&gt;Closing in on publishing these posts...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've gotten the prototype highlighter working well enough, for now, so I decided to try to get its output usable with Cohost.
After smacking my head against it a bunch, I found the things that need to be done to use Pygments with Cohost:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Use the &amp;quot;Lightbulb&amp;quot; theme, or a similar dark theme.&lt;/li&gt;
&lt;li&gt;However, replace the line number colors with whatever is the &amp;quot;default&amp;quot; color according to the scheme.&lt;/li&gt;
&lt;li&gt;Replace all linebreaks in the HTML output with &lt;tt class="docutils literal"&gt;&amp;lt;br&amp;gt;&lt;/tt&gt; tags.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The result looks a little weird to me, but it should serve.&lt;/p&gt;
&lt;p&gt;Anyway, I got distracted and it's late, going to bed now byyyyyye&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Cohost"></category><category term="Impliciula"></category></entry><entry><title>Coding 2023-08-26</title><link href="https://mwchase.neocities.org/coding-2023-08-26" rel="alternate"></link><published>2023-08-26T04:00:00-04:00</published><updated>2023-08-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-08-26:/coding-2023-08-26</id><summary type="html">&lt;p class="first last"&gt;Computers... :(&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I'm not in the mood to make all of the decisions that need to be made, but I started messing with the lexer prototype, and let's see what's missing:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Strings&lt;/li&gt;
&lt;li&gt;Numbers&lt;/li&gt;
&lt;li&gt;Arithmetic operations&lt;/li&gt;
&lt;li&gt;semicolons&lt;/li&gt;
&lt;li&gt;arrow&lt;/li&gt;
&lt;li&gt;something about lists?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I got drafts for most of that, except for lists.
Also I should have comments, which is going to end up being a whole other thing...&lt;/p&gt;
&lt;p&gt;Nevertheless, I think I'm at the point where I can put together short snippets and have some highlighting.
And, trying it out with my color scheme and...
Wow.
That's terrible.
Like I should maybe re-evaluate the color scheme I'm using for this blog, because &amp;quot;half the keywords, and the function invocations and variable names all get &lt;em&gt;identical&lt;/em&gt; highlighting&amp;quot; is a ridiculous scenario to end up in.&lt;/p&gt;
&lt;p&gt;I'll try to get something that makes sense tomorrow...&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;I got sidetracked, and tried to make the theme from scratch, and I ended up with something nearly as bad as my custom theme, from modifying one of the bundled ones.&lt;/p&gt;
&lt;p&gt;I'm going to try to ask for help.
We'll see how that goes, but also I need to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category></entry><entry><title>Coding 2023-08-25</title><link href="https://mwchase.neocities.org/coding-2023-08-25" rel="alternate"></link><published>2023-08-25T04:00:00-04:00</published><updated>2023-08-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-08-25:/coding-2023-08-25</id><summary type="html">&lt;p class="first last"&gt;Not much actual content, but whatever.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I put together the chart, and iterated on it a bunch to write the necessary regexes for the prototype lexer.
It's missing &lt;em&gt;a lot&lt;/em&gt; of stuff I'm going to want down the line, but I'm trying to pick my battles.
And the regexes are totally normal, nothing strange here.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;You wrote a biblically accurate emoticon.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Come on, &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;(?::(:{SEGMENT}:)*:?)&lt;/span&gt;&lt;/tt&gt; isn't &lt;em&gt;that&lt;/em&gt; bad...&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;That is 100% an angel named, like, Ixushavel, with the caveat that nobody who actually knows Hebrew was consulted on this point.
And attempting to copy the &amp;quot;derivation&amp;quot; that &amp;quot;justifies&amp;quot; that name indicated that Hebrew almost certainly doesn't work like that.
Or possibly that easily-available machine translation is being pushed past its limits.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Anyway, I should be good to test whether this actually works now.
And once I've confirmed the basic cases, I can shore up some of the details I haven't covered yet, and then get back to the CSS Weeds.&lt;/p&gt;
&lt;p&gt;For now, I need to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category></entry><entry><title>Coding 2023-08-24</title><link href="https://mwchase.neocities.org/coding-2023-08-24" rel="alternate"></link><published>2023-08-24T04:00:00-04:00</published><updated>2023-08-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-08-24:/coding-2023-08-24</id><summary type="html">&lt;p class="first last"&gt;Something something, it's (not) about sending a message.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay.
I want to write a lexer for Impliciula.
For that, I need test cases.
Let's start listing things.
In each case, assume the whitespace is needed but I don't really care how it lexes.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;list-of:&lt;/span&gt; 'a&lt;/tt&gt;: function-inline-right, type-variable&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;list-of:&lt;/span&gt; int&lt;/tt&gt;: function-inline-right, name&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;nil&lt;/tt&gt;: name&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;head: head &lt;span class="pre"&gt;and-tail:&lt;/span&gt; tail&lt;/tt&gt;: function-inline-right, name, function-inline-right, name&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;for-all-e-in:&lt;/span&gt; list e: &lt;span class="pre"&gt;::is-even&lt;/span&gt;&lt;/tt&gt;: function-inline-right, name, function-inline-right, function-prefix-left&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;there-exists-an-e-in:&lt;/span&gt; list &lt;span class="pre"&gt;such-that-e:&lt;/span&gt; &lt;span class="pre"&gt;::is-even&lt;/span&gt;&lt;/tt&gt;: function-inline-right, name, function-inline-right, function-prefix-left&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pause here to note that I will consider goofy unicode abbreviations for those, so they're more like &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;∀-e-in::e::&lt;/span&gt;&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;∃-e-in::st-e::&lt;/span&gt;&lt;/tt&gt; (which have to be function-prefix-left, function-prefix-left unless I want to devise Cursed Tokens &lt;em&gt;or&lt;/em&gt; if I don't indicate the side on the prefix form, and let it contain multiple parts, in which case it's function-prefix, and that above is function-prefix-left instead of function-prefix)&lt;/p&gt;
&lt;p&gt;The problematic cases come in with partial evaluation.
Like, if I want to apply &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;for-all-e-in::e::&lt;/span&gt;&lt;/tt&gt; to the predicate, can that be &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;for-all-e-in::&lt;/span&gt; e: &lt;span class="pre"&gt;::is-even&lt;/span&gt;&lt;/tt&gt;, or does it have to be &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;for-all-e-in:&lt;/span&gt; : e: &lt;span class="pre"&gt;::is-even&lt;/span&gt;&lt;/tt&gt;?
I really want to make the former work, but that would seem to mean that function-prefix-right, function-inline-right, function-prefix-left is a valid call.
I can't &amp;quot;simply&amp;quot; lex the freestanding colons separately because otherwise I think the inline-right, prefix-left sequence is instead something really messed up.
I think I'd like to allow the prefix version to contain double colons, because the alternative is to just split it into a bunch of prefix-rights.
Prefix-left can only be a single segment, and prefix-right and prefix-right-left end in double colon and can maybe contain multiple segments.&lt;/p&gt;
&lt;p&gt;I'm going to need to make some kind of Punnett square for the token types I'm trying to come up with here.
Not a Punnett square.
Um...
I dunno.&lt;/p&gt;
&lt;p&gt;I'm going to wrap up, and doodle that chart while this publishes.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Impliciula"></category></entry><entry><title>Diary 2023-08-23</title><link href="https://mwchase.neocities.org/diary-2023-08-23" rel="alternate"></link><published>2023-08-23T04:00:00-04:00</published><updated>2023-08-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-08-23:/diary-2023-08-23</id><summary type="html">&lt;p class="first last"&gt;This may be too clever, at least for me.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The Cohost writing is almost done.
It just wants some syntax examples.
Which means I need to write the lexer.
Which means I need to figure out if my current ideas actually lex.&lt;/p&gt;
&lt;p&gt;The issue I need to work out focuses on two special values I need to handle.
The simple part is that I want &lt;tt class="docutils literal"&gt;_&lt;/tt&gt; to be handled specially, but the special handling doesn't need to be in the lexer, so whatever.
The complicated part is...&lt;/p&gt;
&lt;p&gt;So, I'm trying to base the function syntax off of Smalltalk, sort of.
And one of the &amp;quot;great&amp;quot; ideas I came up with was to use &lt;tt class="docutils literal"&gt;:&lt;/tt&gt; not just as a terminator (and sometimes starting character) for parts of a function name, but to represent an unevaluated function using &lt;tt class="docutils literal"&gt;::&lt;/tt&gt; instead, so &lt;tt class="docutils literal"&gt;:&lt;/tt&gt; is used to indicate partial evaluation.
(The starting character version is because I decided that I wanted to allow having an argument before the function name.
Smalltalk doesn't have to specially represent this because—OH MY GOSH, LOOK OVER THERE)&lt;/p&gt;
&lt;p&gt;So, the idea is that there will be functions like &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;:is-even&lt;/span&gt;&lt;/tt&gt; which can be delayed by writing as &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;::is-even&lt;/span&gt;&lt;/tt&gt;, and &lt;em&gt;part&lt;/em&gt; of my uncertainty about all of this is how to put everything into a nice canonical form.&lt;/p&gt;
&lt;p&gt;Anyway, it's too late for me to think about all of this, so I'm going to wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Cohost"></category><category term="Impliciula"></category></entry><entry><title>Weekly Roundup 2023-08-22</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-08-22" rel="alternate"></link><published>2023-08-22T04:00:00-04:00</published><updated>2023-08-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-08-22:/weekly-roundup-2023-08-22</id><summary type="html">&lt;p class="first last"&gt;That travel really disturbed things, but it was worth it.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I complained about my laptop being messed up for over an hour, then made plans for how to get feedback on NABTO, now called Impliciula.&lt;/li&gt;
&lt;li&gt;Thursday: I started drafting entries elsewhere.&lt;/li&gt;
&lt;li&gt;Friday: We traveled.&lt;/li&gt;
&lt;li&gt;Saturday: I did the stuff that we traveled for.&lt;/li&gt;
&lt;li&gt;Sunday: I did some work on the drafts, but started encountering issues that I don't fully understand yet.&lt;/li&gt;
&lt;li&gt;Monday: More drafting, and we traveled back.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to finish up the drafts.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Impliciula"></category></entry><entry><title>Diary 2023-08-21</title><link href="https://mwchase.neocities.org/diary-2023-08-21" rel="alternate"></link><published>2023-08-21T04:00:00-04:00</published><updated>2023-08-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-08-21:/diary-2023-08-21</id><summary type="html">&lt;p class="first last"&gt;Note to self: do not read computer science papers at 11:50 PM.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I did some more Cohost writing, and we traveled back.&lt;/p&gt;
&lt;p&gt;The Cohost writing feels weird.
It's been so long since I properly drafted a blog post ahead of time.&lt;/p&gt;
&lt;p&gt;I'm going to need to find editors for this to force me to confront issues like &amp;quot;I'm not actually explaining anything&amp;quot;.
Maybe I can just let the initial versions be kind of bad, and revise them after publishing if anyone pays attention?&lt;/p&gt;
&lt;p&gt;Either way, for now I need to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="Cohost"></category></entry><entry><title>Diary 2023-08-20</title><link href="https://mwchase.neocities.org/diary-2023-08-20" rel="alternate"></link><published>2023-08-20T04:00:00-04:00</published><updated>2023-08-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-08-20:/diary-2023-08-20</id><summary type="html">&lt;p class="first last"&gt;The CSS Weeds are no fun...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I slept way in today.
I was able to make some progress on the chost drafts.
I think with a few more days worth of work, I'll be ready to post them.
Although, maybe I'll want to have syntax examples, so that's going to push the estimates out a bit.&lt;/p&gt;
&lt;p&gt;Mentioning that sent me out into the CSS Weeds.
The short of it is, I'm not sure how to make Pygments play nice with Cohost's CSS restrictions.&lt;/p&gt;
&lt;p&gt;I got as far as &amp;quot;remove usage of CSS variables&amp;quot;, but at this point the style still has all kinds of Problems.
Like, something somewhere in the box model for what I'm trying to do is Too Chunky, but I haven't had the wherewithal to methodically track down what's going on there.&lt;/p&gt;
&lt;p&gt;I'll try to work out what's going on there later, but for now I should get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2023-08-19</title><link href="https://mwchase.neocities.org/diary-2023-08-19" rel="alternate"></link><published>2023-08-19T04:00:00-04:00</published><updated>2023-08-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-08-19:/diary-2023-08-19</id><summary type="html">&lt;p class="first last"&gt;Let's see how much relaxation I can get in this weekend.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The day has been accomplished.
In the end, I wasn't up for doing my own thing much, but whatever.
I wrote a few more stubs for Cohost; at this point, I'm going to try to get all of the stubs filled in over the next week or so.&lt;/p&gt;
&lt;p&gt;I don't have it in me to do anything else today, though.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2023-08-18</title><link href="https://mwchase.neocities.org/diary-2023-08-18" rel="alternate"></link><published>2023-08-18T04:00:00-04:00</published><updated>2023-08-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-08-18:/diary-2023-08-18</id><summary type="html">&lt;p class="first last"&gt;All wound up and nothing to write.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Traveled, not up for much.
I kind of anticipated this, so I'm just going to chill.
We'll see how tomorrow works out for me, but I'm not really sure what to expect.
I assume we should have the end of the day pretty free, but maybe that's totally wrongheaded.&lt;/p&gt;
&lt;p&gt;I really really need to just listen to some music or something, so I'm going to wrap this up now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2023-08-17</title><link href="https://mwchase.neocities.org/diary-2023-08-17" rel="alternate"></link><published>2023-08-17T04:00:00-04:00</published><updated>2023-08-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-08-17:/diary-2023-08-17</id><summary type="html">&lt;p class="first last"&gt;Banking up writing for elsewhere...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I futzed around some with post drafts on Cohost.
I don't have anything to put up there yet, but with a few more days of tweaking (not necessarily &lt;em&gt;these&lt;/em&gt; next few days), I should be at a point where I'm comfortable publishing all of my posts and angling for feedback.&lt;/p&gt;
&lt;p&gt;I still need to decide what to do with the various bits of software that I'm going to want in order to support early discussion...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Cohost"></category><category term="short post"></category></entry><entry><title>Coding 2023-08-16</title><link href="https://mwchase.neocities.org/coding-2023-08-16" rel="alternate"></link><published>2023-08-16T04:00:00-04:00</published><updated>2023-08-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-08-16:/coding-2023-08-16</id><summary type="html">&lt;p class="first last"&gt;It turns out I can't just will a fully-architected software project into existence, and I have to work out Processes or something.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hhhhhhgghblhhhhhhhhhhhhh.&lt;/p&gt;
&lt;p&gt;The laptop overheated or something earlier.
Did Not Like That.&lt;/p&gt;
&lt;p&gt;Anyway, I'm thinking about ramping up on Cohost with NABTO (which I'm &lt;em&gt;probably&lt;/em&gt; going to end up calling &amp;quot;Impliciula&amp;quot;), and there are a few steps I feel like I need to take:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Extract the code highlighting stuff from the blog stylesheet&lt;/li&gt;
&lt;li&gt;Put together a prototype Pygments lexer for what I have currently of NABTO/Impliciula's syntax.&lt;/li&gt;
&lt;li&gt;Get this hosted somewhere.
This isn't &lt;em&gt;totally&lt;/em&gt; straightforward because I don't want to use Git, so I'm &lt;em&gt;personally&lt;/em&gt; thinking either a Mercurial forge or the Pijul nest.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Flashbacks to the time you listed every SCM you could think of &lt;em&gt;except&lt;/em&gt; Git.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Let's be fair, I also didn't list BitKeeper.&lt;/p&gt;
&lt;p&gt;Anyway, I'm a little out of it, possibly because &lt;em&gt;resurrecting my laptop&lt;/em&gt; is kind of stressful.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Isn't your working theory that you just need to wait for it to cool off, which admittedly seems to take &lt;em&gt;a really long time&lt;/em&gt;?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Stop being right; it doesn't help.&lt;/p&gt;
&lt;p&gt;Anyway, the idea is that I'd figure out how to incorporate that stuff into the workflow of something like prechoster, so I can drop code blocks into my chosts.
Hypothetically, I could also drop the raw HTML into the ReST here, but, ehhh.&lt;/p&gt;
&lt;p&gt;I lack the focus to get on this right now, but I guess I need a venv with Pygments installed, and then I can create a custom lexer, and I can invoke that... somehow.
Looks like I want to base it off of &lt;tt class="docutils literal"&gt;python &lt;span class="pre"&gt;-m&lt;/span&gt; pygments &lt;span class="pre"&gt;-x&lt;/span&gt; &lt;span class="pre"&gt;-l&lt;/span&gt; your_lexer.py:SomeLexer &amp;lt;inputfile&amp;gt;&lt;/tt&gt;.
I bet I could write a script to handle all the dispatch stuff...
Anyway, time to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="NABTO"></category><category term="Impliciula"></category></entry><entry><title>Weekly Roundup 2023-08-15</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-08-15" rel="alternate"></link><published>2023-08-15T04:00:00-04:00</published><updated>2023-08-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-08-15:/weekly-roundup-2023-08-15</id><summary type="html">&lt;p class="first last"&gt;It's kind of a pain to work on this without any feedback, but I don't know the best place to look for feedback.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I tried to figure out how I want the effect system in NABTO to work. I don't think I came to a solid conclusion.&lt;/li&gt;
&lt;li&gt;Thursday: I fiddled some more with the syntax I want for NABTO.&lt;/li&gt;
&lt;li&gt;Friday: I went into some proper detail about the weird syntax experiments I want to try out.&lt;/li&gt;
&lt;li&gt;Saturday: I didn't have anything to post about.&lt;/li&gt;
&lt;li&gt;Sunday: I went into more detail on the syntax ideas, and pushed them further into the language.&lt;/li&gt;
&lt;li&gt;Monday: I figured out another puzzle I was having with the syntax.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I guess I'll keep on with this.
I'm considering moving my posting habits around a bit to make it easier to get feedback on some things; I'll update the footer if I decide to go through with that.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="NABTO"></category></entry><entry><title>Coding 2023-08-14</title><link href="https://mwchase.neocities.org/coding-2023-08-14" rel="alternate"></link><published>2023-08-14T04:00:00-04:00</published><updated>2023-08-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-08-14:/coding-2023-08-14</id><summary type="html">&lt;p class="first last"&gt;Recognizing when I couldn't figure something out because I was trying to solve the wrong problem.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've punted on whether to have &lt;tt class="docutils literal"&gt;rec&lt;/tt&gt; (or &amp;quot;&lt;tt class="docutils literal"&gt;recursive&lt;/tt&gt;&amp;quot;), because I wanted to focus on how to keyword modules and modules types.
I need some kind of keyword for various things to have them inline.
That also includes functions, so maybe I can come up with some insight there?&lt;/p&gt;
&lt;p&gt;Well, I got an idea for inline functions, but I don't feel any closer to having a handle on &amp;quot;&lt;tt class="docutils literal"&gt;struct&lt;/tt&gt;&amp;quot; or &amp;quot;&lt;tt class="docutils literal"&gt;sig&lt;/tt&gt;&amp;quot;.
It's like... these don't correspond to a basic grammatical form, more like a poetic or rhetorical structure?&lt;/p&gt;
&lt;p&gt;Maybe the right way to look at them is as some kind of block structure, in which case the inline form would just be &lt;tt class="docutils literal"&gt;structure &lt;span class="pre"&gt;{...}&lt;/span&gt;&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;signature &lt;span class="pre"&gt;{...}&lt;/span&gt;&lt;/tt&gt;.
Which, given what I've gone through thinking about this, seems reasonable.&lt;/p&gt;
&lt;p&gt;Well, time to get to bed, and maybe think about &lt;tt class="docutils literal"&gt;rec&lt;/tt&gt;, I dunno.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="NABTO"></category><category term="short post"></category></entry><entry><title>Coding 2023-08-13</title><link href="https://mwchase.neocities.org/coding-2023-08-13" rel="alternate"></link><published>2023-08-13T04:00:00-04:00</published><updated>2023-08-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-08-13:/coding-2023-08-13</id><summary type="html">&lt;p class="first last"&gt;Something something, keywords are like violence.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm messing a bit more with the Smalltalk-inspired stuff, and I don't think it's going to deliver on its goals of readability, unless I can come up with a better type definition syntax than &lt;tt class="docutils literal"&gt;let type &lt;span class="pre"&gt;list-of:&lt;/span&gt; 'a be nil or cons: 'a onto: &lt;span class="pre"&gt;list-of:&lt;/span&gt; 'a&lt;/tt&gt;.
Either I need to figure out a reasonable way to make that read more like prose, or I need to come up with a more modest goal.
Or just scrap the whole thing.&lt;/p&gt;
&lt;p&gt;To be honest, I do like the aspect of putting in the parameter's purpose next to its usage.
So, maybe I want to focus my efforts on make the usage conform to some standard, and don't worry so much about the definition...&lt;/p&gt;
&lt;p&gt;Oh man, I just tried annotating types on a function definition, and I think I actually really like what I came up with.&lt;/p&gt;
&lt;p&gt;In that case, now I want to focus on match/switch/case statements.
Right now, it's generically ML-ish, which doesn't &lt;em&gt;particularly&lt;/em&gt; mesh with the pseudo-English going on around it.
Let's look at the parts involved:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;A value, which should be named like a noun.&lt;/li&gt;
&lt;li&gt;A list of pairs.&lt;/li&gt;
&lt;li&gt;The first part of each pair is a destructuring operation, which should be a type constructor, and I've just realized that &lt;tt class="docutils literal"&gt;cons: _ onto: _&lt;/tt&gt; doesn't look like a noun phrase.
Heck.&lt;/li&gt;
&lt;li&gt;Anyway, the second part can look like any part of speech I come up with, as long as it's consistent for a given statement.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thinking about it that way implies that, instead of &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt;&lt;/tt&gt;, I should be using the second keywords from the various forms of definition.
That's no use without something for the beginning to coordinate with it, though.&lt;/p&gt;
&lt;p&gt;Hm.
If you squint at it hard enough, like maybe really &lt;em&gt;really&lt;/em&gt; hard, a match construct kind of looks like an anonymous function that gets pipelined into.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, I've got an idea.
It's weird, but at this point, it's commit, or be committed.
The new syntax I'm trying out is &lt;tt class="docutils literal"&gt;when _ is _ (be|do|then) _&lt;/tt&gt;, and...&lt;/p&gt;
&lt;p&gt;I like it.&lt;/p&gt;
&lt;p&gt;I am going to have &lt;em&gt;so&lt;/em&gt; much trouble convincing people this isn't an esolang.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to wrap up for tonight, and ponder something else for a bit: should I have an equivalent to &lt;tt class="docutils literal"&gt;rec&lt;/tt&gt; from OCaml, or just not, like in Koka?&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="NABTO"></category></entry><entry><title>Diary 2023-08-12</title><link href="https://mwchase.neocities.org/diary-2023-08-12" rel="alternate"></link><published>2023-08-12T04:00:00-04:00</published><updated>2023-08-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-08-12:/diary-2023-08-12</id><summary type="html">&lt;p class="first last"&gt;I was just so done with stuff today, so, eh.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I seem to have been out of it all day, so I guess I don't have anything to write about.
I've got some stuff set aside to look at later.
But for now, I should properly wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2023-08-11</title><link href="https://mwchase.neocities.org/coding-2023-08-11" rel="alternate"></link><published>2023-08-11T04:00:00-04:00</published><updated>2023-08-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-08-11:/coding-2023-08-11</id><summary type="html">&lt;p class="first last"&gt;I may have lost it, or maybe every language is going to look like this in 20 years, or maybe some secret third thing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Yesterday I mentioned having some weird ideas to try out for NABTO's syntax.
I've been thinking about them some more, and I figured I could try describing them.&lt;/p&gt;
&lt;p&gt;Here's the basic idea: the same underlying semantics can be represented with different syntaxes.
See, for example, &lt;a class="reference external" href="https://hylang.org/"&gt;Hy&lt;/a&gt;, which allows writing Lisp code that ultimately runs on the Python VM.
So, I can experiment with how different surface syntaxes work to express the concepts in NABTO without worrying that it will compromise the underlying semantics in some way.
The basic rule I think I need to follow is that a language concept has to either map to an idea that I want to take from another language, or it needs to be possible to implement it as a &lt;em&gt;local&lt;/em&gt; syntax transformation.&lt;/p&gt;
&lt;p&gt;With all that said, researching for NABTO has exposed me to a bunch of different ways to express concepts, and, like, they're fine, but...
So, what set this off is how unfamiliar the type construction syntax in OCaml is, but then I found myself considering the corresponding syntax in other languages, and the way that many widely-used languages represent function application...
Maybe it's just because some of my coworkers don't seem to have a problem writing horrifyingly long parameter lists, but I think the usefulness of making &lt;em&gt;functions in programming&lt;/em&gt; visually resemble &lt;em&gt;functions in mathematics&lt;/em&gt; breaks down when simply &lt;em&gt;enumerating the parameters&lt;/em&gt; (not even explaining what they're for) looks like it would take a full paragraph of prose.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;It sounds like you're advocating for making certain types of code harder to write because of a personal preference.
You're going to ruffle some feathers with that stance.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Well, I don't know how effectively I'm &amp;quot;advocating&amp;quot; for anything, but I'm not saying nobody should ever write a fifteen-parameter function.
I just think that they should work to justify the contribution of each parameter to the cohesive concept that the function represents.
&lt;tt class="docutils literal"&gt;f(x, y, z)&lt;/tt&gt; is good enough as it goes, but I've found myself longing for something a little more verbose.
More talk.
Perhaps a... small bit more talk?&lt;/p&gt;
&lt;p&gt;I don't see many people using Smalltalk, and I'm not sure if Objective-C got traction for any reason besides &amp;quot;On Mac, you kind of had to use it&amp;quot;, so the idea I'm dancing around, of expressing a function as a phrase, with the parameters slotted into predetermined gaps in the function's name, may alienate some people.
To them, I say, &amp;quot;Don't worry! NABTO isn't object-oriented in the Smalltalk sense, so this is probably going to also alienate the people who were nodding along before.&amp;quot;&lt;/p&gt;
&lt;p&gt;Let's get some examples.
Suppose you have a list called &lt;tt class="docutils literal"&gt;lst&lt;/tt&gt;.
In Python, you'd get the length of it by calling &lt;tt class="docutils literal"&gt;len(lst)&lt;/tt&gt;, or maybe &lt;tt class="docutils literal"&gt;lst.__len__()&lt;/tt&gt; for... some reason.
In OCaml, &lt;tt class="docutils literal"&gt;length lst&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;lst |&amp;gt; length&lt;/tt&gt;.
In Koka, &lt;tt class="docutils literal"&gt;length(lst)&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;lst.length&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;I am pondering something like &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;length-of:&lt;/span&gt; lst&lt;/tt&gt;.
In this, a typical function would be named as a noun phrase with one or more gaps within it.
I'm currently leaning towards omitting articles for the sake of brevity.
If I put them in, they'd end up functioning as a means of distinguishing values (have articles) from types (don't have articles).
But for the moment I'd rather see how well things go with a mild headlinese influence.
(&amp;quot;For moment, rather see how things go with mild headlinese influence&amp;quot;?)
Once I have the mental image of code mimicking prose more closely, I imagine stuff like replacing the &lt;tt class="docutils literal"&gt;=&lt;/tt&gt; in &lt;tt class="docutils literal"&gt;let ... =&lt;/tt&gt; with &lt;tt class="docutils literal"&gt;be&lt;/tt&gt;, and changing out Koka's &lt;tt class="docutils literal"&gt;:=&lt;/tt&gt; operator for &lt;tt class="docutils literal"&gt;set ... to&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Not all functions &amp;quot;return nouns&amp;quot;, though.
A function returning &lt;tt class="docutils literal"&gt;()&lt;/tt&gt; must be some kind of verb, and a predicate is very much like an adjective.
Therefore, suppose that we allow &lt;tt class="docutils literal"&gt;to ... do&lt;/tt&gt; as an alternative to &lt;tt class="docutils literal"&gt;let ... be&lt;/tt&gt;, and allow a sort of &amp;quot;one-argument pipelining&amp;quot; with an &lt;tt class="docutils literal"&gt;is&lt;/tt&gt; operator.
So, like &lt;tt class="docutils literal"&gt;if 4 is even:: then ...&lt;/tt&gt;, and &lt;tt class="docutils literal"&gt;even::&lt;/tt&gt; could be defined like &lt;tt class="docutils literal"&gt;when n is even:: then ...&lt;/tt&gt;.
Or &lt;tt class="docutils literal"&gt;iff n is even:: then ...&lt;/tt&gt;.
I'm not seeing good sugar for something like &lt;tt class="docutils literal"&gt;element: e &lt;span class="pre"&gt;is-in:&lt;/span&gt; l&lt;/tt&gt;, so maybe that needs to settle for &lt;tt class="docutils literal"&gt;let element: e &lt;span class="pre"&gt;is-in:&lt;/span&gt; l be ...&lt;/tt&gt;, unless it's permissible to use the non-is syntax in &lt;tt class="docutils literal"&gt;iff ... then&lt;/tt&gt; as well.&lt;/p&gt;
&lt;p&gt;One obstacle to this idea is that I'm not always sure what noun to use for various higher-order function concepts.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Also, how do you intend to handle pipelining in general, if your syntax is so inflexible?
Or default arguments, for that matter?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;For pipelining, I have an idea that amuses me: &lt;tt class="docutils literal"&gt;let &lt;span class="pre"&gt;somewhat-large&lt;/span&gt; be &lt;span class="pre"&gt;fibonacci-number:&lt;/span&gt; 1700; &lt;span class="pre"&gt;factorial-of:&lt;/span&gt; that&lt;/tt&gt;.
That is, using &lt;tt class="docutils literal"&gt;that&lt;/tt&gt; in all code like &lt;tt class="docutils literal"&gt;_&lt;/tt&gt; in the Python REPL.
And speaking of &lt;tt class="docutils literal"&gt;_&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;increment: number by: _&lt;/tt&gt;, literally letting the function definition fill in the blank.&lt;/p&gt;
&lt;p&gt;There is &lt;em&gt;a lot&lt;/em&gt; of syntax to try and fit into this paradigm, but I want to see how far I can push this.&lt;/p&gt;
&lt;p&gt;For now, I'm going to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="NABTO"></category></entry><entry><title>Coding 2023-08-10</title><link href="https://mwchase.neocities.org/coding-2023-08-10" rel="alternate"></link><published>2023-08-10T04:00:00-04:00</published><updated>2023-08-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-08-10:/coding-2023-08-10</id><summary type="html">&lt;p class="first last"&gt;Negaverse Raku is my favorite anime character.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm still tweaking the code samples and pondering how I want effect handling to work.
I ended up with this weird imbalance where most of the code looks like OCaml, but the effect handling looks &lt;em&gt;kind of&lt;/em&gt; like Koka, and my initial goals for the language and my thoughts on the effect handling would be better served by having it the other way around.&lt;/p&gt;
&lt;p&gt;Part of the problem is that I was basing things off of the Koka code samples, which have &lt;em&gt;heavy&lt;/em&gt; doses of syntactic sugar.
My intuition is that I'll make something much more coherent if I focus on the subset of Koka that does stuff like use brackets instead of indentation.&lt;/p&gt;
&lt;p&gt;There's also the somewhat &amp;quot;fun&amp;quot; aspect that I'm trying out syntax that neither language uses, which ends up necessitating entirely new forms of syntactic sugar to handle capabilities from the source languages that don't translate cleanly.&lt;/p&gt;
&lt;p&gt;(With the ideas I'm trying to pull in, I kind of imagine NABTO coming together into some kind of negaverse Raku.)&lt;/p&gt;
&lt;p&gt;I'm not going to do any more tonight, but I think the right way forward is to chart out the relationships between the different syntactic elements of the languages, and figure out what purposes they're serving.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="NABTO"></category></entry><entry><title>Coding 2023-08-09</title><link href="https://mwchase.neocities.org/coding-2023-08-09" rel="alternate"></link><published>2023-08-09T04:00:00-04:00</published><updated>2023-08-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-08-09:/coding-2023-08-09</id><summary type="html">&lt;p class="first last"&gt;I'm not sure if there's a good way to get syntax highlighting for a language that doesn't even have a lexer, so I'm not going to show off code samples yet.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I wrote some sample programs in a possible syntax for NABTO.
There are various things that are likely to need to change:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I haven't considered how to integrate types into the syntax.&lt;/li&gt;
&lt;li&gt;The effect handling syntax is &lt;em&gt;mostly&lt;/em&gt; taken from Koka, and it's not gelling well with the OCaml influences.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I think what I need is something like...
There are a bunch of type constructors that package record/variant/whatever types together with information related to resumption, and defining an effect consists of &lt;em&gt;somehow&lt;/em&gt; associating a record type and a constructor together, and handling an effect consists of having a modified match statement that unpacks the resumption information.
(Maybe there's some kind of automatic casting between different effect constructors?)
Anyway, to perform an effect, the code needs to construct the data type associated with the effect, and then the runtime somehow determines which kind of effect wrapper to use...
Although, that information would be ambiently available at runtime...
Doing that would foreclose a number of desirable optimizations...&lt;/p&gt;
&lt;p&gt;If I want to get the optimizations, then I need to be able to make a statement something like &amp;quot;from a type level, this type is guaranteed not to capture beyond this level of detail&amp;quot;.&lt;/p&gt;
&lt;p&gt;Wait...
Maybe there could be an overloaded function, and then defining an effect can be done by setting up a modular implicit that associates the data type to the specific effect construction machinery.
I'm not sure what the right way to approach this from an ergonomic perspective would be, but I think this can work.
It conceals some weird footguns, but I think people would need to &lt;em&gt;try&lt;/em&gt; to find them, so it's probably fine.&lt;/p&gt;
&lt;p&gt;This has been a productive night, and I should wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="NABTO"></category></entry><entry><title>Weekly Roundup 2023-08-08</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-08-08" rel="alternate"></link><published>2023-08-08T04:00:00-04:00</published><updated>2023-08-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-08-08:/weekly-roundup-2023-08-08</id><summary type="html">&lt;p class="first last"&gt;Still holding out for an exemption...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: Scheduling...&lt;/li&gt;
&lt;li&gt;Thursday: I made some breakthroughs with NABTO.&lt;/li&gt;
&lt;li&gt;Friday: I assume there was nothing in here because of the Scheduling again.&lt;/li&gt;
&lt;li&gt;Saturday: The problem here wasn't the Scheduling, but just that I didn't manage my own time well.&lt;/li&gt;
&lt;li&gt;Sunday: I got a bit more fleshed out about NABTO.&lt;/li&gt;
&lt;li&gt;Monday: I went into more detail on NABTO, but didn't commit to much.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to get more interesting stuff done with drafting NABTO.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="NABTO"></category></entry><entry><title>Coding 2023-08-07</title><link href="https://mwchase.neocities.org/coding-2023-08-07" rel="alternate"></link><published>2023-08-07T04:00:00-04:00</published><updated>2023-08-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-08-07:/coding-2023-08-07</id><summary type="html">&lt;p class="first last"&gt;Some people are going to be confused by the detail I'm going into, and some people are going to be Very Unhappy because I made the Wrong Decisions.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;One thing that I'm not sure about when it comes to a standard library for NABTO is, what kinds of data types are useful to have?
My intention is that NABTO should be usable for writing scripts to execute from the shell, simple low-traffic internet-connected operations like a small IRC bot, stuff like that.
And I'd &lt;em&gt;like&lt;/em&gt; it to scale up to bigger stuff, but I think it makes sense to nail down the behavior, and then investigate what it takes to scale it.&lt;/p&gt;
&lt;p&gt;Anyway, there's algebraic stuff I definitely want, like booleans, optionals, lists, results, eithers (OCaml draws a distinction), maps, sets, arrays, tuples.
And there definitely need to be facilities for manipulating bytes, and some kind of good interface to files full of bytes.&lt;/p&gt;
&lt;p&gt;But I also want to have the ability to deal with text and numbers, and these abilities raise a number of questions that people feel very strongly about:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Should there be multiple numerical types, or just one?
(When there's just one, it seems to me like it's usually a 64-bit floating point type.)&lt;/li&gt;
&lt;li&gt;If there are distinct types for whole numbers and floats, should the whole numbers have a specified size, or be unbounded?&lt;/li&gt;
&lt;li&gt;If there's a bounded type for whole numbers, should there be multiple sizes?
Should there be signed and unsigned variants?&lt;/li&gt;
&lt;li&gt;If there are different floating and whole number types, what should be required to convert between them?
What about converting between different flavors within those categories?&lt;/li&gt;
&lt;li&gt;I probably want to represent rational numbers somehow.
What representation should I use, and should it be in the core library or not?&lt;/li&gt;
&lt;li&gt;Assume for the moment that text is represented as utf-8 by default.
(There are some libraries that I should look into, that I think would translate interestingly into a module system.)
Should strings be indexed to retrieve bytes, code points, graphemes, or should they simply not be indexed at all?
Keep in mind that none of these categories will &lt;em&gt;always&lt;/em&gt; correspond to &amp;quot;the width of a grapheme in a fixed-width font&amp;quot; in a nice way.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My thoughts on this so far:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;It would be good to have facilities for using NABTO as a calculator (floating point or rational (and algebraic, if I can understand the work that's been done on algebraic representations)), and for reasoning about discrete chunks of memory and data (integers, &lt;em&gt;possibly&lt;/em&gt; both signed and unsigned)&lt;/li&gt;
&lt;li&gt;I actually do have some opinions about integer operations: I think I like how Python handles integer division; that is, always rounding down, sign of non-zero remainder matches the sign of the divisor.
That is, the semantics.
I'm not overly attached to the &lt;tt class="docutils literal"&gt;//&lt;/tt&gt; syntax.&lt;/li&gt;
&lt;li&gt;It would be good to have some way to get text into or out of a file, but that's not &lt;em&gt;always&lt;/em&gt; what's going to be happening, and different types will probably be involved.&lt;/li&gt;
&lt;li&gt;Maybe I want to try to replicate Python 3's thing where instead of comparing some instances directly, it takes a &amp;quot;key&amp;quot; function to convert to a type that is simpler to compare.
(At least sometimes. Can't do that all the time without ending up in an infinite regress.)&lt;/li&gt;
&lt;li&gt;Oh geez I forgot that the behavior of changing the case of text is locale-sensitive.&lt;/li&gt;
&lt;li&gt;I don't know if it would help with that, but I guess I should look into how Swift does things.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, it's late and I want to wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="NABTO"></category></entry><entry><title>Coding 2023-08-06</title><link href="https://mwchase.neocities.org/coding-2023-08-06" rel="alternate"></link><published>2023-08-06T04:00:00-04:00</published><updated>2023-08-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-08-06:/coding-2023-08-06</id><summary type="html">&lt;p class="first last"&gt;I've been focused on other stuff, I guess.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Here's what I've decided makes sense as a way to develop NABTO:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Figure out what the standard library functions should look like.
I'm currently thinking somewhere between OCaml and Koka, but focusing on OCaml, making functions uncurried and row-polymorphic in effects, and furthermore using multimethods where sensible.&lt;/li&gt;
&lt;li&gt;Figure out what I want to do for stuff like arithmetic and format strings.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That's all I've got for now.
It's best if I get to bed now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="NABTO"></category><category term="short post"></category></entry><entry><title>Coding 2023-08-05</title><link href="https://mwchase.neocities.org/coding-2023-08-05" rel="alternate"></link><published>2023-08-05T04:00:00-04:00</published><updated>2023-08-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-08-05:/coding-2023-08-05</id><summary type="html">&lt;p class="first last"&gt;Good to skip this one.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I'm still not in great shape to write anything, but I really want to figure out how to pitch the concepts behind NABTO.&lt;/p&gt;
&lt;p&gt;Unfortunately, I got distracted doing research, and maybe the answer is &amp;quot;I need to do a bunch more research before I can talk about this stuff persuasively.&amp;quot;&lt;/p&gt;
&lt;p&gt;Anyway, it's late and I'm tired.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="NABTO"></category><category term="short post"></category></entry><entry><title>Coding 2023-08-04</title><link href="https://mwchase.neocities.org/coding-2023-08-04" rel="alternate"></link><published>2023-08-04T04:00:00-04:00</published><updated>2023-08-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-08-04:/coding-2023-08-04</id><summary type="html">&lt;p class="first last"&gt;Please feel free to skip&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Tired and distracted.
My plan is to finish this post quickly, and take down physical notes on NABTO.
But mainly, I need to get some rest.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="NABTO"></category><category term="short post"></category></entry><entry><title>Coding 2023-08-03</title><link href="https://mwchase.neocities.org/coding-2023-08-03" rel="alternate"></link><published>2023-08-03T04:00:00-04:00</published><updated>2023-08-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-08-03:/coding-2023-08-03</id><summary type="html">&lt;p class="first last"&gt;With this, the real hard work can begin... Once I feel like it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Another rough day, but I stumbled across what was a missing piece of the puzzle in NABTO's &amp;quot;design&amp;quot;.
Here are the three things I want to try to build it up around:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;An effect system that works with the type system (like in &lt;a class="reference external" href="https://koka-lang.github.io/koka/doc/index.html"&gt;Koka&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Modular implicits (like in &lt;a class="reference external" href="https://arxiv.org/abs/1512.01895"&gt;this paper&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Gradual typing with some kind of sensible runtime semantics for the &lt;tt class="docutils literal"&gt;dynamic&lt;/tt&gt; type&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That last goal very obviously complicates the design and implementation of the other two.
My feeling on this is that a language with explicit effects and modular implicits in an ML-style module and type system would be extremely interesting, but I &lt;em&gt;want&lt;/em&gt; to see if it's possible to have gradual typing too.&lt;/p&gt;
&lt;p&gt;(One other thing I've been rolling around in my head is the concept of marking an effect as &amp;quot;must be performed&amp;quot;.)&lt;/p&gt;
&lt;p&gt;There are... a lot of things that would need to be investigated and reconciled to see if all of this even makes sense, but now I feel like I have a specific goal to work towards.
Stuff of note:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Koka &lt;tt class="docutils literal"&gt;var&lt;/tt&gt;s, unlike OCaml &lt;tt class="docutils literal"&gt;ref&lt;/tt&gt;s, interact with the effect system.&lt;/li&gt;
&lt;li&gt;I want effects, though not necessarily all effects, to be arbitrarily resumable, which means that the runtime needs to be written really carefully, especially in conjunction with gradual typing.&lt;/li&gt;
&lt;li&gt;Modular implicits offer an alternative way to lay out some fundamental standard library modules, so that needs to be looked into.&lt;/li&gt;
&lt;li&gt;OCaml also has a bunch of language extensions that seem useful for NABTO, but I don't fully grasp the tradeoffs and limitations involved.&lt;/li&gt;
&lt;li&gt;I don't know what I want function calls to look like.&lt;/li&gt;
&lt;li&gt;I want to see how stuff like Trio's design would work with Koka-style effects.&lt;/li&gt;
&lt;li&gt;And generally the kinds of utility libraries that languages have.&lt;/li&gt;
&lt;li&gt;Also I need to know more about Perceus.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thinking about all of this, it kind of seems like my best bet for actually accomplishing anything here is to figure out how to articulate the vision I'm going for in a way that would convince people who, um, actually understand this stuff to put work in.&lt;/p&gt;
&lt;p&gt;I'm going to get ready for bed now.
Until I get some inspiration for how to write about this stuff persuasively, I can mess with parsing, or maybe some cursed Lua I put together recently.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="NABTO"></category><category term="speculation"></category><category term="short post"></category></entry><entry><title>Diary 2023-08-02</title><link href="https://mwchase.neocities.org/diary-2023-08-02" rel="alternate"></link><published>2023-08-02T04:00:00-04:00</published><updated>2023-08-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-08-02:/diary-2023-08-02</id><summary type="html">&lt;p class="first last"&gt;Not happy with The Situation.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I am too tired and out-of-it to have anything to write for today.
I'm sort of thinking of taking a break from the OCaml stuff, because there is, in fact, more schedule fuckery.&lt;/p&gt;
&lt;p&gt;I'm messing around with other things right now, and there's nothing to write about those currently, so I'm cutting this off here.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2023-08-01</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-08-01" rel="alternate"></link><published>2023-08-01T04:00:00-04:00</published><updated>2023-08-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-08-01:/weekly-roundup-2023-08-01</id><summary type="html">&lt;p class="first last"&gt;I &lt;em&gt;think&lt;/em&gt; this is coming back from a diversion, and not diverting so hard that it wraps around, but who's to say?&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I put together some ideas for internal data structures for an Earley parser.&lt;/li&gt;
&lt;li&gt;Thursday: I decided to take a break from Earley parsers to mess around with Math Stuff that seems like it &amp;quot;should&amp;quot; work better in OCaml than in Haskell or Rust.&lt;/li&gt;
&lt;li&gt;Friday: I redid the Math Stuff a little, and confirmed a few of OCaml's capabilities.&lt;/li&gt;
&lt;li&gt;Saturday: I set out a bunch of work for myself on the Math Stuff.&lt;/li&gt;
&lt;li&gt;Sunday: I decided to take a break from the Math Stuff to mess around with the Earley parser code.&lt;/li&gt;
&lt;li&gt;Monday: I tried to refresh my memory about which types need to exist for the Earley parser internals.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to either power through these weird internals, or get distracted with something else.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="OCaml"></category><category term="various projects"></category></entry><entry><title>Coding 2023-07-31</title><link href="https://mwchase.neocities.org/coding-2023-07-31" rel="alternate"></link><published>2023-07-31T04:00:00-04:00</published><updated>2023-07-31T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-07-31:/coding-2023-07-31</id><summary type="html">&lt;p class="first last"&gt;Getting enough work done.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did other stuff today, but I did just now jump back into the Crafting Interpreters stuff.
I'd mentioned that I wanted to implement the &amp;quot;dot&amp;quot; from Earley parsers as a zipper list.
(Regular reminder that I'm messing with Earley parsers because I'm specifically avoiding what Crafting Interpreters actually says to do.)&lt;/p&gt;
&lt;p&gt;Remembering what comes next:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I need to put together the composite type for representing an item using this stuff, including writing a comparison function.&lt;/li&gt;
&lt;li&gt;I need to put together the composite types for representing the work queue items, and write comparison functions for them.&lt;/li&gt;
&lt;li&gt;I need to sketch out what translations of previous iterations of the scan/parse/complete code will look like.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For now, I need to wind down and get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category><category term="Crafting Interpreters"></category><category term="short post"></category></entry><entry><title>Coding 2023-07-30</title><link href="https://mwchase.neocities.org/coding-2023-07-30" rel="alternate"></link><published>2023-07-30T04:00:00-04:00</published><updated>2023-07-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-07-30:/coding-2023-07-30</id><summary type="html">&lt;p class="first last"&gt;Finally hitting my limit with this side project.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I'm at the point where I need to take a break from this whole weird side project, and also to read some actual literature on constructivism.
For now, the stuff I'm trying to put together is sprawling into something that doesn't make sense.
Maybe by reading up on this stuff, I can come up with some helpful primitives.&lt;/p&gt;
&lt;p&gt;This post, surprisingly, already took too long to write, so I'm going to just call it.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category><category term="I'm not even sure"></category><category term="short post"></category></entry><entry><title>Coding 2023-07-29</title><link href="https://mwchase.neocities.org/coding-2023-07-29" rel="alternate"></link><published>2023-07-29T04:00:00-04:00</published><updated>2023-07-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-07-29:/coding-2023-07-29</id><summary type="html">&lt;p class="first last"&gt;It's so bloated...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm tired, but here's what I've worked out from reading Wikipedia and messing around:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;There are five-ish basic structures I want to mess with to start with.&lt;/li&gt;
&lt;li&gt;Each of these structures needs a few of its own versions of things:&lt;ul&gt;
&lt;li&gt;A &amp;quot;witness&amp;quot; module type that constructs a contradiction-checking function from components of the structure.&lt;/li&gt;
&lt;li&gt;A &amp;quot;witness of&amp;quot; functor that combines an instance of the structure type and the witness type.&lt;/li&gt;
&lt;li&gt;Functors that construct structure instances out of other structure instances; these functors should themselves provide functors that map from attestations of the components to new attestations for the composite.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The attestation concept has a lot going on, and I'm trying to figure out whether it needs specialized components as well, or if it can be general like some of the support code.
An attestation, in my informal thoughts on this, has:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;A structure (module, necessary for typing)&lt;/li&gt;
&lt;li&gt;A property (module, necessary for typing)&lt;/li&gt;
&lt;li&gt;A witness function (probably in a module; derived from structure and property, but I think not in a generalizable fashion)&lt;/li&gt;
&lt;li&gt;The witness module provides an unreduced specimen type; there must also be a partially reduced specimen type&lt;/li&gt;
&lt;li&gt;Fully reduced specimen type&lt;/li&gt;
&lt;li&gt;Mapping from unreduced specimen type to list of partially reduced specimen type&lt;/li&gt;
&lt;li&gt;Function to test reduced specimen types for a contradiction&lt;/li&gt;
&lt;li&gt;Mapping from partially reduced specimen type to fully reduced specimen types&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Probably more, there's so much in there...
And some stuff that maybe can be moved out of the module interface.
I think a bunch of this needs to be structure-specific, so I'll have to figure out how much of it can be factored out.&lt;/p&gt;
&lt;p&gt;Okay, that's... a lot.
I'm going to wind down and try to take it easy for a while.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category><category term="I'm not even sure"></category><category term="short post"></category></entry><entry><title>Coding 2023-07-28</title><link href="https://mwchase.neocities.org/coding-2023-07-28" rel="alternate"></link><published>2023-07-28T04:00:00-04:00</published><updated>2023-07-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-07-28:/coding-2023-07-28</id><summary type="html">&lt;p class="first last"&gt;I'll be shocked if this project results in something with even &amp;quot;okay&amp;quot; ergonomics.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I let things go late tonight, so I'm going to try to just jot down some thoughts.&lt;/p&gt;
&lt;p&gt;After the entry last night, I redid things a bit.
Now, there's a single module per property (ish), and a given property and (currently) magma can be combined in a functor to produce a module that determines whether a collection of values in the magma represent a contradiction of the property.
There are at least two directions that I need (want?) to take this.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;What does it look like when I make the structure more complicated?
The obvious place to start here is to single out a value of the magma's type, and to devise a property check that the designated value is an identity element.&lt;/li&gt;
&lt;li&gt;Constructing these predicates is not the end goal.
My gut tells me I want the ability to take the attestations for the property of some modules, combine those modules into a compound module, and also combine those attestations into a compound attestation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I've been trying to mentally line up the different parts that could be involved there.
Here's one idea that just popped into my head, and I'll lay it out, pop into the playground, and say whether it seems reasonable:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Assume that, when there's a compound or derived property at play, the user knows about it, so it's fine to do some one-off stuff.&lt;/li&gt;
&lt;li&gt;A compound module functor knows how the component modules get put together, so it also knows how to put together corresponding attestations.
(It also has the knowledge to do more elaborate stuff, like combining structures that carry out different operations on the same underlying set.)&lt;/li&gt;
&lt;li&gt;So, if I'm using modules to represent both algebraic structures and assertions about them, does that mean that my &amp;quot;combine structures&amp;quot; functor can define a &amp;quot;combine assertions&amp;quot; functor?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Oh, yes.&lt;/p&gt;
&lt;div class="admonition smiley smiley-glitchy"&gt;
&lt;p class="first admonition-title"&gt;:) (glitchy)&lt;/p&gt;
&lt;p class="last"&gt;Ha ha ha... &lt;em&gt;Yes&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;*Ahem*&lt;/p&gt;
&lt;p&gt;I'm still getting a handle on what OCaml will and won't let me do.
When I was first messing around with this space, I was trying to accomplish things in a way that very much did not fit with what OCaml lets you do, and it kind of seems like there isn't a way to make it do that, because the syntax that expressed my ideas already meant something different.
So it's really gratifying to see a way forward to accomplishing this stuff.&lt;/p&gt;
&lt;p&gt;I can try to do this stuff over the next few days, and see what falls out.
For now, I'm going to wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category><category term="I'm not even sure"></category><category term="short post"></category></entry><entry><title>Coding 2023-07-27</title><link href="https://mwchase.neocities.org/coding-2023-07-27" rel="alternate"></link><published>2023-07-27T04:00:00-04:00</published><updated>2023-07-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-07-27:/coding-2023-07-27</id><summary type="html">&lt;p class="first last"&gt;Today's large upload brought to you by a protest.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay.
So.
I &lt;em&gt;could&lt;/em&gt; keep on with the Crafting Interpreters stuff I was sketching out yesterday.
I &lt;em&gt;could&lt;/em&gt; do a lot of things.
Like take another tack for encoding Math Stuff.&lt;/p&gt;
&lt;p&gt;So I was reading an article on constructive mathematics, and one point it made was that the kinds of limitations that constructivists place on mathematical reasoning can be related to the kinds of limitations that software has to be written under in order to... do anything.
One example I'll develop is, it's not obvious to me how you'd establish that a particular property holds for every member of a set.
So let's flip it around.
Let's reason about what we can do with a contradiction of a property.&lt;/p&gt;
&lt;p&gt;Well, if the set is, handwavily speaking, &amp;quot;simple&amp;quot;, then, not too much, really.
But if the set is built up from smaller sets in some manner, then it should be possible to &lt;em&gt;reduce&lt;/em&gt; the contradiction into one that applies to the smaller set.
If not, then there's something wrong with the reduction or the composition, and we can report that still.&lt;/p&gt;
&lt;p&gt;Let's see if I can put this together in a way that makes sense to anyone, and hopefully to me.
Let's have an informal class of types called &lt;strong&gt;elements&lt;/strong&gt;.
These elements are used to &lt;strong&gt;witness&lt;/strong&gt; contradictions to a property.
Something like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="k"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Total&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="k"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="k"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;commutative&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Commutative&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="k"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;

&lt;span class="c"&gt;(* I tried defining a &amp;quot;binary operation&amp;quot; sig, but I just confused myself. *)&lt;/span&gt;
&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="nc"&gt;Magma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;sig&lt;/span&gt;
  &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;

  &lt;span class="k"&gt;val&lt;/span&gt; &lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="nc"&gt;Witness&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;sig&lt;/span&gt;
  &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;

  &lt;span class="k"&gt;val&lt;/span&gt; &lt;span class="n"&gt;is_contradiction&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nc"&gt;TotalWitness&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;M&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Magma&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt;
  &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;M&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;

  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;is_contradiction&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Total&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;
      &lt;span class="nn"&gt;M&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;op&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ignore&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
      &lt;span class="bp"&gt;false&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="o"&gt;_&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;true&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nc"&gt;CommutativeWitness&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;M&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Magma&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt;
  &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;M&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="n"&gt;commutative&lt;/span&gt;

  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;is_contradiction&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Commutative&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;M&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;op&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class="nn"&gt;M&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;op&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I doubt that I got all of this exactly right.
Like, the specific operation should probably be encoded in the witness type or module...
Let's see if defining composition enlightens things any.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nc"&gt;MagmaProduct&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;M1&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Magma&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;M2&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Magma&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Magma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt;
  &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;M1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nn"&gt;M2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;

  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;op&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;M1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;op&lt;/span&gt; &lt;span class="n"&gt;a1&lt;/span&gt; &lt;span class="n"&gt;b1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;M2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;op&lt;/span&gt; &lt;span class="n"&gt;a2&lt;/span&gt; &lt;span class="n"&gt;b2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;All right.
There's a slight problem there with the module type specification turning &lt;tt class="docutils literal"&gt;t&lt;/tt&gt; abstract, but, eh.
I'm getting tired, but I'm going to try to articulate the bigger problems here.
The key thing missing is the code to isolate and express the errors.
That needs to build on the code above, or something like it.&lt;/p&gt;
&lt;p&gt;At this point, I have some ideas for totally reworking this, but it's too late right now for it to be a good idea to try to write them up.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;I tried working on it outside of this entry, and just confused myself.
Time to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category><category term="I'm not even sure"></category></entry><entry><title>Coding 2023-07-26</title><link href="https://mwchase.neocities.org/coding-2023-07-26" rel="alternate"></link><published>2023-07-26T04:00:00-04:00</published><updated>2023-07-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-07-26:/coding-2023-07-26</id><summary type="html">&lt;p class="first last"&gt;Finding a data layout that fits nicely in my head.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I do have some other ideas that I'm turning over in my head to see how I could express them in OCaml, but the current result there is &amp;quot;seemingly pretty poorly&amp;quot;.
Like a bunch of really messed-up functors...&lt;/p&gt;
&lt;p&gt;So, let's get back to Lox.
By which I mean, the stuff that Crafting Interpreters specifically recommends against doing, in the effort to implement Lox.&lt;/p&gt;
&lt;p&gt;I'm trying to figure out the right structure for the state sets and the &amp;quot;work queue&amp;quot;.
Because I want to augment the state sets with additional information, let's temporarily call them something else, like &amp;quot;cells&amp;quot;.
When we're working with cell #n, then we need access to possibly every cell from 0 to n inclusive, as well as &amp;quot;the current work queue&amp;quot; and &amp;quot;the next work queue&amp;quot;.&lt;/p&gt;
&lt;p&gt;There are several operations that call each other recursively.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Adding an item to a work queue consumes the old version of the queue, and returns a new one. Additionally, it updates the cell corresponding to the work queue...&lt;/li&gt;
&lt;li&gt;Predicting an item consumes from a work queue (consumes and returns a new version), and updates the corresponding cell&lt;/li&gt;
&lt;li&gt;Scanning an item consumes from a work queue and the current token and updates the corresponding cell&lt;/li&gt;
&lt;li&gt;Completing consumes from a work queue and potentially any cell, and updates the corresponding cell.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here's what my gut says to do to implement all of this:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Have a pair of cell and work queue.&lt;/li&gt;
&lt;li&gt;Have a pair of &lt;em&gt;those&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Do not add the &amp;quot;current&amp;quot; cell to the array until it is done being processed; special-case getting it in the completion code.&lt;/li&gt;
&lt;li&gt;Have each function operate on the pair of data structures, taking it in and returning it.&lt;/li&gt;
&lt;li&gt;Maybe define some kind of fixpoint helper to replace all of the loops.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of this gives me a reasonable target to shoot for later, so I'm feeling good about it now.
I'm going to wrap up for now and mess with the other ideas on paper.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category><category term="Crafting Interpreters"></category></entry><entry><title>Weekly Roundup 2023-07-25</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-07-25" rel="alternate"></link><published>2023-07-25T04:00:00-04:00</published><updated>2023-07-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-07-25:/weekly-roundup-2023-07-25</id><summary type="html">&lt;p class="first last"&gt;I mean, I still don't know if it works, but it should work &lt;em&gt;better&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I got some code written for nullability detection in the parser.&lt;/li&gt;
&lt;li&gt;Thursday: My laptop wouldn't turn on for like half an hour, and has since refused to elaborate. I did not like this.&lt;/li&gt;
&lt;li&gt;Friday: I got some more code for the nullability checks written. It didn't look great.&lt;/li&gt;
&lt;li&gt;Saturday: I tracked down some bugs in the nullability checks, through code inspection.&lt;/li&gt;
&lt;li&gt;Sunday: I tried to clean up the code. I do not know if I succeeded.&lt;/li&gt;
&lt;li&gt;Monday: I started planning out a format for storing information about the parsing process.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to flesh out and implement those plans, and maybe find something else to mess around with in OCaml.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="OCaml"></category><category term="Crafting Interpreters"></category></entry><entry><title>Coding 2023-07-24</title><link href="https://mwchase.neocities.org/coding-2023-07-24" rel="alternate"></link><published>2023-07-24T04:00:00-04:00</published><updated>2023-07-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-07-24:/coding-2023-07-24</id><summary type="html">&lt;p class="first last"&gt;I'm not really focusing on algorithmic properties, just, like, what offends my sensibilities as a Zachtronics enjoyer?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was doing stuff besides working on coding today, so I'm going to just drop a few notes on implementation stuff:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The logic for constructing a parse forest requires the index of the start.&lt;/li&gt;
&lt;li&gt;The straightforward way to handle this is with an &lt;tt class="docutils literal"&gt;array&lt;/tt&gt;, but I'm skeptical of the performance characteristics.&lt;/li&gt;
&lt;li&gt;So I'm still messing around with whether it's possible to implement something decent using &lt;tt class="docutils literal"&gt;list&lt;/tt&gt;.
Like some kind of system of adding up indices so it's actually pointing &lt;em&gt;back&lt;/em&gt; instead of counting from the beginning.
There are two immediately obvious drawbacks to this approach: it sounds tricky, which isn't great when I'm trying to figure out the actual main implementation at the same time; and I don't actually know if any of it would help.&lt;/li&gt;
&lt;li&gt;For parse forest construction, the useful indices would be the left-hand-side and the start index.&lt;/li&gt;
&lt;li&gt;For actually constructing stuff, I think the relevant thing is completion, because the work structure can have any required format.
To carry out completion, we need to look for a non-terminal after the dot, which is a completely different arrangement of data.&lt;/li&gt;
&lt;li&gt;Maybe instead of &amp;quot;just&amp;quot; a mapping from left-hand-side to start index to sets of zippered right-hand-sides, I should have &amp;quot;that, plus a map from non-terminal-after-dot to 'whatever the format is for inserting into the work queue'&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I think that's enough to work with later.
For now, I'm going to properly wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category><category term="Crafting Interpreters"></category><category term="short post"></category></entry><entry><title>Coding 2023-07-23</title><link href="https://mwchase.neocities.org/coding-2023-07-23" rel="alternate"></link><published>2023-07-23T04:00:00-04:00</published><updated>2023-07-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-07-23:/coding-2023-07-23</id><summary type="html">&lt;p class="first last"&gt;I think I changed a few lines back and forth several times.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hm.
I spent a few hours moving code around trying to make things &amp;quot;more readable&amp;quot;, and I think I made some improvements to start with, but now it's just kind of, like, sloshing around?&lt;/p&gt;
&lt;p&gt;Earlier I was looking for some kind of set of guidelines for when to use stuff like &lt;tt class="docutils literal"&gt;|&amp;gt;&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;&amp;#64;&amp;#64;&lt;/tt&gt;, and I didn't have any luck, but now I feel like I &lt;em&gt;really&lt;/em&gt; need some guidelines like that, because it's all just getting kind of weird now.&lt;/p&gt;
&lt;p&gt;Anyway, it's way late, so I'm getting to bed finally.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category><category term="Crafting Interpreters"></category><category term="short post"></category></entry><entry><title>Coding 2023-07-22</title><link href="https://mwchase.neocities.org/coding-2023-07-22" rel="alternate"></link><published>2023-07-22T04:00:00-04:00</published><updated>2023-07-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-07-22:/coding-2023-07-22</id><summary type="html">&lt;p class="first last"&gt;I shouldn't be trying to read the code this late, but props to OCaml for being so readable once I get a basic handle on the syntax.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, it's late because I watched a movie that was strange, but probably should have been stranger somehow?&lt;/p&gt;
&lt;p&gt;Anyway, let's take a look at the nullability code.
Here is the premise: some nonterminal symbols are known to be nullable, and the rest are not known to be nullable.
I have a set representing the symbols known to be nullable, and for the symbols not known to be nullable: a map of maps of sets of sets.
It maps from a symbol that is on the right-hand-side of rules, to the symbol that is on the left-hand-side of such rules, and the set that it maps to is of sets of right-hand-side symbols not known to be nullable.&lt;/p&gt;
&lt;p&gt;Working from the outside of the &lt;tt class="docutils literal"&gt;update_nullable&lt;/tt&gt; code path...&lt;/p&gt;
&lt;p&gt;It starts by converting the list of the right-hand-side to a &lt;tt class="docutils literal"&gt;NSet.t option&lt;/tt&gt; containing all of the nonterminal symbols if there were no terminal symbols.
If this is &lt;tt class="docutils literal"&gt;None&lt;/tt&gt;, then there's no work to do and it passes back the set and map unchanged.
Otherwise, it takes the set and passes it to the next function in.
I think I just noticed a bug.
I'm taking a set difference in the wrong place.
Just move it sooner, and...
Okay, that should work.&lt;/p&gt;
&lt;p&gt;Okay, so it filters out all elements of the right-hand-side set that are already known to be nullable.
If there's still &lt;em&gt;something&lt;/em&gt; in the set, then that needs to be added to the map:
Every element in the set needs to be added or updated in the map, by adding or updating the left-hand-side key, to make sure that it points to a set containing the new set.
And if there's nothing in the right-hand-side set, then the course of action is to mark the left-hand-side as nullable.&lt;/p&gt;
&lt;p&gt;Marking a symbol is nullable is accomplished with a recursive function that pulls and accumulates work from and into a set.
If the set is empty, it has no more work to do and passes back the other argument unchanged.
Otherwise, it pulls one element from the set, and, hm.
It's getting late and I need to be better rested to grasp this code.
I &lt;em&gt;think&lt;/em&gt; I'm missing a call to &lt;tt class="docutils literal"&gt;NMap.remove&lt;/tt&gt;, and I &lt;em&gt;think&lt;/em&gt; I just put it in the right place.
But the quick and basic idea is to remove the newly nullable symbol from the sets in the sets in the maps in the map, as well as from the maps in the map.
At that point, if any sets of sets contain the empty set, then the corresponding left-hand-side needs to be added to the work set.&lt;/p&gt;
&lt;p&gt;I mean, this all &lt;em&gt;seems&lt;/em&gt; to make sense, but I'm really tired, so I don't know that I'm trustworthy about this.
I should get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category><category term="Crafting Interpreters"></category><category term="short post"></category></entry><entry><title>Coding 2023-07-21</title><link href="https://mwchase.neocities.org/coding-2023-07-21" rel="alternate"></link><published>2023-07-21T04:00:00-04:00</published><updated>2023-07-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-07-21:/coding-2023-07-21</id><summary type="html">&lt;p class="first last"&gt;Not sure I'm supposed to have four close parens in a row.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I've &lt;em&gt;potentially&lt;/em&gt; got the nullability detection code working properly.
There are &lt;em&gt;a lot&lt;/em&gt; of moving parts, and I suspect a lot of the code I threw together isn't idiomatic.
Like, I managed to get one statement indented nearly halfway across the line.
And some function applications that I think are in &amp;quot;the wrong order&amp;quot; from an allocation perspective.
All sorts of code that can be cleaned up, &lt;strong&gt;if&lt;/strong&gt; it's doing the right thing in the first place.&lt;/p&gt;
&lt;p&gt;So, I can forge ahead with trying to handle parsing now that I at least have the &lt;em&gt;representation&lt;/em&gt; of nullability in a usable state, but also I want to try to validate that my various ideas for this code are correct, and that the code as written implements them, and then look into simplifying things.&lt;/p&gt;
&lt;p&gt;At the moment, I'll do neither, because I need to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category><category term="Crafting Interpreters"></category><category term="short post"></category></entry><entry><title>Diary 2023-07-20</title><link href="https://mwchase.neocities.org/diary-2023-07-20" rel="alternate"></link><published>2023-07-20T04:00:00-04:00</published><updated>2023-07-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-07-20:/diary-2023-07-20</id><summary type="html">&lt;p class="first last"&gt;My laptop turned on &lt;em&gt;immediately&lt;/em&gt; after I edited a message onto the front page saying that it wouldn't. Thanks for the tech support.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The whole schedule change thing continues to be pointless.
I think I might have some ammunition to get out of it, but we'll see.&lt;/p&gt;
&lt;p&gt;Right now, though, I'm a little rattled because my laptop randomly shut down earlier today, and I'm just like &amp;quot;not again&amp;quot;.&lt;/p&gt;
&lt;p&gt;I've got some ideas for stuff to do trying to work on code written in OCaml, but like I said, rattled.&lt;/p&gt;
&lt;p&gt;Hopefully my laptop is better behaved tomorrow.
I did try to reduce some of the load on it.&lt;/p&gt;
&lt;p&gt;Anyway, I don't have the focus to stay up any longer.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2023-07-19</title><link href="https://mwchase.neocities.org/coding-2023-07-19" rel="alternate"></link><published>2023-07-19T04:00:00-04:00</published><updated>2023-07-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-07-19:/coding-2023-07-19</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;This looks complicated. *does it*&amp;quot; is always a classic.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I started specifying and implementing what's required to incrementally detect nullable rules.
One hurdle is that I'm informally writing this out in a mostly imperative style, but I'm implementing it all functionally, and sometimes the gaps between the two approaches get... wide.&lt;/p&gt;
&lt;p&gt;Complaining about this was enough of an impetus to try and get the implementation right before I could manage to explain what the issues were, so this is probably close to done, but there are still various bits of bookkeeping to handle.&lt;/p&gt;
&lt;p&gt;I can't handle them right now, because it's late.
Let's see what I'm up for tomorrow...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category><category term="Crafting Interpreters"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2023-07-18</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-07-18" rel="alternate"></link><published>2023-07-18T04:00:00-04:00</published><updated>2023-07-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-07-18:/weekly-roundup-2023-07-18</id><summary type="html">&lt;p class="first last"&gt;Gradually getting a better handle on both OCaml and Earley parsers.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: Not a great day.&lt;/li&gt;
&lt;li&gt;Thursday: I tried to figure out one of my previous attempts to implement Earley parsing.&lt;/li&gt;
&lt;li&gt;Friday: I looked at the module types I'd written, and tried to figure out how to improve them from a usability standpoint.&lt;/li&gt;
&lt;li&gt;Saturday: I made some progress on simplifying the grammar modules.&lt;/li&gt;
&lt;li&gt;Sunday: I moved on to considering the internal types relevant to the parsing operation.&lt;/li&gt;
&lt;li&gt;Monday: I realized that I need to handle nullable symbols, and investigated a possible way to incrementally detect nullable symbols.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to keep on with that schedule stuff that's messed me up, and hopefully argue against it.
Aside from that, I'm going to try to get the nullability stuff in a sensible state.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="OCaml"></category><category term="Crafting Interpreters"></category></entry><entry><title>Coding 2023-07-17</title><link href="https://mwchase.neocities.org/coding-2023-07-17" rel="alternate"></link><published>2023-07-17T04:00:00-04:00</published><updated>2023-07-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-07-17:/coding-2023-07-17</id><summary type="html">&lt;p class="first last"&gt;This is going to be weird and sprawling, but let's see how it goes.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Now that I have some ideas for the types involved in the actual parsing part of the Earley parser, I've got a better handle on visualizing its operation, and I've concluded that I do, in fact, need nullability checking.
Which is a shame.
Loup Vaillant has &lt;a class="reference external" href="https://loup-vaillant.fr/tutorials/earley-parsing/empty-rules"&gt;an explanation&lt;/a&gt; of what that's supposed to solve, but I'm going to try phrasing it in terms of my &amp;quot;trying to teach this stuff to myself&amp;quot; code structure.&lt;/p&gt;
&lt;p&gt;Basically...
Start with the three operations: scanning, prediction, and completion.
Now, ignore scanning, because it inherently operates on two distinct state sets, so it's unproblematic in this context.
Going over prediction, it does operate on just one state set, but once a prediction has been done, there is guaranteed to be no more work.
Now, completion is a little more subtle, because it's unproblematic &lt;em&gt;if&lt;/em&gt; the item being completed was started in an earlier state set, which is guaranteed to be the case... unless the symbol is nullable.&lt;/p&gt;
&lt;p&gt;There are a few ways to deal with this:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Retry completions until nothing changes, making sure to bring in predictions as those are added.&lt;/li&gt;
&lt;li&gt;Determine the set of nullable symbols immediately before parsing.&lt;/li&gt;
&lt;li&gt;Determine the set of nullable symbols incrementally, as rules are added.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I kind of don't want to do things the first way, because I suspect that that would end in some weird redundant loops.&lt;/p&gt;
&lt;p&gt;So, I need to either have nullability calculations right before parsing, or incrementally.
I &lt;em&gt;want&lt;/em&gt; doing it incrementally to be a slam dunk, but I suspect that it's not.
Basically, if you add a single rule, the &lt;em&gt;immediate&lt;/em&gt; question is whether it renders the left-hand-side symbol nullable, but &lt;em&gt;if it does&lt;/em&gt;, then every non-nullable symbol has to be checked for whether making that first symbol nullable makes that other symbol nullable.
Jeffrey Kegler's &lt;a class="reference external" href="https://github.com/jeffreykegler/old_kollos/blob/master/notes/misc/loup2.md"&gt;note&lt;/a&gt; on the nullable stuff presents a linear-time algorithm for detecting nullables.
I'm going to try to walk through what doing it incrementally would look like.&lt;/p&gt;
&lt;p&gt;So, there are going to be several auxiliary maps.
These maps only need to concern themselves with rules that have no terminal symbols.
One map from LHS to rules.
One map from RHS symbols to sets of rules (including LHS I think).
A set of nonterminals with empty rules.
A mapping from every non-terminal in the LHSs to whether that is a nullable symbol, false by default.&lt;/p&gt;
&lt;p&gt;At this point, things diverge sharply and I kind of have to wing it.
I believe I'll have to re-derive the time bounds of what I'm about to propose, if I want to know what they are.&lt;/p&gt;
&lt;p&gt;When adding a rule:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;If there are terminal symbols, ignore it.&lt;/li&gt;
&lt;li&gt;If the rule is empty, add it to the set of empty rules.
Actually, this step and data might not be needed.&lt;/li&gt;
&lt;li&gt;If the LHS is already marked nullable, ignore it.&lt;/li&gt;
&lt;li&gt;If the RHS is made up only of nullable symbols, mark the LHS as nullable, and then, iterate over every rule with the LHS in the RHS, to see whether any of those rules now have only nullable symbols in the RHS.
If so, mark the associated LHS as nullable and recurse.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm honestly missing what anything besides the RHS map and the nullability map is accomplishing in this, so I'm going to see how far I can get with just those.&lt;/p&gt;
&lt;p&gt;One thing I note is that, once a symbol has been marked nullable, there's no reason to check any rules with that LHS, so it could be efficient to remove such rules from the RHS sets.
Potentially there could be a different way to store the RHS data other than literally, like as sets of symbols not known to be nullable.
Then, when a set gets to zero, mark the LHS as nullable and cut down on stuff.
You know, stuff.&lt;/p&gt;
&lt;p&gt;I think this is enough to get started with tweaking the representation.
Looking over it, I'm highly skeptical that what I have in mind is worst-case linear, but it shouldn't lead to any huge degradations in grammars that don't &amp;quot;need&amp;quot; this stuff.&lt;/p&gt;
&lt;p&gt;One more pass at trying to make sense of this:&lt;/p&gt;
&lt;p&gt;To mark a rule nullable, check the RHS table.
It should be safe for the RHS table to contain tables from the LHS to the sets of symbols not known to be nullable.
When a symbol is marked nullable, then that means that it needs to be removed from every other entry.
For &lt;em&gt;each other&lt;/em&gt; RHS symbol, put together a set of LHS symbols to check.
If any LHS symbol is associated with the set of just the nullable symbol, then that symbol has to be marked nullable on the next pass.
For LHS symbols with other sets, those sets represent RHS symbols that need to be updated; doing so is guaranteed not to produce more nullable symbols.&lt;/p&gt;
&lt;p&gt;I'm still not sure about the time bounds, but I think I can get this to make sense, so I'm going to take down some notes on how I need to change up stuff, and then get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category><category term="Crafting Interpreters"></category></entry><entry><title>Coding 2023-07-16</title><link href="https://mwchase.neocities.org/coding-2023-07-16" rel="alternate"></link><published>2023-07-16T04:00:00-04:00</published><updated>2023-07-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-07-16:/coding-2023-07-16</id><summary type="html">&lt;p class="first last"&gt;This code is going to be so elegant, it'll have its pinky out for literally all beverages.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I went over the parser code for Lox a bunch, and I &lt;em&gt;think&lt;/em&gt; the interfaces make sense now.
At this point, the functor requires two simple modules, instead of three with a complicated relationship between them, so at minimum, the code is simpler now just because I'm not trying to use features that I think I have some serious gaps in my understanding of.&lt;/p&gt;
&lt;p&gt;At this point, the only code missing for the basic parser case is... the code that actually handles parsing.
The hurdle to clear there is that I need to figure out the types required to handle the &amp;quot;items&amp;quot;.
It's like I need to consider every phase of the parsing process simultaneously to figure out what data is actually needed.
But, like, there must be some way to break this down...&lt;/p&gt;
&lt;p&gt;The state sets are stored in an array.
The sets themselves should be &lt;tt class="docutils literal"&gt;NMap&lt;/tt&gt;s containing sets of partially completed rules, and start indices.
I'm not sure whether some of these will need to carry information about semantic actions, or if I can safely just leverage the grammar to retrieve them.
Let's assume the latter.&lt;/p&gt;
&lt;p&gt;It &lt;em&gt;may&lt;/em&gt; be the case that I want items derived from a successful scan to carry the matching terminal symbol.
That could also be in a tuple with the map, or simply not stored within the array.
Because of those latter two options, let's assume that it's not stored inside the items.
My idea for the structure of the items is to have &lt;em&gt;two&lt;/em&gt; lists of symbols like a zipper list, and for the queued form, to take the Cartesian product with the relevant symbol type.
This means that each queue has a different type, which will match up with the action associated with that queue.&lt;/p&gt;
&lt;p&gt;Now that I understand the queue types, I should hopefully be able to write them out properly and get the flow between them correct.
Unfortunately, to actually implement this, I'm going to need to either get really clever with pure functions, or bite the bullet and write a bunch of imperative stuff.&lt;/p&gt;
&lt;p&gt;I'll think about that over the next few days or whatever.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category><category term="Crafting Interpreters"></category></entry><entry><title>Coding 2023-07-15</title><link href="https://mwchase.neocities.org/coding-2023-07-15" rel="alternate"></link><published>2023-07-15T04:00:00-04:00</published><updated>2023-07-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-07-15:/coding-2023-07-15</id><summary type="html">&lt;p class="first last"&gt;Relearning the healing power of deleting code.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I've given things some thought, and here is what I've concluded:
If you're making modules and types for grammars the way I intend to (which is clearly not the only way), then it's going to need a bunch of gnarly compound types, but crucially, they're entirely built up from just two basic types that the user has to pass in.
So, if we give &lt;em&gt;those&lt;/em&gt; types as arguments in &lt;tt class="docutils literal"&gt;OrderedType&lt;/tt&gt; modules, then that relieves the user of constructing a bunch of modules to pass in.&lt;/p&gt;
&lt;p&gt;The next thing I need to think about is how to handle the whole error-wrapping idea.
Is it reasonable to say &amp;quot;If you want an error-correcting grammar, then use the special error-correcting grammar constructor, which will give you back a module for a non-error-correcting grammar, and then you can pass that into a function on the higher-level module&amp;quot;?&lt;/p&gt;
&lt;p&gt;Maybe... maybe the error-correcting version should have a different relationship between its input types and the compound types in the grammar, compared to the basic version.&lt;/p&gt;
&lt;p&gt;Like, what's the right choice between:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;A module that requires another similar module&lt;/li&gt;
&lt;li&gt;A module that provides another similar module&lt;/li&gt;
&lt;li&gt;A module that secretly uses a similar module in its implementation?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And now I'm realizing that a lot of these types should be abstract, which will hopefully make the code shorter overall.
Like, the compound types that the code needs to know about:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The grammar itself.
This should be a map from non-terminals &lt;em&gt;from an implementation perspective&lt;/em&gt;, but all the consumer needs is an empty grammar function, and a function to add rules.&lt;/li&gt;
&lt;li&gt;Rules within the grammar.
The user needs a way to construct these, which requires the ability to create instances of the non-terminal and the matcher types.&lt;/li&gt;
&lt;li&gt;Semantic actions.
The user needs a way to construct these, which requires the ability to &lt;em&gt;destructure&lt;/em&gt; the token type.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, ultimately, this requires three public types, and one abstract type.
Two of the public types need a comparison function to implement the various compound types.&lt;/p&gt;
&lt;p&gt;I think this is enough to fix up the interfaces around the grammar, but right now I need to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category><category term="Crafting Interpreters"></category><category term="short post"></category></entry><entry><title>Coding 2023-07-14</title><link href="https://mwchase.neocities.org/coding-2023-07-14" rel="alternate"></link><published>2023-07-14T04:00:00-04:00</published><updated>2023-07-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-07-14:/coding-2023-07-14</id><summary type="html">&lt;p class="first last"&gt;I think if I get this wrong, the result is basically unusable, but I'm not sure what getting it right looks like.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I stared at my old code some more, and I'm starting to get a handle on what exactly I was doing.
It looks like the difference between using a &lt;tt class="docutils literal"&gt;set&lt;/tt&gt; and a &lt;tt class="docutils literal"&gt;dict&lt;/tt&gt; was just a matter of some cases &amp;quot;wanting&amp;quot; to cache the result of a computation.&lt;/p&gt;
&lt;p&gt;I'm thinking about how best to handle the idea of yet another type to put into a &lt;tt class="docutils literal"&gt;Set&lt;/tt&gt; or a &lt;tt class="docutils literal"&gt;Map&lt;/tt&gt;.
I &lt;em&gt;must&lt;/em&gt; be doing something wrong, because all of this boilerplate is really unpleasant.&lt;/p&gt;
&lt;p&gt;I wonder if I can get away with turning all of this &amp;quot;map&amp;quot; stuff into functions from keys to values, because that would cut out a lot of this nonsense.
Or maybe I should be trying to define just a few &lt;tt class="docutils literal"&gt;Map&lt;/tt&gt;s in the interface, and constructing the implementation out of &lt;tt class="docutils literal"&gt;OrderedType&lt;/tt&gt;s?&lt;/p&gt;
&lt;p&gt;Today was another exhausting day, so I'm going to wrap up for now, and try to figure out what's a sensible way to do this stuff tomorrow or over the weekend.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category><category term="Crafting Interpreters"></category><category term="short post"></category></entry><entry><title>Coding 2023-07-13</title><link href="https://mwchase.neocities.org/coding-2023-07-13" rel="alternate"></link><published>2023-07-13T04:00:00-04:00</published><updated>2023-07-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-07-13:/coding-2023-07-13</id><summary type="html">&lt;p class="first last"&gt;Past me really should have explained all of this clever stuff...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I still haven't got a handle on the new schedule stuff (honestly, I'd like to figure out some way to just be exempted from it, because I don't see what the point is).
Anyway, I'm going to try to take some quick notes on Earley parser stuff and have that be my post.&lt;/p&gt;
&lt;p&gt;So.
My attempt at a Python implementation has a few moving parts.
One of these is called &lt;tt class="docutils literal"&gt;add_item&lt;/tt&gt;.
It supposes that if an item is already in an Earley set, then the next action for it must be queued up, and it accomplishes this by first checking, then queueing, then adding.
The queues are represented by a &lt;tt class="docutils literal"&gt;set[Item]&lt;/tt&gt; (for completion) and two &lt;tt class="docutils literal"&gt;dict[Item, Symbol]&lt;/tt&gt;.
An &lt;tt class="docutils literal"&gt;Item&lt;/tt&gt; is a combination of a &lt;tt class="docutils literal"&gt;Rule&lt;/tt&gt; and an integer index, which could be obnoxious if I translate it directly, because I think that means a bunch more modules.
The different queues are pulled from using different functions that don't return a value, they just mutate the queues.
Now, a close port of the Python logic would actually not be The Worst, because the queues don't leak anywhere, but I would like to see if it's possible to avoid using mutation.&lt;/p&gt;
&lt;p&gt;I think the missing piece in understanding how to update this is just to take some notes, because reading the ipynb file in vim is... probably not the best way to get a handle on this.
Anyway, I will regret it so much if I don't get ready for tomorrow, so I've got to be done now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category><category term="Crafting Interpreters"></category><category term="short post"></category></entry><entry><title>Diary 2023-07-12</title><link href="https://mwchase.neocities.org/diary-2023-07-12" rel="alternate"></link><published>2023-07-12T04:00:00-04:00</published><updated>2023-07-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-07-12:/diary-2023-07-12</id><summary type="html">&lt;p class="first last"&gt;Light on details, heavy on headaches.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Schedule change results so far: terrible; awful.
Tomorrow, I'm going to try changing the schedule in a different way, which should hopefully leaving feeling a little less bad.&lt;/p&gt;
&lt;p&gt;To try to offset the bad vibes I was dealing with, I picked back up some writing I'd been meaning to get back to.
It's pretty good stuff, and so far it's still doing what it's supposed to, so I think that helped a little.&lt;/p&gt;
&lt;p&gt;Anyway, part of that schedule change is going to involve getting up earlier, so I should go.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="writing"></category></entry><entry><title>Weekly Roundup 2023-07-11</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-07-11" rel="alternate"></link><published>2023-07-11T04:00:00-04:00</published><updated>2023-07-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-07-11:/weekly-roundup-2023-07-11</id><summary type="html">&lt;p class="first last"&gt;This is going a bit slow, but I guess I'll keep challenging myself.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I got scanning for Lox working in OCaml.&lt;/li&gt;
&lt;li&gt;Thursday: I tried to figure out what I'd want for implementing parsing for Lox.&lt;/li&gt;
&lt;li&gt;Friday: I speculated a bit about what types might make sense for parsing. (Some of the types, did not, in fact, make sense.)&lt;/li&gt;
&lt;li&gt;Saturday: Trying to actually use those types didn't work out or at least was difficult, but I forget the details.&lt;/li&gt;
&lt;li&gt;Sunday: I tried to work through how to write the relevant type signatures.&lt;/li&gt;
&lt;li&gt;Monday: I didn't go through the details, but I did a bunch of cleanup work that obsoleted the speculation I did the day before.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I've got some schedule changes to deal with, so I'm not totally sure what I'll be up for.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="OCaml"></category><category term="Crafting Interpreters"></category></entry><entry><title>Coding 2023-07-10</title><link href="https://mwchase.neocities.org/coding-2023-07-10" rel="alternate"></link><published>2023-07-10T04:00:00-04:00</published><updated>2023-07-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-07-10:/coding-2023-07-10</id><summary type="html">&lt;p class="first last"&gt;Things are about to keep on getting confusing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right.
At this point, the types are... less wrong.
I'm highly skeptical that I've gotten this stuff to a completely idiomatic state.
I'm now getting back up to speed on the right way to &lt;em&gt;actually carry out the parsing&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Looking over my previous disorganized notes, I &lt;em&gt;think&lt;/em&gt; my plan is to try to do things kind of naively, which means putting together the equivalent of a do-whole loop, but also needing to figure out how to translate the non-local references in the Python version...&lt;/p&gt;
&lt;p&gt;Although, if I end up feeling up to writing Python for hobby stuff again, the insights I had around representing this stuff in OCaml could be helpful as far as writing type annotations that make sense.&lt;/p&gt;
&lt;p&gt;Anyway, it's late and I'm tired, so I'm cutting this off now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category><category term="Crafting Interpreters"></category><category term="short post"></category></entry><entry><title>Coding 2023-07-09</title><link href="https://mwchase.neocities.org/coding-2023-07-09" rel="alternate"></link><published>2023-07-09T04:00:00-04:00</published><updated>2023-07-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-07-09:/coding-2023-07-09</id><summary type="html">&lt;p class="first last"&gt;Does this suck because I'm inexperienced, or is there some actual avenue of improvement? Since I can't come up with a better suggestion, I'm going to assume it's the former.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, let's see if I can put something together quickly.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;And I tried actually using the stuff I wrote before, and I've concluded two main things.&lt;/p&gt;
&lt;p&gt;One is that I'm pushing past my comfort zone a bit in terms of the OCaml features that I'm trying to use.
More importantly, the code as I've written it is just kind of a confusing mess.&lt;/p&gt;
&lt;p&gt;I just now tried to tidy it up a little, and... doubt.
I'm going to try to push forward and see if there's any kind of, like, obstruction.&lt;/p&gt;
&lt;p&gt;So, the current thing I'm trying to put together is a &lt;tt class="docutils literal"&gt;parse&lt;/tt&gt; function.
It starts with a grammar and (currently) a sequence of nonterminals.
The first thing it needs to do is create a &lt;tt class="docutils literal"&gt;('t, 'o) item NMap.t array&lt;/tt&gt;.
That array should start off containing an empty map.
It's only empty because I'm &lt;em&gt;trying&lt;/em&gt; to break this up into steps.&lt;/p&gt;
&lt;p&gt;Aw crud.
I got a few steps in before realizing that one of the types is wrong.
I need a container to go in the middle of one of these horrifying types, and the code is still so bad that I think doing this technically qualifies as an improvement.
So, here's the puzzle...
I need to take the terminal matchers and make them suitable to use as (part of) keys to a &lt;tt class="docutils literal"&gt;Map&lt;/tt&gt;.
To make that work, the functional values have to be removed.
I think this can be accomplished by creating a module to hold the function definitions, and make the actual matchers into normal variant types.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, I've started doing that, and now part of the code is a lot cleaner, but I'm pretty sure the rest of the file is just covered in red lines because I only &lt;em&gt;started&lt;/em&gt; this.
I'm going to leave it there for tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category><category term="Crafting Interpreters"></category></entry><entry><title>Coding 2023-07-08</title><link href="https://mwchase.neocities.org/coding-2023-07-08" rel="alternate"></link><published>2023-07-08T04:00:00-04:00</published><updated>2023-07-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-07-08:/coding-2023-07-08</id><summary type="html">&lt;p class="first last"&gt;I have no idea whether the type signatures I'm writing are remotely reasonable.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I tried to put together a signature for the grammar stuff for Earley parsing.
I've tweaked it a few times, and I'm almost certainly going to tweak and change it a lot more as I figure out what's actually reasonable and what's needed to actually handle the task of parsing.&lt;/p&gt;
&lt;p&gt;I think I have what I need to test it out by actually trying to write the functions, but I'm not up for that right now.
We'll see about tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category><category term="Crafting Interpreters"></category><category term="short post"></category></entry><entry><title>Coding 2023-07-07</title><link href="https://mwchase.neocities.org/coding-2023-07-07" rel="alternate"></link><published>2023-07-07T04:00:00-04:00</published><updated>2023-07-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-07-07:/coding-2023-07-07</id><summary type="html">&lt;p class="first last"&gt;I used a lot of words trying to explain this, but I'm not sure whether I explained anything.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, let's see what it takes to handle Earley parsing, in terms of types.&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;type 't terminal_matcher = { match_ : 't &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; bool ; produce : () &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; 't }&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Might change the input to that second function.
And I think it should &lt;em&gt;not&lt;/em&gt; be required that the &lt;tt class="docutils literal"&gt;produce&lt;/tt&gt; function only produces values that satisfy the predicate.&lt;/p&gt;
&lt;p&gt;Anyway.&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;type n; module NMap = Map.Make(struct type t = n; let compare = compare end); type ('t, 'o) grammar = n * &lt;span class="pre"&gt;(((n,&lt;/span&gt; 't terminal_matcher) Either.t list * &lt;span class="pre"&gt;(('o,&lt;/span&gt; 't) Either.t list &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; 'o)) NMap.t)&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Without the language tools, I don't know which parentheses are needed, or even if I got that all right.
So, let's see if I can explain all of that.&lt;/p&gt;
&lt;p&gt;With the &lt;tt class="docutils literal"&gt;terminal_matcher&lt;/tt&gt;, I'm maybe kind of bending the rules for &amp;quot;what is a grammar&amp;quot;, because the usual description is in terms of terminal symbols, which are more-or-less associated with a particular &lt;em&gt;field&lt;/em&gt; on the &lt;tt class="docutils literal"&gt;token&lt;/tt&gt; type in this context.
So, the &amp;quot;sensible&amp;quot; thing in my mind is to have a type that relates to the &lt;tt class="docutils literal"&gt;token&lt;/tt&gt; type, and write helpers that express &amp;quot;match this terminal symbol&amp;quot; in terms of what structure the &lt;tt class="docutils literal"&gt;token&lt;/tt&gt; has.&lt;/p&gt;
&lt;p&gt;Now, to handle the structure of the grammar, I need to have the nonterminal symbol type as a module-level type instead of a variable, so I can use it to instantiate a &lt;tt class="docutils literal"&gt;Map&lt;/tt&gt;.
This map is used to hold the majority of the information in the grammar, with the remainder being the initial symbol next to it.
Within the grammar, each value is a pair of a list of nonterminals and terminal matchers, along with the semantic actions, which are functions that combine lists of their output type and terminal symbols.&lt;/p&gt;
&lt;p&gt;The expected definition of the action functions is a little dynamic, because I couldn't see a way to encode all of the type information in an existential type so that it doesn't interfere with the ability to put all of these different signatures into one type of slot.&lt;/p&gt;
&lt;p&gt;Oh yeah, I defined a record type to hold two functions for the matcher, instead of just aliasing to one of the types, because I'm trying to plan ahead to having a functor that replaces &lt;tt class="docutils literal"&gt;n&lt;/tt&gt; with &lt;tt class="docutils literal"&gt;n option&lt;/tt&gt; and provides the ability to convert from the wrapped module type to the wrapped type for this module, but with extra output stuff.&lt;/p&gt;
&lt;p&gt;A missing piece of the puzzle is that the grammar modules need to define a &lt;tt class="docutils literal"&gt;parse&lt;/tt&gt; function that takes a grammar and a list (or something) of tokens, and the error-correcting version almost certainly needs a custom parse function to try to avoid all of the pathological parse behavior that I'm pretty sure adding the error correcting would introduce, at least the way &lt;em&gt;I'm&lt;/em&gt; thinking of doing it.
(Other people may be built different.)&lt;/p&gt;
&lt;p&gt;I think I should be done for now, and think about this more over the weekend.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category><category term="Crafting Interpreters"></category></entry><entry><title>Coding 2023-07-06</title><link href="https://mwchase.neocities.org/coding-2023-07-06" rel="alternate"></link><published>2023-07-06T04:00:00-04:00</published><updated>2023-07-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-07-06:/coding-2023-07-06</id><summary type="html">&lt;p class="first last"&gt;Figuring out what I'm supposed to do when other stuff doesn't do what it's supposed to do.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I'm trying to move on to parsing now, and I need some time to figure out the right way to handle it.&lt;/p&gt;
&lt;p&gt;I'm still on the idea I had previously of &amp;quot;let's learn something besides recursive descent&amp;quot;, &lt;em&gt;in part&lt;/em&gt; because I think trying that in OCaml would lead to an utterly monstrous &lt;tt class="docutils literal"&gt;let rec&lt;/tt&gt; that would only get bigger as I go.&lt;/p&gt;
&lt;p&gt;So, I'm back looking at Earley parsers, and I think I've got an idea of how to put the types together.
However, I want to consider error correction possibilities.
From doing some research, I think I want to do something like this:&lt;/p&gt;
&lt;p&gt;First, have a grammar definition, including semantic actions.&lt;/p&gt;
&lt;p&gt;Then, the following:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;A transformation of the semantic actions to a form that includes an error score.&lt;/li&gt;
&lt;li&gt;New rules for matching &amp;quot;junk&amp;quot; where each token matched increases the error score.&lt;/li&gt;
&lt;li&gt;Terminal matchers need the ability to create &amp;quot;synthetic&amp;quot; tokens in the absence of proper input, which signal somehow that they're not present in the source.&lt;/li&gt;
&lt;li&gt;Create rules in which the terminal matchers are replaced with matching zero or more junk, and their argument to the semantic action creates the synthetic token.&lt;/li&gt;
&lt;li&gt;The junk rules need to create something that the modified matches know to discard.&lt;/li&gt;
&lt;li&gt;Some combinations of this stuff.&lt;/li&gt;
&lt;li&gt;Probably the additional data should include error details so those can get reported.&lt;/li&gt;
&lt;li&gt;Bias advancing in the parse without errors (maybe using effects to create continuations or something?) so that working code doesn't end up generating a massive error forest just in case.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Like prioritize by number of errors, and then by index.&lt;/p&gt;
&lt;p&gt;Okay, this sounds workable, but I'm not sure.
I'm going to have to sleep on it.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category><category term="Crafting Interpreters"></category></entry><entry><title>Coding 2023-07-05</title><link href="https://mwchase.neocities.org/coding-2023-07-05" rel="alternate"></link><published>2023-07-05T04:00:00-04:00</published><updated>2023-07-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-07-05:/coding-2023-07-05</id><summary type="html">&lt;p class="first last"&gt;Well, it's not obviously broken at this point. Kind of worried about the non-obvious breakage, then...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Traveled back, and messed around with algebra stuff in OCaml.
But let's ignore that for now, and see about getting scanning written for Lox.
What do I have so far...&lt;/p&gt;
&lt;p&gt;I have a function that attempts to produce a token given some source string and a &lt;tt class="docutils literal"&gt;control&lt;/tt&gt; data structure.
It returns an updated &lt;tt class="docutils literal"&gt;control&lt;/tt&gt; value, and a &lt;tt class="docutils literal"&gt;token option&lt;/tt&gt;.
The equivalent code in Lua relied on a helper function that acts similarly to &lt;tt class="docutils literal"&gt;filter_map id&lt;/tt&gt;, so, um, let's assume I'm using that, and I need to define a function that produces a &lt;tt class="docutils literal"&gt;token option Seq.t&lt;/tt&gt; or something.&lt;/p&gt;
&lt;p&gt;Given all of that writeup, I've managed to write the desired iterator, wire it in, handle the effects, and...&lt;/p&gt;
&lt;p&gt;Something, somewhere in it is broken.
The problem currently seems localized to the &lt;tt class="docutils literal"&gt;number&lt;/tt&gt; function.
I'll see if I can fix that up quickly.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Got it.
I forgot to copy over &lt;em&gt;everything&lt;/em&gt;, and I ended up with an off-by-one error.
Now it all seems to work perfectly.&lt;/p&gt;
&lt;p&gt;I'm going to wrap things up for tonight, but now feels like a good time to sum up how I feel about OCaml so far:&lt;/p&gt;
&lt;p&gt;The normal programming with looking at types and matching everything up is great, basic meta-programming with the module system is fine, trying to push the limits of &amp;quot;obvious&amp;quot; when it comes to meta-programming just ends in confusion so far.&lt;/p&gt;
&lt;p&gt;I'd like to figure out if there's some way to avoid that confusion, but I'm going to keep assuming for now that it's a result of a deficit in my understanding.
Anyway, it's late now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category><category term="Crafting Interpreters"></category></entry><entry><title>Weekly Roundup 2023-07-04</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-07-04" rel="alternate"></link><published>2023-07-04T04:00:00-04:00</published><updated>2023-07-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-07-04:/weekly-roundup-2023-07-04</id><summary type="html">&lt;p class="first last"&gt;Huh, working on a specific project seems to be easier. Who would have thought.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I kept on struggling with algebraic structure stuff.&lt;/li&gt;
&lt;li&gt;Thursday: Ditto.&lt;/li&gt;
&lt;li&gt;Friday: I decided to step away from that whole thing, and revisit Crafting Interpreters.&lt;/li&gt;
&lt;li&gt;Saturday: I decided to use a new, shiny feature for Crafting Interpreters.&lt;/li&gt;
&lt;li&gt;Sunday: I decided to directly adapt some of my old Lua code into OCaml, and felt like it ended up weirdly similar.&lt;/li&gt;
&lt;li&gt;Monday: I had good luck continuing on with that stuff.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to see how much further I can go.
I made more progress today that I haven't written up, so I anticipate I'll get a clean build soon; maybe then I'll discover some weird bugs as a result of the conversion.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="OCaml"></category><category term="Crafting Interpreters"></category></entry><entry><title>Coding 2023-07-03</title><link href="https://mwchase.neocities.org/coding-2023-07-03" rel="alternate"></link><published>2023-07-03T04:00:00-04:00</published><updated>2023-07-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-07-03:/coding-2023-07-03</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Oh, hey, because I defined a function instead of a loop, I can just... call the function again. Cool.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Travel.&lt;/p&gt;
&lt;p&gt;But also, a bunch more work with OCaml.
I'm writing helper functions and finding places that can probably be cleaned up later in the code that I'm writing.
The code feels pretty good to write.
We'll see later how it feels to read.&lt;/p&gt;
&lt;p&gt;I put writing this entry off way too long, and I'm not going to draw it out.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category><category term="Crafting Interpreters"></category><category term="short post"></category></entry><entry><title>Coding 2023-07-02</title><link href="https://mwchase.neocities.org/coding-2023-07-02" rel="alternate"></link><published>2023-07-02T04:00:00-04:00</published><updated>2023-07-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-07-02:/coding-2023-07-02</id><summary type="html">&lt;p class="first last"&gt;Apparently I can write... whatever the hell this is... in any language.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I ended up deciding to try to patch together the scanning code from one of my Lua versions.
While I can express a bunch of the basic primitives fine, as I get to somewhat higher level stuff, I'm hitting imperative constructs, and, like, while I &lt;em&gt;can&lt;/em&gt; use those in OCaml, I want to try to avoid them.&lt;/p&gt;
&lt;p&gt;Like, let's see.
I've defined a function called &lt;tt class="docutils literal"&gt;str&lt;/tt&gt;.
Its OCaml version will take a source string and a &lt;tt class="docutils literal"&gt;control&lt;/tt&gt; record.
The first major thing it does is enter a while loop that advances the state of the &lt;tt class="docutils literal"&gt;control&lt;/tt&gt; record in various fashions.&lt;/p&gt;
&lt;p&gt;By laying that out, I &lt;em&gt;seem&lt;/em&gt; to have gotten a little further in implementing this stuff, and fixed a few issues along the way.
I hadn't quite grasped that OCaml's effect system allows you to pass effects around, and invoke them separately from constructing them.
This makes sense in retrospect, but it's not something I &lt;em&gt;currently&lt;/em&gt; need, so I had to change some code.&lt;/p&gt;
&lt;p&gt;Anyway, big thanks to ocamlformat for taking my stream-of-consciousness one-line monstrosities and making it so that at least I can read them.&lt;/p&gt;
&lt;p&gt;Finally, I should be about done for tonight.
I've got a rough template for how to port the rest of the code, and then I can try to give it a nice interface.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category><category term="Crafting Interpreters"></category></entry><entry><title>Coding 2023-07-01</title><link href="https://mwchase.neocities.org/coding-2023-07-01" rel="alternate"></link><published>2023-07-01T04:00:00-04:00</published><updated>2023-07-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-07-01:/coding-2023-07-01</id><summary type="html">&lt;p class="first last"&gt;Let's see what strange ways this decision comes around to bite me.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The more I thought about how I wanted to handle errors from inside the Lox interpreter, the more I was inclined to try using the experimental effect system in OCaml.
It's like, yes, I'm pretty sure OCaml absolutely &lt;em&gt;would&lt;/em&gt; allow me to make a module level ref and twiddle it back and forth, but I'd rather scope the ref to the &lt;tt class="docutils literal"&gt;run&lt;/tt&gt; function and make the caller handle the output.
So, I've written the helper functions that &lt;em&gt;produce&lt;/em&gt; the effects, but I need to do a bit more work to be able to get the effect handler into the &lt;tt class="docutils literal"&gt;run&lt;/tt&gt; function.&lt;/p&gt;
&lt;p&gt;Hopefully, if I skip ahead and around a bit, I can put together the proper code soon.
Ideally, without going to the next chapter before I get all of this handled.&lt;/p&gt;
&lt;p&gt;I can work on that later.
For now (or, half an hour ago...) I should get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category><category term="Crafting Interpreters"></category></entry><entry><title>Coding 2023-06-30</title><link href="https://mwchase.neocities.org/coding-2023-06-30" rel="alternate"></link><published>2023-06-30T04:00:00-04:00</published><updated>2023-06-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-06-30:/coding-2023-06-30</id><summary type="html">&lt;p class="first last"&gt;Expect a future entry to be much more frustrated.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I took another look at the code that I was planning to... &amp;quot;take inspiration from&amp;quot;, and either one specific part of it is subtly non-idiomatic, or I don't understand idiomatic OCaml.
I'm going to assume the latter.
In any case, I'm now looking for some other place to start messing around in.&lt;/p&gt;
&lt;p&gt;After I pondered it a little, something occurred to me that made a lot of sense: Lox from Crafting Interpreters.
I've gotten relatively far with it before, mainly hindered by the fact that I wanted language features that are in OCaml, but not so much in Lua.
So, if I'm focusing on the early parts of Crafting Interpreters, I can focus the effort of learning on &amp;quot;Okay, I know how to do this thing in a bunch of languages. What's the OCaml version?&amp;quot;&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;All right, I've gotten a few things done, but it's about to get weird.
I'm going to need to get error handling right, and that sounds like a thing to work on later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category><category term="Crafting Interpreters"></category></entry><entry><title>Coding 2023-06-29</title><link href="https://mwchase.neocities.org/coding-2023-06-29" rel="alternate"></link><published>2023-06-29T04:00:00-04:00</published><updated>2023-06-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-06-29:/coding-2023-06-29</id><summary type="html">&lt;p class="first last"&gt;Having a staring contest with OCaml, and blinking.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay.
I had a look at how the different structures with some group properties relate, and I don't think I can &amp;quot;just ignore&amp;quot; stuff like associativity, because of how it seems to interact with divisibility.&lt;/p&gt;
&lt;p&gt;Trying to state what I actually want to accomplish here:&lt;/p&gt;
&lt;p&gt;Any given structure should be able to specify &amp;quot;laws&amp;quot; that its operations satisfy, both as a run-time specification of a test, and as a compile-time specification of &amp;quot;capabilities that the module provides&amp;quot;.
Because this doesn't necessarily relate to a single function or value, I want to somehow tag this information to the module itself.
Which means having something else in the struct to hold that static and run-time information.
I can't see any way through this that doesn't involve somehow constructing an intersection of types, be they module types, object types, or something else.&lt;/p&gt;
&lt;p&gt;One thing that might help constrain what I'm looking for is to consider what the tests look like.
If I'm requiring that every property can be &amp;quot;pulled off&amp;quot; of the module where it definitely applies, then it needs to carry a reference to that module.
For now, let's assume that I &lt;em&gt;probably&lt;/em&gt; shouldn't do that.&lt;/p&gt;
&lt;p&gt;I'm going to try to revisit one of my original ideas...
Hm.
Wouldn't work, but now I'm curious about module constraints and extensions...&lt;/p&gt;
&lt;p&gt;Ugh.
Nothing is coming together with this, so I'm looking at how other people have done stuff in this area.
I think I want to just swipe how other people have done this, and try to extend that with tests of the laws.&lt;/p&gt;
&lt;p&gt;Maybe I can try that out later.
For now, I need to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category><category term="running in place"></category></entry><entry><title>Coding 2023-06-28</title><link href="https://mwchase.neocities.org/coding-2023-06-28" rel="alternate"></link><published>2023-06-28T04:00:00-04:00</published><updated>2023-06-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-06-28:/coding-2023-06-28</id><summary type="html">&lt;p class="first last"&gt;All right, let's see what's the proper way to do this. (I do not see what the proper way to do this is.)&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I messed around in Peglin, but I'd rather work with OCaml stuff for this post.
Let's see about some of the stuff I was thinking about last time.&lt;/p&gt;
&lt;p&gt;I decided to start off by trying to make some of the currently not-too-important code I wrote &amp;quot;actually work&amp;quot;, and I ran into trouble.
Here's the deal.
Any algebraic structure that includes a magma can potentially have that magma be commutative.
This isn't too important to the main... does anyone call it the Group Theory Cube, or something like that?
But it's definitely something that comes up.
For example, the trivial group and the cyclic groups are commutative.
So, if I'm all like, &amp;quot;I want to mark the loops coming out of this functor as commutative&amp;quot;, or whatever, then I need to be able to construct a signature for &amp;quot;a loop, but commutative&amp;quot;.&lt;/p&gt;
&lt;p&gt;I'm not sure if the way I'm currently trying to express this even makes sense in OCaml.
Like, the stuff I'm reading kind of makes it look like &amp;quot;stick stuff onto a random signature&amp;quot; isn't an intended thing, in part because the syntax I'm trying to use is very similar to the syntax for a completely different concept.
So, maybe I need some other way to mark &amp;quot;properties that only become apparent by calling the magma operation multiple times&amp;quot;.
The first thing that I thought of is &amp;quot;something with phantom types&amp;quot;, but that doesn't seem to have solved what I think is the actual hard part, of &amp;quot;some magmas can be associative, some can be associative, some can be both, some can be neither&amp;quot;.
And worse, &amp;quot;what if somebody else thinks of a property to check?&amp;quot;&lt;/p&gt;
&lt;p&gt;Maybe if I can figure out how to express &amp;quot;this set contains such and such member&amp;quot; as a type-level assertion, I can turn this idea into &amp;quot;there's a set of properties&amp;quot;.&lt;/p&gt;
&lt;p&gt;... Or maybe I can swing something with object types.
Like, structural typing gets me &amp;quot;I can sort of have type lattice stuff&amp;quot;, but I think it's going to discard that information pretty aggressively.
I guess the big thing I need to think about is &amp;quot;how do I think this information is even going to get consumed?&amp;quot;
Like, I can figure out how to write tests for these properties, but I'm not sure how to express &amp;quot;these properties are needed for this context&amp;quot;.&lt;/p&gt;
&lt;p&gt;I'll have to think about it, and then commit to something for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category><category term="running in place"></category></entry><entry><title>Weekly Roundup 2023-06-27</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-06-27" rel="alternate"></link><published>2023-06-27T04:00:00-04:00</published><updated>2023-06-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-06-27:/weekly-roundup-2023-06-27</id><summary type="html">&lt;p class="first last"&gt;Just trying to get to grip with the idiomatic way to do things in OCaml.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I laid out some ideas for stuff to do in OCaml.&lt;/li&gt;
&lt;li&gt;Thursday: I tried to explain what I'm trying to accomplish in OCaml.&lt;/li&gt;
&lt;li&gt;Friday: I thought some about how to write the tests for the OCaml stuff.&lt;/li&gt;
&lt;li&gt;Saturday: Peglin...&lt;/li&gt;
&lt;li&gt;Sunday: I had even more thoughts about how to write the property-based tests in OCaml.&lt;/li&gt;
&lt;li&gt;Monday: Didn't do much I guess.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm hopefully going to get more done with OCaml or writing or something.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="OCaml"></category><category term="Peglin"></category></entry><entry><title>Diary 2023-06-26</title><link href="https://mwchase.neocities.org/diary-2023-06-26" rel="alternate"></link><published>2023-06-26T04:00:00-04:00</published><updated>2023-06-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-06-26:/diary-2023-06-26</id><summary type="html">&lt;p class="first last"&gt;I think I need to figure out how to take a break or something. Don't bother reading this post.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was kind of out of it today, and we were doing stuff that I don't have anything to write about, so, eh.&lt;/p&gt;
&lt;p&gt;It sucks that I don't have more to write for now, but I don't.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2023-06-25</title><link href="https://mwchase.neocities.org/coding-2023-06-25" rel="alternate"></link><published>2023-06-25T04:00:00-04:00</published><updated>2023-06-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-06-25:/coding-2023-06-25</id><summary type="html">&lt;p class="first last"&gt;No idea what standards to apply.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I mostly took things easy today.
I did just now mess around with writing OCaml modules representing some simple groups.
From doing this, I concluded that I need to tweak things some more.&lt;/p&gt;
&lt;p&gt;Here's the deal.
I wrote a functor that creates a cyclic group given a module containing an int.
However.
If I want to generate tests for such a module, I need to let the functor that generates the tests know what the order of the group is.&lt;/p&gt;
&lt;p&gt;I &lt;em&gt;think&lt;/em&gt; there are two ways to accomplish this:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Create a new signature specifically for cyclic groups that exposes the order.&lt;/li&gt;
&lt;li&gt;Create a functor that generates the relevant cyclic group, next to the module containing the tests.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I think I'm going to need to reach out to someone who knows what they're doing, but my gut reaction is that it's probably more helpful in general to expose the order as part of the interface of the module.
My reasoning here is, suppose we have hypothetical other metaprogramming based around these kinds of functors.
I think it's a similar amount of effort to implement either option, but it &lt;em&gt;seems&lt;/em&gt; more helpful for multiple forms of metaprogramming to all act on the same module, rather than generating their own copies.
(My recollection is that each invocation of a functor is a distinct module, even if the input modules are identical.)
And this would theoretically allow people to supply their own implementations of, for example, cyclic groups.
Not &lt;em&gt;obviously&lt;/em&gt; helpful, but I don't see what preventing it would accomplish.&lt;/p&gt;
&lt;p&gt;Anyway, it's late, and I should wrap things up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category><category term="short post"></category></entry><entry><title>Diary 2023-06-24</title><link href="https://mwchase.neocities.org/diary-2023-06-24" rel="alternate"></link><published>2023-06-24T04:00:00-04:00</published><updated>2023-06-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-06-24:/diary-2023-06-24</id><summary type="html">&lt;p class="first last"&gt;Had some misplays, but still pulled it off clean.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay.
I poked a bit at the OCaml stuff, but didn't get too much done.
Some writing.
Some Peglin.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;*ahem*&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Kind of a lot of Peglin.
If I get a few more good runs, I should get another orb unlocked.
It's not a &lt;em&gt;good&lt;/em&gt; orb, but it's another orb.&lt;/p&gt;
&lt;p&gt;I'm not thinking of anything else to write, so, oh well, calling it here.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Peglin"></category><category term="short post"></category></entry><entry><title>Coding 2023-06-23</title><link href="https://mwchase.neocities.org/coding-2023-06-23" rel="alternate"></link><published>2023-06-23T04:00:00-04:00</published><updated>2023-06-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-06-23:/coding-2023-06-23</id><summary type="html">&lt;p class="first last"&gt;I'm still not totally sure I've got the right overall organization here.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I just sketched out the eight basic signatures relevant to group theory.
The next thing to look into is the twelve functors that are apparently necessary to represent &amp;quot;forgetting parts of the structure&amp;quot;.
Most of these should be really easy.
(I guess there can be a few more, but, eh.)&lt;/p&gt;
&lt;p&gt;After all of that, I can start thinking about functors along the lines of &amp;quot;here is a generator function associated with this structure&amp;quot; and &amp;quot;here are the tests for checking specific properties&amp;quot;, and then &amp;quot;here are the tests for checking combinations of properties&amp;quot;.&lt;/p&gt;
&lt;p&gt;Once I prove that stuff out with simple things like permutation groups, symmetry groups, and modular arithmetic, I can try to build out more elaborate structures, at which point I should have everything I need to work on stuff like geometric algebra.&lt;/p&gt;
&lt;p&gt;Just pondering this a little, but I guess the test functors would need something like another set of signatures that just refer to the particular functions in use, and they can use that to be like &amp;quot;whatever module you pass in needs to express these capabilities&amp;quot;.&lt;/p&gt;
&lt;p&gt;I'm not sure, though.
Maybe it's sufficient to say &amp;quot;we compare the behavior to this simpler structure that does test for the property&amp;quot;.
But where does that leave stuff like commutativity?&lt;/p&gt;
&lt;p&gt;I'm going to see if these questions are any less vexing tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category><category term="short post"></category></entry><entry><title>Coding 2023-06-22</title><link href="https://mwchase.neocities.org/coding-2023-06-22" rel="alternate"></link><published>2023-06-22T04:00:00-04:00</published><updated>2023-06-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-06-22:/coding-2023-06-22</id><summary type="html">&lt;p class="first last"&gt;Really not trying to throw shade with any of these comments.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, yesterday in the summary, I promised to motivate my efforts to represent algebraic structures in OCaml.
The motivation is a little abstract, but I'm going to try anyway.&lt;/p&gt;
&lt;p&gt;One common aspect of mathematics is to build complex concepts on top of simpler ones.
In some cases, it's essentially possible to swap out the specific &amp;quot;simpler concept&amp;quot; for a different one with similar properties.
To get even more hand-wavy, there is a type of algebraic structure called a &amp;quot;field&amp;quot;, which is basically &amp;quot;something that you can do high-school algebra to&amp;quot;, and &amp;quot;being able to do high-school algebra to something&amp;quot; is a prerequisite for being able to do &lt;em&gt;college-level&lt;/em&gt; algebra to it.&lt;/p&gt;
&lt;p&gt;In other words, if you have a bunch of fields, and a bunch of things that &lt;em&gt;do something&lt;/em&gt; to fields, you can snap them together arbitrarily like legos with no physical form.
Basically, I want to really grasp stuff like geometric algebra, and, um, things that Norman Wildberger thinks would be easier to teach than current curricula, and also have the tools to pose questions like &amp;quot;what's the weirdest thing I can come up with that's still technically a 'triangle'?&amp;quot;&lt;/p&gt;
&lt;p&gt;I'll see when I'm up for actually working on this; I was kind of tired and out of it today, so maybe tomorrow, maybe later.
For now...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category></entry><entry><title>Coding 2023-06-21</title><link href="https://mwchase.neocities.org/coding-2023-06-21" rel="alternate"></link><published>2023-06-21T04:00:00-04:00</published><updated>2023-06-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-06-21:/coding-2023-06-21</id><summary type="html">&lt;p class="first last"&gt;I got so bogged down in the mid-level details here that I forgot to motivate this stuff any more concretely. Um, I have my reasons, trust me.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I'm kind of out of it right now, but I'd like to work through my ideas for other stuff to try with OCaml.
One concept that ML-style modules seem well-suited to representing is that of an &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Algebraic_structure"&gt;algebraic structure&lt;/a&gt;, which is something that Missable Mysteries would have/will end up covering.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Kind of want to change the name...&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I've tied myself in knots trying to fit an algebraic structure (admittedly a somewhat complicated one) into typed Python.
I think doing it in Rust would require a bunch of newtypes in the general case, because Rust traits are all about &amp;quot;the implementation&amp;quot; of a concept, and some of the really interesting stuff happens when you're explicitly manipulating multiple groups derived from the same set.&lt;/p&gt;
&lt;p&gt;Whereas in OCaml, a specific algebraic structure would be a module, a kind of algebraic structure would be a module signature, and a mapping between algebraic structures, such as &amp;quot;forgetting&amp;quot; parts of a structure, would be a functor.&lt;/p&gt;
&lt;p&gt;This is &lt;em&gt;slightly&lt;/em&gt; short of what I want, because I'm not sure if there's a good statically-analyzable way to handle the &lt;em&gt;axioms&lt;/em&gt; of an algebraic structure.
So, what I want to see if I can do is to express axioms in a form that a property-based testing library can handle.
I searched around a bit, and found &lt;a class="reference external" href="https://github.com/c-cube/qcheck"&gt;qcheck&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I think there are two basic concepts that need to be defined together to write the kind of tests I have in mind:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;An axiom corresponds to a test function.&lt;/li&gt;
&lt;li&gt;An algebraic structure will have some associated types, which need to have some kind of generator to produce values.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I guess all of this is going to take a bunch more modules and functors.
Like, given an algebraic structure with some signature, that needs to combine with a generator, which... stuff happens, and eventually a module pops out with a list of tests.&lt;/p&gt;
&lt;p&gt;Properties to test include:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;totality&lt;/li&gt;
&lt;li&gt;commutativity&lt;/li&gt;
&lt;li&gt;associativity&lt;/li&gt;
&lt;li&gt;divisibility&lt;/li&gt;
&lt;li&gt;invertibility&lt;/li&gt;
&lt;li&gt;identity&lt;/li&gt;
&lt;li&gt;distributivity&lt;/li&gt;
&lt;li&gt;forgetting properties in different orders results in structures with the same behavior&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm pretty tired, so I'm going to wrap this up now, and then sketch out exactly how I think this stuff should fit together.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category></entry><entry><title>Weekly Roundup 2023-06-20</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-06-20" rel="alternate"></link><published>2023-06-20T04:00:00-04:00</published><updated>2023-06-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-06-20:/weekly-roundup-2023-06-20</id><summary type="html">&lt;p class="first last"&gt;The fact that I don't usually say to much about the day of these entries really cut down on the drama this week.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: Peglin and OCaml.&lt;/li&gt;
&lt;li&gt;Thursday: Peglin and OCaml.&lt;/li&gt;
&lt;li&gt;Friday: I worked a little on OCaml stuff, and included a digression that inspired me to somewhat improve keyboard-related stuff. That's not quite all the way done, but whatever.&lt;/li&gt;
&lt;li&gt;Saturday: Some more progress with OCaml.&lt;/li&gt;
&lt;li&gt;Sunday: Travel and Peglin.&lt;/li&gt;
&lt;li&gt;Monday: Travel and sort of OCaml.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try and make more progress with OCaml, and maybe branch out into some stuff that I can talk about without worrying about &amp;quot;spoilers&amp;quot;.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Peglin"></category><category term="OCaml"></category></entry><entry><title>Diary 2023-06-19</title><link href="https://mwchase.neocities.org/diary-2023-06-19" rel="alternate"></link><published>2023-06-19T04:00:00-04:00</published><updated>2023-06-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-06-19:/diary-2023-06-19</id><summary type="html">&lt;p class="first last"&gt;*shrug*&lt;/p&gt;
</summary><content type="html">&lt;p&gt;And, we traveled back, and I'm still a little out of it.&lt;/p&gt;
&lt;p&gt;I've been messing with some ideas for the OCaml stuff, and I'll try to execute on them later, but right now it's late and I need to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="travel"></category><category term="short post"></category></entry><entry><title>Diary 2023-06-18</title><link href="https://mwchase.neocities.org/diary-2023-06-18" rel="alternate"></link><published>2023-06-18T04:00:00-04:00</published><updated>2023-06-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-06-18:/diary-2023-06-18</id><summary type="html">&lt;p class="first last"&gt;The Peglin Wikia seems to have gotten painfully out-of-date.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;We traveled today, so I'm kind of out of it.&lt;/p&gt;
&lt;p&gt;Nevertheless, I now have almost all of the unlocks in Peglin that seem... reasonable?
I'm missing a seemingly very rare event combination, several Cruciball levels, and a relic that can only be unlocked in custom games.&lt;/p&gt;
&lt;p&gt;The sensible thing to do is to try for the rare events while pushing Cruciball levels, since the custom unlock conditions look... silly.
Like, that there is a meme run.&lt;/p&gt;
&lt;p&gt;Or maybe I'll step away from all that for now, and do, like, an All Skull Orbs custom run or something.&lt;/p&gt;
&lt;p&gt;Anyway, it's late and I can't think of anything else to say.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Peglin"></category><category term="short post"></category></entry><entry><title>Coding 2023-06-17</title><link href="https://mwchase.neocities.org/coding-2023-06-17" rel="alternate"></link><published>2023-06-17T04:00:00-04:00</published><updated>2023-06-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-06-17:/coding-2023-06-17</id><summary type="html">&lt;p class="first last"&gt;It still doesn't actually compile. Oh well.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I'm still not feeling great, so I'm going to make this quick.&lt;/p&gt;
&lt;p&gt;I poked at my OCaml Cryptopals code today, and I'm getting it into a position that I think makes more sense, but it's going to be even better once I put together some functors.
This is perhaps &amp;quot;ludicrous overkill&amp;quot;, but I really really don't want to write two copies of this helper code.&lt;/p&gt;
&lt;p&gt;(By the way I played a little Peglin and I can't tell if it was trying to unlock orbs or playing on the highest unlocked Cruciball, but Cruciball 7 is a &lt;em&gt;pain&lt;/em&gt;.)&lt;/p&gt;
&lt;p&gt;Anyway, I've got some more helper code to write.
It's really pleasant putting some of this stuff together.&lt;/p&gt;
&lt;p&gt;For now, I really need to get to bed, though.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category><category term="Cryptopals"></category><category term="short post"></category></entry><entry><title>Coding 2023-06-16</title><link href="https://mwchase.neocities.org/coding-2023-06-16" rel="alternate"></link><published>2023-06-16T04:00:00-04:00</published><updated>2023-06-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-06-16:/coding-2023-06-16</id><summary type="html">&lt;p class="first last"&gt;Not sure what messed me up so badly today, but at least I did something.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I wasn't up for much today, because I had a terrible headache for a lot of it.&lt;/p&gt;
&lt;p&gt;I was able to start on &lt;em&gt;some&lt;/em&gt; coding stuff though.
I've made several attempts over the years to do &lt;a class="reference external" href="https://cryptopals.com/"&gt;Cryptopals&lt;/a&gt; stuff in Python, and I've solved the early sets in, as I recall, a few different ways.
(I... don't want to actually look at the old code, because some of it is so cursed that I can't currently type like that, though that's admittedly more to do with not bothering to set up the proper keyboard-related software.)&lt;/p&gt;
&lt;p&gt;I'm messing around with the code for the very first challenge.
Basically, putting a lot of effort into being a very specific kind of lazy.
Specifically, I'm not checking whether there are already libraries for what the challenge is about.
And I'm trying to avoid boilerplate.
This is going to make a bunch of the code really &amp;quot;clever&amp;quot;, but that's kind of the point, so.&lt;/p&gt;
&lt;p&gt;In any case, I still haven't had the time and focus to get this to a point where it all even compiles, so, you know, slow going with a new language.
I'll just have to keep at it.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="OCaml"></category><category term="Cryptopals"></category><category term="short post"></category></entry><entry><title>Diary 2023-06-15</title><link href="https://mwchase.neocities.org/diary-2023-06-15" rel="alternate"></link><published>2023-06-15T04:00:00-04:00</published><updated>2023-06-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-06-15:/diary-2023-06-15</id><summary type="html">&lt;p class="first last"&gt;Died to the final boss due to having no healing whatsoever. So sad.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hoo boy, finally got the Balladin.
Now I just need to figure out what random stuff I still need to unlock.
I think there are a few things that I assume I must have taken that I actually haven't.
The other side of it, of course, is events in the Castle that just.
don't.
spawn.&lt;/p&gt;
&lt;p&gt;Anyway, I'm done with that for tonight.
After I post this, I'm going to mess around with OCaml stuff...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Peglin"></category><category term="short post"></category></entry><entry><title>Diary 2023-06-14</title><link href="https://mwchase.neocities.org/diary-2023-06-14" rel="alternate"></link><published>2023-06-14T04:00:00-04:00</published><updated>2023-06-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-06-14:/diary-2023-06-14</id><summary type="html">&lt;p class="first last"&gt;I guess I'm taking things easy?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Still trying to get that really nice Ballwark build in Peglin, but at least I've grabbed a few new orbs.&lt;/p&gt;
&lt;p&gt;Aside from that, I'm still trying to learn OCaml, and trying to work on Fair Fights.
I made a separate blog for Fair Fights stuff, and I'll link it once there's anything there.&lt;/p&gt;
&lt;p&gt;As far as OCaml goes, I'm most interested to learn the equivalent, where applicable, of common Python idioms, because if I try to just translate stuff over in a literal way, that... is unlikely to work.&lt;/p&gt;
&lt;p&gt;Anyway, it's late and I should get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Peglin"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2023-06-13</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-06-13" rel="alternate"></link><published>2023-06-13T04:00:00-04:00</published><updated>2023-06-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-06-13:/weekly-roundup-2023-06-13</id><summary type="html">&lt;p class="first last"&gt;Peglin.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I played Peglin and did &lt;em&gt;a little&lt;/em&gt; conlanging.&lt;/li&gt;
&lt;li&gt;Thursday: Just all Peglin.&lt;/li&gt;
&lt;li&gt;Friday: More Peglin, and messing with learning programming languages.&lt;/li&gt;
&lt;li&gt;Saturday: More Peglin, and I wondered whether there's an &amp;quot;intended&amp;quot; time to get into custom starts.&lt;/li&gt;
&lt;li&gt;Sunday: We went out and did a bunch of stuff, and I somehow had the energy for Peglin afterwards.&lt;/li&gt;
&lt;li&gt;Monday: Yet more Peglin.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm not going to lie, there's probably going to be more Peglin.
I've got a few other things I might have &lt;em&gt;something&lt;/em&gt; to say about, but we'll see.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Peglin"></category></entry><entry><title>Diary 2023-06-12</title><link href="https://mwchase.neocities.org/diary-2023-06-12" rel="alternate"></link><published>2023-06-12T04:00:00-04:00</published><updated>2023-06-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-06-12:/diary-2023-06-12</id><summary type="html">&lt;p class="first last"&gt;Getting up early so I can get plenty of rest, or something.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was pretty out of it today.
I unlocked &lt;em&gt;stuff&lt;/em&gt; in Peglin, but I forget exactly what.
A few relics that I was like &amp;quot;Now I can feel okay about never taking this again&amp;quot;, and some like &amp;quot;Oh, I probably had a build in the past that would have benefited from this, but I forgot about the relevant stuff for the synergies.&amp;quot;&lt;/p&gt;
&lt;p&gt;Aside from that, I just mostly took things easy.&lt;/p&gt;
&lt;p&gt;Messed around with my appearance a little.
It's a work in progress, and I don't want to go into any more detail right now.&lt;/p&gt;
&lt;p&gt;I don't remember if there was anything else worth talking about, so I'm just going to cut this now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Peglin"></category><category term="short post"></category></entry><entry><title>Diary 2023-06-11</title><link href="https://mwchase.neocities.org/diary-2023-06-11" rel="alternate"></link><published>2023-06-11T04:00:00-04:00</published><updated>2023-06-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-06-11:/diary-2023-06-11</id><summary type="html">&lt;p class="first last"&gt;Crowds...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Ooouuuugh...&lt;/p&gt;
&lt;p&gt;I feel like a ping-pong ball that was in a dryer.
That didn't stop me from unlocking a Cruciball level, but I don't really feel like doing anything else now.&lt;/p&gt;
&lt;p&gt;Okay, time to try to relax.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Peglin"></category><category term="short post"></category></entry><entry><title>Diary 2023-06-10</title><link href="https://mwchase.neocities.org/diary-2023-06-10" rel="alternate"></link><published>2023-06-10T04:00:00-04:00</published><updated>2023-06-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-06-10:/diary-2023-06-10</id><summary type="html">&lt;p class="first last"&gt;Seems like games are what I'm up for currently.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Whew, making more progress in Peglin.
I ended up with a bunch of conflicting synergies, that basically compensated for the fact that they worked against each other by just always swinging high.
Just like, &amp;quot;this is a Muscircle build!&amp;quot; *crits constantly*&lt;/p&gt;
&lt;p&gt;One thing I find myself wondering is, is there an &amp;quot;intended&amp;quot; time to mess around with custom starts?
Like, if I notice some weird interaction, should I just go for it and see what happens, even though I'm not yet halfway through the current crop of Cruciballs?&lt;/p&gt;
&lt;p&gt;I guess I'll ask around somewhere.
Right now, I need to wrap stuff up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Peglin"></category><category term="short post"></category></entry><entry><title>Diary 2023-06-09</title><link href="https://mwchase.neocities.org/diary-2023-06-09" rel="alternate"></link><published>2023-06-09T04:00:00-04:00</published><updated>2023-06-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-06-09:/diary-2023-06-09</id><summary type="html">&lt;p class="first last"&gt;NABTO going off in some kind of direction.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;It's possible that &amp;quot;unlock new orbs and relics&amp;quot;, &amp;quot;unlock more Cruciball levels&amp;quot; and &amp;quot;unlock new characters&amp;quot; are goals that I shouldn't be trying to pursue all simultaneously.
Oh well.&lt;/p&gt;
&lt;p&gt;Anyway, I ended up deciding to focus on learning OCaml for coding, at least for now.
My rationale is that the OCaml/Koka side of things is part of what I want to draw from for NABTO, with Python on the other side, and I want to have a better handle on OCaml, especially the module system, before I commit to any design decisions.
Like, I think there are a bunch of issues I have with Python that would be addressed by having ML-style modules instead of class-based inheritance, but I'm encountering some trade-offs when I imagine going all-in.&lt;/p&gt;
&lt;p&gt;I don't want to speculate too much, but it &lt;em&gt;looks&lt;/em&gt; like the next thing I'd want to look into, once I have a handle on OCaml (and I'm just now starting out, currently), is Julia.
But, like, one thing at a time.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;*cough* GDScript *cough*&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Two-ish things at a time.&lt;/p&gt;
&lt;p&gt;Anyway, it's getting late and I want to wrap things up for tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Peglin"></category><category term="coding"></category><category term="short post"></category></entry><entry><title>Diary 2023-06-08</title><link href="https://mwchase.neocities.org/diary-2023-06-08" rel="alternate"></link><published>2023-06-08T04:00:00-04:00</published><updated>2023-06-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-06-08:/diary-2023-06-08</id><summary type="html">&lt;p class="first last"&gt;Complete miracle that I won.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Peglinnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn...&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Use your words.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;That was a really spicy build I just pulled off.
Sapper's Sack and a bunch of Ballwark orbs, as well as &lt;em&gt;a bunch&lt;/em&gt; of other bomb relics.
Basically, I was constantly building bunkers around myself to compensate for the fact that I kept blowing up literally everything on screen.
I had no reliable in-battle healing.
I would have lost at the end if I hadn't kept an egg.&lt;/p&gt;
&lt;div class="admonition smiley smiley-glitchy"&gt;
&lt;p class="first admonition-title"&gt;:) (glitchy)&lt;/p&gt;
&lt;p class="last"&gt;This is super fun and not at all terrifying.
You all should try it.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;In any case, I unlocked some things, but not the stuff I was really hoping for.
And now, I'm going to make an effort to &lt;em&gt;not&lt;/em&gt; stay on my laptop for another hour, so I'm ending this here.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Peglin"></category><category term="short post"></category></entry><entry><title>Diary 2023-06-07</title><link href="https://mwchase.neocities.org/diary-2023-06-07" rel="alternate"></link><published>2023-06-07T04:00:00-04:00</published><updated>2023-06-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-06-07:/diary-2023-06-07</id><summary type="html">&lt;p class="first last"&gt;I thought I wasn't going to do anything on Fair Fights, but then I did a little, not enough to change the category though.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Peglinnnnnnnnnn...&lt;/p&gt;
&lt;p&gt;I unlocked the Roundrel.
Like, nearly six times over.
The final boss got down to a quarter health and then instantly died to the ridiculous amount of spinfection I stacked on it.&lt;/p&gt;
&lt;p&gt;Writing stuff for the blog made me remember about Fair Fights, so I messed around with some word order stuff.
And, while writing this post, I got far enough for now, that I'm going to try to take what I've got so far, and put it together into names, see what I'm missing.&lt;/p&gt;
&lt;p&gt;Once I've named, like, two monsters, I'll try to get back to game design and learning the tools.&lt;/p&gt;
&lt;p&gt;Right now, though, I'm going to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Peglin"></category><category term="conlanging"></category></entry><entry><title>Weekly Roundup 2023-06-06</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-06-06" rel="alternate"></link><published>2023-06-06T04:00:00-04:00</published><updated>2023-06-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-06-06:/weekly-roundup-2023-06-06</id><summary type="html">&lt;p class="first last"&gt;It's hard to think when it's hot; fortunately we should be able to deal now.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I messed around with stuff for the Fair Fights conlang.&lt;/li&gt;
&lt;li&gt;Thursday: I was kind of out of it. I contemplated speedruns that may or may not be interesting.&lt;/li&gt;
&lt;li&gt;Friday: I tried to do a bit more with the Fair Fights conlang, but I was really suffering through the heat.&lt;/li&gt;
&lt;li&gt;Saturday: I convinced building management to send someone to look at the AC. Building management did not convince them to show up that day.&lt;/li&gt;
&lt;li&gt;Sunday: The HVAC issues got explained and worked around, just in time for the heat to break. Oh well. I messed around some more with the Fair Fights conlang.&lt;/li&gt;
&lt;li&gt;Monday: I mostly played a bunch of Peglin.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to make some progress on the conlang, then put it on hold to learn GDScript.
I'm thinking I'll also mess around with OCaml and BQN.
That... probably won't be confusing.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="conlanging"></category></entry><entry><title>Diary 2023-06-05</title><link href="https://mwchase.neocities.org/diary-2023-06-05" rel="alternate"></link><published>2023-06-05T04:00:00-04:00</published><updated>2023-06-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-06-05:/diary-2023-06-05</id><summary type="html">&lt;p class="first last"&gt;I've got to write something every day. This is something. Therefore, it was enough to write it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So many things seem to be happening right now, and I haven't put in any real effort with that last Can of Wormholes level.
I did spend a bunch of today being... not super great at Peglin yet.&lt;/p&gt;
&lt;p&gt;I then ended up spending a bunch of time, instead of writing this post, trying and failing to figure out a simple way to convert a GitHub Pages site that uses a bunch of non-ASCII characters into a format that I can get on my e-reader.
I may have something, but I'll have to look into it tomorrow.
Because it's tomorrow now...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Fair Fights 2023-06-04</title><link href="https://mwchase.neocities.org/fair-fights-2023-06-04" rel="alternate"></link><published>2023-06-04T04:00:00-04:00</published><updated>2023-06-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-06-04:/fair-fights-2023-06-04</id><summary type="html">&lt;p class="first last"&gt;Incremental but necessary progress.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;A big thanks to the HVAC technician who showed up (a day late, but whatever...) and both noticed what was wrong with the system, and &lt;em&gt;explained it&lt;/em&gt;.
This reflects really poorly on literally every other professional who has looked at the system over the past two years, but, again, whatever.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Anyway, let's ponder how to make the Fair Fights Conlang sound the way I want it to.&lt;/p&gt;
&lt;p&gt;I've elected to give its syllables a modest collection of codas, but more extensive a set than what the cipher produces naturally.
This is helpful, because I want to give the nouns some inflections based on gender and case.
That's reasonable for a naming language, right?
Because you have to know how you're using the nouns that you're naming stuff with.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;They can't respond before you send the post.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Everyone's in agreement, then.
Good.&lt;/p&gt;
&lt;p&gt;Anyway, I want two or three genders here, and as far as cases go, the genitive for sure, dative is probably okay, and to round things out...&lt;/p&gt;
&lt;p&gt;I am going to see how far I can get with ergative and absolutive.
Make absolutive the &amp;quot;dictionary&amp;quot; case, and express the others via suffixes of some kind.&lt;/p&gt;
&lt;p&gt;I seem to have run out of inspiration for the night, so I'm going to just cut this off and wrap up for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Fair Fights"></category><category term="conlanging"></category></entry><entry><title>Diary 2023-06-03</title><link href="https://mwchase.neocities.org/diary-2023-06-03" rel="alternate"></link><published>2023-06-03T04:00:00-04:00</published><updated>2023-06-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-06-03:/diary-2023-06-03</id><summary type="html">&lt;p class="first last"&gt;It's going to rain for a week, but at least I'll be cool.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've almost 100%ed Can of Wormholes.
Some of these puzzles are a bit much.
Like, not figuring out what shape I'm supposed to make until I paste a screenshot into an image editor and mess with it.
Just a bit more of this, and I should be done.
I don't quite understand one of the achievements, but whatever.&lt;/p&gt;
&lt;p&gt;Oh, what's the status of the air conditioning?
WELL&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Hold please.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;DON'T KNOW WHY THEY WOULDN'T BELIEVE ME IN THE FIRST PLACE&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Oh boy, there's some kind of glitching going on.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;SAME ABILITY TO MAKE THE STATED TIME AS TO&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;We might be at this for a while.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;COULD HAVE AVOIDED ALL OF THIS IF THEY'D DONE IT RIGHT TWO YEARS AGO&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Oof. Bring it in, would you.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;HUFF&lt;/p&gt;
&lt;p&gt;HUFF&lt;/p&gt;
&lt;p&gt;So, that's been my day.&lt;/p&gt;
&lt;p&gt;Oh yeah, last night, I came up with some phonotactics for the Fair Fights conlang, so I'll try applying those tomorrow to see if they help make things more palatable.
Maybe I'll try to get started on that after I publish this, maybe not.
Either way, I'm going to call this entry here.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="adverse conditions"></category></entry><entry><title>Fair Fights 2023-06-02</title><link href="https://mwchase.neocities.org/fair-fights-2023-06-02" rel="alternate"></link><published>2023-06-02T04:00:00-04:00</published><updated>2023-06-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-06-02:/fair-fights-2023-06-02</id><summary type="html">&lt;p class="first last"&gt;I wish we could just skip ahead past the point where the AC cooks us.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I wasn't up for much today, and I won't be up for much tomorrow, because we're hitting high highs, and the HVAC in the apartment is [WORKING PERFECTLY FINE – source: people who aren't &lt;em&gt;in here&lt;/em&gt; all day].&lt;/p&gt;
&lt;p&gt;But I want to make some kind of progress on the Fair Fights conlang.
I'm going to look for patterns in the stuff I've labeled as good so far.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Use of /u/&lt;/li&gt;
&lt;li&gt;Detectable patterns in related words&lt;/li&gt;
&lt;li&gt;Possibly, use of /ja/&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unfortunately, it's pretty late, so I'm going to try to cut this short.
Looking at what I have, I think I need to put together proper phonology and phonotactics, because I skipped doing that due to the cipher.
That might give me a vaguely more principled way to reject some of the stuff I didn't like.&lt;/p&gt;
&lt;p&gt;Anyway, time to flop over in bed and stew in my sweat.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Fair Fights"></category><category term="conlanging"></category><category term="short post"></category></entry><entry><title>Diary 2023-06-01</title><link href="https://mwchase.neocities.org/diary-2023-06-01" rel="alternate"></link><published>2023-06-01T04:00:00-04:00</published><updated>2023-06-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-06-01:/diary-2023-06-01</id><summary type="html">&lt;p class="first last"&gt;I haven't really said much about Can of Wormholes. It's good.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The weather today wiped me out a little.
I did some writing, but not for Fair Fights.
Played more Can of Wormholes, which I've been playing a bunch; I'm currently at eighty-something percent, though all of the meaningful shortfall is in the final world.&lt;/p&gt;
&lt;p&gt;... I wonder what the low% runs for Can of Wormholes look like.
Like, you can skip some puzzles I think, although every puzzle that you use for wires you have to solve anyway, and it doesn't seem necessary to get every rocket to at least get started on the final world.
Although, it's possible I'm overthinking this; I don't remember if I know the conditions for getting the credits...&lt;/p&gt;
&lt;p&gt;Hm.
I'm watching an any% run now, and I'm clearly going to have to look up what actually gates the ending.
Looking at all of the stuff the runner &lt;em&gt;isn't&lt;/em&gt; doing, I'm now not sure how interesting the low% routing can be.&lt;/p&gt;
&lt;p&gt;Oh well.
I'll see if I'm up for more stuff tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="adverse conditions"></category></entry><entry><title>Fair Fights 2023-05-31</title><link href="https://mwchase.neocities.org/fair-fights-2023-05-31" rel="alternate"></link><published>2023-05-31T04:00:00-04:00</published><updated>2023-05-31T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-05-31:/fair-fights-2023-05-31</id><summary type="html">&lt;p class="first last"&gt;I really hope I'm only down this rabbit hole for, like, a week.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm still categorizing roots, but at this point, I should be good to rate the many roots, and look for common patterns in the ones I like.
Once I get some solid patterns in the parts of speech I'm considering, I'll start entering stuff into a database to hopefully be able to handle stuff like sound changes so I can get the conlang that I actually want.&lt;/p&gt;
&lt;p&gt;For right now, I'm going to lie down and mess with the number system.
It's getting late and I want to stop looking at my screen.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Fair Fights"></category><category term="conlanging"></category></entry><entry><title>Weekly Roundup 2023-05-30</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-05-30" rel="alternate"></link><published>2023-05-30T04:00:00-04:00</published><updated>2023-05-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-05-30:/weekly-roundup-2023-05-30</id><summary type="html">&lt;p class="first last"&gt;Changing my focus around a bit.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I decided to step away from MOTR in particular, and Python in my spare time in general, because I was having such a bad time with the &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt; lugin.&lt;/li&gt;
&lt;li&gt;Thursday: I started learning Godot.&lt;/li&gt;
&lt;li&gt;Friday: I made a little more progress following along with the Godot tutorials.&lt;/li&gt;
&lt;li&gt;Saturday: Nothing really happened apparently.&lt;/li&gt;
&lt;li&gt;Sunday: I made a new category, for a project which is already several layers deep in weird detours.&lt;/li&gt;
&lt;li&gt;Monday: I hopefully made some progress within the weird detours.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to get the Fair Fights stuff to the point where I can name a monster, finally.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="MOTR"></category><category term="GDScript"></category><category term="Fair Fights"></category></entry><entry><title>Fair Fights 2023-05-29</title><link href="https://mwchase.neocities.org/fair-fights-2023-05-29" rel="alternate"></link><published>2023-05-29T04:00:00-04:00</published><updated>2023-05-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-05-29:/fair-fights-2023-05-29</id><summary type="html">&lt;p class="first last"&gt;Currently taking a text file and just turning it into absolute nonsense.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, here we go.
I've got a start on the roots, and they're ciphered.
At this point, I need to kind of rate the resulting roots and pick out any patterns.
As a run-up to this, I redid the part-of-speech classification for some of the roots.
It &lt;em&gt;maybe&lt;/em&gt; would have made more sense to do that before I picked out roots and ciphered them, but whatever, it's fine.&lt;/p&gt;
&lt;p&gt;The current status is, some of the roots look a little hard to pronounce, and I don't really like some of them, while some of them I like a lot, and others show some patterns I could work with.
I'm currently not up for rating and drawing connections for this stuff, but hopefully in the next few days.&lt;/p&gt;
&lt;p&gt;Until then, I'm going to sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Fair Fights"></category><category term="conlanging"></category></entry><entry><title>Fair Fights 2023-05-28</title><link href="https://mwchase.neocities.org/fair-fights-2023-05-28" rel="alternate"></link><published>2023-05-28T04:00:00-04:00</published><updated>2023-05-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-05-28:/fair-fights-2023-05-28</id><summary type="html">&lt;p class="first last"&gt;A new category? I can do that? Um, anyway, this is why I'm eventually learning GDScript.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, Fair Fights.
Here's the deal.&lt;/p&gt;
&lt;p&gt;I've been messing around a bunch with the concept of a fakemon region.
However, in the end, I decided to step away from &amp;quot;fan content for an existing franchise&amp;quot;, and tried to come up with something similar but distinct.
Playing a little bit of &lt;a class="reference external" href="https://www.cassettebeasts.com/"&gt;Cassette Beasts&lt;/a&gt; gave me the inspiration I needed to take the core combat mechanics in a different direction, and I ended up coming up with a few other ideas that further distinguished things.
I won't go over those just yet, because I want to learn enough Godot to put together a prototype to determine whether all of these ideas are actually... good.&lt;/p&gt;
&lt;p&gt;In any case, right now I want to focus on designing monsters, and part of that is coming up with names for them.
As far as design goes, I want to consciously distance myself from Pokémon's design sensibilities, and to start with:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Instead of &amp;quot;balancing cool and cute&amp;quot;, I want to come up with designs that are &amp;quot;both ethereal and powerful&amp;quot;&lt;/li&gt;
&lt;li&gt;I want some other system for naming, different from puns, words smashed together, or just the name or sound of an animal&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the latter, I'm currently trying out &amp;quot;create a naming conlang&amp;quot;, which feels like maybe a decision not made from an objective assessment of multiple alternatives, but oh well.&lt;/p&gt;
&lt;p&gt;Here is my basic plan for attempting this:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Get a list of root words that seem relevant for coming up with names.&lt;/li&gt;
&lt;li&gt;Add roots relevant to Fair Fights.&lt;/li&gt;
&lt;li&gt;Pick a source language so I can be kind of lazy about coming up with roots.&lt;/li&gt;
&lt;li&gt;Apply an &lt;a class="reference external" href="http://jbr.me.uk/crypto.html"&gt;Ostamer-style cipher&lt;/a&gt; to the source language so the derivations aren't blatantly obvious.&lt;/li&gt;
&lt;li&gt;Look for patterns in the limited set of roots I'll choose, and try to regularize according to those patterns.&lt;/li&gt;
&lt;li&gt;Come up with morphological derivation rules that take advantage of those patterns, as well as paradigms for conjugation and declension.&lt;/li&gt;
&lt;li&gt;A few rounds of sound change.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of these steps, except the last three, are either done or straightforward.
I'm not sure about the third-from-the last or the second-from-the-last; we'll have to see.
The last one could be a pain, because I'm not sure what the best way is to apply sound changes.
I'm aware of a few different software packages where I'm not sure how to pick between them, and just doing everything manually is a possibility that I can keep in mind, but I kind of don't want to.&lt;/p&gt;
&lt;p&gt;Anyway, I'll get to that once I'm done with the rest.
Maybe it'll get me something I like, maybe it won't, but hopefully I'll be able to use what I learn in other projects.
For now, I'm going to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Fair Fights"></category><category term="conlanging"></category></entry><entry><title>Diary 2023-05-27</title><link href="https://mwchase.neocities.org/diary-2023-05-27" rel="alternate"></link><published>2023-05-27T04:00:00-04:00</published><updated>2023-05-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-05-27:/diary-2023-05-27</id><summary type="html">&lt;p class="first last"&gt;I've been having a lot of these lately. Oh well, safe to skip.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Um...&lt;/p&gt;
&lt;p&gt;What did I do today?
Spaced out a bunch, I guess.&lt;/p&gt;
&lt;p&gt;I think the best use of my time would be to cheap out on this entry, and try to find a good angle for designing stuff in Fair Fight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2023-05-26</title><link href="https://mwchase.neocities.org/coding-2023-05-26" rel="alternate"></link><published>2023-05-26T04:00:00-04:00</published><updated>2023-05-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-05-26:/coding-2023-05-26</id><summary type="html">&lt;p class="first last"&gt;Taking things slowly. Admittedly, very slowly, but whatever.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;A few quick thoughts on the Godot tutorials I've worked through so far:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Given my background, GDScript's syntax so far seems, like, aggressively approachable.
We'll see if that keeps up.&lt;/li&gt;
&lt;li&gt;I remember reading blog posts that had strong opinions about interactions between simulation steps and framerate.
...
*websearch*
...
Ah, it looks like &lt;a class="reference external" href="https://docs.godotengine.org/en/stable/tutorials/scripting/idle_and_physics_processing.html"&gt;I'm getting ahead of things&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The movement example feels painfully janky to luck at.
I don't know if that's a result of running it in debug mode, having too many browser tabs open, or what, but I kind of expected my machine to be able to handle a simple scene.
...
Okay, yeah, it was the browser tabs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hopefully, I won't run into too many issues in this area, since the game I want to make, codenamed Fair Fights (I need to find something with more unique initials) is turn-based-ish.
Stutter won't open up weird exploits, it'll just look kind of bad, so hopefully I'll be able to avoid it, but we'll see.&lt;/p&gt;
&lt;p&gt;Anyway, that's enough for now.
I'm going to get to bed, and see what I'm up for tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Godot"></category></entry><entry><title>Coding 2023-05-25</title><link href="https://mwchase.neocities.org/coding-2023-05-25" rel="alternate"></link><published>2023-05-25T04:00:00-04:00</published><updated>2023-05-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-05-25:/coding-2023-05-25</id><summary type="html">&lt;p class="first last"&gt;Not much to say; it's a little hard to think in this weather, with this pollen.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I'm still getting up to speed on Godot.
It's late right now, but up next is actually learning about GDScript.&lt;/p&gt;
&lt;p&gt;So, tomorrow, I'll hopefully be up for getting on with that.
For now, I'll sketch out ideas for the game I want to try to make.&lt;/p&gt;
&lt;p&gt;And cool off, because it is roasting in here, and my laptop isn't helping.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="short post"></category><category term="Godot"></category></entry><entry><title>Coding 2023-05-24</title><link href="https://mwchase.neocities.org/coding-2023-05-24" rel="alternate"></link><published>2023-05-24T04:00:00-04:00</published><updated>2023-05-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-05-24:/coding-2023-05-24</id><summary type="html">&lt;p class="first last"&gt;Nothing says &amp;quot;cool feature request&amp;quot; like withdrawing it accompanied by &amp;quot;I cannot in good conscience ask for this&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay.
I'm going to take a break from MOTR and MOTR auxiliaries for a while, so I'm currently looking at programming languages besides Python.&lt;/p&gt;
&lt;p&gt;There are a bunch of languages that I'm varying levels of interested in, but I'm focusing on Godot, because one thing I want to try doing more is talking about this stuff with my wife, and that's simply easier if I'm focused on making games, or something like them.&lt;/p&gt;
&lt;p&gt;Right now, I'm still going over the basics of the documentation.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;And spacing out.
Not going to get anything else done right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category><category term="Godot"></category></entry><entry><title>Weekly Roundup 2023-05-23</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-05-23" rel="alternate"></link><published>2023-05-23T04:00:00-04:00</published><updated>2023-05-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-05-23:/weekly-roundup-2023-05-23</id><summary type="html">&lt;p class="first last"&gt;Really not a fan of how the current version of the &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt; plugin falls over and catches fire in the face of any mildly non-trivial usage of inheritance.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I gave some thought to extending the &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt; plugin to handling &lt;tt class="docutils literal"&gt;Union&lt;/tt&gt;s. Which is not a thing I need it to handle, but it seems reasonable.&lt;/li&gt;
&lt;li&gt;Thursday: I implemented &lt;tt class="docutils literal"&gt;Union&lt;/tt&gt; support, and wrote tests for a few other cases.&lt;/li&gt;
&lt;li&gt;Friday: I noticed that the &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt; plugin introduces implicit typecasts (as opposed to the explicit ones) if you do stuff that I don't care about, and tried to figure out what to do about that.&lt;/li&gt;
&lt;li&gt;Saturday: I noticed &lt;em&gt;another&lt;/em&gt; issue with the &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt; plugin caused by inheritance. Absurd.&lt;/li&gt;
&lt;li&gt;Sunday: Nothing worth writing about happened.&lt;/li&gt;
&lt;li&gt;Monday: Nothing worth writing about happened.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, maybe I'll work myself up to sort of finishing the &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt; plugin, but also I'm thinking of messing with other programming languages than Python for a bit.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Diary 2023-05-22</title><link href="https://mwchase.neocities.org/diary-2023-05-22" rel="alternate"></link><published>2023-05-22T04:00:00-04:00</published><updated>2023-05-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-05-22:/diary-2023-05-22</id><summary type="html">&lt;p class="first last"&gt;Let's see how I feel after sleeping. (This post can also be skipped.)&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I think I had something wrong with me these last few days.
I was kind of out of it, and then I felt much worse, and now, I'm... probably okay?
We'll see.&lt;/p&gt;
&lt;p&gt;I did mess around getting some stuff set up earlier today, and maybe I'll play with it later in the week.&lt;/p&gt;
&lt;p&gt;For now, I just want to lie down and relax.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2023-05-21</title><link href="https://mwchase.neocities.org/diary-2023-05-21" rel="alternate"></link><published>2023-05-21T04:00:00-04:00</published><updated>2023-05-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-05-21:/diary-2023-05-21</id><summary type="html">&lt;p class="first last"&gt;Not sure exactly what happened to me today, but this is another post that it's safe to skip.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm not feeling great today.
Just... super out of it.&lt;/p&gt;
&lt;p&gt;I've decided to deal with this by skimping on this post, and doodling ideas in my notebook.&lt;/p&gt;
&lt;p&gt;Hm, yeah, okay, nothing else to say right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2023-05-20</title><link href="https://mwchase.neocities.org/coding-2023-05-20" rel="alternate"></link><published>2023-05-20T04:00:00-04:00</published><updated>2023-05-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-05-20:/coding-2023-05-20</id><summary type="html">&lt;p class="first last"&gt;Trying to decide how much of a jerk I want to be to hypothetical future users of this stuff.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Iiii got distracted.&lt;/p&gt;
&lt;p&gt;However, I also noticed and fixed another issue in the &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt; plugin.
I'm not sure how that code is handling being such a bundle of issues...&lt;/p&gt;
&lt;p&gt;Anyway, the problem was, I was erasing types too aggressively.
&lt;em&gt;Technically&lt;/em&gt;, this isn't a problem for my use case, because I barely use subclassing.
But from a theoretical perspective...&lt;/p&gt;
&lt;p&gt;Basically, if you have a &lt;tt class="docutils literal"&gt;class Base(Generic[T])&lt;/tt&gt; and a &lt;tt class="docutils literal"&gt;class Derived(Base[int])&lt;/tt&gt;, then it can't be sound to treat a &lt;tt class="docutils literal"&gt;Derived&lt;/tt&gt; as a &lt;tt class="docutils literal"&gt;Base[str]&lt;/tt&gt;.
Or any other example you care to come up with.&lt;/p&gt;
&lt;p&gt;The solution is simple: for the subtype check (which I mostly have in place to deal with unions), erase the types on the &lt;tt class="docutils literal"&gt;inst&lt;/tt&gt; arg, but not on the &lt;tt class="docutils literal"&gt;typ&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;I still need to work out what I want it to do for non-final classes.
I guess I can argue: &amp;quot;It might not be valid, but if it is, then the return value is of type &lt;tt class="docutils literal"&gt;typ&lt;/tt&gt;, and any attribute on &lt;tt class="docutils literal"&gt;inst&lt;/tt&gt; but not &lt;tt class="docutils literal"&gt;typ&lt;/tt&gt; is, let's say required and of type &lt;tt class="docutils literal"&gt;Any&lt;/tt&gt;, and if &lt;tt class="docutils literal"&gt;inst&lt;/tt&gt; is non-final, maybe add a &lt;tt class="docutils literal"&gt;**kwargs: Any&lt;/tt&gt; of some kind, except I'm not sure how to handle name collisions in that case...&amp;quot;&lt;/p&gt;
&lt;p&gt;I'll think about it some more, but right now, I let things get way too late and I need to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2023-05-19</title><link href="https://mwchase.neocities.org/coding-2023-05-19" rel="alternate"></link><published>2023-05-19T04:00:00-04:00</published><updated>2023-05-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-05-19:/coding-2023-05-19</id><summary type="html">&lt;p class="first last"&gt;This nonsense is making me wish that NABTO existed...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Oh dear...
I realized that the &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt; plugin has some problems that the &lt;tt class="docutils literal"&gt;evolve&lt;/tt&gt; code it's based on does not, and I'm not quite sure what to do about them.&lt;/p&gt;
&lt;p&gt;Basically, the saltation operation is not valid if the runtime type is a strict subtype of the analyzed type, because attrs subclasses can add attributes.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;That... sounds like a dealbreaker.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Not if I disallow passing subclassable types!&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;... Which of us is which, again?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Really, the only thing I'm not sure of is whether I want passing non-final types to be a hard error, or to simply complain.&lt;/p&gt;
&lt;p&gt;But if it does fail, should I have it go all the way to &lt;tt class="docutils literal"&gt;Any&lt;/tt&gt;, or accept some kind of best guess for what the arguments would be?&lt;/p&gt;
&lt;p&gt;And I thought of more issues while I was pondering this stuff.
Let's see which questions I need to answer...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;What guarantees are broken if just the &lt;tt class="docutils literal"&gt;typ&lt;/tt&gt; argument allows subclassing?&lt;/li&gt;
&lt;li&gt;What guarantees are broken if the &lt;tt class="docutils literal"&gt;inst&lt;/tt&gt; argument allows subclassing?
Note that &lt;tt class="docutils literal"&gt;inst&lt;/tt&gt; should be a subclass of &lt;tt class="docutils literal"&gt;typ&lt;/tt&gt;, so it can't be the case that only &lt;tt class="docutils literal"&gt;inst&lt;/tt&gt; allows subclassing?&lt;/li&gt;
&lt;li&gt;Does the union-related code I copied out of the attrs plugin have the desired behavior in the context of &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt;?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'll have to think about this more later...
For now, I need to wind down properly.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2023-05-18</title><link href="https://mwchase.neocities.org/coding-2023-05-18" rel="alternate"></link><published>2023-05-18T04:00:00-04:00</published><updated>2023-05-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-05-18:/coding-2023-05-18</id><summary type="html">&lt;p class="first last"&gt;I feel like I should have more to say about this, but I... don't.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right.
I've got support in for union types in &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt;.
I don't anticipate that I'll use it in MOTR, but it was going to bother me that it wasn't there.
Let's see what's next to boost coverage...&lt;/p&gt;
&lt;p&gt;Bounded typevar?
Oh boy, that might actually break things?
Huh, it did okay.&lt;/p&gt;
&lt;p&gt;Well, there are a few more execution paths to puzzle out.
I'll get those later.
For now, I'm going to take things easy.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2023-05-17</title><link href="https://mwchase.neocities.org/coding-2023-05-17" rel="alternate"></link><published>2023-05-17T04:00:00-04:00</published><updated>2023-05-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-05-17:/coding-2023-05-17</id><summary type="html">&lt;p class="first last"&gt;Figuring out One Weird Trick for handling more cases, and incidentally cleaning up the overall structure of the code.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's think about the &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt; plugin some more.
There are a few transformations and checks I want to do.
Currently, on line 131, it expects to receive a &lt;tt class="docutils literal"&gt;typ&lt;/tt&gt; that is a &lt;tt class="docutils literal"&gt;TypeType&lt;/tt&gt;, an &lt;tt class="docutils literal"&gt;AnyType&lt;/tt&gt;, or just wrong.
This needs to be extended to handling a &lt;tt class="docutils literal"&gt;UnionType&lt;/tt&gt;.
For a &lt;tt class="docutils literal"&gt;UnionType&lt;/tt&gt;, we basically need to handle any of the &lt;tt class="docutils literal"&gt;items&lt;/tt&gt; potentially being &lt;tt class="docutils literal"&gt;Any&lt;/tt&gt; or otherwise not &lt;tt class="docutils literal"&gt;TypeType&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Something like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;return_permissive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;magic_func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_proper_type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TypeType&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;pass&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AnyType&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;return_permissive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;return_permissive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;return_permissive&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;permissive_signature&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I'm not feeling great about the exact structure there, but anyway.
Line 136 converts the &lt;tt class="docutils literal"&gt;TypeType&lt;/tt&gt; or the &lt;tt class="docutils literal"&gt;UnionType&lt;/tt&gt; of &lt;tt class="docutils literal"&gt;TypeType&lt;/tt&gt;s into either the underlying type, or the union of the underlying types.
I can get that by augmenting the above lines.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;return_permissive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;magic_func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_proper_type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TypeType&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AnyType&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;return_permissive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;return_permissive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;return_permissive&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;permissive_signature&lt;/span&gt;

&lt;span class="n"&gt;typ_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;UnionType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;make_union&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The next code to handle is at 159.
I'm not quite sure what has to be done here.
There are two angles to take.
The actual type comparisons have to reach into the unions, and convert all args to &lt;tt class="docutils literal"&gt;Instance&lt;/tt&gt; types to &lt;tt class="docutils literal"&gt;Any&lt;/tt&gt;.
For diagnostics, I need to construct a sequence of names, and potentially do extra formatting to it.&lt;/p&gt;
&lt;p&gt;I think I understand how all of this needs to be implemented, but I don't want to do it right now.
At least I'm pretty sure I know what to do.&lt;/p&gt;
&lt;p&gt;And what to do now, is get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Weekly Roundup 2023-05-16</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-05-16" rel="alternate"></link><published>2023-05-16T04:00:00-04:00</published><updated>2023-05-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-05-16:/weekly-roundup-2023-05-16</id><summary type="html">&lt;p class="first last"&gt;My hope with MOTR is that I can get it into a state where I can once again routinely get this kind of &amp;quot;switching projects&amp;quot; boost.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I cooled off a little after getting the &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt; plugin not quite working. While I was messing around, I discovered that the site theme was a little illegible, according to Color Science.&lt;/li&gt;
&lt;li&gt;Thursday: I got the new theme mostly done, but elected to hold off due to a few issues.&lt;/li&gt;
&lt;li&gt;Friday: I fixed a bunch of problems, and got the theme to a point where I'm happier with it now than I ever was with the old one, so I pushed it out.&lt;/li&gt;
&lt;li&gt;Saturday: I tried to work out exactly how deficient the &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt; plugin currently is. The answer is, just enough to bother me.&lt;/li&gt;
&lt;li&gt;Sunday: We traveled.&lt;/li&gt;
&lt;li&gt;Monday: We did not travel, but I didn't have anything to write about regardless, so eh.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I can either try to finish up the &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt; plugin, or conclude that it's good enough for my current purposes, so I can push ahead using it.
Maybe both?&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="web design"></category></entry><entry><title>Diary 2023-05-15</title><link href="https://mwchase.neocities.org/diary-2023-05-15" rel="alternate"></link><published>2023-05-15T04:00:00-04:00</published><updated>2023-05-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-05-15:/diary-2023-05-15</id><summary type="html">&lt;p class="first last"&gt;Still nothing to see here.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm still taking things easy.
Playing puzzle games a bunch.&lt;/p&gt;
&lt;p&gt;Not coming up with anything substantive to put in a post.&lt;/p&gt;
&lt;p&gt;I'm going to just cut this off early again, because otherwise I'd probably spend half an hour not making this post any longer, when I could simply have it not be any longer now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2023-05-14</title><link href="https://mwchase.neocities.org/diary-2023-05-14" rel="alternate"></link><published>2023-05-14T04:00:00-04:00</published><updated>2023-05-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-05-14:/diary-2023-05-14</id><summary type="html">&lt;p class="first last"&gt;Nothing to see here.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;And we traveled today, so I'm not sure what to write about.&lt;/p&gt;
&lt;p&gt;I'm just going to try to take things easy, maybe doodle some stuff in my notebook.&lt;/p&gt;
&lt;p&gt;For now, this is it.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2023-05-13</title><link href="https://mwchase.neocities.org/coding-2023-05-13" rel="alternate"></link><published>2023-05-13T04:00:00-04:00</published><updated>2023-05-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-05-13:/coding-2023-05-13</id><summary type="html">&lt;p class="first last"&gt;Wait, have I already done this before?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, here we are, looking at the &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt; plugin again.
The key thing here is, I need to understand exactly how the &amp;quot;proper types&amp;quot; in Mypy work, because there are a lot of them, and what I'm doing currently is not quite right.
I need to work out how to activate each type of proper type, the correct behavior for it, and to devise corresponding tests.&lt;/p&gt;
&lt;p&gt;Let's see...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;TypeVarLikeType&lt;/tt&gt;&lt;ul&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;TypeVarType&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;ParamSpecType&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;TypeVarTupleType&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;I believe these should be treated as either their upper bound, or &lt;tt class="docutils literal"&gt;Any&lt;/tt&gt;.
Maybe fail?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;UnboundType&lt;/tt&gt; I'm not sure what to do with this if it shows up.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;CallableArgument&lt;/tt&gt; Should not show up.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;TypeList&lt;/tt&gt; Should not show up.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;UnpackType&lt;/tt&gt; Should not show up.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;AnyType&lt;/tt&gt; Should already be handled.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;UninhabitedType&lt;/tt&gt; Should be treated as &lt;tt class="docutils literal"&gt;Any&lt;/tt&gt;. Maybe can obtain using &lt;tt class="docutils literal"&gt;NoReturn&lt;/tt&gt;?&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;NoneType&lt;/tt&gt; It's &lt;tt class="docutils literal"&gt;None&lt;/tt&gt;. Should fail.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;ErasedType&lt;/tt&gt; Not sure how to hit this.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;DeletedType&lt;/tt&gt; I don't have an intuition for how this should interact with any of the plugin. Should probably just fail.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Instance&lt;/tt&gt; I'm trying to handle this already.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;FunctionLike&lt;/tt&gt;: &lt;tt class="docutils literal"&gt;CallableType&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Overloaded&lt;/tt&gt; These should fail.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Parameters&lt;/tt&gt; Probably should not show up.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;TupleType&lt;/tt&gt; Should fail.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;TypedDictType&lt;/tt&gt; Should fail.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;RawExpressionType&lt;/tt&gt; Should not show up.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;LiteralType&lt;/tt&gt; Should fail.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;UnionType&lt;/tt&gt; &lt;strong&gt;Needs special handling.&lt;/strong&gt; Every argument of a union needs to be transformed recursively.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;PartialType&lt;/tt&gt; If it shows up, the correct action is... probably complicated? Like okay, from a &amp;quot;do the types match&amp;quot; perspective, the correct action is to replace the placeholders with &lt;tt class="docutils literal"&gt;Any&lt;/tt&gt;. When it comes to the &lt;tt class="docutils literal"&gt;typ&lt;/tt&gt; argument, this shouldn't show up, so as &lt;tt class="docutils literal"&gt;inst&lt;/tt&gt;, when the types match, we need something like an attrs class with a field of type &lt;tt class="docutils literal"&gt;T | None&lt;/tt&gt;. I &lt;em&gt;think&lt;/em&gt; that makes a &lt;tt class="docutils literal"&gt;PartialType&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;EllipsisType&lt;/tt&gt; Should not show up.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;TypeType&lt;/tt&gt; Must be handled, with specific cases for &lt;tt class="docutils literal"&gt;Instance&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;AnyType&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;TypeVarType&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;TupleType&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;NoneType&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;CallableType&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;PlaceholderType&lt;/tt&gt; Should not show up?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, to summarize:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;typ&lt;/tt&gt; argument must handle &lt;tt class="docutils literal"&gt;TypeType&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;UnionType&lt;/tt&gt; of &lt;tt class="docutils literal"&gt;TypeType&lt;/tt&gt;.
Within the &lt;tt class="docutils literal"&gt;TypeType&lt;/tt&gt;, it needs special handling for &lt;tt class="docutils literal"&gt;AnyType&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Instance&lt;/tt&gt;.
&lt;em&gt;Maybe&lt;/em&gt; convert &lt;tt class="docutils literal"&gt;TypeVarType&lt;/tt&gt; to its upper bound, but probably don't.
Actually, there's even more subtlety here, bleh.
I kind of hope a constrained typevar just gets checked with the concrete values so I don't have to think about it?
Everything else should fail and coerce to &lt;tt class="docutils literal"&gt;Any&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;inst&lt;/tt&gt; argument needs to handle the same types as &lt;tt class="docutils literal"&gt;typ&lt;/tt&gt;, and maybe also &lt;tt class="docutils literal"&gt;PartialType&lt;/tt&gt;?&lt;/p&gt;
&lt;p&gt;From this, we see that the plugin is mostly done, but it still needs work, &lt;em&gt;mostly&lt;/em&gt; to cover the union cases.
I'll get to that whenever.
I'll at least write a test to see how messed up it all is.&lt;/p&gt;
&lt;p&gt;Okay, it's definitely messed up, and I'm not currently up for fixing it, so, whenever.
For now...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Diary 2023-05-12</title><link href="https://mwchase.neocities.org/diary-2023-05-12" rel="alternate"></link><published>2023-05-12T04:00:00-04:00</published><updated>2023-05-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-05-12:/diary-2023-05-12</id><summary type="html">&lt;p class="first last"&gt;Apparently, the secret to getting something done is complaining about how hard it is.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, here we are.
I'm posting this entry, and redoing all of the pages on this site, because I've finished updating the theme files.
Now, they're &lt;a class="reference external" href="https://github.com/jan-warchol/selenized/tree/master"&gt;Selenized&lt;/a&gt;.
While I was at it, I redid the light/dark mode theming to provide a proper fallback on low-end browsers what don't show up on &lt;a class="reference external" href="https://caniuse.com/"&gt;Can I use&lt;/a&gt;.
(I mean, I guess it shows up better on Internet Explorer.
(And Opera Mini.)
(I have not attempted to confirm this.))
And, lastly&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;At last!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonition smiley smiley-glitchy"&gt;
&lt;p class="first admonition-title"&gt;:) (glitchy)&lt;/p&gt;
&lt;p class="last"&gt;Somewhat improved legibility!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonition smiley smiley-glitchier"&gt;
&lt;p class="first admonition-title"&gt;:) (glitchier)&lt;/p&gt;
&lt;p class="last"&gt;The old version of this icon was too spicy to actually be used!&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Yep, we've come so far.
Maybe I'll remember to actually use that later.&lt;/p&gt;
&lt;p&gt;Anyway, at some point, I need to fix some bugs I discovered by rotating the &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt; plugin in my head, but for now, I should take things easy.
I'm going to be worrying enough about making sure there aren't any show-stoppers in this post.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="web design"></category></entry><entry><title>Diary 2023-05-11</title><link href="https://mwchase.neocities.org/diary-2023-05-11" rel="alternate"></link><published>2023-05-11T04:00:00-04:00</published><updated>2023-05-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-05-11:/diary-2023-05-11</id><summary type="html">&lt;p class="first last"&gt;Somehow, I've made my site even more minimal on low-end browsers than it already was.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right.
I've made a bunch of progress updating the color scheme for the blog.
It's not quite ready to go; I need to tweak a few CSS rules before I can expect it to work right.&lt;/p&gt;
&lt;p&gt;It's a little obnoxious that I can get so far basically on autopilot, and when it comes to a few finishing touches, those are seemingly going to take more effort than the rest of the work put together.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;I just now &lt;em&gt;hopefully&lt;/em&gt; got the CSS side of things right, and now what I need is to validate and remake some assets.
I think I'll just cut this entry here and take things easy.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2023-05-10</title><link href="https://mwchase.neocities.org/diary-2023-05-10" rel="alternate"></link><published>2023-05-10T04:00:00-04:00</published><updated>2023-05-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-05-10:/diary-2023-05-10</id><summary type="html">&lt;p class="first last"&gt;Not sure what everyone else thinks of my idea of a &amp;quot;fun side project&amp;quot;, but whatever.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I really went hard polishing the new plugin, so I'd like to take a bit of time to cool off.
I'll be trying to think about writing, but one other thing that I'm going to be thinking about is trying to make my blog more readable.
If you run &lt;a class="reference external" href="https://www.ssa.gov/accessibility/andi/help/install.html"&gt;ANDI&lt;/a&gt; on this blog, &lt;em&gt;some&lt;/em&gt; things are okay, but it's not happy with the color scheme.
(And there are other issues, but it's really unhappy with the color scheme.)&lt;/p&gt;
&lt;p&gt;I've got some ideas in mind to deal with that, but the first thing I thought of is not a drop-in replacement, so this may end up being some kind of a fun side project.&lt;/p&gt;
&lt;p&gt;Anyway, it's a little late and I don't want to force myself to go further, so I'm going to call things here.
(Maybe I should look into getting back into longer-form posts sometime...)&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2023-05-09</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-05-09" rel="alternate"></link><published>2023-05-09T04:00:00-04:00</published><updated>2023-05-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-05-09:/weekly-roundup-2023-05-09</id><summary type="html">&lt;p class="first last"&gt;The plugin is getting into a good position...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I looked over how the &lt;tt class="docutils literal"&gt;attrs&lt;/tt&gt; plugin handles the &lt;tt class="docutils literal"&gt;evolve&lt;/tt&gt; function.&lt;/li&gt;
&lt;li&gt;Thursday: I put together a weird implementation for &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Friday: I upgraded Mypy, and had trouble distringuishing between &lt;tt class="docutils literal"&gt;Tuple&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;tuple&lt;/tt&gt; in the failure messages.&lt;/li&gt;
&lt;li&gt;Saturday: As I spun up the plugin development, I realized that I'm going to want to pull this out into a separate package as soon as I can.&lt;/li&gt;
&lt;li&gt;Sunday: I started writing tests, and using their failure details to refine the plugin design.&lt;/li&gt;
&lt;li&gt;Monday: I got the broad details of the plugin pretty much locked in, so it's in a good shape now.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to fully polish the plugin, as well as develop the generic motrfile enough to pull the plugins out into their own packages.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-05-08</title><link href="https://mwchase.neocities.org/coding-2023-05-08" rel="alternate"></link><published>2023-05-08T04:00:00-04:00</published><updated>2023-05-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-05-08:/coding-2023-05-08</id><summary type="html">&lt;p class="first last"&gt;Still not a fan of how all of this has caused a full run to balloon to almost a minute of runtime, but oh well.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I spent a lot of today smacking my head into Mypy plugin stuff, and I think things are coming together and making more sense to me.
I've got better error messages and the signatures being returned are in better shape.&lt;/p&gt;
&lt;p&gt;From all of this, I now understand that I'm missing a specific case:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;saltate(typ: type[T], inst: Any, **changes: Any)&lt;/tt&gt;, when &lt;tt class="docutils literal"&gt;T&lt;/tt&gt; is an attrs class, should get typed like: &lt;tt class="docutils literal"&gt;saltate(typ: type[T], inst: Any, **changs: &amp;lt;the attributes of T&amp;gt;) &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; T&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;So, let's see if I can untangle that from the current plugin code.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, that wasn't too bad.&lt;/p&gt;
&lt;p&gt;I basically had to split apart a fancy conditional, and move a line up in the function, so I could construct a mediumly-permissive signature.
The result will sometimes construct somewhat peculiar signatures, but those edge cases should be accompanied by a type checking failure, so I don't believe there's a serious problem with that.&lt;/p&gt;
&lt;p&gt;There are a few big misses remaining in the plugin code that will be filled in by the positive test cases, but I want to focus on the last thing I don't quite understand:&lt;/p&gt;
&lt;p&gt;Is the length of &lt;tt class="docutils literal"&gt;ctx.args&lt;/tt&gt; determined solely by the function declaration, or does it somehow depend on the call being processed by the &lt;tt class="docutils literal"&gt;get_function_signature_hook&lt;/tt&gt;?&lt;/p&gt;
&lt;p&gt;If it's the former, I don't understand how I'd write tests for that branch.
If it's the latter, I still haven't figured out how to go down that branch.
I'm going to take the slightly spicy option of just asserting that my library method will always have exactly three arguments, from the perspective of names available within it.&lt;/p&gt;
&lt;p&gt;Anyway, once I have coverage on the hook function locked down, I'm going to work on expanding coverage in the helper functions.
This is likely to result in commenting out some blocks or something, but we'll see how that all goes when I take the time to do this stuff.
I'm also going to have to comment all of this code thoroughly.&lt;/p&gt;
&lt;p&gt;But right now, I'm going to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-05-07</title><link href="https://mwchase.neocities.org/coding-2023-05-07" rel="alternate"></link><published>2023-05-07T04:00:00-04:00</published><updated>2023-05-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-05-07:/coding-2023-05-07</id><summary type="html">&lt;p class="first last"&gt;I'm a little worried that at least some of the calls I'm making in the plugin are for no actual reason.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay.
I've got tests for the &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt; plugin.
They're not passing yet, because I haven't nailed down the desired behavior.
In order to get a proper idea of the desired behavior, I'm coming up with failing test cases, and inspecting the resulting failure messages.&lt;/p&gt;
&lt;p&gt;Careful inspection of the error messages and the coverage data has allowed me to conclude...&lt;/p&gt;
&lt;p&gt;That I still don't understand how Mypy represents types.&lt;/p&gt;
&lt;p&gt;Anyway, I ended up reimplementing parts of the &lt;tt class="docutils literal"&gt;attrs&lt;/tt&gt; plugin.
At the rate this is going, I might accidentally make the plugin compatible with older versions of Mypy.
I did the reimplementation because I was pulling out helper functions from the &lt;tt class="docutils literal"&gt;attrs&lt;/tt&gt; plugin, and they really didn't expect to be used with anything that wasn't &lt;tt class="docutils literal"&gt;evolve&lt;/tt&gt;.
I'm still pulling out helper functions, just, less so.&lt;/p&gt;
&lt;p&gt;Let's take a look at the improvements I want to make:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Failures generated by the reimplemented helper functions are associated with the function, rather than the specific argument.&lt;/li&gt;
&lt;li&gt;Failures associated with the &lt;tt class="docutils literal"&gt;typ&lt;/tt&gt; argument use the wrong type name.&lt;/li&gt;
&lt;li&gt;Once the above fixes are made, I want to use a more permissive signature for the relevant returns, because then the plugin-generated type errors are handling everything that is needed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I don't know if the first one is possible.
I believe I handled the second one, because the attrs plugin code is flexible, and I just needed to change which arguments I'm passing.&lt;/p&gt;
&lt;p&gt;I worry that the second one will result in more deep-dives into the Mypy source code, because I have to somehow go from &amp;quot;a function call context&amp;quot; to &amp;quot;the context of an argument to that function&amp;quot;.
That sounds like something that someone would have needed at some point, but I really don't know, and I don't know what it would take to hack it together if people have gotten by without that somehow.
Hm.
I'm going to try retrieving the expression node from the function argument context, and...&lt;/p&gt;
&lt;p&gt;There.
We.
Go.&lt;/p&gt;
&lt;p&gt;I've got a few more tweaks I want to make to presentation, then I can get to work making tests of the updated parts of the plugin pass.&lt;/p&gt;
&lt;p&gt;(I should maybe make sure that the positive tests pass, now that the negative tests are somewhat locked down...)
Anyway, it's late, I should wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-05-06</title><link href="https://mwchase.neocities.org/coding-2023-05-06" rel="alternate"></link><published>2023-05-06T04:00:00-04:00</published><updated>2023-05-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-05-06:/coding-2023-05-06</id><summary type="html">&lt;p class="first last"&gt;It's basically arbitrary which category I put these in.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Last night, I figured out why updating Mypy in my test environment made some tests fail: the capitalization of some types changed.
This might have been easier to notice if the change markers were meaningfully aligned with anything, not sure what's up with that.&lt;/p&gt;
&lt;p&gt;In any case, with that done, I have what I need to plan out the tests.
For that, I have a rough idea of the kinds of types and situations I need to handle, and given those, I just need to fill it all in.&lt;/p&gt;
&lt;p&gt;However, I expect that at some point, the test times will end up being so painful that I'll end up switching focus back to the generic motrfile repo, so I can pull out the plugin-bearing code ASAP.&lt;/p&gt;
&lt;p&gt;Anyway, maybe I'll get on writing the tests after this, maybe I'll do it tomorrow.
Either way, I'm going to wrap up now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Diary 2023-05-05</title><link href="https://mwchase.neocities.org/diary-2023-05-05" rel="alternate"></link><published>2023-05-05T04:00:00-04:00</published><updated>2023-05-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-05-05:/diary-2023-05-05</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Corporate needs you to find the difference between this [error message] and this [error message].&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I'm in better shape than the last diary post.
I got carried away with a distraction, but I didn't, like, &lt;em&gt;injure myself&lt;/em&gt; on it.&lt;/p&gt;
&lt;p&gt;I'm going to not try to &amp;quot;make up lost time&amp;quot;, and just let things go for the rest of tonight.
Maybe take some notes on paper for the &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt; plugin testing.
I'll at least update the requirements file that's relevant there...&lt;/p&gt;
&lt;p&gt;Aw heck.
That more than doubles &lt;tt class="docutils literal"&gt;motr &lt;span class="pre"&gt;-t&lt;/span&gt; nocov&lt;/tt&gt; execution time, &lt;em&gt;and&lt;/em&gt; makes the type tests fail for made-up looking reasons.&lt;/p&gt;
&lt;p&gt;So, here's how things go:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Tonight, sketch out the tests I'm going to have to write.&lt;/li&gt;
&lt;li&gt;Later, hope that I can troubleshoot the existing test failures.&lt;/li&gt;
&lt;li&gt;In general, anticipate the release of Mypy 1.4.0.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For now, I have to get away from my screen.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2023-05-04</title><link href="https://mwchase.neocities.org/coding-2023-05-04" rel="alternate"></link><published>2023-05-04T04:00:00-04:00</published><updated>2023-05-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-05-04:/coding-2023-05-04</id><summary type="html">&lt;p class="first last"&gt;I still don't quite believe that worked.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I bashed out code for the &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt; &lt;em&gt;plugin&lt;/em&gt; last night, but it turns out that trying to make the actual implementation have mildly reasonable annotations causes Mypy to raise a bunch of sensible objections that I don't really know what to do about.
I could loosen the annotations and try to put more type-checking smarts on the plugin, but that would mean that nearly anything would typecheck without the plugin.&lt;/p&gt;
&lt;p&gt;One of the issues is, I'd really &lt;em&gt;like&lt;/em&gt; to be able to bound a &lt;tt class="docutils literal"&gt;TypeVar&lt;/tt&gt; as &amp;quot;any attrs class&amp;quot;, and according to my intuition and a cursory Google search, that's not a thing.&lt;/p&gt;
&lt;p&gt;Let's review:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;typ: type[T]&lt;/tt&gt;: hmm&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;inst: U&lt;/tt&gt;: &lt;em&gt;hmm&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;**changes: Any&lt;/tt&gt;: no notes&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; T&lt;/tt&gt;: I mean, that makes sense&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I don't &lt;em&gt;think&lt;/em&gt; there's any sensible way to express the desired relationship between &lt;tt class="docutils literal"&gt;T&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;U&lt;/tt&gt;.
If I could just express &amp;quot;Hey, this is &lt;em&gt;some&lt;/em&gt; attrs class...&amp;quot;&lt;/p&gt;
&lt;p&gt;Actually...
If I could just forbid it from typechecking without the plugin rewriting the signature?
Hm.&lt;/p&gt;
&lt;p&gt;So, like, if I created a typing-only attrs class?
This is a silly idea; I have to try it.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;That&lt;/p&gt;
&lt;p&gt;&lt;em&gt;worked&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;???&lt;/p&gt;
&lt;p&gt;It all typechecks, despite clearly being objectively ludicrous.
&amp;quot;Here, reinstantiate this class that doesn't exist with arguments that it wouldn't take if it did.&amp;quot;&lt;/p&gt;
&lt;p&gt;Well, next up is seeing whether the plugin actually works.
I don't have the stamina to write the tests currently, and I also need to update the requirements file for testing, which is probably going to slow it down even more.&lt;/p&gt;
&lt;p&gt;But, anyway, that's one obstacle knocked down.&lt;/p&gt;
&lt;p&gt;We'll see when I'm up for more.
For now, I'm going to wind down and get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-05-03</title><link href="https://mwchase.neocities.org/coding-2023-05-03" rel="alternate"></link><published>2023-05-03T04:00:00-04:00</published><updated>2023-05-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-05-03:/coding-2023-05-03</id><summary type="html">&lt;p class="first last"&gt;Just kind of work by analogy...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I don't feel like touching MOTR directly right now, so let's take a look at how Mypy supports &lt;tt class="docutils literal"&gt;attrs.evolve&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;It expects two &lt;tt class="docutils literal"&gt;args&lt;/tt&gt; (&lt;tt class="docutils literal"&gt;inst&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;**changes&lt;/tt&gt;?).
Then it mostly focuses on &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;args[0][0]&lt;/span&gt;&lt;/tt&gt;.
Is Mypy's usage of nested lists documented anywhere?
I don't remember &lt;em&gt;understanding&lt;/em&gt; it with the last plugin I wrote, just figuring out what made the test cases pass.&lt;/p&gt;
&lt;p&gt;Anyway, it gets the type of &lt;tt class="docutils literal"&gt;inst&lt;/tt&gt;, and operates on that.
There's a helper function I'm going to have to get access to, which determines the types of the fields.
Once the fields are gotten, it does a bunch of stuff that's pretty straightforward for &lt;tt class="docutils literal"&gt;evolve&lt;/tt&gt;, and will be less so for &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Let's see what's different.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt; has two required positional arguments, &lt;tt class="docutils literal"&gt;typ&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;inst&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;It needs to determine the type of &lt;tt class="docutils literal"&gt;typ&lt;/tt&gt;.
That is, given &amp;quot;this expression is of type &lt;tt class="docutils literal"&gt;type[T]&lt;/tt&gt;&amp;quot;, it needs to get the representation of &lt;tt class="docutils literal"&gt;T&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;It needs to confirm that the base types of &lt;tt class="docutils literal"&gt;T&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;inst&lt;/tt&gt; are the same; this should &lt;em&gt;not&lt;/em&gt; fail if they aren't generic, because I'm pretty sure there's some way to make that case matter, even if it's not occurring to me just yet.&lt;/li&gt;
&lt;li&gt;It needs to go through the overall flow for both types, eventually generating two different lists of fields.&lt;/li&gt;
&lt;li&gt;The one from &lt;tt class="docutils literal"&gt;typ&lt;/tt&gt; should be used, but it needs to be compared against the &lt;tt class="docutils literal"&gt;inst&lt;/tt&gt; list, to determine which fields should be required instead of optional.
Maybe this can be done with simple equality, or maybe I need to try to unify the types.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In any case, let's work through this in order.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Probably look at &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;ctx.args[0][0]&lt;/span&gt;&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;ctx.args[1][0]&lt;/span&gt;&lt;/tt&gt;, after checking that &lt;tt class="docutils literal"&gt;len(ctx.args) == 3&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;len(ctx.args[0]) == 1&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;len(ctx.args[1]) == 1&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;typ&lt;/tt&gt; should be a &lt;tt class="docutils literal"&gt;TypeType&lt;/tt&gt;?
The type we want is the &lt;tt class="docutils literal"&gt;item&lt;/tt&gt; field?&lt;/li&gt;
&lt;li&gt;If both types are &lt;tt class="docutils literal"&gt;Instance&lt;/tt&gt;, then compare by the &lt;tt class="docutils literal"&gt;type&lt;/tt&gt; field, otherwise compare normally?
If the comparison fails, do no further processing, otherwise proceed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That gets us to fields, and the check we need to make is whether a given &lt;tt class="docutils literal"&gt;inst&lt;/tt&gt; field is a subtype of the corresponding &lt;tt class="docutils literal"&gt;typ&lt;/tt&gt; field.
Ah, that's what &lt;tt class="docutils literal"&gt;mypy.subtypes.is_subtype&lt;/tt&gt; is for.&lt;/p&gt;
&lt;p&gt;I think that's all the information I need to write the hook for &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt;.
I'm going to hold off on writing it, because I still want to figure out stuff like where to put it.
Judging by how I positioned other general-purpose stuff, it looks like it should go in a module right under the &lt;tt class="docutils literal"&gt;motr&lt;/tt&gt; package.
(At least, until and if it gets its own package.)&lt;/p&gt;
&lt;p&gt;Let's see if I'm up for working on this properly tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Weekly Roundup 2023-05-02</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-05-02" rel="alternate"></link><published>2023-05-02T04:00:00-04:00</published><updated>2023-05-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-05-02:/weekly-roundup-2023-05-02</id><summary type="html">&lt;p class="first last"&gt;Progress is taking things through a bunch of weird circles until your code suddenly typechecks.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I started thinking about the &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt; concept, and worked on a workaround for a Mypy... I think it's confirmed as a bug, that I found.&lt;/li&gt;
&lt;li&gt;Thursday: I filed the bug, and started working on wrapping pyinstrument.&lt;/li&gt;
&lt;li&gt;Friday: I refined and updated the Placeholder concept.&lt;/li&gt;
&lt;li&gt;Saturday: My efforts to get Placeholders working resulted in rewrites in other parts of the code.&lt;/li&gt;
&lt;li&gt;Sunday: I wrote tests for the pyinstrument wrapper, and immediately became suspicious of my test primitives.&lt;/li&gt;
&lt;li&gt;Monday: I looked over the diagnostic methods on &lt;tt class="docutils literal"&gt;Compendium&lt;/tt&gt;, concluded that I only need one more, and wrote it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to think about how to improve these tests, but also start taking notes on what's needed for the &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt; plugin.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-05-01</title><link href="https://mwchase.neocities.org/coding-2023-05-01" rel="alternate"></link><published>2023-05-01T04:00:00-04:00</published><updated>2023-05-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-05-01:/coding-2023-05-01</id><summary type="html">&lt;p class="first last"&gt;I feel like there needs to be some way to mark these methods that aren't meant to be used by the application code, but maybe there doesn't need to be?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, I was focused on other stuff and generally kind of out of it today, but let's think a little about how I want to do &lt;tt class="docutils literal"&gt;Compendium&lt;/tt&gt; diagnostics.
Well, these ultimately focus on private fields of the &lt;tt class="docutils literal"&gt;Compendium&lt;/tt&gt; class, so I guess they have to be methods on it?&lt;/p&gt;
&lt;p&gt;It's late and I have a few other things to do, so let's just take a quick look at what's in here that I need to deal with.&lt;/p&gt;
&lt;p&gt;First off, let's switch to the future topic...&lt;/p&gt;
&lt;p&gt;And what we have currently:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&amp;quot;Which &lt;tt class="docutils literal"&gt;Task&lt;/tt&gt;s have no outputs?&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;Which &lt;tt class="docutils literal"&gt;Task&lt;/tt&gt;s are not transitively required by a named output?&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Stuff that's used for other reasons:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&amp;quot;What are the requirements for a &lt;tt class="docutils literal"&gt;Task&lt;/tt&gt;?&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;What outputs are referred to by a given name?&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;What &lt;tt class="docutils literal"&gt;Task&lt;/tt&gt; corresponds to a given output?&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;Which names are selected by default, and which are not?&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I additionally want:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&amp;quot;Provide all &lt;tt class="docutils literal"&gt;Task&lt;/tt&gt;s in the compendium, either as an iterator or a container.&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Beyond that, I'm not really sure.&lt;/p&gt;
&lt;p&gt;Well, if I can't think of anything else, then I'll just... do it.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;And, it's done.
That was one of the shorter ellipses.&lt;/p&gt;
&lt;p&gt;Anyway, I'm tired and I'd like to wind down, so I'm going to wrap up now, and figure out how to actually use all of this stuff later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2023-04-30</title><link href="https://mwchase.neocities.org/coding-2023-04-30" rel="alternate"></link><published>2023-04-30T04:00:00-04:00</published><updated>2023-04-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-04-30:/coding-2023-04-30</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;My tests passed immediately, so maybe they're not very good.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've very quickly written &amp;quot;new&amp;quot; tests for the code I've added, and that all seems to work and hit the proper parts of the code.
&lt;em&gt;However&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Looking at the tests, I see that they're very superficial.
There are very basic questions that I should be asking about the output of this code that I'm currently not sure how to ask.
I remember considering some of them in the past, so I'd better take a quick look at the relevant module...&lt;/p&gt;
&lt;p&gt;So, the &lt;tt class="docutils literal"&gt;Compendium&lt;/tt&gt;, at least in this pre-future version where that's not actually what it's called, defines two diagnostic methods.
These methods help to track down basic issues with the &lt;tt class="docutils literal"&gt;Compendium&lt;/tt&gt;, and I should use them outside of the apparently just one test that they're currently in.&lt;/p&gt;
&lt;p&gt;But I also need diagnostic stuff like: provide every command where the first argument ends with the given name.
From there, I can check over the remaining arguments.
This will let me confirm stuff like &amp;quot;commands will have everything installed required to &lt;em&gt;actually run&lt;/em&gt;&amp;quot;.
Tomorrow or later, I'll try to work out what kind of interface I want on that.
For now, I'm going to wind down again.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2023-04-29</title><link href="https://mwchase.neocities.org/coding-2023-04-29" rel="alternate"></link><published>2023-04-29T04:00:00-04:00</published><updated>2023-04-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-04-29:/coding-2023-04-29</id><summary type="html">&lt;p class="first last"&gt;I only hope I'm still happy with this in the morning. Apologies for how vague this post is, but, eh, whatever.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I think I understand where I went wrong with some of the design I've been working with, but I want to make sure I don't cause myself even more problems trying to deal with it.&lt;/p&gt;
&lt;p&gt;Basically, right now, I have a class called &lt;tt class="docutils literal"&gt;command.Metadata&lt;/tt&gt;, which is parametric over installer types, and I think I actually need to make it just accept any installer type.
It's already supposed to have the groundwork for this in there, sort of.
Now, what this is going to mean is that I need to redo the placeholder filling-in.
Here's how that looks, I think:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Two different functions for filling in an executable.
One is strictly typed, and operates unconditionally.
This is what is currently used everywhere.
The other one needs to be loosely typed, and to take an additional parameter to condition whether to replace or not.
Basically, if that parameter matches what's in the executable exactly, then do the replacement.
Otherwise, leave it be.&lt;/li&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;command.Metadata&lt;/tt&gt; class (which probably needs a new name) is no longer parametric.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, I did a bunch more work, some of it focused around undoing stuff I did before.
There's more work where that come from, and I need to think about some things.&lt;/p&gt;
&lt;p&gt;Like, now that I'm just doing replacements at the level of one &lt;tt class="docutils literal"&gt;PathWith&lt;/tt&gt;, should I be using combine at the...
Wait, I'm already doing what I was considering doing.
Okay, this code is a little bit of a rat's nest.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Or.&lt;/p&gt;
&lt;p&gt;Or I could get distracted and just do it.&lt;/p&gt;
&lt;p&gt;At the very least, the various checks all pass, except for the one that I didn't expect to.&lt;/p&gt;
&lt;p&gt;I'll leave things like actually testing this new code for later.
For now, I'm going to be glad that I seem to have pulled this together, and hopefully improved the design of this part of the code.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-04-28</title><link href="https://mwchase.neocities.org/coding-2023-04-28" rel="alternate"></link><published>2023-04-28T04:00:00-04:00</published><updated>2023-04-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-04-28:/coding-2023-04-28</id><summary type="html">&lt;p class="first last"&gt;Solving problems with more problems.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I'm trying to reconsider how I'm handling the passing of requirements relevant to a command that needs a module argument passed.
I'm getting a sense that there's something a little iffy in how all of these components fit together, but I think I've figured out what I need to get unstuck for now.&lt;/p&gt;
&lt;p&gt;Basically, I need to make it possible to instantiate and combine placeholder installers, but not to resolve with them.
Specifically, a placeholder should contain an instance of the corresponding installer type.
Then, the &lt;tt class="docutils literal"&gt;_command.Metadata&lt;/tt&gt; needs to retrieve the nested installer under the placeholder label, and merge it with the value under the new key, if any.&lt;/p&gt;
&lt;p&gt;After that, my plan is to rework the helper code.
The point of the helper code is to define builder classes that get out of the way as soon as possible, by constructing instances of common classes.
There are two things that need to be done.
One is to convert a property to a method, and change a field on the class to an argument to that method.
The other is to add a distinct method that takes different argument types.&lt;/p&gt;
&lt;p&gt;Let's try doing all of this, and see where I get tripped up.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Hm.
Looks like I need some way of knowing which labels are getting filled in.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, so this function implementation is not &lt;em&gt;clean&lt;/em&gt;, per se, because I'm running into some issues where some part of my thought process wanted to pretend I had dependent types, and that's simply not the case...&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, that's part of it done.
Let's make sure I didn't introduce any new typing issues. ...
I have introduced a new typing issue.
But I dealt with it. I just needed to make the updated function &lt;em&gt;even grodier&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Anyway, now I just have to...
Hm.
Hm.
I'm going to need to think about this some more.
There's a helper method that assumes it's getting an executable, but if I just change how that helper is put together a little...&lt;/p&gt;
&lt;p&gt;This should produce so many typing issues...&lt;/p&gt;
&lt;p&gt;I'm paring down the typing issues, but I don't feel like putting in the work to deal with this last set right now.
Tomorrow, or over the weekend maybe.
And once I get this stuff to pass, I need to make a thorough check of whether the helper functions are actually helping.&lt;/p&gt;
&lt;p&gt;Actually, I can see one thing I'd like to have: a map method on &lt;tt class="docutils literal"&gt;PathWith&lt;/tt&gt;.
That should alleviate a bunch of heartburn with these changes.&lt;/p&gt;
&lt;p&gt;Okay, that was quick to write.
I'll make use of it later, and finish up the changes to the helpers.&lt;/p&gt;
&lt;p&gt;For now, I really should wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-04-27</title><link href="https://mwchase.neocities.org/coding-2023-04-27" rel="alternate"></link><published>2023-04-27T04:00:00-04:00</published><updated>2023-04-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-04-27:/coding-2023-04-27</id><summary type="html">&lt;p class="first last"&gt;Getting into a fight with my past self about what the code should do.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;With some fiddling, I managed to both get Mypy to accept my code for now, and to produce an actually decently-small example of what's going on to file a bug report.
It looks like that's getting looked at.&lt;/p&gt;
&lt;p&gt;Anyway, let's take a look at some of the motrfile code I want to make an equivalent of in the new system.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;yield from&lt;/span&gt; &lt;span class="n"&gt;run_pytest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;profile&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;profile&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;pyinstrument&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;--renderer&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;html&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;--outfile&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;profile_dir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;INDEX&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;as_output&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;profile&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;-m&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;pytest&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;pytest-profile&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;profile_dir&lt;/span&gt;&lt;span class="p"&gt;,),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I... hm.
Just so we're clear, these functions that mostly take string arguments... kind of suck?
Anyway, let's break it down.&lt;/p&gt;
&lt;p&gt;The stuff I care about the most is the tuple in the middle.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;pyinstrument&lt;/tt&gt; the executable&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--renderer&lt;/span&gt; html&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--renderer=html&lt;/span&gt;&lt;/tt&gt; is needed for output; other values are possible, but I'll leave it at this for the initial release&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--outfile&lt;/span&gt; &amp;lt;path/to/file&amp;gt;&lt;/tt&gt; is the other part of output; the existing new-style code should handle the &lt;tt class="docutils literal"&gt;profile_dir&lt;/tt&gt; input stuff later on&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-m&lt;/span&gt;&lt;/tt&gt; module runner argument; this is proven out with the Python wrapper&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I fiddled around, and got everything to a point that seems to make sense... and then it failed type checking because I hadn't accounted for placeholders in some of the utility code I'm trying to use.
(Side note from looking at the names I'm using: wow, some of these names are bad.
Like, there's a &amp;quot;Labeled&amp;quot; type that doesn't actually require a label???)
Anyway, placeholders.
In a fancier system, I would be lobbying for higher-kinded-typevars or something like that about now, but there's no point when there's only one instance to work with currently.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Hm.
I appear to have dug myself deeper into a hole here.
This helper code isn't really taking to the placeholders, and I'm going to need to think some more about how to address this, and avoid making any rash decisions.
(I mean, I could make some, like, alternative methods to handle placeholder versions, but that would... sort of suck.)&lt;/p&gt;
&lt;p&gt;I'm going to take a few days to ponder this, and try to wind down for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-04-26</title><link href="https://mwchase.neocities.org/coding-2023-04-26" rel="alternate"></link><published>2023-04-26T04:00:00-04:00</published><updated>2023-04-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-04-26:/coding-2023-04-26</id><summary type="html">&lt;p class="first last"&gt;You know I believe it's important to use gradual typing heavily, because I'm always complaining about it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, here we go...
I've got a bit to catch up on.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I'm leaning towards closing my feature request, but I kind of want to see what other people think.&lt;/li&gt;
&lt;li&gt;I figured out how to write the plugin to catch problematic class definitions.
It's a pretty gross implementation, though, so I'm looking into an alternative.&lt;/li&gt;
&lt;li&gt;If I'm writing a plugin &lt;em&gt;anyway&lt;/em&gt;, the discussion on the feature request made me realize what I'd want a plugin to do.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let's get right into it.&lt;/p&gt;
&lt;p&gt;Code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;saltate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;typ&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;inst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;changes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;attrs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inst&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;changes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Plugin: ... like the new attrs plugin code, but unfortunately, more complicated.
Basically, it needs to do all of the legwork of the builtin plugin, but also check that the underlying types of &lt;tt class="docutils literal"&gt;typ&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;inst&lt;/tt&gt; &amp;quot;match&amp;quot;, but need not unify, derive all arguments from &lt;tt class="docutils literal"&gt;typ&lt;/tt&gt;, and mark any that are a different type from the attributes on &lt;tt class="docutils literal"&gt;inst&lt;/tt&gt; as mandatory.&lt;/p&gt;
&lt;p&gt;The basic concept here is that, because what I want is a kind of &amp;quot;discontinuous evolution&amp;quot;, it's &amp;quot;saltation&amp;quot;, and it needs to provide a specific target, as if it's a cast.
This addresses some of the problems uncovered in the feature request discussion, and also hopefully makes it obvious that, hey, if you don't need to specify a type, probably just use &lt;tt class="docutils literal"&gt;evolve&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Unfortunately, it is too late at night for me to puzzle out plugin code right now, so I'm going to go over what else I did today.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;After getting a bunch of helper functions written earlier, I finally put it all together, and moved code out of the &lt;tt class="docutils literal"&gt;python&lt;/tt&gt; module.
At this point, it should be safe to create profiling wrappers.&lt;/li&gt;
&lt;li&gt;In order to have things work properly with the plugin I want to write, I finally unpinned Mypy from pre-1.0, addressed the type issues, one potentially valid and one that seems incredibly made-up to me, and then pinned to master, because otherwise I'd just have to pin to 1.1.*.
I've got to say, I &lt;em&gt;really hope&lt;/em&gt; I get Mypy yelling at me about unused type ignores from this, because I can't figure out which case I'm supposed to be hitting.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;However, the more I think about it, the more I think &amp;quot;No, there has to be a way to make Mypy make sense here.&amp;quot;
So I guess I'm going to be bouncing off of that for a bit.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, that's weird.
I managed to get rid of one instance of the error by just annotating stuff until Mypy admitted there wasn't actually a problem, but it's not working a second time.&lt;/p&gt;
&lt;p&gt;Okay, that's... not the greatest solution, but I can't find fault with it from a simple inspection perspective.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;facts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;_requirements&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Requirements&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;_cmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EnvVar&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;_cmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CmdArg&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;span class="n"&gt;facts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map_facts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;map_func&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;facts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;_requirements.Requirements[_cmd.EnvVar[_cmd.CmdArg]]&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;facts&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;quot;What does the cast accomplish?&amp;quot;&lt;/p&gt;
&lt;p&gt;It makes type-checking pass.&lt;/p&gt;
&lt;p&gt;Anyway, now I've got a clean basis for working on &lt;tt class="docutils literal"&gt;saltate&lt;/tt&gt;, but before that, I should probably try to extend the code some.
It's possible I've forgotten some more improvements that I want to make.
But for now, it's late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Weekly Roundup 2023-04-25</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-04-25" rel="alternate"></link><published>2023-04-25T04:00:00-04:00</published><updated>2023-04-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-04-25:/weekly-roundup-2023-04-25</id><summary type="html">&lt;p class="first last"&gt;A bit of MOTR progress...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I planned extensions to the high-level MOTR API.&lt;/li&gt;
&lt;li&gt;Thursday: I decided to take a detour and try to unpin Mypy. This resulted in filing a bug.&lt;/li&gt;
&lt;li&gt;Friday: Well, Mypy is fixed, the fix just isn't released yet. So I updated some of my Trio usage, and it went much smoother.&lt;/li&gt;
&lt;li&gt;Saturday: I played a single game of Vampire Survivors for almost two hours. Do not play a single game of Vampire Survivors for almost two hours.&lt;/li&gt;
&lt;li&gt;Sunday: I decided to try to address an issue with how I'm using attrs.&lt;/li&gt;
&lt;li&gt;Monday: I ended up trying a few different tacks, and not really being satisfied with any of them yet.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to spend a little more time trying to make some kind of plugin to detect what I want to detect, but so far it's not going great.&lt;/p&gt;
&lt;p&gt;(I tried out one of those LLMs that's supposed to code for you.
&lt;em&gt;Absolutely uncanny&lt;/em&gt; simulation of a sleazy used-car salesman who's been abducted, and is being forced at gunpoint to produce code samples.)&lt;/p&gt;
&lt;p&gt;Besides that, I'll be working on the actual updates.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-04-24</title><link href="https://mwchase.neocities.org/coding-2023-04-24" rel="alternate"></link><published>2023-04-24T04:00:00-04:00</published><updated>2023-04-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-04-24:/coding-2023-04-24</id><summary type="html">&lt;p class="first last"&gt;So many things seemed worth a shot, but I'm not sure what's ultimately worth a shot.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, I ended up tabling the &amp;quot;remove defaults&amp;quot; idea in favor of putting in a feature request to Mypy to see where that goes.
I can anticipate some potential objections to it, and I'm not sure how to address them, so I need people who understand Mypy better than I do to discuss it some.&lt;/p&gt;
&lt;p&gt;There are two major reasons I swung around to a feature request:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;What I was trying to accomplish with the code changes was to make a worse version of &lt;tt class="docutils literal"&gt;attrs.evolve&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;I couldn't figure out a good way to get a linting framework to do what I wanted.&lt;ul&gt;
&lt;li&gt;Semgrep doesn't seem to support regex operators in token names, so if I want to account for all of the different reasons that the rule might or might not apply, I'd need a combinatorial explosion of rules.
Also, I couldn't find a way to make it detect &amp;quot;a type expression that uses any typevar&amp;quot;.&lt;/li&gt;
&lt;li&gt;Although Pylint gets me as far as detecting attrs classes, it's not obvious to me whether the information I actually want is present in the AST.&lt;/li&gt;
&lt;li&gt;I honestly didn't even try with flake8.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My guess is that, with some effort, I could get Pylint working nicely with this idea, but I'd rather focus on the feature request for now.&lt;/p&gt;
&lt;p&gt;Let's see about chasing down the information that got me down this tangent in the first place...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I want to put a &lt;tt class="docutils literal"&gt;Placeholder&lt;/tt&gt; into an &lt;tt class="docutils literal"&gt;Executable&lt;/tt&gt;, and I have a means of taking it back out, given the proper data.&lt;/li&gt;
&lt;li&gt;At the other end of the pipeline is the &lt;tt class="docutils literal"&gt;ParametricCommandMeta&lt;/tt&gt;, which needs to carry out updates to a &lt;tt class="docutils literal"&gt;CommandBuilder&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;CommandBuilder&lt;/tt&gt; needs the ability to update an &lt;tt class="docutils literal"&gt;Executable&lt;/tt&gt;, which we have, and a &lt;tt class="docutils literal"&gt;command.Metadata&lt;/tt&gt;, which we don't.
Yet.&lt;/li&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;Metadata&lt;/tt&gt; is the most troublesome to update, because it requires conditionally mapping the &lt;tt class="docutils literal"&gt;Executable&lt;/tt&gt; update over three different data structures.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In terms of raw volume of code, it's not clear that doing this would constitute a win, but it would mean moving code out of the more data-y modules, so I at least want to evaluate how much of a mess it would make.&lt;/p&gt;
&lt;p&gt;Let's treat the top-level data structures as mostly straightforward, and focus on the type fiddling.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Args&lt;/tt&gt; is one of the baselines, because it just has a &lt;tt class="docutils literal"&gt;MaybeExecutable&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;EnvVars&lt;/tt&gt; looks a little scarier due to the use of &lt;tt class="docutils literal"&gt;EnvVar&lt;/tt&gt;, but I can just map a lambda over that, no problem.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;IOSet&lt;/tt&gt; is mainly confusing because it uses a more restrictive set of types in the left-hand side of the union.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, the thing that hopefully makes this less confusing than the existing functions is, I don't need special handling for different entry point types.
Everything just gets passed through, no questions asked.&lt;/p&gt;
&lt;p&gt;Before I mess around with new code, I want to investigate using the techniques from &lt;a class="reference external" href="https://github.com/python/mypy/issues/8356#issuecomment-884548381"&gt;this comment&lt;/a&gt; in the existing code.&lt;/p&gt;
&lt;p&gt;(Update: Things aren't currently looking great for the Mypy feature request, so I'm trying to nail down what I'd want out of a plugin.
Like, the brief is, the constructor for a generic attrs class shouldn't have any optional arguments, and the question is just how to express that in terms of whatever I use to lint.)&lt;/p&gt;
&lt;p&gt;Anyway, back to messing with the code...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;There's some nested code that doesn't need updating because it doesn't need &lt;tt class="docutils literal"&gt;overload&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;There's some code that can't work with this because I need to key off of the type parameters, but fortunately, this isn't an all-or-nothing thing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, I've proved that this still works, and the behavior is preserved (up to and including the mystery errors from recent Mypy versions).&lt;/p&gt;
&lt;p&gt;At the moment, I just want to wrap up and get to bed, but this was nice for proving out the approach for handling the placeholder updates.
I'll try to do that in the next few days, and hopefully it'll get me some data points for those mystery errors.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-04-23</title><link href="https://mwchase.neocities.org/coding-2023-04-23" rel="alternate"></link><published>2023-04-23T04:00:00-04:00</published><updated>2023-04-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-04-23:/coding-2023-04-23</id><summary type="html">&lt;p class="first last"&gt;I'll probably share this rule after I've written it, since it seems like most people should run into problems if they write code that would trigger it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did a little work on MOTR after last night's entry, and I ended up with an idea that I'm not sure whether I should believe:&lt;/p&gt;
&lt;p&gt;&amp;quot;Generic attributes should not have a default value in the base constructor, and the class can provide alternative constructors that do provide default values.&amp;quot;&lt;/p&gt;
&lt;p&gt;I may even consider a strong statement, starting instead with &amp;quot;Generic classes should not have default values for any attribute&amp;quot;.&lt;/p&gt;
&lt;p&gt;I'm pondering this, because I can't see a way to make &lt;tt class="docutils literal"&gt;evolve&lt;/tt&gt; handle changing the parameters to the type; this means that &amp;quot;modified&amp;quot; values &lt;em&gt;must&lt;/em&gt; be instantiated from scratch, and that means that, if I add another field to the class definition, it will be silently dropped from the update if it has a default value.&lt;/p&gt;
&lt;p&gt;This has implications for:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;io.Output&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;python_helpers.PythonCmd&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;artifact.Input&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;artifact.LabeledConverter&lt;/tt&gt;, technically, I guess.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;artifact.BasicOutputConverter&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;command_builder.CommandBuilder&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;parametric_command.ParametricCommandMeta&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;parametric.Parametric&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;command.Metadata&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hm.
Let's see how much it hurts if I start changing these...&lt;/p&gt;
&lt;p&gt;So far, it hasn't been a big deal, but this seems fiddly enough to remember and to deal with that I'm now looking into &lt;a class="reference external" href="https://semgrep.dev/"&gt;semgrep&lt;/a&gt;, or maybe something similar, to check the codebase for a highly specific pattern.
Like, &amp;quot;when a class has one of these decorators, and inherits from an expression involving instances of this type, make sure that any values set at the class level either have a specific type annotation, or the value is a call to a function that &lt;em&gt;does not&lt;/em&gt; pass some specific arguments&amp;quot;.
Sure.&lt;/p&gt;
&lt;p&gt;It's a bit late to write that right now, but I'll get on it tomorrow.
For now, I want to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Diary 2023-04-22</title><link href="https://mwchase.neocities.org/diary-2023-04-22" rel="alternate"></link><published>2023-04-22T04:00:00-04:00</published><updated>2023-04-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-04-22:/diary-2023-04-22</id><summary type="html">&lt;p class="first last"&gt;Ooooogh noooooogh...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Me several hours ago: &amp;quot;I wonder what it's like to play Vampire Survivors on Endless mode&amp;quot;&lt;/p&gt;
&lt;p&gt;Me now: &amp;quot;I wholeheartedly regret that decision&amp;quot;&lt;/p&gt;
&lt;p&gt;I would have given up much sooner if I hadn't been switching off hands to control movement as my wrists wore out...&lt;/p&gt;
&lt;p&gt;Point is, my brain is &lt;em&gt;jangly&lt;/em&gt; now, and I can't really do much tonight as a result.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2023-04-21</title><link href="https://mwchase.neocities.org/coding-2023-04-21" rel="alternate"></link><published>2023-04-21T04:00:00-04:00</published><updated>2023-04-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-04-21:/coding-2023-04-21</id><summary type="html">&lt;p class="first last"&gt;It's really nice to have updating to deal with a new version just work...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;People are working on fixing Mypy, so I'll see improvements there... after at least two more minor versions.
I'm going to put off the unpin until then, and maybe look into putting together something for the other errors I hit, just so I can pin down whether the changes are intended or not.&lt;/p&gt;
&lt;p&gt;Aside from that, I got prepped for some future release of Trio, so that's pretty great.
I'm not sure &lt;em&gt;precisely&lt;/em&gt; how valid my code to handle &lt;tt class="docutils literal"&gt;ExceptionGroup&lt;/tt&gt;s is, but the tests pass, at least for now, so eh.&lt;/p&gt;
&lt;p&gt;Anyway, now that I've fully characterized the parameters of my tactical retreat from messing with Mypy, I'm all set to investigate the right places to define and use &lt;tt class="docutils literal"&gt;Placeholder&lt;/tt&gt; next time I touch the code.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2023-04-20</title><link href="https://mwchase.neocities.org/coding-2023-04-20" rel="alternate"></link><published>2023-04-20T04:00:00-04:00</published><updated>2023-04-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-04-20:/coding-2023-04-20</id><summary type="html">&lt;p class="first last"&gt;I should try to distill Mypy tests out of MOTR's code.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm going to try and get Mypy unpinned.
Let's see what kind of shape it's in...&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;motr-dev&lt;span class="o"&gt;)&lt;/span&gt; ↪ hg diff
diff --git a/requirements/mypy.txt b/requirements/mypy.txt
--- a/requirements/mypy.txt
+++ b/requirements/mypy.txt
@@ -1,3 +1,3 @@
 lxml
-mypy&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="c"&gt;# My weird code.&lt;/span&gt;
+mypy
 trio-typing
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And when I run &lt;tt class="docutils literal"&gt;motr &lt;span class="pre"&gt;-t&lt;/span&gt; mypy&lt;/tt&gt;, it&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;src/motr/_api/cli_types/parametric.py:512: error: Argument &amp;quot;instantiate&amp;quot; to &amp;quot;evolve&amp;quot; of &amp;quot;Parametric[T]&amp;quot; has incompatible type &lt;span class="pre"&gt;&amp;quot;Callable[[PerItemParametricMapping[motr._api.cli_types.box._Unlabel],&lt;/span&gt; &lt;span class="pre"&gt;PerItemParametricMapping[motr._api.cli_types.selection._Unlabel]],&lt;/span&gt; Generator[Union[Action, ActionInput, ActionOutput, TargetName, SkippedName], None, &lt;span class="pre"&gt;T]]&amp;quot;;&lt;/span&gt; expected &lt;span class="pre"&gt;&amp;quot;Callable[[PerItemParametricMapping[motr._api.cli_types.box._Unlabel],&lt;/span&gt; &lt;span class="pre"&gt;PerItemParametricMapping[motr._api.cli_types.selection._Unlabel]],&lt;/span&gt; Generator[Union[Action, ActionInput, ActionOutput, TargetName, SkippedName], None, &lt;span class="pre"&gt;T_co]]&amp;quot;&lt;/span&gt;&amp;nbsp; &lt;span class="pre"&gt;[arg-type]&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;It&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;src/motr/_api/cli_types/parametric.py:512: error: Argument &amp;quot;instantiate&amp;quot; to &amp;quot;evolve&amp;quot; of &amp;quot;Parametric[T]&amp;quot; has incompatible type &lt;span class="pre"&gt;&amp;quot;Callable[[PerItemParametricMapping[motr._api.cli_types.box._Unlabel],&lt;/span&gt; &lt;span class="pre"&gt;PerItemParametricMapping[motr._api.cli_types.selection._Unlabel]],&lt;/span&gt; Generator[Union[Action, ActionInput, ActionOutput, TargetName, SkippedName], None, &lt;span class="pre"&gt;T]]&amp;quot;;&lt;/span&gt; expected &lt;span class="pre"&gt;&amp;quot;Callable[[PerItemParametricMapping[motr._api.cli_types.box._Unlabel],&lt;/span&gt; &lt;span class="pre"&gt;PerItemParametricMapping[motr._api.cli_types.selection._Unlabel]],&lt;/span&gt; Generator[Union[Action, ActionInput, ActionOutput, TargetName, SkippedName], None, &lt;span class="pre"&gt;T_co]]&amp;quot;&lt;/span&gt;&amp;nbsp; &lt;span class="pre"&gt;[arg-type]&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;I mean, I think that sounds straight-up incorrect, but&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;src/motr/_api/cli_types/parametric.py:512: error: Argument &amp;quot;instantiate&amp;quot; to &amp;quot;evolve&amp;quot; of &amp;quot;Parametric[T]&amp;quot; has incompatible type &lt;span class="pre"&gt;&amp;quot;Callable[[PerItemParametricMapping[motr._api.cli_types.box._Unlabel],&lt;/span&gt; &lt;span class="pre"&gt;PerItemParametricMapping[motr._api.cli_types.selection._Unlabel]],&lt;/span&gt; Generator[Union[Action, ActionInput, ActionOutput, TargetName, SkippedName], None, &lt;span class="pre"&gt;T]]&amp;quot;;&lt;/span&gt; expected &lt;span class="pre"&gt;&amp;quot;Callable[[PerItemParametricMapping[motr._api.cli_types.box._Unlabel],&lt;/span&gt; &lt;span class="pre"&gt;PerItemParametricMapping[motr._api.cli_types.selection._Unlabel]],&lt;/span&gt; Generator[Union[Action, ActionInput, ActionOutput, TargetName, SkippedName], None, &lt;span class="pre"&gt;T_co]]&amp;quot;&lt;/span&gt;&amp;nbsp; &lt;span class="pre"&gt;[arg-type]&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Fiiiiine.&lt;/p&gt;
&lt;p&gt;So, about two weeks ago, Mypy got another release, and I got &lt;em&gt;more errors&lt;/em&gt;.
With some experimentation on a reproduction that doesn't recite the entire text of Moby Dick, I've determined that it's probably fine if the following two conditions are met:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The call to &lt;tt class="docutils literal"&gt;evolve()&lt;/tt&gt; is in a method on the relevant class.&lt;/li&gt;
&lt;li&gt;The typevars associated with &lt;tt class="docutils literal"&gt;self&lt;/tt&gt; exactly match the ones on the class line???
That is, from my testing, it appears that you can't annotate a method on a class defined with &lt;tt class="docutils literal"&gt;class &lt;span class="pre"&gt;MyAwesomeClass(Generic[T1]):&lt;/span&gt;&lt;/tt&gt; like &lt;tt class="docutils literal"&gt;def my_awesome_method(self: MyAwesomeClass[T2]) &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; T2:&lt;/tt&gt; even if &lt;tt class="docutils literal"&gt;T1&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;T2&lt;/tt&gt; are identical except for the name???&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There is no way that second one is intended behavior.
Ludicrous.
The first one is a little obnoxious, but I'm not confident that that wasn't intended?
Anyway, let's see what I need to handle this...&lt;/p&gt;
&lt;p&gt;Okay, wait.
Hold on.
It instantiated the constraints on a typevar, then failed to unify the typevar with the constraints?
Okay.&lt;/p&gt;
&lt;p&gt;Okay.&lt;/p&gt;
&lt;p&gt;Okay.&lt;/p&gt;
&lt;p&gt;Okay.&lt;/p&gt;
&lt;p&gt;Okay.&lt;/p&gt;
&lt;p&gt;Okay.&lt;/p&gt;
&lt;p&gt;I've got to file this, because that is actually impossible to satisfy.&lt;/p&gt;
&lt;p&gt;So, I guess I can consider trying to move the pin out, but I'm frankly not impressed by how Mypy 1+ has handled MOTR's code.
Kind of weird how the scrunkly plugin stuff hasn't posed any obvious problems, but whatever.&lt;/p&gt;
&lt;p&gt;Anyway, getting all het up about how messed up the new &lt;tt class="docutils literal"&gt;evolve()&lt;/tt&gt; handling is ate up the night, so I guess I'm not doing this.
And I'm kind of skeptical about whether it's worth trying to get to 1.1+.&lt;/p&gt;
&lt;p&gt;I'm going to wrap things up for now, and see what I'm up for later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-04-19</title><link href="https://mwchase.neocities.org/coding-2023-04-19" rel="alternate"></link><published>2023-04-19T04:00:00-04:00</published><updated>2023-04-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-04-19:/coding-2023-04-19</id><summary type="html">&lt;p class="first last"&gt;After I finished writing this entry, I remembered I should probably be trying to get Mypy unpinned, and, like... I don't wanna...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, here we go.&lt;/p&gt;
&lt;p&gt;I want to create a placeholder value for installer labels to allow me to convert a bunch of a function I've written into a combination of a utility function and some static data, so I can define &lt;em&gt;different&lt;/em&gt; data in other contexts.&lt;/p&gt;
&lt;p&gt;Here is a first shot...&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@attrs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;frozen&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Placeholder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Generic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;_installer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TArgs&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;

    &lt;span class="n"&gt;uninstantiable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;NoReturn&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;__environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;__cmd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Facts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;NotImplementedError&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;__other&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Placeholder&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;_installer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TArgs&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Placeholder&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;_installer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TArgs&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;NotImplementedError&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The basic idea is that there's some way to take a &lt;tt class="docutils literal"&gt;ParametricCommandMeta[TEntry, TProgram, Placeholder[_installer.TArgs]]&lt;/tt&gt;, pass it a &lt;tt class="docutils literal"&gt;ParametricCommand[Module, Any, _installer.TArgs]&lt;/tt&gt;, and synthesize them into a &lt;tt class="docutils literal"&gt;ParametricCommand[TEntry, TProgram, _installer.TArgs]&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;I'm pretty sure I can write the code to do that, no big deal.
I'm just not sure if it's a generally valid transformation, outside of the context where I want it.&lt;/p&gt;
&lt;p&gt;All the same, it seems like a better idea to just go for it.&lt;/p&gt;
&lt;p&gt;Now, how to lay this out.
I'm leaning towards, actual definition in &lt;tt class="docutils literal"&gt;parametric_command&lt;/tt&gt;, but re-export in the &lt;tt class="docutils literal"&gt;installers&lt;/tt&gt; namespace.
Some amount of support code to handle the type twiddles will probably be necessary, but I'm going to make a bold prediction that it won't be a big deal.&lt;/p&gt;
&lt;p&gt;I'll get started on this tomorrow, because right now, I need to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Weekly Roundup 2023-04-18</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-04-18" rel="alternate"></link><published>2023-04-18T04:00:00-04:00</published><updated>2023-04-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-04-18:/weekly-roundup-2023-04-18</id><summary type="html">&lt;p class="first last"&gt;Nearly done refactoring...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I wrote a bunch of things that weren't a blog entry, thereby not leaving me the time to write a blog entry.&lt;/li&gt;
&lt;li&gt;Thursday: I considered some changes to the layout of MOTR, including a few things that turned out not to matter.&lt;/li&gt;
&lt;li&gt;Friday: I continued to consider the changes, and came to a decision.&lt;/li&gt;
&lt;li&gt;Saturday: I tried to trace the flow of &lt;tt class="docutils literal"&gt;MapOverSelection&lt;/tt&gt; through &lt;tt class="docutils literal"&gt;parametric_command&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt;, which was... still obnoxious.&lt;/li&gt;
&lt;li&gt;Sunday: I made all of the planned changes.&lt;/li&gt;
&lt;li&gt;Monday: I backed out some of the changes in order to keep things usable, but I did keep the major improvements.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to remember what I wanted to work on next.
I &lt;em&gt;think&lt;/em&gt; I've managed to figure out some of it...&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-04-17</title><link href="https://mwchase.neocities.org/coding-2023-04-17" rel="alternate"></link><published>2023-04-17T04:00:00-04:00</published><updated>2023-04-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-04-17:/coding-2023-04-17</id><summary type="html">&lt;p class="first last"&gt;A less painful merge than I expected.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Pro: The tests pass now.&lt;/p&gt;
&lt;p&gt;Con: They were coupled to the old design, not in the sense of &amp;quot;They're doing things the old way, and need to be switched to the new way.&amp;quot;, but in the sense of &amp;quot;There is no new way, so I need to walk back a bunch of my changes.&amp;quot;&lt;/p&gt;
&lt;p&gt;Pro: I didn't have to walk them all back, and I was able to keep a bunch of the major improvements.&lt;/p&gt;
&lt;p&gt;Con: This merge is going to suck.&lt;/p&gt;
&lt;p&gt;Let's see how that goes...&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;motr-dev&lt;span class="o"&gt;)&lt;/span&gt; ↪ hg up 39-documentation
switching to topic 39-documentation
&lt;span class="m"&gt;56&lt;/span&gt; files updated, &lt;span class="m"&gt;0&lt;/span&gt; files merged, &lt;span class="m"&gt;20&lt;/span&gt; files removed, &lt;span class="m"&gt;0&lt;/span&gt; files unresolved
maxchase at maxchase-ThinkPad-P1-Gen-5 &lt;span class="k"&gt;in&lt;/span&gt; ~/D/s/m/motr
&lt;span class="o"&gt;(&lt;/span&gt;motr-dev&lt;span class="o"&gt;)&lt;/span&gt; ↪ hg merge 87-test-coverage
file &lt;span class="s1"&gt;&amp;#39;src/motr/_api/cli_types/map_over_selection.py&amp;#39;&lt;/span&gt; was deleted &lt;span class="k"&gt;in&lt;/span&gt; other &lt;span class="o"&gt;[&lt;/span&gt;merge rev&lt;span class="o"&gt;]&lt;/span&gt; but was modified &lt;span class="k"&gt;in&lt;/span&gt; local &lt;span class="o"&gt;[&lt;/span&gt;working copy&lt;span class="o"&gt;]&lt;/span&gt;.
You can use &lt;span class="o"&gt;(&lt;/span&gt;c&lt;span class="o"&gt;)&lt;/span&gt;hanged version, &lt;span class="o"&gt;(&lt;/span&gt;d&lt;span class="o"&gt;)&lt;/span&gt;elete, &lt;span class="k"&gt;or&lt;/span&gt; leave &lt;span class="o"&gt;(&lt;/span&gt;u&lt;span class="o"&gt;)&lt;/span&gt;nresolved.
What do you want to do? d
merging src/motr/_api/cli_types/artifact.py
merging src/motr/_api/cli_types/command.py
merging src/motr/_api/cli_types/installer.py
merging src/motr/_api/cli_types/parametric.py
merging src/motr/_api/cli_types/parametric_command.py
warning: conflicts &lt;span class="k"&gt;while&lt;/span&gt; merging src/motr/_api/cli_types/parametric_command.py! &lt;span class="o"&gt;(&lt;/span&gt;edit, then use &lt;span class="s1"&gt;&amp;#39;hg resolve --mark&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
merging src/motr/_api/package.py
warning: conflicts &lt;span class="k"&gt;while&lt;/span&gt; merging src/motr/_api/package.py! &lt;span class="o"&gt;(&lt;/span&gt;edit, then use &lt;span class="s1"&gt;&amp;#39;hg resolve --mark&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
merging src/motr/_api/tasks/cmd.py &lt;span class="k"&gt;and&lt;/span&gt; src/motr/_api/actions/cmd.py to src/motr/_api/tasks/cmd.py
warning: conflicts &lt;span class="k"&gt;while&lt;/span&gt; merging src/motr/_api/tasks/cmd.py! &lt;span class="o"&gt;(&lt;/span&gt;edit, then use &lt;span class="s1"&gt;&amp;#39;hg resolve --mark&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
merging src/motr/_api/tasks/io.py &lt;span class="k"&gt;and&lt;/span&gt; src/motr/_api/actions/io.py to src/motr/_api/tasks/io.py
warning: conflicts &lt;span class="k"&gt;while&lt;/span&gt; merging src/motr/_api/tasks/io.py! &lt;span class="o"&gt;(&lt;/span&gt;edit, then use &lt;span class="s1"&gt;&amp;#39;hg resolve --mark&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="m"&gt;0&lt;/span&gt; files updated, &lt;span class="m"&gt;4&lt;/span&gt; files merged, &lt;span class="m"&gt;2&lt;/span&gt; files removed, &lt;span class="m"&gt;4&lt;/span&gt; files unresolved
use &lt;span class="s1"&gt;&amp;#39;hg resolve&amp;#39;&lt;/span&gt; to retry unresolved file merges &lt;span class="k"&gt;or&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;hg merge --abort&amp;#39;&lt;/span&gt; to abandon
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;... Well, that probably could have gone worse?&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;That wasn't so bad.&lt;/p&gt;
&lt;p&gt;I haven't made all of the changes that I could make, but I'm going to hold off on taking it further for now.
The thing to focus on after now, is to refresh my memory about what is a problem for the remaining wrapper code, because I've completely forgotten what was supposed to be problematic with this code.&lt;/p&gt;
&lt;p&gt;I'll start on that in a few days.
For now, I need to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-04-16</title><link href="https://mwchase.neocities.org/coding-2023-04-16" rel="alternate"></link><published>2023-04-16T04:00:00-04:00</published><updated>2023-04-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-04-16:/coding-2023-04-16</id><summary type="html">&lt;p class="first last"&gt;Just kind of gambling that all of those tests were coupled to the old design.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right.
I ended up just jumping in and updating code until Mypy stopped complaining.
This resulted in something happening with the tests, and I'll try and get them passing again later.&lt;/p&gt;
&lt;p&gt;Basically, I just did what seemed to make sense, and nothing obviously broke yet.
I should be able to delete a lot of code now, but I don't yet know for sure.&lt;/p&gt;
&lt;p&gt;We traveled again today, and I feel like I was lucky to get this much done, and I don't have the energy to write this up in any more detail.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2023-04-15</title><link href="https://mwchase.neocities.org/coding-2023-04-15" rel="alternate"></link><published>2023-04-15T04:00:00-04:00</published><updated>2023-04-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-04-15:/coding-2023-04-15</id><summary type="html">&lt;p class="first last"&gt;I may need to switch to documenting this stuff if it's going to keep being this confusing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, so, the next thing to work on is updating &lt;tt class="docutils literal"&gt;parametric_command&lt;/tt&gt; to use the new class I threw together.
I could try working methodically through the file, or making changes at random until Mypy stops yelling at me.&lt;/p&gt;
&lt;p&gt;Or, I could try simulating that, but describing the code changes instead of trying to actually make them all at once.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Let's start with the definition of &lt;tt class="docutils literal"&gt;Part&lt;/tt&gt;.
&lt;tt class="docutils literal"&gt;Part&lt;/tt&gt; now has to involve &lt;tt class="docutils literal"&gt;_parametric.AdaptiveParametric[BlahBlahBlah]&lt;/tt&gt;.
This requires a minor and obvious change to the &lt;tt class="docutils literal"&gt;_optional_parametric&lt;/tt&gt; helper.
In addition...&lt;/li&gt;
&lt;li&gt;There is a method called &lt;tt class="docutils literal"&gt;_selections()&lt;/tt&gt;.
The inside is going to change, but also the return value, so we're going to have to look at how it's used.
Its usage ultimately ends up as an argument to &lt;tt class="docutils literal"&gt;_build()&lt;/tt&gt;, where it is eventually passed into... &lt;tt class="docutils literal"&gt;_optional_parametric&lt;/tt&gt;.
Huh.
Insert le funny Gandalf meme here.&lt;/li&gt;
&lt;li&gt;Within &lt;tt class="docutils literal"&gt;_optional_parametric&lt;/tt&gt;, this value is only used to pass to &lt;tt class="docutils literal"&gt;Part.build()&lt;/tt&gt; by specifically extracting the values from it...&lt;/li&gt;
&lt;li&gt;In there, it's passed to &lt;tt class="docutils literal"&gt;Artifact.convert()&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At this point, I kind of lose the plot, because this somehow diverts it through seemingly every part of the &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt; module.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;I &lt;em&gt;think&lt;/em&gt; it mainly ends up on the &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; type, which passes it back out via &lt;tt class="docutils literal"&gt;exposed_selections()&lt;/tt&gt;.
Which is used for &lt;tt class="docutils literal"&gt;Part.selections()&lt;/tt&gt;.
Which comes back to &lt;tt class="docutils literal"&gt;_selections()&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Let's assume we should be replacing &lt;tt class="docutils literal"&gt;MapOverSelection&lt;/tt&gt; with &lt;tt class="docutils literal"&gt;Parametric[PathStr]&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;This represents a change in semantics in some fashion, but let's assume the way to update a sequence of these is to filter out incoming duplicates.
Maybe look into making callable types for the various &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt; changes, so duplicates can be checked for structurally...&lt;/p&gt;
&lt;p&gt;I'll look into trying to do this, maybe in the next few days, maybe next week.
We'll see.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-04-14</title><link href="https://mwchase.neocities.org/coding-2023-04-14" rel="alternate"></link><published>2023-04-14T04:00:00-04:00</published><updated>2023-04-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-04-14:/coding-2023-04-14</id><summary type="html">&lt;p class="first last"&gt;It was less effort to do weird introspection stuff than to come up with distinct, self-explanatory names.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's take a little time to consider how these decorators are supposed to work.
Ignoring &lt;tt class="docutils literal"&gt;MappedParametric&lt;/tt&gt; for now, because that's a whole thing, I've got two basic options for external interfaces to use:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&amp;#64;_parametric.parametric&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;&amp;#64;_parametric.adaptive&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&amp;#64;_parametric.Parametric.make&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;&amp;#64;_parametric.AdaptiveParametric.make&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sadly, I do kind of need to consider the lengths involved, since there are valid reasons to use these inline as well as in decorator form.&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;MappedParametric&lt;/tt&gt; is kind of an opposite situation, where I'm not quite sure what I want out of the decorator, but there's no reason to care how the decorator works inline when I can just use the default &lt;tt class="docutils literal"&gt;attrs&lt;/tt&gt; constructor.&lt;/p&gt;
&lt;p&gt;I think the first question comes down to how committed I am to having all normal modules import modules instead of importing non-module items from modules.
I don't remember the rationale for that, so it's time to try to go back to first principles, apparently.
Now, where did I get that idea...&lt;/p&gt;
&lt;p&gt;Let's see, my source was certainly the &lt;a class="reference external" href="https://google.github.io/styleguide/pyguide.html#s2.2-imports"&gt;Google Python Style Guide&lt;/a&gt;, which, granted, I don't follow perfectly even in this context...
Between that, and &lt;tt class="docutils literal"&gt;import this&lt;/tt&gt;, and a desire to not given in &lt;em&gt;completely&lt;/em&gt; to Pokémon-speak, here is my general idea:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Decorate to produce a &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt; with &lt;tt class="docutils literal"&gt;&amp;#64;_parametric.make&lt;/tt&gt;, as well as a few other module-level functions that can be used as a decorator.&lt;/li&gt;
&lt;li&gt;However, also consider adding fluent methods that forward to these functions when applicable.
For example, I may want a &lt;tt class="docutils literal"&gt;.flattened&lt;/tt&gt; method or property corresponding to the &lt;tt class="docutils literal"&gt;flatten&lt;/tt&gt; function.&lt;/li&gt;
&lt;li&gt;Use &lt;tt class="docutils literal"&gt;adaptive&lt;/tt&gt; for &lt;tt class="docutils literal"&gt;AdaptiveParametric&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Use either one or two decorators for &lt;tt class="docutils literal"&gt;MappedParametric&lt;/tt&gt;.
This is the remaining effort I need to put into thinking about this.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Perhaps &lt;tt class="docutils literal"&gt;&amp;#64;_parametric.map_over(func)&lt;/tt&gt;...
No.
Here's a slightly wonky idea...&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@overload&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;map_over&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;PathStr&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;Parametric&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt; &lt;span class="n"&gt;MappedParametric&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;

&lt;span class="nd"&gt;@overload&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;map_over&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;parametric&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Parametric&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;PathStr&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt; &lt;span class="n"&gt;MappedParametric&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;map_over&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;func_or_parametric&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;PathStr&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Parametric&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;Parametric&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt; &lt;span class="n"&gt;MappedParametric&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;PathStr&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt; &lt;span class="n"&gt;MappedParametric&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func_or_parametric&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Parametric&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;needs_func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;PathStr&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;MappedParametric&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;MappedParametric&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func_or_parametric&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;needs_func&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;needs_parametric&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parametric&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Parametric&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;MappedParametric&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;MappedParametric&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parametric&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;func_or_parametric&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;needs_parametric&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Can't really use it inline, but as I said, you don't need to, and it types cleanly enough, and saves you the bother of having to remember which way around things go by having them both be right.&lt;/p&gt;
&lt;p&gt;In fact, I'll try to get it to work now.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Hm, it didn't quite work, but it was close.
Just needed to make some minor adjustments...&lt;/p&gt;
&lt;p&gt;All set for tonight.
Later, I can look at this in the light of day, and ponder whether my actions made any sense at all.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-04-13</title><link href="https://mwchase.neocities.org/coding-2023-04-13" rel="alternate"></link><published>2023-04-13T04:00:00-04:00</published><updated>2023-04-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-04-13:/coding-2023-04-13</id><summary type="html">&lt;p class="first last"&gt;Plenty of stuff just kind of happily shoves in wherever, and then I need to think about the actual external interfaces...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was thinking about how to organize the new code in MOTR, and something occurred to me:
That higher-order decorator is &lt;em&gt;really&lt;/em&gt; squirrelly, and I'd rather leave it as a module implementation detail than something that gets exposed to other modules.
Doing that requires pulling a bunch of code into the &lt;tt class="docutils literal"&gt;parametric&lt;/tt&gt; module, which is... probably fine?
The only real hurdle is that I'd need different names for the &amp;quot;fake value&amp;quot; classes.
Again, probably fine.
I can stick them inside the associated classes, even, probably.&lt;/p&gt;
&lt;p&gt;Let's try that, actually...
I mean, it didn't break yet, with the obvious caveat that I'm not really testing these paths.&lt;/p&gt;
&lt;p&gt;If it's not broken yet, let's stuff more things in to see if it does...&lt;/p&gt;
&lt;p&gt;Well, now all that's left is to figure out the proper way to handle the decorators for &lt;tt class="docutils literal"&gt;MappedParametric&lt;/tt&gt;.
That, and to write the validation for &lt;tt class="docutils literal"&gt;AdaptiveParametric&lt;/tt&gt;.
I should be able to handle that...&lt;/p&gt;
&lt;p&gt;And, the validation should be done now.
The big thing missing is the last constructor, and instead of rushing into that, I want to take some more time to consider whether to do this as top-level functions, or classmethods, or what.&lt;/p&gt;
&lt;p&gt;Like, more cruft at the top level, versus longer access paths on decorators, and is that even the rate dimension to be comparing for tradeoffs...&lt;/p&gt;
&lt;p&gt;Not something that I want to rush into.&lt;/p&gt;
&lt;p&gt;For now, I'm going to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Diary 2023-04-12</title><link href="https://mwchase.neocities.org/diary-2023-04-12" rel="alternate"></link><published>2023-04-12T04:00:00-04:00</published><updated>2023-04-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-04-12:/diary-2023-04-12</id><summary type="html">&lt;p class="first last"&gt;Suddenly it's so good. No, you cannot see it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did a bunch of writing and I'm really excited about how it's going, but unfortunately I got so excited that now it's almost midnight, so, um.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2023-04-11</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-04-11" rel="alternate"></link><published>2023-04-11T04:00:00-04:00</published><updated>2023-04-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-04-11:/weekly-roundup-2023-04-11</id><summary type="html">&lt;p class="first last"&gt;Just keep on ratcheting things forwards...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I started drafting out a new decorator for MOTR.&lt;/li&gt;
&lt;li&gt;Thursday: I traced out the usage of some types in MOTR, and realized that I can't take as much out as I want, but I can at least improve the stuff that I have to leave in.&lt;/li&gt;
&lt;li&gt;Friday: I tried to extend the implementation of the new decorator to handle the new type I realized I need. I also threw in some Dynamism Crimes.&lt;/li&gt;
&lt;li&gt;Saturday: I took care of obligations. Hopefully, I'll be recovered by the time I have to do this again next year.&lt;/li&gt;
&lt;li&gt;Sunday: I traveled.&lt;/li&gt;
&lt;li&gt;Monday: I came up with some helpful ideas for some writing I'm doing, so that was good.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to look for usages of the old &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt; constructors, to see if I can replace any of them with the new decorator.
Also, I need to mark up the usages of the old &lt;tt class="docutils literal"&gt;MapOverSelection&lt;/tt&gt; stuff to make sure I can smoothly replace it.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="MOTR"></category><category term="Python"></category><category term="writing"></category></entry><entry><title>Diary 2023-04-10</title><link href="https://mwchase.neocities.org/diary-2023-04-10" rel="alternate"></link><published>2023-04-10T04:00:00-04:00</published><updated>2023-04-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-04-10:/diary-2023-04-10</id><summary type="html">&lt;p class="first last"&gt;I have suspicions about what got my mind flexible enough to come up with these ideas, but they're &lt;em&gt;extremely&lt;/em&gt; embarrassing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Somehow or other, I got some ideas for some of the writing I'm doing.
I think they're solid ideas, but I need to review what little I have written currently to make sure I'm not writing myself into a corner.&lt;/p&gt;
&lt;p&gt;Basically, I want to make sure that what the main character knows is consistent with what ends up being the case, but to give them as little information as possible within the parameters I'm setting, because there's no reason to make this easy for them.&lt;/p&gt;
&lt;p&gt;I'll try to work on that later.
For now, I'm just glad that things are shaping up.
Now I ought to wrap things up for tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2023-04-09</title><link href="https://mwchase.neocities.org/diary-2023-04-09" rel="alternate"></link><published>2023-04-09T04:00:00-04:00</published><updated>2023-04-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-04-09:/diary-2023-04-09</id><summary type="html">&lt;p class="first last"&gt;Nothing to see here, oh well.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Traveled today, and did &lt;em&gt;a bunch&lt;/em&gt; of pointless messing-around.&lt;/p&gt;
&lt;p&gt;Maybe before I travel again tomorrow, I'll get some work done on MOTR, maybe I won't.&lt;/p&gt;
&lt;p&gt;Either way, I'm going to take things easy, because I think I need to.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2023-04-08</title><link href="https://mwchase.neocities.org/diary-2023-04-08" rel="alternate"></link><published>2023-04-08T04:00:00-04:00</published><updated>2023-04-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-04-08:/diary-2023-04-08</id><summary type="html">&lt;p class="first last"&gt;Just keep on doing things until I'm done with obligations...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I took care of a bunch of stuff today to, um, different levels of quality, but now I should be able take things a little easier.&lt;/p&gt;
&lt;p&gt;Right now, though, I'm just kind of fried.&lt;/p&gt;
&lt;p&gt;I'm unsure how much I'll get done over the weekend, so my overall plan/goal is to just take things easy for the next few days.&lt;/p&gt;
&lt;p&gt;I don't have anything else in mind for this entry, so, it's done.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2023-04-07</title><link href="https://mwchase.neocities.org/coding-2023-04-07" rel="alternate"></link><published>2023-04-07T04:00:00-04:00</published><updated>2023-04-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-04-07:/coding-2023-04-07</id><summary type="html">&lt;p class="first last"&gt;Did I forget to hit publish yesterday?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I thought some about what I want from the other decorator.
Something like...&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# parametric.py&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;make_deco&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;converter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;Paramatric&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt; &lt;span class="n"&gt;Parametric&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;deco&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Parametric&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="n"&gt;signature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;inspect&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;instantiators&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
        &lt;span class="n"&gt;metadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Metadata&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;param&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parameters&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="n"&gt;default&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;converter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;param&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;metadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;instantiators&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;param&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instantiator&lt;/span&gt;

        &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;instantiate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;box&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;selections&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;kwargs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instantiator&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;instantiators&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
                &lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;yield from&lt;/span&gt; &lt;span class="n"&gt;instantiator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;box&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;selections&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Parametric&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instantiate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;deco&lt;/span&gt;

&lt;span class="nd"&gt;@make_deco&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;parametric&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Parametric&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FakeValue&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parametric&lt;/span&gt;

&lt;span class="c1"&gt;# another module&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;adaptive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;AdaptiveParametric&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="n"&gt;segment_parametrics&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="nd"&gt;@_parametric&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;make_deco&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;deco&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Parametric&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SomeOtherFakeValue&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;
        &lt;span class="n"&gt;mapped_parametric&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;
        &lt;span class="n"&gt;parametric&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mapped_parametric&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parametric&lt;/span&gt;
        &lt;span class="n"&gt;segment_parametrics&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;_parametric&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map_over_1_parametric&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;mapped_parametric&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parametric&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;parametric&lt;/span&gt;

    &lt;span class="n"&gt;parametric&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;deco&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;AdaptiveParametric&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;segment_parametrics&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;parametric&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It might look a little weird that I'm using the old mapping functions as part of implementing the new mapping functions, but the thing is, there are places where I feel like it doesn't make sense to switch from the old system, so I might as well keep it, and if I'm keeping it, I might as well use it in new places as well.&lt;/p&gt;
&lt;p&gt;Aside from the corrections to obvious mistakes I made last-time-ish, I'm now considering what I want the new MappedParametric concept to look like.
The &amp;quot;problem&amp;quot; is, both of the things that go into it are functions, unlike the old way, which used a label instead of a parametric.
I can't think of which one I'd want to have set up in a decorator position, so maybe... both?&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;mapped_parametric&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parametric&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;none_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parametric&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;none_count&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;none_count&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;MappedParametric&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;map&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parametric&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;parametric&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;partial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mapped_parametric&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parametric&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;parametric&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That seems a little cursed, so it would be better to inventory how this would &lt;em&gt;actually be used&lt;/em&gt;, before actually putting this in the code and trying to annotate it.
(A more restrained way to accomplish something similar would be to create alternative constructors with &lt;tt class="docutils literal"&gt;classmethod&lt;/tt&gt;, but that's not as funny as putting cartoon swearing in the parameter list.)&lt;/p&gt;
&lt;p&gt;Anyway, that's enough for now.
I'm going to try to figure out what happened to last night's entry, then wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-04-06</title><link href="https://mwchase.neocities.org/coding-2023-04-06" rel="alternate"></link><published>2023-04-06T04:00:00-04:00</published><updated>2023-04-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-04-06:/coding-2023-04-06</id><summary type="html">&lt;p class="first last"&gt;These names won't make any more sense when I'm done, but maybe the structure of the code will.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Before I get into messing with code, let's take a look at what I need to know for one of the future steps, that of getting rid of &lt;tt class="docutils literal"&gt;MapOverSelection&lt;/tt&gt;.
First, let's see how it's used.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;In &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt;:&lt;ul&gt;
&lt;li&gt;I wrap it in an alias, which is, a bit unfortunate.
The alias is used only in the module, which helps.
The alias is used:&lt;ul&gt;
&lt;li&gt;In the signature of &lt;tt class="docutils literal"&gt;Artifact.convert&lt;/tt&gt;.
In this context, it is passed to &lt;tt class="docutils literal"&gt;_selection_labels&lt;/tt&gt;, which corresponds to one of the metadata fields on a parametric, but I'm not sure which one currently, and to a &lt;tt class="docutils literal"&gt;Condenser&lt;/tt&gt; and an &lt;tt class="docutils literal"&gt;OutputConverter&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;In the signature of &lt;tt class="docutils literal"&gt;Condenser.__call__&lt;/tt&gt;.
In this context, it is used directly, to alter a parametric through a folding operation.
The probable updated version of this usage is to directly have a set of parametrics, and pass that directly to the fold.&lt;/li&gt;
&lt;li&gt;In the signature of &lt;tt class="docutils literal"&gt;InternalConverter.__call__&lt;/tt&gt;.
In this context, it is passed to the &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; constructor.&lt;/li&gt;
&lt;li&gt;In the signature of &lt;tt class="docutils literal"&gt;OutputConverter.__call__&lt;/tt&gt;.
In this context, it is passed to &lt;tt class="docutils literal"&gt;InternalConverter.__call__&lt;/tt&gt; and the &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; constructor, as well as to &lt;tt class="docutils literal"&gt;OutputConverter.__call__&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Otherwise, it's held in the &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; object, and passed out via &lt;tt class="docutils literal"&gt;Artifact.exposed_selections&lt;/tt&gt;.
Which is called from...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;parametric_command&lt;/tt&gt; module, specifically...&lt;ul&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Put.selections&lt;/tt&gt;, which is accessed in...&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;ParametricCommand._selections&lt;/tt&gt;, which passes individual items to &lt;tt class="docutils literal"&gt;_update_labeled_maps&lt;/tt&gt;, and also accesses a similarly-named attribute off of...&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;AdaptiveParametric&lt;/tt&gt;, which dynamically constructs a parametric based off of its attributes, in a very unsafe way, by the standards of this layer.
The hope here is to replace this with bare &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt;, or a much lighter wrapper.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;_update_labeled_maps&lt;/tt&gt; associates a selection label to a &lt;tt class="docutils literal"&gt;MapOverSelection&lt;/tt&gt;, and this is helpful because...&lt;/li&gt;
&lt;li&gt;It is eventually passed to &lt;tt class="docutils literal"&gt;_optional_parametric&lt;/tt&gt;?
This confusing function only needs to pass it to &lt;tt class="docutils literal"&gt;Put.build&lt;/tt&gt;, which passes it back to &lt;tt class="docutils literal"&gt;Artifact.convert&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From here, it looks like all I need to do is to make sure some of the types are properly restricted.
I think that can be accomplished by...&lt;/p&gt;
&lt;p&gt;Using the type &lt;tt class="docutils literal"&gt;Parametric[PathStr]&lt;/tt&gt;.
Or maybe pairs of &lt;tt class="docutils literal"&gt;Parametric[T]&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Callable[[T],&lt;/span&gt; PathStr]&lt;/tt&gt;.
Which implies to me that maybe I don't rip out quite as much as I was thinking I would.
However...&lt;/p&gt;
&lt;p&gt;I forgot my train of thought.&lt;/p&gt;
&lt;p&gt;Anyway, I think I've got the information I need to plan out new versions.
The one wrinkle is, I want to figure out if it's possible to take the core &lt;tt class="docutils literal"&gt;parametric()&lt;/tt&gt; logic from yesterday, and have some of it in common somehow, since, unless I manage not to need the pair stuff, the pair is going to need its own decorator with an extremely similar implementation.&lt;/p&gt;
&lt;p&gt;In any case, I should get ready for bed now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-04-05</title><link href="https://mwchase.neocities.org/coding-2023-04-05" rel="alternate"></link><published>2023-04-05T04:00:00-04:00</published><updated>2023-04-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-04-05:/coding-2023-04-05</id><summary type="html">&lt;p class="first last"&gt;Just kind of smoosh all of the metadata together, it's fine.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, the magma is written, and I'll verify that it's &amp;quot;actually correct in general&amp;quot; later, hopefully after I've nailed down some requirements for it.&lt;/p&gt;
&lt;p&gt;Let's start working on the next &lt;tt class="docutils literal"&gt;parametric&lt;/tt&gt; overhaul.&lt;/p&gt;
&lt;p&gt;The first half of this has several parts:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;A wrapper class around &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt; objects.&lt;/li&gt;
&lt;li&gt;A property on &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt; that is documented to return an object of the underlying type, but actually returns an instance of this wrapper class.&lt;/li&gt;
&lt;li&gt;A decorator that takes the signature of the function it's passed, and makes sure that all arguments have a default value that's an instance of the wrapper class.
Then, map over all of them.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It's probably worth calling the decorator just &amp;quot;&lt;tt class="docutils literal"&gt;parametric&lt;/tt&gt;&amp;quot;.
The type should be called, um...
&lt;tt class="docutils literal"&gt;FakeValue&lt;/tt&gt;, or something.
Something that hopefully makes it really clear that it shouldn't work for most purposes.
And the property, just &lt;tt class="docutils literal"&gt;value&lt;/tt&gt;, maybe?&lt;/p&gt;
&lt;p&gt;I don't know if I want to put these ideas into the actual module yet, but let's see what I can do in code blocks here.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Eventually, these will be replaced with &amp;quot;attrs.frozen&amp;quot;&lt;/span&gt;
&lt;span class="nd"&gt;@attr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataclass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frozen&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FakeValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;typing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Generic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T_co&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
    &lt;span class="n"&gt;parametric&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Parametric&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T_co&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Parametric&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;typing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Generic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T_co&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
    &lt;span class="nd"&gt;@property&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;T_co&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T_co&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FakeValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;parametric&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;signature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;inspect&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;instantiators&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="n"&gt;metadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Metadata&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;param&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parameters&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;default&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;param&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FakeValue&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;
        &lt;span class="n"&gt;metadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;instantiators&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;param&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instantiator&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;instantiate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;box&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;selectors&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# I&amp;#39;m pretty sure Python is too strict to allow this, but eh.&lt;/span&gt;
        &lt;span class="n"&gt;kwargs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;yield from&lt;/span&gt; &lt;span class="n"&gt;instantiator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;box&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;selectors&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instantiator&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;instantiators&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Parametric&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instantiate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I hope this basically works, disregarding the syntactic gunk that I'll have to work around.
I'm going to wrap things up for now, and think about it.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Weekly Roundup 2023-04-04</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-04-04" rel="alternate"></link><published>2023-04-04T04:00:00-04:00</published><updated>2023-04-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-04-04:/weekly-roundup-2023-04-04</id><summary type="html">&lt;p class="first last"&gt;I suppose I really should try to list, like, specific things blocking a release...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I worked on updating the &lt;tt class="docutils literal"&gt;cmd&lt;/tt&gt; module in MOTR.&lt;/li&gt;
&lt;li&gt;Thursday: I realized that the &lt;tt class="docutils literal"&gt;cmd&lt;/tt&gt; module is going to need to operate in some weird mixed mode for the time being.&lt;/li&gt;
&lt;li&gt;Friday: I got the mixed mode stuff working, which gave me the confidence to try to address the Mypy 1 typing issues. Trying to address the issues removed the confidence.&lt;/li&gt;
&lt;li&gt;Saturday: I finished with &lt;tt class="docutils literal"&gt;cmd&lt;/tt&gt;, and had a look at &lt;tt class="docutils literal"&gt;command&lt;/tt&gt;. That's... even less straightforward, even though there's no legacy path to worry about.&lt;/li&gt;
&lt;li&gt;Sunday: I made a small addition to &lt;tt class="docutils literal"&gt;cmd&lt;/tt&gt; to handle the changes I'm making to &lt;tt class="docutils literal"&gt;command&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Monday: I got &lt;em&gt;almost&lt;/em&gt; done updating &lt;tt class="docutils literal"&gt;command&lt;/tt&gt;. Just a little tweaking left, and it's good to go.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to wrap up the &lt;tt class="docutils literal"&gt;command&lt;/tt&gt; updates, and probably get into some weirder updating projects.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-04-03</title><link href="https://mwchase.neocities.org/coding-2023-04-03" rel="alternate"></link><published>2023-04-03T04:00:00-04:00</published><updated>2023-04-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-04-03:/coding-2023-04-03</id><summary type="html">&lt;p class="first last"&gt;No progress yet in understanding why this stuff breaks under Mypy 1.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was messing with other stuff today, so let's give some quick thoughts to the conversion method I want to update.&lt;/p&gt;
&lt;p&gt;The actual update should be pretty simple.
I &amp;quot;just&amp;quot; have to update a single type and fix the errors that bubble out...&lt;/p&gt;
&lt;p&gt;Okay, that was actually pretty easy, except that I forgot to mark some usages as covariant, so I went add fixed that, and then it all, just, went.&lt;/p&gt;
&lt;p&gt;That's addressing the types, but not the new combination logic, which just has to go in &lt;tt class="docutils literal"&gt;command&lt;/tt&gt;.
I don't feel like writing a magma for this right now, even though I basically know what it has to do.
There are a few things that I may need to think about.
Like, should it be possible to specify duplicate paths in an environment variable, and, if so, do I want some way to opt into deduplication?
For now, it's probably safe to ignore questions like that.&lt;/p&gt;
&lt;p&gt;Once the magma is in, it'll be trivial to add a new type to &lt;tt class="docutils literal"&gt;parametric_command&lt;/tt&gt; to handle it.&lt;/p&gt;
&lt;p&gt;In any case, the other thing I can be working on is, how to phase out the MapOverSelection stuff.&lt;/p&gt;
&lt;p&gt;For now, I'm going to wind down and mess with other stuff.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2023-04-02</title><link href="https://mwchase.neocities.org/coding-2023-04-02" rel="alternate"></link><published>2023-04-02T04:00:00-04:00</published><updated>2023-04-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-04-02:/coding-2023-04-02</id><summary type="html">&lt;p class="first last"&gt;Things that are necessary and also easy.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right.
I've determined that the right way to handle the new environment variable format is to shove everything into the new wrapper types, and use map methods to apply the existing conversion method over the contents.&lt;/p&gt;
&lt;p&gt;The wrinkle that I addressed with that was to write new methods to properly handle the whole &amp;quot;sort-of-effects-system&amp;quot; I have going.
So, I did that, and now I need to review the conversion method.
For reasons, it might make sense to pull it out into its own class.&lt;/p&gt;
&lt;p&gt;I'll give this all a shot later.&lt;/p&gt;
&lt;p&gt;For now, I'm going to take things easy again.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2023-04-01</title><link href="https://mwchase.neocities.org/coding-2023-04-01" rel="alternate"></link><published>2023-04-01T04:00:00-04:00</published><updated>2023-04-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-04-01:/coding-2023-04-01</id><summary type="html">&lt;p class="first last"&gt;Given enough thought, this was easy. Next time, though...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I went back to the &lt;tt class="docutils literal"&gt;cmd&lt;/tt&gt; module, and finished updating the interfaces.
Everything beyond this point should be a case of switching over completely to the new interface.
If I'm remembering and reading the grep output correctly, that should be relatively minor of a change.
I think it should just be &lt;tt class="docutils literal"&gt;command&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;parametric_command&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Oof, &amp;quot;just&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;parametric_command&lt;/tt&gt; should be fine, but &lt;tt class="docutils literal"&gt;command&lt;/tt&gt; is a bit of a mess in this area.&lt;/p&gt;
&lt;p&gt;Here's the deal...&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;command&lt;/tt&gt; defines an &lt;tt class="docutils literal"&gt;EnvVars&lt;/tt&gt; type that is parametric over... stuff.
It's a map from strings to... stuff.
Where &amp;quot;stuff&amp;quot;, in this case, is a &lt;tt class="docutils literal"&gt;CmdArg&lt;/tt&gt; and either nothing else, or an &lt;tt class="docutils literal"&gt;Executable&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;(Side note: I find myself wondering whether it's worth having the Path/NonPath distinction, but I still &lt;em&gt;need&lt;/em&gt; the new logic to feel comfortable with this code, so let's go ahead with it anyway.)&lt;/p&gt;
&lt;p&gt;Now, let's trace what this code is doing.
Not going to touch it tonight, but let's trace it.&lt;/p&gt;
&lt;p&gt;The type ultimately gets used by &lt;tt class="docutils literal"&gt;resolve_env&lt;/tt&gt;.
This function currently produces a mapping from &lt;tt class="docutils literal"&gt;str&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;CmdArg&lt;/tt&gt;.
It needs to produce a mapping from &lt;tt class="docutils literal"&gt;str&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;EnvVar[CmdArg]&lt;/tt&gt;.
Which means that &lt;tt class="docutils literal"&gt;_convert_segment&lt;/tt&gt; needs to be producing &lt;tt class="docutils literal"&gt;EnvVar[CmdArg]&lt;/tt&gt;, which is a bit interesting, because it doesn't overlap with the other return types from &lt;tt class="docutils literal"&gt;_convert_segment&lt;/tt&gt;, so I ought to be able to split it out into a new method.
At that point, it makes sense to provide three private conversion methods instead of one combined one.&lt;/p&gt;
&lt;p&gt;So, the first thing I need to do is to trace out what the other call sites do, and track down which types they need to handle.&lt;/p&gt;
&lt;p&gt;That could be a lot.
So, I'm going to wrap things up for now, and wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-03-31</title><link href="https://mwchase.neocities.org/coding-2023-03-31" rel="alternate"></link><published>2023-03-31T04:00:00-04:00</published><updated>2023-03-31T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-03-31:/coding-2023-03-31</id><summary type="html">&lt;p class="first last"&gt;I genuinely can't tell if this stuff is a regression or a bugfix.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's think about MOTR and the &lt;tt class="docutils literal"&gt;Cmd.env&lt;/tt&gt; field some more.
It's arguably inaccurate, but not in a way that matters, to shove everything into one mapping type in each place.
So, let's give that a shot.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Changing the code seemed to work, but it looks like I made it unhappy...&lt;/p&gt;
&lt;p&gt;Okay, that was a legitimate error, a mistype.
Fixed easily enough.
Now, I'll get the other problem...&lt;/p&gt;
&lt;p&gt;And, done.&lt;/p&gt;
&lt;p&gt;Now, before I think about continuing the update path here, I should really try to update some of my dependencies.&lt;/p&gt;
&lt;p&gt;When I run the latest version of Mypy against the MOTR code base...
It complains mightily because of some Extremely Normal code.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;I slammed into it a few times.
Here are the basic issues:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;TypeVars that are restricted to a range of values including a (user-defined?) generic type parameterized with &lt;tt class="docutils literal"&gt;Any&lt;/tt&gt; no longer unify with that type parameterized with a specific type.&lt;/li&gt;
&lt;li&gt;Sometimes, for some reason, a function that always defines a return type, is considered to not actually return.
The heavy use of &lt;tt class="docutils literal"&gt;overload&lt;/tt&gt; in this area of code may be confusing things.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I can get around the former case by using an unrestricted type variable, which is &lt;em&gt;basically&lt;/em&gt; harmless, but I can't even figure out which line is making it complain in the latter case.
Like, yes, there are line numbers in the error messages, but those are at &lt;em&gt;usage&lt;/em&gt;, so it's kind of already too late, in that the idea that this function can fail to return is already locked in.&lt;/p&gt;
&lt;p&gt;Anyway, I'll get back to that later, or not.
I made my choices for the &lt;tt class="docutils literal"&gt;cmd&lt;/tt&gt; module tonight, and I'll call that good enough.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-03-30</title><link href="https://mwchase.neocities.org/coding-2023-03-30" rel="alternate"></link><published>2023-03-30T04:00:00-04:00</published><updated>2023-03-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-03-30:/coding-2023-03-30</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Development is going well, I just need to turn over this rock and—OH NO!&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right.
Starting this entry early, because I've been considering some fiddly changes I want to make within MOTR.&lt;/p&gt;
&lt;p&gt;Basically...&lt;/p&gt;
&lt;p&gt;The problem with updating the &lt;tt class="docutils literal"&gt;cmd&lt;/tt&gt; module is that the current release of MOTR is operating at such a low level (relatively speaking, &lt;em&gt;do not&lt;/em&gt; scoff) that the motrfiles that I'm currently writing need to reach into MOTR's guts in order to actually &lt;em&gt;accomplish&lt;/em&gt; anything.
So, even though I have some ideas about changes I want to make (I'll explain those ideas in a moment), I need to make sure that I leave some way for the existing code to manage to accomplish stuff.&lt;/p&gt;
&lt;p&gt;So, here's the issue.
As the reproduction code I pasted yesterday kind of indicates, I'm doing some stuff where I'm &lt;em&gt;basically&lt;/em&gt; replacing &lt;tt class="docutils literal"&gt;T&lt;/tt&gt; with &lt;tt class="docutils literal"&gt;T | tuple[T, &lt;span class="pre"&gt;...]&lt;/span&gt;&lt;/tt&gt;.
The problem with this type is that Mypy only allows me to accomplish anything with it, by, um, cheating.
The proper replacement is something like &lt;tt class="docutils literal"&gt;NewWrapper[T] | tuple[T, &lt;span class="pre"&gt;...]&lt;/span&gt;&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;NewWrapper[T] | OtherNewWrapper[T]&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;But if I do that, then the core code isn't supposed to handle &lt;tt class="docutils literal"&gt;T&lt;/tt&gt; any more, which means that existing callers get broken.&lt;/p&gt;
&lt;p&gt;So here's the trick:
I only need to continue to support the old flow with the &lt;tt class="docutils literal"&gt;cmd&lt;/tt&gt; module.
Everything else is basically invisible to the motrfiles.
SO.&lt;/p&gt;
&lt;p&gt;I have &lt;tt class="docutils literal"&gt;EnvVar = Unique[T] | Paths[T]&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;StrMap = Mapping[str, T]&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;EnvVars = StrMap[EnvVar[T]]&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;LegacyEnvVars = StrMap[T] | EnvVars[T]&lt;/tt&gt;.
Something like that.
What this lets me do is to beef up support for &lt;tt class="docutils literal"&gt;EnvVars&lt;/tt&gt; until I can cut the internal consumers over to it, but leave the legacy code paths in place until after I finally cut a release.&lt;/p&gt;
&lt;p&gt;I probably need to finagle this a bit to account for the fact that I'm specifying concrete types in a few places, but this shouldn't be hard to iron out.&lt;/p&gt;
&lt;p&gt;Regardless, I don't feel like I'm going to get it done tonight; I'm just glad I ironed things out a bit in thinking about the way I want the types to be interacting.&lt;/p&gt;
&lt;p&gt;That said, I do have the option to make everything a bit less... precise, in exchange for having fewer types kicking around.
This will need a bit of sketching to check, and right now I just want to take things easy for the rest of tonight again.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-03-29</title><link href="https://mwchase.neocities.org/coding-2023-03-29" rel="alternate"></link><published>2023-03-29T04:00:00-04:00</published><updated>2023-03-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-03-29:/coding-2023-03-29</id><summary type="html">&lt;p class="first last"&gt;I can think of ways around this, but they're ridiculous.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right...&lt;/p&gt;
&lt;p&gt;Let's just do one of these things: the path environment variable work.&lt;/p&gt;
&lt;p&gt;Actually, before that, let's see how bad the merge is currently.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Not too bad.&lt;/p&gt;
&lt;p&gt;Back to the path environment variable stuff.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;And nearly immediately, I run into trouble.&lt;/p&gt;
&lt;p&gt;It was no big deal supporting this at the very bottom level, and I anticipate the levels above will be... mostly workable.
What I need to figure out is how to deal with the weird &amp;quot;shapes&amp;quot; that allowing multiple values into the environment mapping is creating.
Here's the deal...&lt;/p&gt;
&lt;p&gt;The &lt;tt class="docutils literal"&gt;cmd_&lt;/tt&gt; wrapper is meant to unwrap values that may be IO-wrapped.
(If you know Haskell or a similar language, please try to ignore all possible connotations.
They're not the same thing, and if I come up with better terminology, I'll change it.)
These values are extract in three different places.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;Cmd&lt;/tt&gt; constructor needs &lt;em&gt;the same structure&lt;/em&gt;, but with all wrapping discarded, and individual values passed through &lt;tt class="docutils literal"&gt;os.fspath&lt;/tt&gt;.
The changes I just made make the structure more complex, and move around the concept of &amp;quot;individual values&amp;quot;.&lt;/li&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;action&lt;/tt&gt; (I assume this has a different name in the future topic, but I've forgotten) call needs the stream of individual values, as does the &lt;tt class="docutils literal"&gt;_extra_targets&lt;/tt&gt; call.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The initial thought that I have is that this implies that the current system of unwrapping doesn't completely make sense.
The current system assumes that we can get sensible behavior by passing around streams of values.
Now, there's no way around this when it comes to filtering by IO wrapper type, unless whatever alternative system can handle discarding values, but there's no gain in implementing such a system currently.&lt;/p&gt;
&lt;p&gt;So, the filtering behavior stands, but the &amp;quot;unwrapping&amp;quot; behavior has to move into a standalone function, and get mapped or comprehended.
Let's see...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Write the unwrap function...&lt;/li&gt;
&lt;li&gt;Use the unwrap function in &lt;tt class="docutils literal"&gt;cmd_&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;Remove the method...&lt;/li&gt;
&lt;li&gt;Fix a mypy error that I introduced somehow...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Okay, I'm going to need to puzzle over that.
But I know approximately what comes next:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Write a function to emit all &amp;quot;individual values&amp;quot; from one of these fancy environment dictionaries.&lt;/li&gt;
&lt;li&gt;Write a function to map over one of these fancy environment dictionaries.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm going to try to get the error fixed, and then call things for tonight.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;I sort of understand the error, but it...
It shouldn't happen?&lt;/p&gt;
&lt;p&gt;I just confirmed that it's not because I'm pinning the mypy version back.&lt;/p&gt;
&lt;p&gt;In any case, I'm using a cast to deal with this, but &lt;em&gt;really&lt;/em&gt;, mypy should just get the right value itself.&lt;/p&gt;
&lt;p&gt;Here is a reproduction.
My code is extremely normal.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TypeVar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Union&lt;/span&gt;

&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TypeVar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;T&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;Thing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Union&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;MaybeTuple&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Union&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;untuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MaybeTuple&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;

&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MaybeTuple&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Thing&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;reveal_type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;untuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# object???&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I think I'm going to have to live with this &lt;em&gt;at least&lt;/em&gt; until I can actually unpin the version, unless there's some way I'm &amp;quot;supposed to&amp;quot; be setting up these unions.&lt;/p&gt;
&lt;p&gt;In any case, I want to wrap up for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Weekly Roundup 2023-03-28</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-03-28" rel="alternate"></link><published>2023-03-28T04:00:00-04:00</published><updated>2023-03-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-03-28:/weekly-roundup-2023-03-28</id><summary type="html">&lt;p class="first last"&gt;I got stuff done, but I didn't feel great. Oh well.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I started drafting the next round of changes to the &lt;tt class="docutils literal"&gt;parametric&lt;/tt&gt; module.&lt;/li&gt;
&lt;li&gt;Thursday: I finished drafting those changes.&lt;/li&gt;
&lt;li&gt;Friday: I got some feedback on my writing, and added more esoteric shell gunk to the build script.&lt;/li&gt;
&lt;li&gt;Saturday: I dashed out something at approximately five to midnight.&lt;/li&gt;
&lt;li&gt;Sunday: I thought a bit about my priorities.&lt;/li&gt;
&lt;li&gt;Monday: I made the next round of changes to the &lt;tt class="docutils literal"&gt;parametric&lt;/tt&gt; module. It went well.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to finally get a bit more feedback on my writing, and work on the other overhauls that I feel like MOTR needs.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="MOTR"></category><category term="writing"></category></entry><entry><title>Coding 2023-03-27</title><link href="https://mwchase.neocities.org/coding-2023-03-27" rel="alternate"></link><published>2023-03-27T04:00:00-04:00</published><updated>2023-03-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-03-27:/coding-2023-03-27</id><summary type="html">&lt;p class="first last"&gt;Ripping another bandaid off.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I did the renames to update the fields in the &lt;tt class="docutils literal"&gt;parametric&lt;/tt&gt; module.
The initial update was pretty smooth, although I did run into one weird issue with the attrs plugin for Mypy.
I need to take some time to go over the module and make sure the updates all make sense.&lt;/p&gt;
&lt;p&gt;One thing I wasn't remembering yesterday is that I want to phase out one of the other modules.
Now that I have the new names in, I should be able to coherently reason about the replacement.&lt;/p&gt;
&lt;p&gt;I suppose I should also merge up to the future topic, but, eeeh.
Maybe later.&lt;/p&gt;
&lt;p&gt;So, looking at what's coming next:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Verify name updates in &lt;tt class="docutils literal"&gt;parametric&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Implement path environment variables.&lt;/li&gt;
&lt;li&gt;Phase out &lt;tt class="docutils literal"&gt;map_over_selection&lt;/tt&gt;.&lt;ul&gt;
&lt;li&gt;Implement decorator-based parameter mapping.&lt;ul&gt;
&lt;li&gt;Write a specialized wrapper class and fake property.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Document all usages of &lt;tt class="docutils literal"&gt;MapOverSelection&lt;/tt&gt;; this is going to be a bit of a pain, since it shows up in annotations nearly two dozen times.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Realistically speaking, the path environment variables is going to be less of a pain, but I'm really intrigued by the ergonomics wins from the overall process for phasing out &lt;tt class="docutils literal"&gt;map_over_selection&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Anyway, I can't do any of that tonight, so I'm going to take things easy for the rest of the night, and then work on doing things properly over the rest of the week.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Diary 2023-03-26</title><link href="https://mwchase.neocities.org/diary-2023-03-26" rel="alternate"></link><published>2023-03-26T04:00:00-04:00</published><updated>2023-03-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-03-26:/diary-2023-03-26</id><summary type="html">&lt;p class="first last"&gt;Stay tuned for: more stuff in this vein throughout the week.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I'm not writing this entry on a stupid time crunch, but I'm going to try to get it done quickly anyway.
All day pretty much was taken up with sleep and some important things that we had to take care of.&lt;/p&gt;
&lt;p&gt;Tomorrow, I hope to put in work on MOTR, prioritizing things between:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Support for path environment variables&lt;/li&gt;
&lt;li&gt;Reworking the parametric metadata label sets&lt;/li&gt;
&lt;li&gt;Making any helpful adjustments to how the parametric module is laid out.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The label sets probably come first, and then the other two as I feel like it.&lt;/p&gt;
&lt;p&gt;Once all of these are handled, I should take stock of what I'll need in order to advance with work on the wrappers.&lt;/p&gt;
&lt;p&gt;But for now, I'm going to put this entry in nice and early, and take things easy for the rest of the night.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2023-03-25</title><link href="https://mwchase.neocities.org/diary-2023-03-25" rel="alternate"></link><published>2023-03-25T04:00:00-04:00</published><updated>2023-03-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-03-25:/diary-2023-03-25</id><summary type="html">&lt;p class="first last"&gt;Whoops. Don't bother reading this.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Oh wow, I made some bad time management decisions.
The best course of action I can take, if I want to publish an entry tonight, is to just publish this tiny little thing.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2023-03-24</title><link href="https://mwchase.neocities.org/diary-2023-03-24" rel="alternate"></link><published>2023-03-24T04:00:00-04:00</published><updated>2023-03-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-03-24:/diary-2023-03-24</id><summary type="html">&lt;p class="first last"&gt;It's probably fine.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, so, here's where the writing is...&lt;/p&gt;
&lt;p&gt;My wife had a look over the current, very short draft.
Things sound mostly good so far, but the experimental stuff is making it a bit hard to follow.
So, I'm currently working on adding explanations of it.&lt;/p&gt;
&lt;p&gt;The next thing I need to do is to clear up my workflow for generating uploadable drafts, because I'm running into spellcheck-related issues that are definitely an issue on my end rather than any other software.&lt;/p&gt;
&lt;p&gt;Basically, because I'm adding a preface, I don't think I want to apply the same spell-checking stuff to the preface as to the main story.&lt;/p&gt;
&lt;p&gt;Okay cool I just have to pipe the plaintext version through &lt;tt class="docutils literal"&gt;sed &lt;span class="pre"&gt;-n&lt;/span&gt; &lt;span class="pre"&gt;'/Preface/,/Main&lt;/span&gt; &lt;span class="pre"&gt;Story/!p'&lt;/span&gt;&lt;/tt&gt; that's not going to be super confusing or anything later I bet.&lt;/p&gt;
&lt;p&gt;Anyway, that's stuff accomplished for tonight, cool.
It's early, but I'm still tired, so I'm going to wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="writing"></category></entry><entry><title>Coding 2023-03-23</title><link href="https://mwchase.neocities.org/coding-2023-03-23" rel="alternate"></link><published>2023-03-23T04:00:00-04:00</published><updated>2023-03-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-03-23:/coding-2023-03-23</id><summary type="html">&lt;p class="first last"&gt;Just about comfortable locking these ideas in.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, let's move through more parametric stuff...&lt;/p&gt;
&lt;p&gt;The next function defines a helper, which I'd like to move into the helper module related to &amp;quot;parametric maps&amp;quot;.
Basically, I want a few different example magma functions, and one of them will be &amp;quot;bail if the values don't match&amp;quot;.
All together, this should result in something like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Metadata&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Metadata&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;box_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;box_labels&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;box_labels&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# I, uh, missed adding this to the other constructors.&lt;/span&gt;
        &lt;span class="n"&gt;selection_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;selection_labels&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;selection_labels&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;iterated_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iterated_labels&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iterated_labels&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;exclusive_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exclusive_labels&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exclusive_labels&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;multivalue_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;multivalue_labels&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;multivalue_labels&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update_with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;_per_item_parametric_mapping&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reject_if_different&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The next function is... not named well...
Let's change it to...&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;iterated_labels_except_for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;_selection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Labels&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_selection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;labels&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iterated_labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iterated_labels&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;difference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And now, the last bits of code for the &lt;tt class="docutils literal"&gt;Metadata&lt;/tt&gt; class:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@property&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;singleton_labels&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_selection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exclusive_labels&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iterated_labels&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;selection_labels&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;multivalue_labels&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;selections&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;box&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;_box&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Box&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Iterator&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;_selection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Selection&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;box_label&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;box_labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;box_label&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;box&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;
    &lt;span class="c1"&gt;# Maybe check that every selection label maps to a non-empty value?&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;singleton_label&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;singleton_labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;box&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;singleton_label&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_selection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;selections&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iterated_labels&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;box&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let's see, the next really interesting one is &amp;quot;include_box&amp;quot;, which.
Hm.
That should fail if the included box has a non-empty intersection with &lt;tt class="docutils literal"&gt;selection_labels&lt;/tt&gt;, and it should set &lt;tt class="docutils literal"&gt;box_labels&lt;/tt&gt; to the difference.&lt;/p&gt;
&lt;p&gt;I think that all gets me to a good place with the &lt;tt class="docutils literal"&gt;parametric&lt;/tt&gt; module.
If the rest of the code has a problem with the changes I'm proposing, then that, um... that's a problem with the code that's not in the module, frankly.&lt;/p&gt;
&lt;p&gt;Now, I'm going to take a break from working on this for a day or so, then get into either this or the common motrfile concept.
In the meantime, I'm going to get in some work on the draft for my writing.&lt;/p&gt;
&lt;p&gt;For now, it's too late again, and I need to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-03-22</title><link href="https://mwchase.neocities.org/coding-2023-03-22" rel="alternate"></link><published>2023-03-22T04:00:00-04:00</published><updated>2023-03-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-03-22:/coding-2023-03-22</id><summary type="html">&lt;p class="first last"&gt;This overall makes a lot more sense.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I'm not sick any more.&lt;/p&gt;
&lt;p&gt;So, let's take a look at MOTR's code and imagine updating it.&lt;/p&gt;
&lt;p&gt;Going through in order, we have the helper method &lt;tt class="docutils literal"&gt;not_accumulable_because&lt;/tt&gt;, which is...
Only called from &lt;tt class="docutils literal"&gt;not_flex_out_because&lt;/tt&gt;?
Which is only called from &lt;tt class="docutils literal"&gt;artifact._parametric_not_flex_out&lt;/tt&gt;.
Which is used as a validator for &lt;tt class="docutils literal"&gt;artifact.Condenser&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;artifact.BasicOutputConverter&lt;/tt&gt;.
For now, let's ignore what's going on in &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt;, except insofar as this code is actually being used...&lt;/p&gt;
&lt;p&gt;Putting all of this together, and keeping in mind that I want to relax the restrictions on multivalue labels, the final result is: one function like so:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;not_flex_out_because&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Iterator&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Unexpected use of parametric with associated inputs.&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iterated_labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;The base parametric for an Output should not force iteration.&amp;quot;&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I dropped the restriction on required/exclusive labels, because I think the singleton reforms handle that, as well.&lt;/p&gt;
&lt;p&gt;The definition of &lt;tt class="docutils literal"&gt;expected_labels&lt;/tt&gt; changes to &lt;tt class="docutils literal"&gt;return self.iterated_labels | self.exclusive_labels&lt;/tt&gt;, and it probably needs a name change.&lt;/p&gt;
&lt;p&gt;Next, we have &lt;tt class="docutils literal"&gt;providing&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;also_providing&lt;/tt&gt;, which change like so:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@classmethod&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;iterating_over&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;label_set&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;frozenset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;iterated_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;label_set&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;selection_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;label_set&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;also_iterating_over&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;attr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;iterated_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iterated_labels&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;union&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
        &lt;span class="n"&gt;selection_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;selection_labels&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;union&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Next, we have &lt;tt class="docutils literal"&gt;as_maximal&lt;/tt&gt;, which maybe needs a name change, but I also have some simplifications planned.
Something like...&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Universe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;enum&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Enum&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;UNIVERSE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;enum&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__and__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;

    &lt;span class="fm"&gt;__rand__&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="fm"&gt;__and__&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__rsub__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;frozenset&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# Don&amp;#39;t know if this one is needed.&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__contains__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Which would be used as the default value of &lt;tt class="docutils literal"&gt;multivalue_labels&lt;/tt&gt;.
So &lt;tt class="docutils literal"&gt;as_maximal&lt;/tt&gt; becomes:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;as_maximal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;attr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;multivalue_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;multivalue_labels&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;selection_labels&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Similar changes to &lt;tt class="docutils literal"&gt;as_requiring&lt;/tt&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;as_exclusive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;attr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;iterated_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;frozenset&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="n"&gt;exclusive_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;expected_labels&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then we get into &lt;tt class="docutils literal"&gt;narrow_labels&lt;/tt&gt;, which becomes...&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;reduce_iteration_to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;_selection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Labels&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;labels&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iterated_labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;
    &lt;span class="n"&gt;no_longer_iterated_labels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iterated_labels&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;labels&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;attr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;iterated_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;exclusive_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exclusive_labels&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;no_longer_iterated_labels&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And I think I'll leave it there, because something is pretty suspicious about this, in a way that's making me suspect that my model is incomplete or incorrect.
There's a few things going on that look suspicious:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Given this logic, which is identical to the previous logic except for the names, I can't tell how the &lt;tt class="docutils literal"&gt;forbid_narrowing&lt;/tt&gt; concept from elsewhere in the code is supposed to work.
Like, this code is, um, pretty insistent...&lt;/li&gt;
&lt;li&gt;Oh, wait, I sort of get it.
&lt;tt class="docutils literal"&gt;forbid_narrowing&lt;/tt&gt; can't directly affect what happens to &lt;tt class="docutils literal"&gt;exclusive_labels&lt;/tt&gt;, but it does reduce the &lt;tt class="docutils literal"&gt;iterated_labels&lt;/tt&gt;...
In other words, &amp;quot;You can't squeeze this if I stomp it flat first.&amp;quot;
I'm now provisionally okay with all of this except for the names.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In any case, I need to think about this a bit more, then change things if I feel the need, or just move on down through the rest of the methods and functions.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Weekly Roundup 2023-03-21</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-03-21" rel="alternate"></link><published>2023-03-21T04:00:00-04:00</published><updated>2023-03-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-03-21:/weekly-roundup-2023-03-21</id><summary type="html">&lt;p class="first last"&gt;A good week. Pity about today, though.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I got some work done writing, in spite of some of the software I'm using.&lt;/li&gt;
&lt;li&gt;Thursday: I did a bit more work, and reached an important milestone.&lt;/li&gt;
&lt;li&gt;Friday: I considered how to move forward with the writing.&lt;/li&gt;
&lt;li&gt;Saturday: Hunspell gave me &lt;em&gt;problems&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Sunday: I worked on some of the changes I want to make to MOTR, focusing on planning.&lt;/li&gt;
&lt;li&gt;Monday: I got some names improved in MOTR, and locked in the plan to evaluate these changes and then apply them if they work out.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try and make some more progress on these projects.
It's hard to say when I'll get started on that or just how much I'll accomplish, because I seem to be at least a little sick right now.
I also want to get back to working on the TWaW review backlog.
I may need to rethink that project in some way...&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="MOTR"></category><category term="writing"></category></entry><entry><title>Coding 2023-03-20</title><link href="https://mwchase.neocities.org/coding-2023-03-20" rel="alternate"></link><published>2023-03-20T04:00:00-04:00</published><updated>2023-03-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-03-20:/coding-2023-03-20</id><summary type="html">&lt;p class="first last"&gt;Staring at my documentation and pondering what those words should actually mean.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I just did some quick work sketching stuff out for MOTR, and I think I've got what I need to try moving forward with the code:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;strong&gt;ghost labels&lt;/strong&gt; are now &lt;strong&gt;exclusive labels&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;I have a tentative mapping from the old label names to the new label names&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I don't think I have much time to work on this tonight, but the next step is to go through all of the operations I have defined on these sets, and make sure that the new names make intuitive sense with what the operations do.
In some cases, I'll need to tweak the definitions slightly, to deal with the fact that I'm trying to allow more possible metadata.&lt;/p&gt;
&lt;p&gt;The logic for determining singletons is also a bit up in the air.
I need to do some combination of set operations on &lt;em&gt;four&lt;/em&gt; of these sets.&lt;/p&gt;
&lt;p&gt;Anyway, I'll work that out later.
Here's hoping it all goes smoothly.
I'm going to wrap up early.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2023-03-19</title><link href="https://mwchase.neocities.org/coding-2023-03-19" rel="alternate"></link><published>2023-03-19T04:00:00-04:00</published><updated>2023-03-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-03-19:/coding-2023-03-19</id><summary type="html">&lt;p class="first last"&gt;I'm still working through this logic...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, so, I'm writing this late, so this is kind of &amp;quot;Hey, I should work on this more tomorrow,&amp;quot; but...&lt;/p&gt;
&lt;p&gt;I'm thinking more about the &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt; rework in MOTR, and the more I think about it, the more I realize that I need to nail down some of the terminology.&lt;/p&gt;
&lt;p&gt;I'm right now leaning towards four different kinds of data that can go into a command:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Arguments, which have an optional prefix.
These have values like &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--fail-under=100&lt;/span&gt;&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--show-contexts&lt;/span&gt;&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-d&lt;/span&gt;&lt;/tt&gt; &lt;tt class="docutils literal"&gt;reports/coverage&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Non-path environment variables.
This isn't a great name.
It refers to stuff like &lt;tt class="docutils literal"&gt;{&amp;quot;TERM&amp;quot;: &amp;quot;xterm&amp;quot;}&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Path environment variables.
As above.
This is the newest concept in this space, and refers to stuff like &lt;tt class="docutils literal"&gt;{&amp;quot;PYTHONPATH&amp;quot;: &lt;span class="pre"&gt;&amp;quot;/a/b/c:/d/e/f&amp;quot;}&lt;/span&gt;&lt;/tt&gt;, in which the code, not yet written, should synthesize the combined path list from the component paths.&lt;/li&gt;
&lt;li&gt;Implicit input and output.
Basically, sometimes a command's input or output is not present in the command's text, but MOTR still needs to be able to reason about it.
This is stuff like &amp;quot;the command accepts an output directory, but from downstream commands' perspectives, the outcome is that now the file &lt;tt class="docutils literal"&gt;index.html&lt;/tt&gt; in that directory exists&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are all collected into a &lt;tt class="docutils literal"&gt;ParametricCommand&lt;/tt&gt;, and the &lt;em&gt;usual&lt;/em&gt; case for &lt;tt class="docutils literal"&gt;ParametricCommand&lt;/tt&gt; is that every combination of parameter values corresponds to a single command.
However, this is not the case for commands that are supposed to aggregate data from several different versions of some other command.&lt;/p&gt;
&lt;p&gt;In order to convert the relevant &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt; values in this situation, the values have to undergo a process currently called &amp;quot;reduction&amp;quot;.
This selectively overrides the default behavior of combining &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt; values.
Now, some variables, instead of duplicating and altering the command invocations, are &lt;strong&gt;combined&lt;/strong&gt; within a single invocation.
The way &lt;strong&gt;combination&lt;/strong&gt; is accomplished depends on the type of value.&lt;/p&gt;
&lt;p&gt;Thinking about this, we can get the following vocabulary concepts:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;strong&gt;reduction&lt;/strong&gt; makes it possible for a &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt; to produce values for some &lt;em&gt;subset&lt;/em&gt; of its selections, instead of the full set&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;combination&lt;/strong&gt; is the process that allows reduction to occur&lt;/li&gt;
&lt;li&gt;some selections must be &lt;strong&gt;singleton&lt;/strong&gt; for various reasons, including in order to implement combination by, um, not combining anything&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;box labels&lt;/strong&gt; are all of the labels that must be passed to a &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt; to instantiate its values&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;selection labels&lt;/strong&gt; are a subset of box labels, and something will iterate over them at some point&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;iterated labels&lt;/strong&gt; are a subset of selection labels: these labels contribute a dimension to the final output matrix&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The overall desired behavior for &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt; labels is found by looking at the ranges of behavior for:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;arguments, non-path environment variables, path environment variables, implicit IO&lt;/li&gt;
&lt;li&gt;static data, inputs, outputs&lt;/li&gt;
&lt;li&gt;multiadic maps, reductions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are two main things here that relatively less obvious:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;What controls which labels need to be singleton, and what's the right way to represent this?&lt;/li&gt;
&lt;li&gt;What are all of the requirements around implicit IO?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The trick to implicit IO is that it doesn't distinguish the command that is actually run, so any selection label used by implicit IO either must be singleton, or must be an iteration label.
Otherwise, the same command will get added to the compendium multiple times with &lt;em&gt;different&lt;/em&gt; edge data, which is&lt;/p&gt;
&lt;p&gt;bad.&lt;/p&gt;
&lt;p&gt;It's like, there's something that will collide with itself unless separated by something else.
I don't think &lt;strong&gt;ghost labels&lt;/strong&gt; is a great name for this concept, but it's better than the weird patchwork I have currently.&lt;/p&gt;
&lt;p&gt;So, I think the last thing I need to get parity with what the current system models is something that can handle maps over output values.
The thing about output values is that any label that any label that an output value doesn't iterate over can't be a non-singleton iterated label.&lt;/p&gt;
&lt;p&gt;I'm not happy with iteration/iterated/whatever yet, but I think this all provides a basis to work with.
I'm going to wrap up for tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Diary 2023-03-18</title><link href="https://mwchase.neocities.org/diary-2023-03-18" rel="alternate"></link><published>2023-03-18T04:00:00-04:00</published><updated>2023-03-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-03-18:/diary-2023-03-18</id><summary type="html">&lt;p class="first last"&gt;&lt;em&gt;Unfortunately, computers,&lt;/em&gt;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The current situation with Hunspell is Some Serious Bullshit, so if anyone has an alternative to pitch, please reply to &lt;a class="reference external" href="https://im-in.space/&amp;#64;mwchase/110041239294474217"&gt;this post&lt;/a&gt;.
Nevertheless, I'm making progress on the draft, so that's good.&lt;/p&gt;
&lt;p&gt;I'll be asking friends for feedback over the next few days.&lt;/p&gt;
&lt;p&gt;For now, I'm going to take things easy for the rest of tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="writing"></category></entry><entry><title>Diary 2023-03-17</title><link href="https://mwchase.neocities.org/diary-2023-03-17" rel="alternate"></link><published>2023-03-17T04:00:00-04:00</published><updated>2023-03-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-03-17:/diary-2023-03-17</id><summary type="html">&lt;p class="first last"&gt;A little work, and then some good ideas for later.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Filling in details in the writing...
I did a little work there, but not much.&lt;/p&gt;
&lt;p&gt;I guess I'll have to wait until the weekend to try and make a serious effort.
For now, I'd rather try to put all of my conviction that &amp;quot;I should be working on something&amp;quot; into thinking about process improvements or figuring out how to discuss this skeleton of a story with other people.&lt;/p&gt;
&lt;p&gt;Okay, I was brushing my teeth and there was one thing I thought of to improve this outline: convert as much of the comments as feasible into [bracketed text] describing what the final version should look like, so the exports have more useful data in them.&lt;/p&gt;
&lt;p&gt;I'll start on that tomorrow, because I am tired, and I think I can feel it messing me up right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="writing"></category></entry><entry><title>Diary 2023-03-16</title><link href="https://mwchase.neocities.org/diary-2023-03-16" rel="alternate"></link><published>2023-03-16T04:00:00-04:00</published><updated>2023-03-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-03-16:/diary-2023-03-16</id><summary type="html">&lt;p class="first last"&gt;I did stuff, really quickly, and had basically no time to write about it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I've transferred over the important bits from my original &amp;quot;outline&amp;quot;, and now I need to work on filling in details or moving forward.
And by &amp;quot;now&amp;quot; I mean &amp;quot;later&amp;quot;, because I zoned out for &lt;em&gt;quite some time&lt;/em&gt; before getting on this, so I need to wrap this up as soon as possible.&lt;/p&gt;
&lt;p&gt;Now.
Now is good.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="writing"></category></entry><entry><title>Diary 2023-03-15</title><link href="https://mwchase.neocities.org/diary-2023-03-15" rel="alternate"></link><published>2023-03-15T04:00:00-04:00</published><updated>2023-03-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-03-15:/diary-2023-03-15</id><summary type="html">&lt;p class="first last"&gt;Unfortunately, computers, but fortunately the experience of writing is winning out.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The personal writing is going really well, I feel like.
I've been refining (and debugging, sigh) the automation for the personal writing I've been mentioning.&lt;/p&gt;
&lt;!-- I want this to be at "glitchy", but it doesn't play nice with dark mode --&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;&amp;quot;Hunspell is the spell checker of LibreOffice&amp;quot; is definitely a helpful statement that allows you to make sensible predictions about the behavior of the one, given information about the behavior of the other.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Those bumps in the road aside, I spent a bunch of today retyping and updating my initial draft, and, it's like, I guess I'm always going to be happy working on this, because right now nothing else makes me feel like this.&lt;/p&gt;
&lt;p&gt;Here's how things look for what to work on now:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Finish retyping.&lt;/li&gt;
&lt;li&gt;Fill in whichever bits I want to fill in next.&lt;/li&gt;
&lt;li&gt;Work on the motrfile, then work on other coding projects.&lt;/li&gt;
&lt;li&gt;Figure out whether I can roll back some of the compromises I made.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, I should definitely wrap up for tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="writing"></category></entry><entry><title>Weekly Roundup 2023-03-14</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-03-14" rel="alternate"></link><published>2023-03-14T04:00:00-04:00</published><updated>2023-03-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-03-14:/weekly-roundup-2023-03-14</id><summary type="html">&lt;p class="first last"&gt;I really really hope this pans out...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I didn't do much.&lt;/li&gt;
&lt;li&gt;Thursday: I started considering some somewhat drastic changes to MOTR. Like, adding new capabilities to core, released types.&lt;/li&gt;
&lt;li&gt;Friday: I started to realize just how drastic the changes were.&lt;/li&gt;
&lt;li&gt;Saturday: I didn't do much.&lt;/li&gt;
&lt;li&gt;Sunday: I started drafting a motrfile that should work with several projects. The hope is to take less effort now than it would take to push MOTR over the line; &lt;em&gt;and&lt;/em&gt; less effort than it would take to maintain many copies of a task runner configuration file (regardless of task runner), in order to let me work on other projects, and also to evaluate how I should write the bits of MOTR that aren't written yet.&lt;/li&gt;
&lt;li&gt;Monday: I made a little progress there...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to work on some writing (which I worked on automation for today), which will hopefully help me deal better with stage fright, which should eventually get us to a point where I can work on the TWaW reviews.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="MOTR"></category><category term="writing"></category></entry><entry><title>Coding 2023-03-13</title><link href="https://mwchase.neocities.org/coding-2023-03-13" rel="alternate"></link><published>2023-03-13T04:00:00-04:00</published><updated>2023-03-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-03-13:/coding-2023-03-13</id><summary type="html">&lt;p class="first last"&gt;This had better get easier, geez...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's see.
I'm working on a motrfile that should work with the projects I want to work on.
It will eventually be available through my Pijul Nest page, but I'm mainly putting it there as a backup, as I don't expect it to be useful to anyone else, unless someone got really excited about MOTR for some reason, and needs a reality check about the current state of the software.&lt;/p&gt;
&lt;p&gt;The current state of it is that I'm close to having it ready for running flake8.
Next, I'll look into setting stuff up with mypy, then pytest, profiling, and coverage.
Next up, shiv or some similar packaging.&lt;/p&gt;
&lt;p&gt;The big thing to work out is how to hook up stuff like virtualenv and pyproject-build.
This is stuff that I believe should be working in the current development version, but I kind of forget what I did...
And, in any case, I can't &lt;em&gt;use&lt;/em&gt; the current development version.
Or, I don't want to, not until I've come to a decision on those changes I was considering.&lt;/p&gt;
&lt;p&gt;Anyway, it's getting late and I'm tired; I should get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2023-03-12</title><link href="https://mwchase.neocities.org/coding-2023-03-12" rel="alternate"></link><published>2023-03-12T05:00:00-04:00</published><updated>2023-03-12T05:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-03-12:/coding-2023-03-12</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Short post&amp;quot;. Anyway, I'm looking forward to doing some weird stuff with Python without needing to mess with a config file to get nice task runner stuff.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was pretty much just decompressing all day, but I did get some of the work I was thinking of done.&lt;/p&gt;
&lt;p&gt;Basically, I want to investigate using the current release of MOTR with the hobby projects that it's supposed to help with.
This would be a bad idea if I were writing one motrfile per project.&lt;/p&gt;
&lt;p&gt;Which is why my plan is to write the motrfile once in a pijul repository, and then merge that repository into other repositories.
The idea is that the functional changes to the code should be entirely orthogonal to the updates I make to the motrfile, so the patches should be completely independent.&lt;/p&gt;
&lt;p&gt;Here's how things look for my plans:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Re-implement the MOTR motrfile, but using the lessons I learned writing the higher-level interface, so it's a bit more flexible.&lt;/li&gt;
&lt;li&gt;Redo my virtual tabletop project, with a focus first on simpler code, and next on making sure I'm comfortable with what I'm uploading, from a perspective of licensing/fair use.
(Nobody reached out to me about this, and I assume nobody knew.)
(I may look into aggressively factoring out textual content into external data files that aren't part of the repo. This is more than I &lt;em&gt;think&lt;/em&gt; I need to do for some, and seems reasonable for others.)&lt;/li&gt;
&lt;li&gt;Make sure the file is reusable by trying it out with stuff like my attempt at Cryptopals.&lt;/li&gt;
&lt;li&gt;Find other projects to mess with, now that the main obstacle to using MOTR is hopefully dealt with.
(I'm using MOTR instead of Nox because MOTR is, for obvious reasons, better conformed to my mental model for how this stuff &amp;quot;should&amp;quot; work, and also it should be faster.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The basic goal here is to get around feeling like any Python work I do &amp;quot;has to&amp;quot; be for MOTR.
It will make sense to keep working on it, because I want to make it easier to edit the motrfile, but writing it once should be okay, I hope.&lt;/p&gt;
&lt;p&gt;Anyway, it's way too late right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Diary 2023-03-11</title><link href="https://mwchase.neocities.org/diary-2023-03-11" rel="alternate"></link><published>2023-03-11T05:00:00-05:00</published><updated>2023-03-11T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-03-11:/diary-2023-03-11</id><summary type="html">&lt;p class="first last"&gt;Okay, let's try to do... not what I've been doing lately.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I was messing around and let this get too late, so.
Not much writing or other stuff today, and I'm thinking I shouldn't try to fit anything in after I publish.&lt;/p&gt;
&lt;p&gt;I've been kind of tired lately, so I'm going to sleep in tomorrow, but try to get stuff done once I'm up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2023-03-10</title><link href="https://mwchase.neocities.org/coding-2023-03-10" rel="alternate"></link><published>2023-03-10T05:00:00-05:00</published><updated>2023-03-10T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-03-10:/coding-2023-03-10</id><summary type="html">&lt;p class="first last"&gt;Stuff I missed&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Additional notes on the whole &amp;quot;more ways to handle environment variables&amp;quot; thing.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The correct place to do all of the necessary conversions in probably in &lt;tt class="docutils literal"&gt;cmd.cmd&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;The place where I need to check for compatibility with that call is in &lt;tt class="docutils literal"&gt;command_builder&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I think those are the last missing pieces of the puzzle.
Now that I have all of this together, I'm going to take a break and think about whether this is how I want to do things.&lt;/p&gt;
&lt;p&gt;I'm pretty sure this all makes sense, but still only pretty sure.&lt;/p&gt;
&lt;p&gt;For now, I'm going to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="note to self"></category><category term="short post"></category></entry><entry><title>Coding 2023-03-09</title><link href="https://mwchase.neocities.org/coding-2023-03-09" rel="alternate"></link><published>2023-03-09T05:00:00-05:00</published><updated>2023-03-09T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-03-09:/coding-2023-03-09</id><summary type="html">&lt;p class="first last"&gt;It will probably be fine. Probably.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I'm not going to commit to making these changes, but let's see what I'm thinking about doing in MOTR.
Here's the initial code in the &lt;tt class="docutils literal"&gt;command.py&lt;/tt&gt; module.
&lt;tt class="docutils literal"&gt;EnvVars = pyrsistent.typing.PMap[str, MaybeExecutable[TMaybeExecutable]]&lt;/tt&gt;.
This relies on: &lt;tt class="docutils literal"&gt;TMaybeExecutable = &lt;span class="pre"&gt;typing.TypeVar(&amp;quot;TMaybeExecutable&amp;quot;,&lt;/span&gt; typing.NoReturn, Executable[typing.Any, typing.Any])&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;MaybeExecutable = typing.Union[_cmd.CmdArg, TMaybeExecutable]&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;What I'm looking into messing with is to allow the map values to potentially contain a sequence of paths, and... hm.
Something looks a bit fishy here.
Okay, that &lt;tt class="docutils literal"&gt;CmdArg&lt;/tt&gt; is &lt;tt class="docutils literal"&gt;_io.MaybeIO[PathStr]&lt;/tt&gt;.
So, it should be all right to say &amp;quot;let's add the ability to stick this in a tuple instead, and rewrite the update logic&amp;quot;.&lt;/p&gt;
&lt;p&gt;And then to actually use this, let's take a look at &lt;tt class="docutils literal"&gt;parametric_command.py&lt;/tt&gt;
It has an &lt;tt class="docutils literal"&gt;EnvVar&lt;/tt&gt; class, which currently assumes that the values don't really combine.
I &lt;em&gt;believe&lt;/em&gt; to support this idea, I'd need another class that needs the tuple version of the values, or that provides an adaptor from non-tuple to tuple.
Now, that part is seemingly straightforward, but let's see...
So, instead of the &lt;tt class="docutils literal"&gt;Artifact&lt;/tt&gt; in this new class matching the type in question, the &lt;tt class="docutils literal"&gt;Artifact&lt;/tt&gt; needs to be the basic version, and the &lt;tt class="docutils literal"&gt;build()&lt;/tt&gt; method needs to... um...&lt;/p&gt;
&lt;p&gt;I regret to inform you that... I am confused.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, I &lt;em&gt;think&lt;/em&gt; it's enough to just change how single items get processed in the other class, and turn them into singleton tuples.&lt;/p&gt;
&lt;p&gt;At this point, I'm &lt;em&gt;pretty sure*&lt;/em&gt; that if I go through all of this stuff and carry out the &amp;quot;obvious steps&amp;quot;, then this stuff &amp;quot;should work&amp;quot;.&lt;/p&gt;
&lt;p&gt;But, um, &amp;quot;should work&amp;quot; is a scary phrase.&lt;/p&gt;
&lt;p&gt;Anyway, I want to wind down now, maybe do some more writing.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="note to self"></category></entry><entry><title>Diary 2023-03-08</title><link href="https://mwchase.neocities.org/diary-2023-03-08" rel="alternate"></link><published>2023-03-08T05:00:00-05:00</published><updated>2023-03-08T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-03-08:/diary-2023-03-08</id><summary type="html">&lt;p class="first last"&gt;Just kind of messed around, w/e&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Another day where I just kind of took things easy.
I'm going to try to write a bit after I publish this, and I have some questionable ideas about MOTR queued up to investigate later.&lt;/p&gt;
&lt;p&gt;I wrote this post earlier and then spaced out, so, um, let's wrap it up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2023-03-07</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-03-07" rel="alternate"></link><published>2023-03-07T05:00:00-05:00</published><updated>2023-03-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-03-07:/weekly-roundup-2023-03-07</id><summary type="html">&lt;p class="first last"&gt;Trying to get a handle on the right way to move forward with stuff.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I messed around a bit with MOTR's design, and I found... either a new requirement, or a valid relaxation of existing requirements.&lt;/li&gt;
&lt;li&gt;Thursday: I tried to approach the requirement changes in a principled way, and, eh. We'll see how this goes when I get back into coding.&lt;/li&gt;
&lt;li&gt;Friday: I got a few things done, but nothing that would really fill up a post.&lt;/li&gt;
&lt;li&gt;Saturday: I tried to take things easy.&lt;/li&gt;
&lt;li&gt;Sunday: I started working on trying out GODEATER, and it went well, until it didn't. Entirely a me problem.&lt;/li&gt;
&lt;li&gt;Monday: I tried to deal with that problem, and I guess I'm going to have to keep trying.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to either push through the MOTR work, or try out an idea I've been turning around to try and extract some value from it now without making terribly much work for myself later.
I also want to take down some of my source code repositories and put up slimmed-down versions, but I don't know if I'll actually get to that.
Also also, I'm still doing the experimental writing thing.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="review work"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Diary 2023-03-06</title><link href="https://mwchase.neocities.org/diary-2023-03-06" rel="alternate"></link><published>2023-03-06T05:00:00-05:00</published><updated>2023-03-06T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-03-06:/diary-2023-03-06</id><summary type="html">&lt;p class="first last"&gt;Shoutout to Mythic V2 for helping me name, like, everything in this story.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't get too far with the plan to address stage fright, but I did lay the groundwork some, and that went well.
I'm using the experimental writing for this, and the experimental stuff still just feels, like, really good.
Would probably really annoy most other people, but I deserve this.&lt;/p&gt;
&lt;p&gt;Anyway, I should wrap things up for tonight, or I will &lt;em&gt;extremely&lt;/em&gt; regret it.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="writing"></category></entry><entry><title>Diary 2023-03-05</title><link href="https://mwchase.neocities.org/diary-2023-03-05" rel="alternate"></link><published>2023-03-05T05:00:00-05:00</published><updated>2023-03-05T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-03-05:/diary-2023-03-05</id><summary type="html">&lt;p class="first last"&gt;Well, that's a pain.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;We did some stuff with the core of GODEATER today, and then... I got... stage fright?
Anyway, I'm going to need to work through that if we're going to get anywhere with this project.&lt;/p&gt;
&lt;p&gt;I have some plans for dealing with that, and I'll try to put them into action tomorrow.
For now, I'm going to take things easy.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="writing"></category></entry><entry><title>Diary 2023-03-04</title><link href="https://mwchase.neocities.org/diary-2023-03-04" rel="alternate"></link><published>2023-03-04T05:00:00-05:00</published><updated>2023-03-04T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-03-04:/diary-2023-03-04</id><summary type="html">&lt;p class="first last"&gt;Something has been telling me I need to take things easy.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Welp.
I didn't get anything else done today.
My plan is to get a bit more done tomorrow.&lt;/p&gt;
&lt;p&gt;It's getting late again.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2023-03-03</title><link href="https://mwchase.neocities.org/diary-2023-03-03" rel="alternate"></link><published>2023-03-03T05:00:00-05:00</published><updated>2023-03-03T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-03-03:/diary-2023-03-03</id><summary type="html">&lt;p class="first last"&gt;Researched setting stuff, read programming stuff, installed some software... *shrug*&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did a bunch of research and prep work for various projects and ideas, but nothing that translates into much to talk about &lt;em&gt;right now&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I'm going to wrap up now so it's not suddenly midnight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2023-03-02</title><link href="https://mwchase.neocities.org/coding-2023-03-02" rel="alternate"></link><published>2023-03-02T05:00:00-05:00</published><updated>2023-03-02T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-03-02:/coding-2023-03-02</id><summary type="html">&lt;p class="first last"&gt;I've been researching space operas and space-opera-adjacent fiction&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Taking things slow, thinking about MOTR.
I worked out last night that the conditions under which a label is required to be a singleton are somewhat complicated, so there &lt;em&gt;probably&lt;/em&gt; needs to be new fields to track the state.&lt;/p&gt;
&lt;p&gt;However.&lt;/p&gt;
&lt;p&gt;Rather than just throwing fields at it to try to approximate the correct behavior, let's try laying out the final semantics, starting in very general terms.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The most obvious check to make at runtime is, are all of the necessary labels defined?&lt;/li&gt;
&lt;li&gt;The next most obvious check is, which of those labels must be singletons?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This second check is trickier.
On the one hand, every label &lt;em&gt;not&lt;/em&gt; iterated over by &lt;em&gt;every&lt;/em&gt; output must be a singleton, so we effectively have an allow list.
On the other hand, every label that is iterated over by an environment variable must be either iterated over at the top level, or a singleton.
(Inclusive or.)
On the gripping hand, every label that is &lt;em&gt;only&lt;/em&gt; iterated over by implicit values must be a singleton.&lt;/p&gt;
&lt;p&gt;Currently, I believe this last requirement is satisfied by &lt;em&gt;not allowing those labels to exist&lt;/em&gt;.
There are two &amp;quot;big things&amp;quot; that need to be done in this area.
One is to allow all of these scenarios.
The other is to give the metadata the ability to notice &amp;quot;hey, here are these selections being used, but forced to be singletons&amp;quot;, and emit some kind of diagnostics.&lt;/p&gt;
&lt;p&gt;Anyway, I got distracted and it's late, so I'm done for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="note to self"></category></entry><entry><title>Coding 2023-03-01</title><link href="https://mwchase.neocities.org/coding-2023-03-01" rel="alternate"></link><published>2023-03-01T05:00:00-05:00</published><updated>2023-03-01T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-03-01:/coding-2023-03-01</id><summary type="html">&lt;p class="first last"&gt;Rehash, rehash, uh-oh, I found a new requirement.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm taking a break from GODEATER prep to reconsider what invariants MOTR's &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt; type will want to track.
Here's the general outline I need to work through:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt; class exists in order to produce &lt;tt class="docutils literal"&gt;Command&lt;/tt&gt; objects, which produce a set of &lt;tt class="docutils literal"&gt;Fact&lt;/tt&gt;s relating a &lt;tt class="docutils literal"&gt;Command&lt;/tt&gt; to other &lt;tt class="docutils literal"&gt;Task&lt;/tt&gt;s via &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt;s and &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt;s.&lt;/li&gt;
&lt;li&gt;A &lt;tt class="docutils literal"&gt;Command&lt;/tt&gt; will have arguments, environment variables, and implicit inputs and outputs (as well as better-behaved values).&lt;/li&gt;
&lt;li&gt;There can be any number of arguments.&lt;/li&gt;
&lt;li&gt;Each environment variable must have just one value.&lt;/li&gt;
&lt;li&gt;Of the &lt;tt class="docutils literal"&gt;Command&lt;/tt&gt;s produced by a &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt;, no two can produce identical &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt;s.&lt;/li&gt;
&lt;li&gt;Of the &lt;tt class="docutils literal"&gt;Command&lt;/tt&gt;s produced by a &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt;, no two can differ only in implicit &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt;s or &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt;s.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, some components are outputs, and need to ensure that the actual parameterization does not vary over any multi-valued label that the output does not vary over.&lt;/p&gt;
&lt;p&gt;Some components are environment variables, and the final output must vary over at least as many labels as the environment variable.&lt;/p&gt;
&lt;p&gt;Some components are implicit, and if they vary, the final output must vary over those labels in a non-implicit component.&lt;/p&gt;
&lt;p&gt;I believe these cases cover the existing fields.&lt;/p&gt;
&lt;p&gt;These are handled with the methods &lt;tt class="docutils literal"&gt;as_maximal&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;as_requiring&lt;/tt&gt;, as well as a few others.&lt;/p&gt;
&lt;p&gt;So, we need fields like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&amp;quot;These fields are the only multi-valued labels that the final output can vary over&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;These fields must be iterated over by the final output [if they have multiple values]&amp;quot; oh no I think I just found a new requirement&lt;/li&gt;
&lt;li&gt;&amp;quot;This output is of one type, and these fields need to be iterated over by an output of the other type&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm going to need to ponder how to handle the new requirement I just noticed.
Or, technically, maybe it's a relaxation of a requirement?
A new requirement of what to accept?&lt;/p&gt;
&lt;p&gt;Anyway, I'm done for now, but I'm going to note this stuff down so I know I need to tweak stuff.&lt;/p&gt;
&lt;p&gt;Anyway, I should wrap up for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="note to self"></category></entry><entry><title>Weekly Roundup 2023-02-28</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-02-28" rel="alternate"></link><published>2023-02-28T05:00:00-05:00</published><updated>2023-02-28T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-02-28:/weekly-roundup-2023-02-28</id><summary type="html">&lt;p class="first last"&gt;Really nice to put together some concrete artifacts that probably mostly work.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I worked on figuring out what I need to include for a GM emulation reference.&lt;/li&gt;
&lt;li&gt;Thursday: I tested out my draft reference, and had some issues with speed. Something to keep in mind for later.&lt;/li&gt;
&lt;li&gt;Friday: I figured out most of what I want for reference material, but I had trouble getting it into a small form factor.&lt;/li&gt;
&lt;li&gt;Saturday: The printer aggressively did not work, but in a way that isn't immediately obvious, and kept on taunting me with hope.&lt;/li&gt;
&lt;li&gt;Sunday: I took a break from this prep work, and did prep work for something else.&lt;/li&gt;
&lt;li&gt;Monday: I put together the bulk of the reference material, having solved most of the issues I was grappling with earlier.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to take notes on GODEATER, and try to get through a session 0 and maybe a session 1.
We'll see.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="writing ideas"></category></entry><entry><title>Diary 2023-02-27</title><link href="https://mwchase.neocities.org/diary-2023-02-27" rel="alternate"></link><published>2023-02-27T05:00:00-05:00</published><updated>2023-02-27T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-02-27:/diary-2023-02-27</id><summary type="html">&lt;p class="first last"&gt;Another day without much time/focus for writing...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I managed to put together much of the reference material I'll need for the first round of reviews, so I'll start taking notes on the actual stuff under review tomorrow.&lt;/p&gt;
&lt;p&gt;Beyond that, I don't know, travel and research for other stuff.
I took a lot of time to see if I'd think of something else to put, and I didn't, so I'm not going to try to force it any further.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="writing ideas"></category></entry><entry><title>Diary 2023-02-26</title><link href="https://mwchase.neocities.org/diary-2023-02-26" rel="alternate"></link><published>2023-02-26T05:00:00-05:00</published><updated>2023-02-26T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-02-26:/diary-2023-02-26</id><summary type="html">&lt;p class="first last"&gt;A day without much time/focus for writing...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I traveled a bunch today, and didn't start writing this entry until late.
I'd been hoping to mess with some code that I haven't touched in a while, but I guess that's not happening today.&lt;/p&gt;
&lt;p&gt;I'm messing around with some other writing that might or might not see the light of day.
It's kind of a mix of very conventional elements with some experimentation that's very important to me, and the whole point is just to see how I come out the other side.&lt;/p&gt;
&lt;p&gt;Anyway, I should get ready for bed now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2023-02-25</title><link href="https://mwchase.neocities.org/diary-2023-02-25" rel="alternate"></link><published>2023-02-25T05:00:00-05:00</published><updated>2023-02-25T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-02-25:/diary-2023-02-25</id><summary type="html">&lt;p class="first last"&gt;I had heretofore avoided printer issues by simply not using the printer.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Printer... bad...&lt;/p&gt;
&lt;p&gt;Nevertheless, I've put together a collection of pages to print out.
It's a little... big, but it should get us through next week, when I'll finally start tracking time for this review project.&lt;/p&gt;
&lt;p&gt;(Everything before now was what should be one-time prep work, and I didn't want to skew the numbers.)&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to try to take things easy for now.
We might get a new printer later, but I'm pondering looking for a thermal printer, in the hopes that it won't jam so much.
(And also I won't raise my anxiety just looking at the cost of ink refills.)&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="writing ideas"></category></entry><entry><title>Diary 2023-02-24</title><link href="https://mwchase.neocities.org/diary-2023-02-24" rel="alternate"></link><published>2023-02-24T05:00:00-05:00</published><updated>2023-02-24T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-02-24:/diary-2023-02-24</id><summary type="html">&lt;p class="first last"&gt;I tried to make a flowchart, and it turned into a huge mess.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got distracted all night trying to come up with a concise format for the reference work I've been doing.
I think I've got all of the content drafted, but I'm having trouble condensing it nicely.&lt;/p&gt;
&lt;p&gt;Tomorrow, I'm going to print out everything I think I need from the books, and then try harder to condense stuff.&lt;/p&gt;
&lt;p&gt;For now, I need to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="writing ideas"></category></entry><entry><title>Diary 2023-02-23</title><link href="https://mwchase.neocities.org/diary-2023-02-23" rel="alternate"></link><published>2023-02-23T05:00:00-05:00</published><updated>2023-02-23T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-02-23:/diary-2023-02-23</id><summary type="html">&lt;p class="first last"&gt;I should be ready to test this soon, but probably not quite as soon as I'd like...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, so, with just a bit more effort, I should be able to put together my concept for reference material.
The problem is, I just tried to test run a scenario, and the result was pretty unwieldy.
Or, it went fine, although a bit slow, but then I messed with it a bit and lost motivation.
Part of the problem was that I managed to get &lt;em&gt;the same&lt;/em&gt; plot point twice, which kind of muddled things for me.
Hopefully that shouldn't be a common thing using this in practice.&lt;/p&gt;
&lt;p&gt;In any case, I've got a draft of the new guidelines for integrating the charts.
I'm going to look into two areas later:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Finally setting up the planned flag and highlight layout on the piles of charts I need to print out.&lt;/li&gt;
&lt;li&gt;Look into expressing the flows for the guidelines more concisely, and possibly including charts inline somehow.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For now, I need to wind down and take things easy.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="writing ideas"></category></entry><entry><title>Diary 2023-02-22</title><link href="https://mwchase.neocities.org/diary-2023-02-22" rel="alternate"></link><published>2023-02-22T05:00:00-05:00</published><updated>2023-02-22T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-02-22:/diary-2023-02-22</id><summary type="html">&lt;p class="first last"&gt;Unlike MOTR, I've got reasonable-looking bounds on how much prep work I'm doing to facilitate more interesting stuff.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I'm not buffering stuff yet.
I'm working on the planning for a revision to my reference material for GM emulation.
This is a mix of narrowing down Mythic's share to the new core (which is then expanded), redoing my referencing system for the plotlines table, and updating and rewriting the reference material.&lt;/p&gt;
&lt;p&gt;While I'm in here, I want to see if it makes sense to write up flowcharts for any of this, and whether it's possible to condense some of these tables onto one page.&lt;/p&gt;
&lt;p&gt;I've just about used up my thoughts for the night, so I guess I should get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="writing ideas"></category></entry><entry><title>Weekly Roundup 2023-02-21</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-02-21" rel="alternate"></link><published>2023-02-21T05:00:00-05:00</published><updated>2023-02-21T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-02-21:/weekly-roundup-2023-02-21</id><summary type="html">&lt;p class="first last"&gt;It's a little annoying taking things this methodically, but hopefully next week, we should just be able to dive in as needed.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I came up with a writing project: reviewing the contents of the Trans Witches are Witches bundle on Itch.&lt;/li&gt;
&lt;li&gt;Thursday: I worked on the planning for it, apparently.&lt;/li&gt;
&lt;li&gt;Friday: I began taking notes on the contents of the bundle, to set my expectations for, like, some things are really long, and most things aren't.&lt;/li&gt;
&lt;li&gt;Saturday: I finished the first round of notes, and tried to work out just how much effort it's going to take to &lt;em&gt;read&lt;/em&gt; all this.&lt;/li&gt;
&lt;li&gt;Sunday: I went into a bit more detail in the notes, looking more at the rules.&lt;/li&gt;
&lt;li&gt;Monday: I got the notes &lt;em&gt;hopefully&lt;/em&gt; complete enough to prioritize things.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to focus on redoing some work I did before, to create reference binders for a GM oracle.
That way, we should be able to play the games that specify a GM.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="reviews"></category><category term="writing"></category></entry><entry><title>Diary 2023-02-20</title><link href="https://mwchase.neocities.org/diary-2023-02-20" rel="alternate"></link><published>2023-02-20T05:00:00-05:00</published><updated>2023-02-20T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-02-20:/diary-2023-02-20</id><summary type="html">&lt;p class="first last"&gt;I'm getting a better understanding of most of these games...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, here's how it went:&lt;/p&gt;
&lt;p&gt;I took a few more notes on all of the tabletop games.
Starting tomorrow, we should be good to review the notes and prioritize things.
When that's done, then I can work on buffering stuff up.&lt;/p&gt;
&lt;p&gt;I can't think of anything else relevant to today, so I'm just going to wrap things up now because it's late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="writing ideas"></category></entry><entry><title>Diary 2023-02-19</title><link href="https://mwchase.neocities.org/diary-2023-02-19" rel="alternate"></link><published>2023-02-19T05:00:00-05:00</published><updated>2023-02-19T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-02-19:/diary-2023-02-19</id><summary type="html">&lt;p class="first last"&gt;The vibes are pretty important, I guess.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm working on categorizing the roleplaying games still.
I'm just kind of classifying some of the rules engagement based on vibes; the main thing missing from this currently is Our Minerva, which I haven't yet had enough focus to properly understand.&lt;/p&gt;
&lt;p&gt;The main thing I've determined from the vibes-based classification is that probably none of these have as involved a character creation system as Traveller, which is... probably not surprising?&lt;/p&gt;
&lt;p&gt;Tomorrow, I'll try to figure out which multiplayer games to focus on, but I'm going to wrap things up for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="writing ideas"></category></entry><entry><title>Diary 2023-02-18</title><link href="https://mwchase.neocities.org/diary-2023-02-18" rel="alternate"></link><published>2023-02-18T05:00:00-05:00</published><updated>2023-02-18T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-02-18:/diary-2023-02-18</id><summary type="html">&lt;p class="first last"&gt;Like a thousand pages to read... I'll be fine...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've sorted the tabletop games by approximate length; comparison between different games is &lt;em&gt;kind of&lt;/em&gt; fake, but order of magnitude is &lt;em&gt;probably&lt;/em&gt; generally useful for the ones that are more than a few pages.&lt;/p&gt;
&lt;p&gt;After that, I tried reading through one of the games that looked like it was in the middle of the pack.
That took about a half hour, so I'll have that as my baseline for now.&lt;/p&gt;
&lt;p&gt;One thing that I think helps when I remember to do it is, to set my PDF viewer to 100% instead of fitting width, because having the pages blown up like that makes them intimidating to look at, and hard to read all at once.&lt;/p&gt;
&lt;p&gt;The big thing I'm considering now is how we're going to play some of these games.
I'm maybe going to have to just review some of them in the abstract, oh well.
We'll see if I come up with something else when the time comes.&lt;/p&gt;
&lt;p&gt;Right now, I want to wrap things up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="writing ideas"></category></entry><entry><title>Diary 2023-02-17</title><link href="https://mwchase.neocities.org/diary-2023-02-17" rel="alternate"></link><published>2023-02-17T05:00:00-05:00</published><updated>2023-02-17T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-02-17:/diary-2023-02-17</id><summary type="html">&lt;p class="first last"&gt;Some kind of power-law distribution here&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm still taking notes on the different entries in the Trans Witches are Witches bundle.
I think some of these will end up taking much more time than others, just because of the sometimes-extreme differences in length.
Like, if something is over 200 pages long, I expect it'll take a lot more time to review it than something that's 5 pages long.&lt;/p&gt;
&lt;p&gt;Also, as I look through these, I have to admit that I'm way more excited about some of these games than others.
This isn't, like a commentary on the quality of anything.
Like, it's good for a bundle like this to have stuff for people with all kinds of different tastes.
It's just, I'll have to see what I think about some of the games that I'm feeling apprehensive or awkward about.&lt;/p&gt;
&lt;p&gt;Anyway, yeah, still in planning, so I'm not going to rush ahead yet.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="writing ideas"></category></entry><entry><title>Diary 2023-02-16</title><link href="https://mwchase.neocities.org/diary-2023-02-16" rel="alternate"></link><published>2023-02-16T05:00:00-05:00</published><updated>2023-02-16T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-02-16:/diary-2023-02-16</id><summary type="html">&lt;p class="first last"&gt;Seriously, what did I do today?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did a small amount of planning for the review stuff today, and... I have no memory of what else.&lt;/p&gt;
&lt;p&gt;That's a shame, but oh well, at least I got something done.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="writing ideas"></category></entry><entry><title>Diary 2023-02-15</title><link href="https://mwchase.neocities.org/diary-2023-02-15" rel="alternate"></link><published>2023-02-15T05:00:00-05:00</published><updated>2023-02-15T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-02-15:/diary-2023-02-15</id><summary type="html">&lt;p class="first last"&gt;It's short, okay?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I came up with something to write about.
Unfortunately, I ended up spending a lot of time today planning it, so this entry is going to have to be pretty rushed.&lt;/p&gt;
&lt;p&gt;Here is the general idea:&lt;/p&gt;
&lt;p&gt;Right now, the Internet Discourse around Hogwarts Legacy is Extremely Normal.
For my part, rather than spend $60 on a game in a franchise I no longer pay attention to (Johnny Depp was in some of the movies I guess? I don't care?), I put $60 in &lt;a class="reference external" href="https://itch.io/b/1712/trans-witches-are-witches"&gt;a related but very different direction&lt;/a&gt;.
Nobody wants me to provide a take on Hogwarts Legacy, and I don't want to formulate one, so what if I focused on other games?
After all, I've got... four-ish tabletop supplements, thirty-eight-ish tabletop games, twenty-three-ish video games, a poem, a soundtrack, and a set of tarot cards in there.
I also want to look into a few things not in the bundle that are directly related to it, and a few things not related to the bundle, but I thought of them because of it.&lt;/p&gt;
&lt;p&gt;And if this goes well, there are plenty more bundles from the past for me to look through and see what I've got...&lt;/p&gt;
&lt;p&gt;So, my plan right now is to pick, say, four things to write drafts on, and see what kind of time frame that gets me.
My goal is to figure out some whole number multiple of a week to put stuff out on.
If this all ends up being a reasonable set of things to do, then I'll be making posts here, probably under a category of, like, &amp;quot;reviews&amp;quot; or something, and putting reviews on the relevant store pages.
I'll be bringing in my wife for additional commentary and for player-two stuff as needed for the tabletop games.&lt;/p&gt;
&lt;p&gt;Things are late enough tonight, so I'll wrap up for now, and later I'll finish planning the first round of drafts.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category><category term="writing ideas"></category></entry><entry><title>Weekly Roundup 2023-02-14</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-02-14" rel="alternate"></link><published>2023-02-14T05:00:00-05:00</published><updated>2023-02-14T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-02-14:/weekly-roundup-2023-02-14</id><summary type="html">&lt;p class="first last"&gt;Having hurt a bunch of the muscles in my torso, I would recommend &lt;em&gt;not&lt;/em&gt; doing that.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I was sick(?) but I was still able to think about MOTR some.&lt;/li&gt;
&lt;li&gt;Thursday: Still sick, and I decided to switch gears to interpreter stuff.&lt;/li&gt;
&lt;li&gt;Friday: I got a bit further with the interpreter stuff.&lt;/li&gt;
&lt;li&gt;Saturday: I relaxed.&lt;/li&gt;
&lt;li&gt;Sunday: I came up with some parts of my interpreter code that need to work better.&lt;/li&gt;
&lt;li&gt;Monday: Things broke, and it was pretty much my fault, but at least I got some better error reporting out of trying to figure out just what was wrong.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, maybe I'll write tests for the interpreter code, or maybe I'll change gears again.
We'll see.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="MOTR"></category><category term="Python"></category><category term="Lua"></category><category term="Crafting Interpreters"></category></entry><entry><title>Coding 2023-02-13</title><link href="https://mwchase.neocities.org/coding-2023-02-13" rel="alternate"></link><published>2023-02-13T05:00:00-05:00</published><updated>2023-02-13T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-02-13:/coding-2023-02-13</id><summary type="html">&lt;p class="first last"&gt;It did not Just Work when I tried to use it...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm going to need to thoroughly document how my attempt to put together a higher-level system from a box of scraps actually works, because the failures are all pretty inscrutable.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Fortunately, I was able to fix it through the simple expedient of &lt;em&gt;reading the dang code&lt;/em&gt;, and realizing that my assumptions weren't lining up with how I'd written one module.&lt;/p&gt;
&lt;p&gt;So I fixed that, and things started working.
Then I kept on wiring in new modules, and things kept working, and I kind of don't trust it all?
I'm going to have to write a bunch of tests to actually verify all of this behavior, and I don't wanna...&lt;/p&gt;
&lt;p&gt;Instead, I wrote more code that I'm going to have to test later.
Oh well.&lt;/p&gt;
&lt;p&gt;All right, it's getting late and I want to wrap up.
For now, I'm going to take things easy.&lt;/p&gt;
&lt;p&gt;When I come back to this, I should go over all of the modules and make sure I write tests for them.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Lua"></category><category term="Crafting Interpreters"></category></entry><entry><title>Coding 2023-02-12</title><link href="https://mwchase.neocities.org/coding-2023-02-12" rel="alternate"></link><published>2023-02-12T05:00:00-05:00</published><updated>2023-02-12T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-02-12:/coding-2023-02-12</id><summary type="html">&lt;p class="first last"&gt;This stuff had better Just Work when I try to use it...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;It can be a bad sign when, while working on code in one language, you try to replicate the behavior of another language.
Different languages make different tradeoffs, and this (hopefully) guides the design of what is easy to accomplish in that language.
Attempts to import behavior from another context are likely to produce inefficiencies, or even bugs.&lt;/p&gt;
&lt;p&gt;So anyway, I've drafted an implementation of Python-tuple-like objects in pure Lua.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;That's it.
That's the joke.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Anyway, sure, maybe all of these attempts at immutability are kind of pointless if I'm not going to be changing stuff, but it does also cache the immutable value, which means that identical calls will produce the same table, so hashing and equality will work the way I want them to.&lt;/p&gt;
&lt;p&gt;Here's what I want to do next with this code:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Fix up the &amp;quot;frozen class&amp;quot; draft to use this new &amp;quot;frozen array&amp;quot; code.&lt;/li&gt;
&lt;li&gt;Figure out how to integrate this with the &amp;quot;enum class&amp;quot; code.&lt;/li&gt;
&lt;li&gt;Roll that out where I'm using enum classes currently.&lt;/li&gt;
&lt;li&gt;Also, update some of the enum classes to make proper use of the &amp;quot;class&amp;quot; side of things.&lt;/li&gt;
&lt;li&gt;I should really bake some reasonable stringification logic into classes somehow.
Maybe add a helper function to the &lt;tt class="docutils literal"&gt;disinherit&lt;/tt&gt; module that can be used to produce a &lt;tt class="docutils literal"&gt;__tostring&lt;/tt&gt; value.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, I'll work on that when I feel like it.
I'm trying to figure out what I'm really motivated to work on right now, and I'm not sure.
I'll think about it some more, I guess.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Lua"></category><category term="Crafting Interpreters"></category></entry><entry><title>Diary 2023-02-11</title><link href="https://mwchase.neocities.org/diary-2023-02-11" rel="alternate"></link><published>2023-02-11T05:00:00-05:00</published><updated>2023-02-11T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-02-11:/diary-2023-02-11</id><summary type="html">&lt;p class="first last"&gt;I'm not going to wrack my brains this time.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm still recovering from whatever has been messing me up all week, so I'm just not going to bother writing anything substantial right now.&lt;/p&gt;
&lt;p&gt;This weekend, I should have some time to mess with coding, because hopefully I'll finally be able to focus.&lt;/p&gt;
&lt;p&gt;For now, it's time to relax.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Coding 2023-02-10</title><link href="https://mwchase.neocities.org/coding-2023-02-10" rel="alternate"></link><published>2023-02-10T05:00:00-05:00</published><updated>2023-02-10T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-02-10:/coding-2023-02-10</id><summary type="html">&lt;p class="first last"&gt;I think I'll be able to make some kind of real progress on this soon...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I didn't come up with the greatest interface for the class-enum thing, but it works for now, and maybe I can tweak it later.&lt;/p&gt;
&lt;p&gt;Anyway, let's get into what it was for.
It looks like I'm getting into things near the beginning of the &lt;a class="reference external" href="https://loup-vaillant.fr/tutorials/earley-parsing/recogniser"&gt;tutorial&lt;/a&gt; I'm looking at.
So, let's see...&lt;/p&gt;
&lt;p&gt;Earley grammars can be expressed as a list of rules, which have a left-hand side (a single non-terminal symbol), and a right-hand side (a sequence of terminal and non-terminal symbols).
Later on, it should also have stuff like a constructor for the non-terminal given on the left, but let's stick to the recognizer for now.
(One obvious attempt at optimization would be to store the rules in a table that indexes them by left-hand side.)&lt;/p&gt;
&lt;p&gt;Being very careful about reading the example in the tutorial, we see that there's also &amp;quot;groups of (specifically terminal?) symbols&amp;quot;.&lt;/p&gt;
&lt;p&gt;Anyway, as we move on through the tutorial, we see that there is a concept of &amp;quot;items&amp;quot;, which derive from individual rules.
It seems to me most natural to build them up by stages, starting with a rule, and then adding the starting index in the parse, and then the progress through the right-hand side.
This is because the natural derivation of an item over time is to advance the progress through the right-hand side, but this has no effect on the starting position.&lt;/p&gt;
&lt;p&gt;Next, we get to state sets, which I &lt;em&gt;believe&lt;/em&gt; I wrote the &lt;tt class="docutils literal"&gt;otable&lt;/tt&gt; module for.
Here it is:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;
&lt;span class="normal"&gt;22&lt;/span&gt;
&lt;span class="normal"&gt;23&lt;/span&gt;
&lt;span class="normal"&gt;24&lt;/span&gt;
&lt;span class="normal"&gt;25&lt;/span&gt;
&lt;span class="normal"&gt;26&lt;/span&gt;
&lt;span class="normal"&gt;27&lt;/span&gt;
&lt;span class="normal"&gt;28&lt;/span&gt;
&lt;span class="normal"&gt;29&lt;/span&gt;
&lt;span class="normal"&gt;30&lt;/span&gt;
&lt;span class="normal"&gt;31&lt;/span&gt;
&lt;span class="normal"&gt;32&lt;/span&gt;
&lt;span class="normal"&gt;33&lt;/span&gt;
&lt;span class="normal"&gt;34&lt;/span&gt;
&lt;span class="normal"&gt;35&lt;/span&gt;
&lt;span class="normal"&gt;36&lt;/span&gt;
&lt;span class="normal"&gt;37&lt;/span&gt;
&lt;span class="normal"&gt;38&lt;/span&gt;
&lt;span class="normal"&gt;39&lt;/span&gt;
&lt;span class="normal"&gt;40&lt;/span&gt;
&lt;span class="normal"&gt;41&lt;/span&gt;
&lt;span class="normal"&gt;42&lt;/span&gt;
&lt;span class="normal"&gt;43&lt;/span&gt;
&lt;span class="normal"&gt;44&lt;/span&gt;
&lt;span class="normal"&gt;45&lt;/span&gt;
&lt;span class="normal"&gt;46&lt;/span&gt;
&lt;span class="normal"&gt;47&lt;/span&gt;
&lt;span class="normal"&gt;48&lt;/span&gt;
&lt;span class="normal"&gt;49&lt;/span&gt;
&lt;span class="normal"&gt;50&lt;/span&gt;
&lt;span class="normal"&gt;51&lt;/span&gt;
&lt;span class="normal"&gt;52&lt;/span&gt;
&lt;span class="normal"&gt;53&lt;/span&gt;
&lt;span class="normal"&gt;54&lt;/span&gt;
&lt;span class="normal"&gt;55&lt;/span&gt;
&lt;span class="normal"&gt;56&lt;/span&gt;
&lt;span class="normal"&gt;57&lt;/span&gt;
&lt;span class="normal"&gt;58&lt;/span&gt;
&lt;span class="normal"&gt;59&lt;/span&gt;
&lt;span class="normal"&gt;60&lt;/span&gt;
&lt;span class="normal"&gt;61&lt;/span&gt;
&lt;span class="normal"&gt;62&lt;/span&gt;
&lt;span class="normal"&gt;63&lt;/span&gt;
&lt;span class="normal"&gt;64&lt;/span&gt;
&lt;span class="normal"&gt;65&lt;/span&gt;
&lt;span class="normal"&gt;66&lt;/span&gt;
&lt;span class="normal"&gt;67&lt;/span&gt;
&lt;span class="normal"&gt;68&lt;/span&gt;
&lt;span class="normal"&gt;69&lt;/span&gt;
&lt;span class="normal"&gt;70&lt;/span&gt;
&lt;span class="normal"&gt;71&lt;/span&gt;
&lt;span class="normal"&gt;72&lt;/span&gt;
&lt;span class="normal"&gt;73&lt;/span&gt;
&lt;span class="normal"&gt;74&lt;/span&gt;
&lt;span class="normal"&gt;75&lt;/span&gt;
&lt;span class="normal"&gt;76&lt;/span&gt;
&lt;span class="normal"&gt;77&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="kr"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;non_numeric&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kr"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;number&amp;quot;&lt;/span&gt; &lt;span class="kr"&gt;then&lt;/span&gt;
    &lt;span class="nb"&gt;error&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Indirect index cannot be numeric&amp;quot;&lt;/span&gt;
  &lt;span class="kr"&gt;end&lt;/span&gt;
  &lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;
&lt;span class="kr"&gt;end&lt;/span&gt;

&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="kr"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;get_by_index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;non_numeric&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
  &lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="kr"&gt;end&lt;/span&gt;

&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="kr"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;get_by_key&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;non_numeric&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
  &lt;span class="kr"&gt;if&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="kr"&gt;then&lt;/span&gt;
    &lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;
  &lt;span class="kr"&gt;end&lt;/span&gt;
&lt;span class="kr"&gt;end&lt;/span&gt;

&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="kr"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;o_it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;control&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;control&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;control&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_by_index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;control&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kr"&gt;if&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="kr"&gt;then&lt;/span&gt;
    &lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="n"&gt;control&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;
  &lt;span class="kr"&gt;end&lt;/span&gt;
&lt;span class="kr"&gt;end&lt;/span&gt;

&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="kr"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;opairs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="n"&gt;o_it&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="kr"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;opairs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;opairs&lt;/span&gt;

&lt;span class="kr"&gt;function&lt;/span&gt; &lt;span class="nc"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i_or_k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kr"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i_or_k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;number&amp;quot;&lt;/span&gt; &lt;span class="kr"&gt;then&lt;/span&gt;
    &lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="n"&gt;get_by_index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i_or_k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kr"&gt;end&lt;/span&gt;
  &lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="n"&gt;get_by_key&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i_or_k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kr"&gt;end&lt;/span&gt;

&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="kr"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kr"&gt;if&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt; &lt;span class="kr"&gt;then&lt;/span&gt;
    &lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;
  &lt;span class="kr"&gt;end&lt;/span&gt;
  &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v_existing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_by_key&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kr"&gt;if&lt;/span&gt; &lt;span class="n"&gt;v_existing&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt; &lt;span class="kr"&gt;then&lt;/span&gt;
    &lt;span class="nb"&gt;table.insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;
  &lt;span class="kr"&gt;elseif&lt;/span&gt; &lt;span class="n"&gt;v_existing&lt;/span&gt; &lt;span class="o"&gt;~=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="kr"&gt;then&lt;/span&gt;
    &lt;span class="nb"&gt;error&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Cannot change associated value&amp;quot;&lt;/span&gt;
  &lt;span class="kr"&gt;end&lt;/span&gt;
  &lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;
&lt;span class="kr"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt;

&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="kr"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;move&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;dest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dest&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="kr"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="kr"&gt;in&lt;/span&gt; &lt;span class="n"&gt;opairs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kr"&gt;end&lt;/span&gt;
  &lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="n"&gt;dest&lt;/span&gt;
&lt;span class="kr"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;move&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;move&lt;/span&gt;

&lt;span class="kr"&gt;function&lt;/span&gt; &lt;span class="nc"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;
  &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;dest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="kr"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="kr"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;ipairs&lt;/span&gt; &lt;span class="p"&gt;{...}&lt;/span&gt; &lt;span class="kr"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;move&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kr"&gt;end&lt;/span&gt;
  &lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="n"&gt;dest&lt;/span&gt;
&lt;span class="kr"&gt;end&lt;/span&gt;

&lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;readonly&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;One thing I realize as I look over this code is, I'm going to have to make sure that everything handles &lt;tt class="docutils literal"&gt;__eq&lt;/tt&gt;, or that I pull some shenanigans to make sure that specific functions produce the exact same values every time.&lt;/p&gt;
&lt;p&gt;Another possibility is to just ignore that module for now, and accept some probably-quadratic behavior in the prototype: just implement &lt;tt class="docutils literal"&gt;__eq&lt;/tt&gt;, and make sure to always scan the target table before inserting.&lt;/p&gt;
&lt;p&gt;Okay, I had a proper look over the rest of the tutorial, and realized that I can probably adapt the code from the tutorial into the framework I'm putting together.
Here are the big differences:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Instead of text characters for terminal symbols, I'm going to use the existing &lt;tt class="docutils literal"&gt;token&lt;/tt&gt; class.&lt;/li&gt;
&lt;li&gt;I'm going to have to decide how to represent non-terminals, since the actual classes being generated won't correspond neatly to the rules.
Probably just using strings would make sense.
I want to take some time to consider whether there's anything that would strongly recommend an alternative, so I'm going to take some time to think about this.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, that's enough for right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Lua"></category><category term="Crafting Interpreters"></category></entry><entry><title>Coding 2023-02-09</title><link href="https://mwchase.neocities.org/coding-2023-02-09" rel="alternate"></link><published>2023-02-09T05:00:00-05:00</published><updated>2023-02-09T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-02-09:/coding-2023-02-09</id><summary type="html">&lt;p class="first last"&gt;Coding while loopy is not a good idea, but, oh well.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Overall, I'm doing about the same as yesterday I think.
The soreness is kind of moving upwards in my body, and I don't know when it's going to let up.&lt;/p&gt;
&lt;p&gt;Anyway, I did manage to remember where I was with regards to the Crafting Interpreters stuff: on a completely different website because I didn't want to do recursive descent stuff.
Here's what I ended up deciding:&lt;/p&gt;
&lt;p&gt;Instead of trying to have a stripped-down representation for inputs to some of the functions, I had the functions take a more structured format, and make helpers that produce that more structured format.
The result is apparently sensible.&lt;/p&gt;
&lt;p&gt;I'm going to try to put together the combination of &lt;tt class="docutils literal"&gt;class{}&lt;/tt&gt; and the new &lt;tt class="docutils literal"&gt;enum{}&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;I'll mess with that later, but I don't have the focus to describe anything else.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Lua"></category><category term="Crafting Interpreters"></category><category term="short post"></category></entry><entry><title>Coding 2023-02-08</title><link href="https://mwchase.neocities.org/coding-2023-02-08" rel="alternate"></link><published>2023-02-08T05:00:00-05:00</published><updated>2023-02-08T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-02-08:/coding-2023-02-08</id><summary type="html">&lt;p class="first last"&gt;So hard to think...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm feeling&lt;/p&gt;
&lt;p&gt;interesting&lt;/p&gt;
&lt;p&gt;in the aftermath of last weekend, so I can't really focus on any one thing for too long, but I did want to take some notes on another bit of metadata that... I think MOTR currently has, but the names are &lt;em&gt;so bad&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Anyway, there's selections that must be defined in order to produce output, and there's selections that will contribute dimensions to the output matrix.
The latter is a subset of the former.&lt;/p&gt;
&lt;p&gt;I'm not sure if this information is as important to surface to the user (probably there's some reason to want to calculate how many different commands an input will actually create, although you could also just... run the generation code), but accurately tracking it is vital to making the output coherent.&lt;/p&gt;
&lt;p&gt;Still missing good names for these, but my hope is to re-evaluate all of the opportunities for tracking relevant information here, since, as the first two labels I described show, I am currently leaving a lot on the table.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to leave that here for now, and try to relax.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category><category term="note to self"></category></entry><entry><title>Weekly Roundup 2023-02-07</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-02-07" rel="alternate"></link><published>2023-02-07T05:00:00-05:00</published><updated>2023-02-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-02-07:/weekly-roundup-2023-02-07</id><summary type="html">&lt;p class="first last"&gt;Good times until they were really bad times.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I reviewed the existing Parametric metadata in MOTR.&lt;/li&gt;
&lt;li&gt;Thursday: I tried to figure out how many things were wrong with the existing metadata.&lt;/li&gt;
&lt;li&gt;Friday: I found some metadata that &lt;em&gt;should&lt;/em&gt; be in there.&lt;/li&gt;
&lt;li&gt;Saturday: I took a look at the helper functions and methods that need to account for the metadata.&lt;/li&gt;
&lt;li&gt;Sunday: I had a really bad, like, few hours. I've resolved to do some things in response, that I have not done yet, but I'm working on it.&lt;/li&gt;
&lt;li&gt;Monday: I was still kind of out of it, so eh.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to work on other coding or writing stuff besides MOTR, and tweak plans and specification for it in the background.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="MOTR"></category><category term="really bad days"></category></entry><entry><title>Diary 2023-02-06</title><link href="https://mwchase.neocities.org/diary-2023-02-06" rel="alternate"></link><published>2023-02-06T05:00:00-05:00</published><updated>2023-02-06T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-02-06:/diary-2023-02-06</id><summary type="html">&lt;p class="first last"&gt;So much bad air...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I was traveling today and yesterday, and right now I'm out of it.
So, today, I'm going to try to take things easy, and tomorrow, I'll try to act on those ideas from yesterday.&lt;/p&gt;
&lt;p&gt;Right now, I just want to relax.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="short post"></category></entry><entry><title>Diary 2023-02-05</title><link href="https://mwchase.neocities.org/diary-2023-02-05" rel="alternate"></link><published>2023-02-05T05:00:00-05:00</published><updated>2023-02-05T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-02-05:/diary-2023-02-05</id><summary type="html">&lt;p class="first last"&gt;We're all being treated like a fucking rounding error.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I ended up feeling really bad today, and I couldn't tell what was going on.
I was guessing all kinds of environmental factors.
Maybe the air was too dry.
Maybe it was some dust that I wasn't used to.&lt;/p&gt;
&lt;p&gt;But eventually, I think I figured it out.
I was &lt;em&gt;pissed off&lt;/em&gt;.
I was pissed off at the state of pandemic response.
That brand new variants are raging all around me, and by and large the measures being taken are woefully inadequate.
Basic precautions are advised, then ignored.
Massive in-person gatherings.&lt;/p&gt;
&lt;p&gt;I am, of course, pissed off at myself for not behaving more sensibly myself, but systemic problems require systemic action.
I can keep myself a little safer by having more common* sense in the future, and not behaving recklessly, but the important thing is what happens to everyone.&lt;/p&gt;
&lt;p&gt;Maybe I'll get covid, maybe I won't (yet), but the real fucking tragedy of all of this is what the &lt;em&gt;continued&lt;/em&gt; pandemic means for people without a support net like I have, and just in general the fucked up way this has gone on for so long, some of the ghoulish things I'm hearing about being done by people with the power to make a difference.&lt;/p&gt;
&lt;p&gt;How is anyone supposed to feel when they realize that they, and everyone around them, basically constitute acceptable losses in the minds of the people in charge?&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;The test came back negative, for what it's worth.
My run of luck apparently remains unbroken.
Good for me.
For now.&lt;/p&gt;
&lt;p&gt;We shouldn't be forced to rely on luck like this.
It's just not right.
My heart goes out to the hundreds of millions (hundreds of millions! preposterous!) that we know didn't dodge the bullet, and the families of the millions who didn't make it through.&lt;/p&gt;
&lt;p&gt;For the moment, I'll be taking care of myself, because I'm really not prepared to take care of anyone else.
And when I'm feeling better, I've got to make some noise.&lt;/p&gt;
&lt;p&gt;(PS I rejiggered my upload script a few times to deal with payload sizes and server-side changes so hopefully this actually uploads properly byyyyee.)&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="angry"></category></entry><entry><title>Coding 2023-02-04</title><link href="https://mwchase.neocities.org/coding-2023-02-04" rel="alternate"></link><published>2023-02-04T05:00:00-05:00</published><updated>2023-02-04T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-02-04:/coding-2023-02-04</id><summary type="html">&lt;p class="first last"&gt;Pondering more reorganization...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Light day today.
Here's what I did:&lt;/p&gt;
&lt;p&gt;I noted down all of the methods and functions in the &lt;tt class="docutils literal"&gt;parametric&lt;/tt&gt; module that deal with the invariants I'm trying to work out.
One of these, I can probably get rid of, but I'm also trying to work out how to change things up so that other modules stop reaching into the metadata.
That should basically be to add more helper functions, although...&lt;/p&gt;
&lt;p&gt;Since these functions specifically require their inputs to have the exact right type, maybe I should switch them to methods?
Something to think about.&lt;/p&gt;
&lt;p&gt;Anyway, it's late and I want to take things easy before the weekend, which I expect to also be light.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2023-02-03</title><link href="https://mwchase.neocities.org/coding-2023-02-03" rel="alternate"></link><published>2023-02-03T05:00:00-05:00</published><updated>2023-02-03T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-02-03:/coding-2023-02-03</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;That's too obvious, there's no way it wasn't handled.&amp;quot; Friend, I regret to inform you,&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I mostly messed with other stuff today, but I'm going to put in a small amount of work on MOTR now:&lt;/p&gt;
&lt;p&gt;The parametric metadata should track &amp;quot;the Box must specify a value for these labels&amp;quot;.
This should be populated by &lt;tt class="docutils literal"&gt;from_box&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;from_selection&lt;/tt&gt;, should be left unchanged by &lt;tt class="docutils literal"&gt;flatten&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;map_over_1_parametric&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;reduce_parameterization&lt;/tt&gt;, unioned by &lt;tt class="docutils literal"&gt;map_over_2_parametric&lt;/tt&gt; (as well as a planned decorator that will replace the map functions in some contexts), and &lt;tt class="docutils literal"&gt;include_box&lt;/tt&gt; is... complicated.
&lt;tt class="docutils literal"&gt;include_box&lt;/tt&gt; should remove any value that &lt;em&gt;is not&lt;/em&gt; iterated over.&lt;/p&gt;
&lt;p&gt;So we also need to track &amp;quot;this label gets iterated over&amp;quot;, which is populated by &lt;tt class="docutils literal"&gt;from_selection&lt;/tt&gt;, and passed through everything else in the expected fashion.
In &lt;tt class="docutils literal"&gt;include_box&lt;/tt&gt;, it prevents the removal of the requirement to be explicitly specified.&lt;/p&gt;
&lt;p&gt;It's... a little mindblowing that I haven't defined these exact fields before...
Anyway, I've written them down in my notes with the date of this post, so I should be able to get myself up to speed when I want to try to implement these.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to call it here and mess with other stuff before I get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category><category term="note to self"></category></entry><entry><title>Coding 2023-02-02</title><link href="https://mwchase.neocities.org/coding-2023-02-02" rel="alternate"></link><published>2023-02-02T05:00:00-05:00</published><updated>2023-02-02T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-02-02:/coding-2023-02-02</id><summary type="html">&lt;p class="first last"&gt;Now I know what it feels like to write something that explains why something doesn't work, and it's probably opaque to anyone else.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm not touching MOTR's code, but I did think some about how I want to reason about the different sets of labels, and I came up with some ideas that I think will be helpful.&lt;/p&gt;
&lt;p&gt;Considering a &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt; in isolation, there are four basic possibilities when it comes to extracting a value from it:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The metadata is &lt;strong&gt;overspecified&lt;/strong&gt;.
This happens when the metadata requires iteration over a selection that is not allowed to have multiple values, but it does have multiple values.&lt;/li&gt;
&lt;li&gt;The metadata is &lt;strong&gt;underspecified&lt;/strong&gt;.
This happens when the metadata requires iteration over a selection, but nothing iterates over the selection.&lt;/li&gt;
&lt;li&gt;The metadata is &lt;strong&gt;incompatible&lt;/strong&gt; with the input Box.
This happens when the metadata requires iteration over a selection, but the selection is not defined by the Box.&lt;/li&gt;
&lt;li&gt;The metadata is &lt;strong&gt;compatible&lt;/strong&gt; with the input Box.
This happens when the metadata is not underspecified, and the Box contains a superset of the required values, which is no overspecified in conjunction with the metadata.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is helpful to think about, because I'm realizing that some of the information required to track this stuff &lt;em&gt;could&lt;/em&gt; be tracked, but isn't.&lt;/p&gt;
&lt;p&gt;Also, this is all in terms of selections, but there should be a compatible/incompatible check around non-selection labels.
Furthermore, iterating over a label that is added via &lt;tt class="docutils literal"&gt;include_box&lt;/tt&gt; should render the parametric &lt;strong&gt;incoherent&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Fun note to myself because I keep forgetting: &lt;tt class="docutils literal"&gt;include_box&lt;/tt&gt; prefers the upstream values over the included ones, which means that, actually, it just sort of cancels out and turns into a requirement.
Whether this is &amp;quot;the right choice&amp;quot; is a question that, like, needs more usage data to answer.
It's hard for me to work out from first principles whether I care about the behavior of &amp;quot;two different values get included under the same label in different parts of the Parametric&amp;quot;.
One possible mitigation would be to pass the included box &lt;em&gt;up&lt;/em&gt; and have a sentinel value for collisions.
I'll keep that in mind as something I &lt;em&gt;can&lt;/em&gt; do, but the bigger win right now is in formalizing the relationships between the different outcomes.
(Like, you can use parametric reduction to stop a Parametric from being overspecified.)&lt;/p&gt;
&lt;p&gt;The tl;dr of this is that I need to make sure that I'm actually tracking all of the data required to carry out the proper runtime checks; at this point, I highly doubt that that's the case.&lt;/p&gt;
&lt;p&gt;For now, I'm going to mess with other stuff, and get generally towards bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-02-01</title><link href="https://mwchase.neocities.org/coding-2023-02-01" rel="alternate"></link><published>2023-02-01T05:00:00-05:00</published><updated>2023-02-01T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-02-01:/coding-2023-02-01</id><summary type="html">&lt;p class="first last"&gt;Again, you will notice that these names only occasionally and glancingly, like, signify properties of the things they're supposed to represent.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, so.
I should have expected that I wouldn't be up for much today, but whatever.
Let's take a look at the code.&lt;/p&gt;
&lt;p&gt;I define four sets of labels that control whether a parametric metadata is valid for various purposes.
There is an additional generated set.
To extend the scope of validation I need to:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Verify the intended usage of each set.&lt;/li&gt;
&lt;li&gt;Update the names to use a clearer metaphor.&lt;/li&gt;
&lt;li&gt;Check on the semantics of the helper functions.&lt;/li&gt;
&lt;li&gt;Make any required fixes.&lt;/li&gt;
&lt;li&gt;Track additional sets.&lt;/li&gt;
&lt;li&gt;Create further invariants.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let's look at the sets:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;provided_labels&lt;/tt&gt;: &amp;quot;the Parametric &lt;strong&gt;will&lt;/strong&gt; iterate over these labels.&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;required_labels&lt;/tt&gt;: &amp;quot;the Parametric &lt;strong&gt;needs&lt;/strong&gt; these labels to be iterated over.&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;handled_labels&lt;/tt&gt;: &amp;quot;the Parametric &lt;strong&gt;can&lt;/strong&gt; handle these labels being iterated over.&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;multivalue_labels&lt;/tt&gt;: &amp;quot;the Parametric &lt;strong&gt;cannot&lt;/strong&gt; handle labels &lt;em&gt;besides&lt;/em&gt; these being iterated over.&amp;quot; (Technically, it's fine if the other labels don't contain more than one value. I think. At least, it works like that in the code, probably.)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;expected_labels&lt;/tt&gt;: &amp;quot;the minimal set of labels expected in the final product.&amp;quot; (the definition is &lt;tt class="docutils literal"&gt;provided_labels | required_labels&lt;/tt&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;quot;Product&amp;quot; is actually kind of an interesting word there, because the idea is to form a cartesian product over all of the selections.
I don't know if I can work that in.
Although, calling them &amp;quot;factors&amp;quot; might help.
Or it might not.&lt;/p&gt;
&lt;p&gt;Anyway, it's getting late, so I'll have to pick this up later.
First, I want to try to explain why there are all of these different sets.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;A &amp;quot;provided&amp;quot; label refers to the label's value correlating with an &lt;em&gt;explicit&lt;/em&gt; value in the final result.&lt;/li&gt;
&lt;li&gt;A label that is only &amp;quot;required&amp;quot; correlates to a value that is &lt;em&gt;implicit&lt;/em&gt; in the final result.
This is acceptable in intermediate calculations, but leads to problems if it gets all the way out, because that situation corresponds to &lt;tt class="docutils literal"&gt;Cmd&lt;/tt&gt; objects that only differ in their implicit IO, which is broken sometimes, and I don't think corresponds to any desirable state, so I try to forbid it.&lt;/li&gt;
&lt;li&gt;A &amp;quot;handled&amp;quot; label might not be iterated over by the metadata that contains the set, but if other metadata &lt;em&gt;does&lt;/em&gt; iterate over that label, then that situation is handled gracefully.&lt;/li&gt;
&lt;li&gt;The set of &amp;quot;multivalue&amp;quot; labels, if present, represents a hard limit on the labels that the metadata will allow iteration over.
This addresses a similar issue to the &amp;quot;implicit&amp;quot; stuff above, in that multiple &lt;tt class="docutils literal"&gt;Cmd&lt;/tt&gt; objects should not produce the same output artifact.&lt;/li&gt;
&lt;li&gt;A label is &amp;quot;expected&amp;quot; if either it is explicitly iterated over, or if something else should iterate over it, even though this metadata doesn't.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That's a lot to unpack; I'm looking at this and kind of wondering if sorting this stuff out would be a good use case for formal methods.
For now, I've written these field names down and suggested clunky but descriptive new names; the goal from that is to come up with something better than either, in each case.
And now that I've done that, I'm going to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Weekly Roundup 2023-01-31</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-01-31" rel="alternate"></link><published>2023-01-31T05:00:00-05:00</published><updated>2023-01-31T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-01-31:/weekly-roundup-2023-01-31</id><summary type="html">&lt;p class="first last"&gt;Trying to make the code better, still...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I started changing my mind about how to reorganize &lt;tt class="docutils literal"&gt;artifact.Output&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Thursday: I noticed even more ways I could potentially simplify the code...&lt;/li&gt;
&lt;li&gt;Friday: I took a little break to ponder effect systems.&lt;/li&gt;
&lt;li&gt;Saturday: I started planning ahead to the next set of changes I want to make, which I want to make because they mean deleting code, which means I wouldn't have to document it.&lt;/li&gt;
&lt;li&gt;Sunday: The MOTR update got... a little out of hand.&lt;/li&gt;
&lt;li&gt;Monday: I got the MOTR update under control, and then started planning for other things.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to look over the parametric metadata fields and try to improve them.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-01-30</title><link href="https://mwchase.neocities.org/coding-2023-01-30" rel="alternate"></link><published>2023-01-30T05:00:00-05:00</published><updated>2023-01-30T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-01-30:/coding-2023-01-30</id><summary type="html">&lt;p class="first last"&gt;There is still so much left to fix this up...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got the &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; stuff updated and qualified.
The merge was &lt;em&gt;shockingly&lt;/em&gt; uneventful, all things considered.&lt;/p&gt;
&lt;p&gt;I could try to work on several different fronts now:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Try to fix the new names I came up with, because there's a bunch of &amp;quot;well I needed to call it &lt;em&gt;something&lt;/em&gt;&amp;quot; classes, and they really don't make things clear.&lt;/li&gt;
&lt;li&gt;Try to add new wrappers using the current state of things.&lt;/li&gt;
&lt;li&gt;Remove the &lt;tt class="docutils literal"&gt;MapOverSelection&lt;/tt&gt; class.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I really want to do that last one, then loop around to the beginning.
It's late now, so I'm going to just quickly lay out some knowledge I'll need later:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;parametric.Metadata&lt;/tt&gt; currently does not track &lt;tt class="docutils literal"&gt;box.Label&lt;/tt&gt; status; I did the hard stuff first with &lt;tt class="docutils literal"&gt;selection.Label&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;box.Label&lt;/tt&gt; should be just &amp;quot;here are the labels it needs&amp;quot;.&lt;/li&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;selection.Label&lt;/tt&gt; stuff is going to need the names re-evaluated.
Like, &amp;quot;provided&amp;quot;, &amp;quot;required&amp;quot;, &amp;quot;handled&amp;quot;, and &amp;quot;multivalue&amp;quot;?
I could try to defend those names, but I guarantee it wouldn't be persuasive.&lt;/li&gt;
&lt;li&gt;Once I re-familiarize myself with the &lt;tt class="docutils literal"&gt;selection.Labels&lt;/tt&gt; meanings, I should be able to figure out the required relationships between the metadatas in what is currently called &lt;tt class="docutils literal"&gt;AdaptiveParametric&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Also, the different parts of &lt;tt class="docutils literal"&gt;parametric_command&lt;/tt&gt; should be named to properly correspond to the unique/parametric/artifact distinction.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Okay, I did a little thinking, and I really need to figure out how &lt;tt class="docutils literal"&gt;selection.Label&lt;/tt&gt; stuff should interact with &lt;tt class="docutils literal"&gt;include_box&lt;/tt&gt;, and I'm still on &amp;quot;yeah, it probably shouldn't allow that&amp;quot;.
But I should figure out how to express that in terms of the existing metadata.&lt;/p&gt;
&lt;p&gt;One last note: once I have this all converted to use &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt;s, then I should be ready to assess whether to try doing the &lt;tt class="docutils literal"&gt;ContextVar&lt;/tt&gt; stuff.&lt;/p&gt;
&lt;p&gt;For now, though, I should get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2023-01-29</title><link href="https://mwchase.neocities.org/coding-2023-01-29" rel="alternate"></link><published>2023-01-29T05:00:00-05:00</published><updated>2023-01-29T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-01-29:/coding-2023-01-29</id><summary type="html">&lt;p class="first last"&gt;The concept: simplicity itself. The execution: twelve-dimensional summoning runes engraved on the surface of a hypercube. Like, anyone would look at this and go &amp;quot;this code is kind of confusing&amp;quot; and &lt;strong&gt;I KNOW&lt;/strong&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Uuuuuuugh.&lt;/p&gt;
&lt;p&gt;I ran into, and continue to run into, issues with updating the artifact module.&lt;/p&gt;
&lt;p&gt;I have been bouncing off this all day, and I've made a lot of progress, but getting past this last bit is a pain because it's confusing.
This is exactly why I wanted to do this kind of work before I consider adding more wrappers.&lt;/p&gt;
&lt;p&gt;There's a lot that happened, but the short version is that my initial design got sort of fractured into even more classes, and some of my assumptions got challenged, but that part is okay.
What remains to update, as far as getting the code to typecheck, is a worryingly large function that is just two statements.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;I've got something that looks like it fixes that function, but now I've got other weird stuff to fix.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;And, it's fixed, thanks to... stuff.&lt;/p&gt;
&lt;p&gt;Sometimes I can understand typing stuff, but other times, eh.&lt;/p&gt;
&lt;p&gt;Here is the plan for later, definitely not now:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Get flake8 to pass over the code, because I was not bothering to fix style issues.&lt;/li&gt;
&lt;li&gt;Get pytest to pass over the code, because it seems extremely likely that I regressed &lt;em&gt;something&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Confirm that the old code paths are dead and I can delete them.&lt;/li&gt;
&lt;li&gt;Mer...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mer...&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;merge&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Y-yeah...&lt;/p&gt;
&lt;p&gt;I can tell from here that that's going to &lt;em&gt;hurt&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;But for now, I'm just going to wind down and get to bed, because I &lt;em&gt;need&lt;/em&gt; rest after all of that.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
&lt;p&gt;PS I had to walk back the glitchiness on the smiley because the glitchy versions don't look as good on my new laptop, and I'm not sure what to do about that.
I guess there's a theme update coming down the pipe.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2023-01-28</title><link href="https://mwchase.neocities.org/coding-2023-01-28" rel="alternate"></link><published>2023-01-28T05:00:00-05:00</published><updated>2023-01-28T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-01-28:/coding-2023-01-28</id><summary type="html">&lt;p class="first last"&gt;The problem I want to fix with this system is not that other people &amp;quot;aren't smart enough to use it&amp;quot; (and even if I agreed with that statement, it'd still be a me problem), but that it currently &amp;quot;expects&amp;quot; the end user to be able to &lt;em&gt;read my mind&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I'm not touching the code for MOTR, but I want to plan things out for later.&lt;/p&gt;
&lt;p&gt;Here are the modules that should guide my changes later:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;parametric&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;parametric_command&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The goal is to eliminate the &lt;tt class="docutils literal"&gt;map_over_selection&lt;/tt&gt; module.
I've got a two-ish part plan to do this.
First, as I've said, I want to rework the &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt; module to stop using the &lt;tt class="docutils literal"&gt;*Accumulator&lt;/tt&gt; classes, by reorganizing the &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; class.
The other part is to replace the &lt;tt class="docutils literal"&gt;MapOverSelection&lt;/tt&gt; class.
The &lt;tt class="docutils literal"&gt;MapOverSelection&lt;/tt&gt; basically associates a &lt;tt class="docutils literal"&gt;Label&lt;/tt&gt; with a function that maps that label's associated value to a &lt;tt class="docutils literal"&gt;PathStr&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;The thing I realized is that this is basically equivalent to a &lt;tt class="docutils literal"&gt;Parametric[PathStr]&lt;/tt&gt; with a bunch of restrictions on its metadata.
My goal is to eliminate the usages of this class by figuring out the actual metadata restrictions, and having the code require those restrictions, where applicable.
This will actually make the code more reliable than it is now, because some of those restrictions are currently enforced, at best, by convention, which makes this code even more useless than one might reasonably expect for anyone who isn't me.&lt;/p&gt;
&lt;p&gt;Here's some background:&lt;/p&gt;
&lt;p&gt;There's sort of a latent mental model I have, of a division of the files that MOTR works with, into two categories: source, and artifacts.
Source files are the background or basis for the operations that MOTR carries out, and are expected to be tracked in a source control system like Mercurial, Pijul, Darcs, Fossil, Bazaar, Perforce, Subversion, etc.
Artifacts are anything that MOTR creates based on its configuration and the source files.
This includes generated constraint files, static analysis, test results, coverage reports, profile data, and, like, anything else that could make sense there.&lt;/p&gt;
&lt;p&gt;The &lt;tt class="docutils literal"&gt;parametric_command&lt;/tt&gt; module divides the paths that are fed into command constructors into three categories:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;artifacts&lt;/li&gt;
&lt;li&gt;unique source files&lt;/li&gt;
&lt;li&gt;groups of related source files&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The first two groups are in better shape than the third.
The way the third group is represented is a bit wonky, so I'm just going to describe what I think it should be doing:&lt;/p&gt;
&lt;p&gt;There is a &lt;tt class="docutils literal"&gt;Parametric[T_co]&lt;/tt&gt; and one or more &lt;tt class="docutils literal"&gt;Parametric[PathStr]&lt;/tt&gt;s.
All &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt;s that are any more than mildly complicated have metadata relating to selection labels.
These two groups of &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt;s &lt;em&gt;must&lt;/em&gt; have metadata requirements that are, um, complementary?
Basically, the latter group feeds into the pipeline that creates artifacts, so whenever there's a different value from the &lt;tt class="docutils literal"&gt;Parametric[T_co]&lt;/tt&gt;, the &lt;tt class="docutils literal"&gt;Parametric[PathStr]&lt;/tt&gt;s should collectively have a different value.&lt;/p&gt;
&lt;p&gt;This system kind of breaks down if the functions that make up a &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt; end up mapping two possible &lt;tt class="docutils literal"&gt;Selection&lt;/tt&gt; values to the same output, and my advice is to simply, not do that.
This, kind of sucks, but I have no idea how to express &amp;quot;this function must be injective&amp;quot; as a Mypy-compatible annotation.
To be fair, I don't think this is a particularly unique shortcoming of Python.&lt;/p&gt;
&lt;p&gt;Anyway, it's getting late, and I'm getting tired.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-01-27</title><link href="https://mwchase.neocities.org/coding-2023-01-27" rel="alternate"></link><published>2023-01-27T05:00:00-05:00</published><updated>2023-01-27T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-01-27:/coding-2023-01-27</id><summary type="html">&lt;p class="first last"&gt;I'm not saying this code is &amp;quot;the right way&amp;quot; or &amp;quot;a good idea&amp;quot;. It's just what I came up with.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;In the previous entry, I got diverted into thinking about whether I want to try using &lt;tt class="docutils literal"&gt;ContextVar&lt;/tt&gt;s in some places that I'm currently basically saying &amp;quot;pass through these parameters everywhere&amp;quot;.
The reason I'm pondering this is because I've read Koka's documentation, and I saw some connections between concepts in Python that don't obviously map to &amp;quot;the same underlying thing&amp;quot;.
This post could be pretty rough.&lt;/p&gt;
&lt;p&gt;Here's the background:
Koka uses effects for a lot of things, and provides various possible behaviors that an effect handler can apply to the effectful code.
Basically, part of an effect in Koka is a set of functions that code that &lt;em&gt;has&lt;/em&gt; the effect can call.
The result of calling these functions is determined by the dynamic scope of how the function is called: most effects are not handled by &lt;tt class="docutils literal"&gt;main()&lt;/tt&gt;, so they have to be handled by other code.
A handler is an expression (I think...) that evaluates to a value of some type.
This is done either by having its associated block execute to completion, or as part of an implementation of a function required for the effect.&lt;/p&gt;
&lt;p&gt;The simplest thing to put in a handler implementation is an expression that does not resume the effectful computation.
Let's compare the example from the Koka documentation with the equivalent code in Python:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;fun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;raise&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;const&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;int&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;handler&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;ctl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;raise(msg)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;safe&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;divide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If we ignore the fact that the Koka documentation is defining some effects and functions explicitly for pedagogical purposes, the equivalent in Python is&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;raise_const&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;ZeroDivisionError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;There are some syntactic things that stick out, like that Python doesn't have an equivalent to Koka's &lt;tt class="docutils literal"&gt;with&lt;/tt&gt;, so the indentation is, like, more severe?
(Even ignoring that I 2-spaced Koka.
Count the levels of indentation between the &lt;tt class="docutils literal"&gt;def&lt;/tt&gt; and the &lt;tt class="docutils literal"&gt;+&lt;/tt&gt;.)&lt;/p&gt;
&lt;p&gt;The next thing the Koka documentation talks about is resuming, and I'm actually not sure what the idiomatic translation of their basic examples is.
The reason I'm not sure actually gets into why I'm interested in working with effect systems.&lt;/p&gt;
&lt;p&gt;Here's the Koka code I'm looking at...&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;effect&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ask&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;ctl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ask&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;a&lt;/span&gt;

&lt;span class="k"&gt;fun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;twice&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;ask&amp;lt;int&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;int&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;ask()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ask&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If I wanted to surface the resumptive behavior to Python's type system, I think I'd end up with something like...&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TypeVar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;T&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;R&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TypeVar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;R&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;Ask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Generator&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_twice&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Ask&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;yield&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;yield&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;But I could also hide this distinction from the runtime (and, as a consequence in this case, the type system) using &lt;tt class="docutils literal"&gt;ContextVar&lt;/tt&gt;s:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;ask&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ContextVar&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;[[],&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ContextVar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ask&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# need to hardcode result type&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_twice&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ask&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;()()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ask&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;()()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The latter option definitely looks a bit strange to me, but the reason I'm interested in it is because of function color.
I can either give an example that works with these functions, or make them look a little more realistic...&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_to_input_gen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Ask&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;yield&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_to_input_ctx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ask&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;()()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;(I did say &lt;em&gt;a little&lt;/em&gt;.)&lt;/p&gt;
&lt;p&gt;The point is, these new functions, at least conceptually, can be passed to higher-order functions or nice syntactic constructs.
Let's pretend we have a reason to want to add numbers to a stream of data, but we want to be able to dynamically change the logic that generates the added numbers.
For the latter function we do...&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_to_stream_ctx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Iterable&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Iterable&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;add_to_input_ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For the former, we, um...
Look, I know I sometimes (very rarely) pretend to not notice something for attempted pedagogical purposes, but I'm really not sure what you'd do.
I want to be missing something, but when I try to sketch something out, it just turns into a mess.&lt;/p&gt;
&lt;p&gt;There's a lot more to Koka, but it's a combination of stuff that relatively-straightforwardly follows from all of this, or stuff that I can't imagine working well in Python, like the ability to resume from the same point multiple times.&lt;/p&gt;
&lt;p&gt;For completeness, I'll try to translate my &amp;quot;more realistic&amp;quot; code back to Koka:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;fun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;ask&amp;lt;int&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;int&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ask&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This signature is in some sense even more specialized than the &lt;tt class="docutils literal"&gt;Ask[int, int]&lt;/tt&gt; stuff, which was, in the end, nothing but standard library types mushed together.
The difference is the higher-order functions in Koka's standard libraries are generic over effects.
This gives you guarantees like &amp;quot;mapping over a total function is total&amp;quot; and its converse, &amp;quot;mapping over a non-total function is non-total&amp;quot;.
Or use custom effects like &lt;tt class="docutils literal"&gt;ask&amp;lt;a&amp;gt;&lt;/tt&gt; explicitly.
To do that in Python, you either need a new higher-order library, or you need to make Python &amp;quot;not see them&amp;quot;, except to the extent that you need to provide implementations.&lt;/p&gt;
&lt;p&gt;(Like, I didn't actually &lt;em&gt;set&lt;/em&gt; the &lt;tt class="docutils literal"&gt;ContextVar&lt;/tt&gt; anywhere, and if you don't set it, then, um, it's going to fall over in a way that I believe is imperceptible to static analysis.)&lt;/p&gt;
&lt;p&gt;I'm interested in all of this not because I really want to choose different numbers to add to other numbers under various circumstances (at least, that's not the main thing I want), but because it seems really neat to be able to say &amp;quot;Here is a shiny new concurrency library. It is fully compatible with the higher-order functions in the standard library.&amp;quot;&lt;/p&gt;
&lt;p&gt;For this post specifically, I just wanted to think about some of the ways that Python surfaces the concept of effects, and how they don't really gel in Python, and I'm not really sure they could be made to gel in Python without a compatibility break that would make the transition from 2 to 3 look like a tea party.&lt;/p&gt;
&lt;p&gt;And that's why I want to learn OCaml.
(I haven't tried very hard yet, but I will.)&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="Koka"></category><category term="NABTO"></category></entry><entry><title>Coding 2023-01-26</title><link href="https://mwchase.neocities.org/coding-2023-01-26" rel="alternate"></link><published>2023-01-26T05:00:00-05:00</published><updated>2023-01-26T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-01-26:/coding-2023-01-26</id><summary type="html">&lt;p class="first last"&gt;Questioning the need for still more of the code. Which is a good impulse, but I have to be careful following it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, let's see where I want to take MOTR's &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt; module.
The key thing I realized thinking about the reorganization is that I can corral some functionality into the &amp;quot;constructor&amp;quot; idea I had, so it can be a helper class that, instead of unpacking all of that into an &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt;, it gets included into the class, and delegated to for the following flow:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Given a sequence of &lt;tt class="docutils literal"&gt;MapOverSelection[object]&lt;/tt&gt; objects...&lt;/li&gt;
&lt;li&gt;Produce a &lt;tt class="docutils literal"&gt;Parametric[io.Input[T_co]]&lt;/tt&gt; object.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, what do I want to &lt;em&gt;call&lt;/em&gt; this?&lt;/p&gt;
&lt;p&gt;(Horrible diversion: there are legitimate reasons to try to retire the concept of the &lt;tt class="docutils literal"&gt;MapOverSelection&lt;/tt&gt; and make this code work directly with &lt;tt class="docutils literal"&gt;Parametric[PathStr]&lt;/tt&gt; objects, but &lt;em&gt;oh boy&lt;/em&gt; I do not have the bandwidth for that currently.)&lt;/p&gt;
&lt;p&gt;Actually, can I run with that parenthetical?
It takes several &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt;s and, I want to say, it &lt;em&gt;condenses&lt;/em&gt; them into one?&lt;/p&gt;
&lt;p&gt;&amp;quot;Condense&amp;quot; is the word that my gut wants me to use, and I need to ponder what sense it has in this context.
I think the reference is to the idea of condensing a piece of writing, and not directly to anything involving physical substances.&lt;/p&gt;
&lt;p&gt;I guess what I'm wondering is, can I come up with a nicer name than &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt;?
Aside from the classes that I'm actively attempting to remove in the current effort, &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt; seems like pretty low-hanging fruit.
Its point now is that you give it a &lt;tt class="docutils literal"&gt;Box&lt;/tt&gt; and it uses metadata to create &lt;tt class="docutils literal"&gt;Selection&lt;/tt&gt;s from that &lt;tt class="docutils literal"&gt;Box&lt;/tt&gt;, and passes them in together to a function.&lt;/p&gt;
&lt;p&gt;Slightly alarming idea: I've been looking at some of the code I've written, and wondering if using &lt;tt class="docutils literal"&gt;ContextVar&lt;/tt&gt;s would be a cleaner way to handle shared data/behavior.&lt;/p&gt;
&lt;p&gt;A somewhat-related idea that occurs to me is that the implementations for, um, &lt;tt class="docutils literal"&gt;Parametric.instantiate&lt;/tt&gt;, in some sense, &amp;quot;should&amp;quot; be written with the keys they access in their signatures somehow.
Maybe something really straightforward like &lt;tt class="docutils literal"&gt;def instantiate(box_var: Annotated[int, SOME_BOX_INT_LABEL], selection_var: Annotated[str, SOME_SELECTION_STR_LABEL]) &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; ResultType:&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;I don't have a sense for whether these are unambiguously good ideas I'm tossing around; they do seem like they would improve some things, but I can't tell if there are any major caveats.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;I took some time to trace the implications of what I want to change, and they're frankly too complicated.
If I can convince myself that some invariants that the code currently maintains don't actually matter, then I can cut down on the number of classes used.&lt;/p&gt;
&lt;p&gt;I think the play to make is, this weekend, put together the required changes to &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt;, and try not to worry too hard about the names.
Then, switch to the documentation branch and start documenting the invariants of the &lt;tt class="docutils literal"&gt;parametric&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;parametric_command&lt;/tt&gt;, and &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt; modules.&lt;/p&gt;
&lt;p&gt;My suspicion is that those modules in particular are dragging around some outdated simplifying assumptions.
If I can nail down what those modules need, I can work out the feasibility of cutting down on the number of high-level concepts in the code.&lt;/p&gt;
&lt;p&gt;Independently of that, I also want to mess around with context variables a bit, because I think they can substitute for most but not all of the uses of a heavily-forked variant of the &lt;a class="reference external" href="https://punq.readthedocs.io/en/latest/"&gt;punq&lt;/a&gt; library I'm using in another hobby project.&lt;/p&gt;
&lt;p&gt;I think that's all for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-01-25</title><link href="https://mwchase.neocities.org/coding-2023-01-25" rel="alternate"></link><published>2023-01-25T05:00:00-05:00</published><updated>2023-01-25T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-01-25:/coding-2023-01-25</id><summary type="html">&lt;p class="first last"&gt;I needed to put &lt;em&gt;even more&lt;/em&gt; thought in.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, taking another look at how I want to tweak the construction of &lt;tt class="docutils literal"&gt;artifact.Output&lt;/tt&gt;.
Basically...
There are three things exclusive to &lt;tt class="docutils literal"&gt;artifact.Output&lt;/tt&gt;:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;A seed &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt; that currently has to produce a &lt;tt class="docutils literal"&gt;PathStr&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;A &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Callable[[PathStr,&lt;/span&gt; PathStr], PathStr]&lt;/tt&gt; to combine other values into it.&lt;/li&gt;
&lt;li&gt;A &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Callable[[PathStr],&lt;/span&gt; T_co]&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Currently, the first two get bundled up.
I'm &lt;em&gt;thinking&lt;/em&gt; I might want to bundle the third one in with the others.
It's either bundle stuff up &lt;em&gt;more&lt;/em&gt;, or &lt;em&gt;less&lt;/em&gt;, and I don't know which way is better to go...&lt;/p&gt;
&lt;p&gt;I'm going to try to bundle them up, but today, and the next few days, I'm a little booked as far as things to do.
I hope to try this out sooner, but it might end up waiting until the weekend.
We'll see.&lt;/p&gt;
&lt;p&gt;I can't delay things any longer.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2023-01-24</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-01-24" rel="alternate"></link><published>2023-01-24T05:00:00-05:00</published><updated>2023-01-24T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-01-24:/weekly-roundup-2023-01-24</id><summary type="html">&lt;p class="first last"&gt;Let's wrap this stage up and see what it takes to cut a release!&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I kept on renaming stuff in MOTR.&lt;/li&gt;
&lt;li&gt;Thursday: I finished the name updates, and then dealt with the merge.&lt;/li&gt;
&lt;li&gt;Friday: I planned some test speedups and coverage improvements.&lt;/li&gt;
&lt;li&gt;Saturday: The speedups worked.&lt;/li&gt;
&lt;li&gt;Sunday: I sped things up a little more, and dealt with the merges.&lt;/li&gt;
&lt;li&gt;Monday: I did some evaluation and planning of how I want to improve &lt;tt class="docutils literal"&gt;artifact.Output&lt;/tt&gt;, and I've got some interesting ideas, for sure...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to execute on my latest plans for improving MOTR.
After that, I should be good to try implementing more wrappers.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-01-23</title><link href="https://mwchase.neocities.org/coding-2023-01-23" rel="alternate"></link><published>2023-01-23T05:00:00-05:00</published><updated>2023-01-23T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-01-23:/coding-2023-01-23</id><summary type="html">&lt;p class="first last"&gt;Why use two classes, when you can use two classes &lt;em&gt;and&lt;/em&gt; a Protocol?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I want to figure out how to redo the &lt;tt class="docutils literal"&gt;artifact.Output&lt;/tt&gt; class so it's like, less janky, but it's not obvious to me how to get from here to there.
Let's take a look at what it has and what I want.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@attr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataclass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frozen&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Generic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T_co&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;

    &lt;span class="n"&gt;input_accumulator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;This is basically an initial Parametric[io.Input[PathStr]] plus a fold operation over PathStr. Going forward, I want to break this into two fields.&amp;quot;&lt;/span&gt;
    &lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;A function from PathStr to T_co. I&amp;#39;m going to keep this, and it should be helpful in eliminating some of the weird cruft I ended up adding.&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;This is misnamed; it is a Parametric[Sequence[str]]. It should probably have a default value that just evaluates to the empty tuple. Its name should include &amp;#39;name&amp;#39; somehow.&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;target_label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;I don&amp;#39;t know if &amp;#39;target&amp;#39; is the right word, but the only change to make here is to probably make it optional.&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;make_parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Here&amp;#39;s the big change. This is currently an optional data-y value that produces various kinds of outputs. I want to replace it with a data-y type that combines a function from T_co to a Datum subclass with an InputLabel of that subclass, and has a helper function to wire that all up in the only way that really makes sense.&amp;quot;&lt;/span&gt;

&lt;span class="o"&gt;...&lt;/span&gt;

&lt;span class="c1"&gt;# So, the dream is something like...&lt;/span&gt;

&lt;span class="n"&gt;TDatum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TypeVar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;TDatum&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bound&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Datum&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# I have no complaints about the new attrs module, but I&amp;#39;d rather wait to&lt;/span&gt;
&lt;span class="c1"&gt;# switch until after I&amp;#39;ve stopped maintaining two topics in parallel.&lt;/span&gt;
&lt;span class="c1"&gt;# Also, maybe I need to make TDatum covariant or something.&lt;/span&gt;
&lt;span class="nd"&gt;@attr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataclass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frozen&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ExtraImplicit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Generic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TDatum&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;  &lt;span class="c1"&gt;# Formerly, this would have been &amp;quot;ExtraExtra&amp;quot; 🤢&lt;/span&gt;
    &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;InputLabel&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;TDatum&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;TDatum&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Fairly straightforward helper functions go here-ish.&lt;/span&gt;

&lt;span class="nd"&gt;@attr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataclass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frozen&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Generic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T_co&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;

    &lt;span class="n"&gt;initial_parametric&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Parametric&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;PathStr&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
    &lt;span class="n"&gt;pathstr_accumulator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;PathStr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PathStr&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;PathStr&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;PathStr&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;T_co&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Parametric&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Sequence&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
    &lt;span class="n"&gt;input_label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;InputLabel&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T_co&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
    &lt;span class="n"&gt;extra_implicit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ExtraImplicit&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T_co&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;My main concern, looking at all of that stuff, is how to put together a sensible constructor interface.
Part of me wants to just slap a basic fluent interface over top of it all and call it a day, but that doesn't feel good to the rest of me.
Perhaps if I consider what the other majorly reworked class would look like...&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@attr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataclass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frozen&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OutputFromInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Generic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T_co&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;

    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T_co&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Parametric&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Sequence&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
    &lt;span class="n"&gt;input_label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;InputLabel&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T_co&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
    &lt;span class="n"&gt;extra_implicit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ExtraImplicit&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T_co&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This implies that, from a code organization perspective, we need a class representing &amp;quot;how a &lt;tt class="docutils literal"&gt;Parametric[io.Input[T_co]]&lt;/tt&gt; gets converted to a &lt;tt class="docutils literal"&gt;Parametric[io.Output[T_co]]&lt;/tt&gt;, and, with the help of a callback, then to a &lt;tt class="docutils literal"&gt;Parametric[command.Metadata[installer.TArgs]]&lt;/tt&gt;, although, I've just realized...&lt;/p&gt;
&lt;p&gt;I need an additional option on this thing for handling the &amp;quot;make parent&amp;quot; case, because that's an implicit &lt;em&gt;input&lt;/em&gt; rather than an implicit &lt;em&gt;output&lt;/em&gt;.
So, the helper class is something like...&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@attr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataclass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frozen&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OutputConverter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Generic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;

    &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Parametric&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Sequence&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
    &lt;span class="n"&gt;input_label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;InputLabel&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
    &lt;span class="n"&gt;make_parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ParentMaker&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
    &lt;span class="n"&gt;extra_implicit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ExtraImplicit&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;ParentMaker&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Or something.
I don't know if there's an idiomatic way to have &amp;quot;a boolean variable that can only take a &lt;tt class="docutils literal"&gt;True&lt;/tt&gt; value if a type parameter has a specific value&amp;quot;...
Like, this is seeming like a &lt;em&gt;really tempting&lt;/em&gt; case for subclassing, even by my standards.
I suppose the alternative would be to define a protocol based on its inputs and outputs, and write a wrapper class around the basic converter, then add a fluent method that requires &lt;tt class="docutils literal"&gt;T&lt;/tt&gt; to be &lt;tt class="docutils literal"&gt;pathlib.Path&lt;/tt&gt;, and then... yeah, at that point, it should Just Work.&lt;/p&gt;
&lt;p&gt;I'm not getting this done tonight, but I'm glad I've got a pretty solid plan now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-01-22</title><link href="https://mwchase.neocities.org/coding-2023-01-22" rel="alternate"></link><published>2023-01-22T05:00:00-05:00</published><updated>2023-01-22T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-01-22:/coding-2023-01-22</id><summary type="html">&lt;p class="first last"&gt;I think I may have regressed coverage on the future topic, but, um, that's a Future Max problem.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I squeezed out the last two seconds of speedup left on the table, and grabbed about four more.
After that, there's about 4 that I can get later, but I can't get now.
The merges required are getting a little frustrating, but it's probably fine.
I also put up the coverage a little.
Currently hovering at or above 97.5%.&lt;/p&gt;
&lt;p&gt;I'm guessing that both of the things I want to work on next will do something horrifying in terms of merge conflicts, so I'll just try to focus on what should be the smaller one.&lt;/p&gt;
&lt;p&gt;That's going to be basically taking apart the &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt; classes and putting them back together in a way that makes more sense.&lt;/p&gt;
&lt;p&gt;For now, I'm going to wrap things up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2023-01-21</title><link href="https://mwchase.neocities.org/coding-2023-01-21" rel="alternate"></link><published>2023-01-21T05:00:00-05:00</published><updated>2023-01-21T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-01-21:/coding-2023-01-21</id><summary type="html">&lt;p class="first last"&gt;Some of the weird stuff I ran into would have made a good post. Too bad I'm super tired.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I ended up &amp;quot;only&amp;quot; speeding things up by ten or so seconds, but that's not nothing.
I think there's about four seconds I can save easily, and four more that I can take care of down the line.&lt;/p&gt;
&lt;p&gt;As far as what to do next, wiping out the coverage misses that just got opened up is a solid choice, but I also want to look into the &lt;tt class="docutils literal"&gt;artifact.Output&lt;/tt&gt; rework.&lt;/p&gt;
&lt;p&gt;Anyway, for now, I want to zone out for a while, then go to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2023-01-20</title><link href="https://mwchase.neocities.org/coding-2023-01-20" rel="alternate"></link><published>2023-01-20T05:00:00-05:00</published><updated>2023-01-20T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-01-20:/coding-2023-01-20</id><summary type="html">&lt;p class="first last"&gt;Talking about these test rewrites like I'm a speedrunner. &amp;quot;Yeah, I've got a potential 12-second time save on my hands here&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I forget how or whether I prioritized things for MOTR recently.
Now that I've got a round of renames done, I was like &amp;quot;what do I feel like working on?&amp;quot; and the answer was apparently &amp;quot;remove the usages of &lt;a class="reference external" href="https://pyrsistent.readthedocs.io/"&gt;pyrsistent&lt;/a&gt; that aren't &lt;tt class="docutils literal"&gt;PMap&lt;/tt&gt;s&amp;quot;.
Which, I wanted to do that at some point.
It might have been prudent to do it on the &amp;quot;future&amp;quot; side, since the merges were all gross, but, eh...
Offhand, I can remember a few other things to look into:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Reduce the dependence of tests on subprocesses.&lt;/li&gt;
&lt;li&gt;Rework the &lt;tt class="docutils literal"&gt;artifact.Output&lt;/tt&gt; layout and creation workflow.&lt;/li&gt;
&lt;li&gt;Work on splitting up the API into logical layers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Looking over these, the first is good to do when I feel like it, since it &lt;em&gt;shouldn't&lt;/em&gt; involve a bunch of soul-searching or wide-ranging changes, and getting it done should shave a few seconds off of the run time of the tests, which is several percent improvement.&lt;/p&gt;
&lt;p&gt;The other options both take some careful planning, and I wouldn't be surprised if they caused interesting things to happen in terms of merges.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Wait a sec, I was going by memory for the expected speedup, and it's more like, if I can get just one test to run at a similar speed to nearly every other test, the tests will be nearly three times faster?!?!
However, it's right in the middle of &amp;quot;future&amp;quot; changes.
At the same time, getting the logic relevant to this test mocked would make it easier to increase coverage, so I think implementing the mocking twice, more or less, would be less painful than trying to legitimately force a failure state to trigger the unused branches.&lt;/p&gt;
&lt;p&gt;All right, this is clearly the play.
It speeds up iteration, and gets me closer to full coverage.
Then I can work on these other changes.
Probably planning out the different layers as I feel like it, but focusing on the &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt; rework.&lt;/p&gt;
&lt;p&gt;Anyway, I should get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2023-01-19</title><link href="https://mwchase.neocities.org/coding-2023-01-19" rel="alternate"></link><published>2023-01-19T05:00:00-05:00</published><updated>2023-01-19T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-01-19:/coding-2023-01-19</id><summary type="html">&lt;p class="first last"&gt;I should maybe have expected some trouble from making all of these changes on adjacent lines in different topics.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I had a rough day at work today, but now I'm&lt;/p&gt;
&lt;p&gt;&lt;em&gt;FINE&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Because I got the name updates finished in MOTR, and then I merged them, and then I fixed the merge conflicts, and then I updated all of the things that the merge didn't update, and when I'm feeling a little less tired and twitchy I can start working on more significant updates.&lt;/p&gt;
&lt;p&gt;Right now, though, I desperately need to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2023-01-18</title><link href="https://mwchase.neocities.org/coding-2023-01-18" rel="alternate"></link><published>2023-01-18T05:00:00-05:00</published><updated>2023-01-18T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-01-18:/coding-2023-01-18</id><summary type="html">&lt;p class="first last"&gt;Polishing...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I have been &lt;em&gt;so&lt;/em&gt; in the zone propagating renames through MOTR's code base.
I'm stopping and writing this post, not because I got to any kind of natural stopping point (I absolutely did not), but because I don't have it in me to update any more code tonight.&lt;/p&gt;
&lt;p&gt;I ended up stumbling across some really nice improvements to make while I was working through these files, and I have a few ideas for further tweaks to try out later.&lt;/p&gt;
&lt;p&gt;For now, I need to take a few more days to get these renames done, then to run flake8 on the result, then to test the results.
Then merge.
And probably do this all a few more times.&lt;/p&gt;
&lt;p&gt;Progress...
Yay...&lt;/p&gt;
&lt;p&gt;Anyway, it's late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Weekly Roundup 2023-01-17</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-01-17" rel="alternate"></link><published>2023-01-17T05:00:00-05:00</published><updated>2023-01-17T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-01-17:/weekly-roundup-2023-01-17</id><summary type="html">&lt;p class="first last"&gt;I had a bunch of trouble focusing on my projects, but when I got started, hoo boy.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I was focused on the CtC hunt.&lt;/li&gt;
&lt;li&gt;Thursday: I finished the hunt.&lt;/li&gt;
&lt;li&gt;Friday: I started thinking about MOTR again, and getting bits of the code to make more sense.&lt;/li&gt;
&lt;li&gt;Saturday: I didn't get much done.&lt;/li&gt;
&lt;li&gt;Sunday: My face hurt.&lt;/li&gt;
&lt;li&gt;Monday: I started making changes to MOTR.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to get MOTR to a state where it can pass its tests again, then merge to the future (which will suck), then make a few more changes, then see if I feel ready to write more support code.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="MOTR"></category><category term="Sudoku"></category></entry><entry><title>Coding 2023-01-16</title><link href="https://mwchase.neocities.org/coding-2023-01-16" rel="alternate"></link><published>2023-01-16T05:00:00-05:00</published><updated>2023-01-16T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-01-16:/coding-2023-01-16</id><summary type="html">&lt;p class="first last"&gt;Once again, not on top of time management&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I didn't really focus on much today, but I did work out something to get more work done &lt;em&gt;later&lt;/em&gt;.
I did the beginning of a bunch of naming updates.&lt;/p&gt;
&lt;p&gt;So, now the new code is pretty thoroughly broken (though I plan to break it more), and I can easily call up a list of everything that needs to be updated.&lt;/p&gt;
&lt;p&gt;So, with these changes, it's simple: fix type issues until it thinks things work again.&lt;/p&gt;
&lt;p&gt;I can't think of anything else, so I'm going to make a few more name changes, to queue up the checklist for later.&lt;/p&gt;
&lt;p&gt;For now, I need to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Diary 2023-01-15</title><link href="https://mwchase.neocities.org/diary-2023-01-15" rel="alternate"></link><published>2023-01-15T05:00:00-05:00</published><updated>2023-01-15T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-01-15:/diary-2023-01-15</id><summary type="html">&lt;p class="first last"&gt;Ow, my face.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Oh man, I feel so bad right now.
Like, my sinuses are doing something that they definitely shouldn't.&lt;/p&gt;
&lt;p&gt;I don't feel up for anything too intense, but I did take a few notes for the Other Project.
And I can probably handle taking paper notes on MOTR changes, now that I've managed to grasp how the scope should be narrowed.&lt;/p&gt;
&lt;p&gt;But other than that, I need to make a sincere effort to do better at winding down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Short post"></category></entry><entry><title>Diary 2023-01-14</title><link href="https://mwchase.neocities.org/diary-2023-01-14" rel="alternate"></link><published>2023-01-14T05:00:00-05:00</published><updated>2023-01-14T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-01-14:/diary-2023-01-14</id><summary type="html">&lt;p class="first last"&gt;Hellraiser: Revelations all like, &amp;quot;What if there was a movie that made you think about the first Hellraiser, but it like, wasn't very good?&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Took another light day.&lt;/p&gt;
&lt;p&gt;Over the weekend, I'll hopefully have a chance to lay out all of my thoughts for MOTR and get them to make sense, but right now, I should wind down.&lt;/p&gt;
&lt;p&gt;I did at least put together some stuff for the Other Project.
At some point, I should figure out if the Other Project needs, like, legal advice.
But that's not right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Short post"></category></entry><entry><title>Coding 2023-01-13</title><link href="https://mwchase.neocities.org/coding-2023-01-13" rel="alternate"></link><published>2023-01-13T05:00:00-05:00</published><updated>2023-01-13T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-01-13:/coding-2023-01-13</id><summary type="html">&lt;p class="first last"&gt;Fortunately, I can scale back some of my ambitions.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Instead of touching any code today, I'm going to try to fully lay out my thoughts on the general area I was talking about last time.&lt;/p&gt;
&lt;p&gt;For context, I'm trying to rework the structure of the class that will be call &lt;tt class="docutils literal"&gt;artifact.Output&lt;/tt&gt; once I've renamed everything.
The various classes in the &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt; module are (okay, fine, &lt;em&gt;will be&lt;/em&gt;) implementations of the &lt;tt class="docutils literal"&gt;Artifact&lt;/tt&gt; protocol, which defines a method that takes a callback which converts some value to a &lt;tt class="docutils literal"&gt;Parametric[command.Metadata]&lt;/tt&gt; (or something along those lines.
&lt;tt class="docutils literal"&gt;artifact.Output&lt;/tt&gt; currently has provisions to inject other values in specific circumstances, which end up making it hard for me to determine which intermediate values are &amp;quot;supposed to&amp;quot; be used at various stages.&lt;/p&gt;
&lt;p&gt;Now, I was thinking of putting together something &lt;em&gt;really elaborate&lt;/em&gt; to replace this system, but I think the specific &lt;em&gt;really elaborate&lt;/em&gt; thing I had in mind had its own problems.
So, let's take it slow...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The current system is required to work with pathlike objects for the &amp;quot;accumulation&amp;quot; phase that happens before anything else.
It also has an optional &amp;quot;mapping&amp;quot; step that's required to stay pathlike, and could in theory be removed, so eh.&lt;/li&gt;
&lt;li&gt;Once the final pathlike is produced from the accumulation, an additional mapping step is carried out, and the relevant &amp;quot;PCM&amp;quot; object is constructed using the callback.&lt;/li&gt;
&lt;li&gt;The instance may contain information relevant to adding information about the parent path of the &amp;quot;final&amp;quot; pathlike to the &amp;quot;PCM&amp;quot;, and if so, that pathlike is passed in.
The mapped value cannot be used, because its type is not statically known.&lt;/li&gt;
&lt;li&gt;This could all be drastically simplified and address some of the problems, except for the case currently referred to as &lt;tt class="docutils literal"&gt;Extra&lt;/tt&gt; (which will be &lt;tt class="docutils literal"&gt;Implicit&lt;/tt&gt;).
The callback passed in that case accepts a type that &lt;em&gt;partially&lt;/em&gt; overlaps with MOTR's definition of pathlike, and we &lt;em&gt;really want&lt;/em&gt; to be able to use the types outside of that overlap.
While the type in question sometimes does contain path information, at least sort of, it's not guaranteed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, going from there...
I don't think there's a sensible definition of &amp;quot;parent&amp;quot; for these &amp;quot;&lt;tt class="docutils literal"&gt;Token&lt;/tt&gt;&amp;quot; objects, but unless I can formalize the types in question, I need the code to do &lt;em&gt;something&lt;/em&gt; when this overlap happens, and I'd rather not stick &lt;tt class="docutils literal"&gt;isinstance&lt;/tt&gt; checks in there.&lt;/p&gt;
&lt;p&gt;So, I want to change this code both from a usage perspective, and from an implementation perspective.
From a usage perspective, I want the &amp;quot;final&amp;quot; accumulated value to be what is passed to the command if possible (so, ideally not &lt;tt class="docutils literal"&gt;Extra&lt;/tt&gt;/&lt;tt class="docutils literal"&gt;Implicit&lt;/tt&gt;), and I want the other values to be &lt;tt class="docutils literal"&gt;Extra&lt;/tt&gt;/&lt;tt class="docutils literal"&gt;Implicit&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;This actually really helps, because it gets me that these extra values are only expected when the produced value is known to be pathlike.
So, if there are update methods that restrict their validity based on the type parameter, then &lt;em&gt;those&lt;/em&gt; methods are allowed to use the fact that the data is pathlike.
I don't know if I should exercise that option, but it's there.&lt;/p&gt;
&lt;p&gt;Anyway, a few other notes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Only the &amp;quot;explicit&amp;quot; value needs to be named, because the names will always sort of refer to the same things.&lt;/li&gt;
&lt;li&gt;However, it would be good to allow &lt;em&gt;any&lt;/em&gt; output to have its own &lt;em&gt;label&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These involve maps like &lt;tt class="docutils literal"&gt;PathLike &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; T_co&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;T_co &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; Datum&lt;/tt&gt;, but the latter is only expected with &lt;tt class="docutils literal"&gt;T_co == PathLike&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Something else I need to keep in mind is that I believe I want to add these capabilities to the &lt;tt class="docutils literal"&gt;OutputFromInput&lt;/tt&gt; class, which... hm...
Basically, all of this logic &amp;quot;should&amp;quot; be neatly encapsulated somewhere, and the question of how to do that feels like maybe it should wait for after I've done the previous rounds of rewrites.&lt;/p&gt;
&lt;p&gt;So, the plan for the coming days: take my existing plans, convert them into TODO comments in the code, then grind through them and take notes on what to do differently.&lt;/p&gt;
&lt;p&gt;For now, though, I really need to sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Diary 2023-01-12</title><link href="https://mwchase.neocities.org/diary-2023-01-12" rel="alternate"></link><published>2023-01-12T05:00:00-05:00</published><updated>2023-01-12T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-01-12:/diary-2023-01-12</id><summary type="html">&lt;p class="first last"&gt;Hunt over.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hunt is &lt;em&gt;done&lt;/em&gt;.
I kind of want to jump right back into other stuff &lt;em&gt;right now&lt;/em&gt;, but that would be a bad idea.&lt;/p&gt;
&lt;p&gt;Aside from the hunt, I did take some notes on the other project, and now I'm ready to start planning how I'm going to actually produce stuff for it.
I'm thinking I'll try to figure out what kind of techniques I want to work with, and use them with other topics.
We'll see.&lt;/p&gt;
&lt;p&gt;Anyway, I should wrap up for tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Short post"></category></entry><entry><title>Diary 2023-01-11</title><link href="https://mwchase.neocities.org/diary-2023-01-11" rel="alternate"></link><published>2023-01-11T05:00:00-05:00</published><updated>2023-01-11T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-01-11:/diary-2023-01-11</id><summary type="html">&lt;p class="first last"&gt;Still staring at Sudoku puzzles until they suddenly solve themselves.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right.
I was still focused on the CtC hunt, so no hobby coding stuff.
I'm closing in on the end of it, but there's still one and a bit puzzles to go.&lt;/p&gt;
&lt;p&gt;I'm also gradually assembling resources for The Other Project, which I will properly announce at some point.
I just don't feel comfortable saying &amp;quot;Here is my idea for a thing I'm doing. If that sounds interesting... too bad, lol, check back in like a year.&amp;quot;
So just, trust me that I'm trying to put something out, and I won't make people wait for anything &lt;em&gt;specific&lt;/em&gt; until after I've put part of it out.&lt;/p&gt;
&lt;p&gt;In any case, it's too late currently, and I'm not going to get anything else written tonight, so this is done.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Short post"></category></entry><entry><title>Weekly Roundup 2023-01-10</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-01-10" rel="alternate"></link><published>2023-01-10T05:00:00-05:00</published><updated>2023-01-10T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-01-10:/weekly-roundup-2023-01-10</id><summary type="html">&lt;p class="first last"&gt;Somewhat light week, and now I'm out of it.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I came up with a possible reason that I'm having trouble with one of the classes in MOTR.&lt;/li&gt;
&lt;li&gt;Thursday: I mostly focused on the Cracking the Cryptic puzzle hunt.&lt;/li&gt;
&lt;li&gt;Friday: I looked a bit more at MOTR, and tried to figure out how to make some of the code make fewer assumptions, in order to be clearer.&lt;/li&gt;
&lt;li&gt;Saturday: I tried to work on another project...&lt;/li&gt;
&lt;li&gt;Sunday: I dunno.&lt;/li&gt;
&lt;li&gt;Monday: I roughed out some possible ways to rework the &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt; implementation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to flesh out the other project, and take notes on changes to MOTR.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="MOTR"></category><category term="secret project"></category></entry><entry><title>Coding 2023-01-09</title><link href="https://mwchase.neocities.org/coding-2023-01-09" rel="alternate"></link><published>2023-01-09T05:00:00-05:00</published><updated>2023-01-09T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-01-09:/coding-2023-01-09</id><summary type="html">&lt;p class="first last"&gt;I need to work through the use cases here, or I might accidentally come up with something really complicated.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right.
I got some work done on one project today, let's sketch stuff out for MOTR.&lt;/p&gt;
&lt;p&gt;My idea for generalizing &lt;tt class="docutils literal"&gt;artifact.Output&lt;/tt&gt; is to have a helper class that looks something like&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@attrs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;frozen&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Converter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Generic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
    &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
    &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Parametric&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Sequence&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;attrs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;no_parameters&lt;/span&gt;&lt;span class="p"&gt;(()),&lt;/span&gt;
        &lt;span class="n"&gt;validator&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;RejectBecause&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parametric_not_flex_out&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parametric&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Parametric&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;PCM&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="c1"&gt;# Things get a little problematic here.&lt;/span&gt;
        &lt;span class="c1"&gt;# This needs some way to either use a provided converter callable&lt;/span&gt;
        &lt;span class="c1"&gt;# OR to use the Implicit converter.&lt;/span&gt;
        &lt;span class="c1"&gt;# I think the steps there are to move the &amp;quot;logic&amp;quot; of Implicit to&lt;/span&gt;
        &lt;span class="c1"&gt;# the top level, and write overrides for this method.&lt;/span&gt;
        &lt;span class="c1"&gt;# Anyway, once that&amp;#39;s done, porting over the main logic from&lt;/span&gt;
        &lt;span class="c1"&gt;# artifact.Output is a cinch.&lt;/span&gt;
        &lt;span class="c1"&gt;# One thing that I realize I should do first is, check how aligned&lt;/span&gt;
        &lt;span class="c1"&gt;# the different implementations of the Artifact protocol end up&lt;/span&gt;
        &lt;span class="c1"&gt;# looking.&lt;/span&gt;
        &lt;span class="c1"&gt;# I may want to look into reducing the degree of runtime&lt;/span&gt;
        &lt;span class="c1"&gt;# polymorphism somehow, although there are some hurdles there.&lt;/span&gt;
        &lt;span class="c1"&gt;# Like the fact that there are three separate implementations on&lt;/span&gt;
        &lt;span class="c1"&gt;# both sides of the interface boundary.&lt;/span&gt;

    &lt;span class="c1"&gt;# Anyway...&lt;/span&gt;

    &lt;span class="nd"&gt;@attrs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;frozen&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AdditionalOutput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Generic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T_contra&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T_co&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
        &lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;T_contra&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;T_co&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;converter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Converter&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T_co&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parametric&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Parametric&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T_contra&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;PCM&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
            &lt;span class="c1"&gt;# Map types over the parametric, then pass it to the converter.&lt;/span&gt;

    &lt;span class="c1"&gt;# This raises the question of whether the artifact.Output should derive&lt;/span&gt;
    &lt;span class="c1"&gt;# all of its outputs from the basal combined value, or if it should&lt;/span&gt;
    &lt;span class="c1"&gt;# apply a map to that value, and then additional maps on top of the&lt;/span&gt;
    &lt;span class="c1"&gt;# first.&lt;/span&gt;
    &lt;span class="c1"&gt;# I&amp;#39;m thinking about this, and not coming up with anything compelling,&lt;/span&gt;
    &lt;span class="c1"&gt;# so I think the tiebreaker is ease of implementation, which would mean&lt;/span&gt;
    &lt;span class="c1"&gt;# merging those classes into one and constraining T_contra when using&lt;/span&gt;
    &lt;span class="c1"&gt;# them with artifact.Output&lt;/span&gt;

    &lt;span class="c1"&gt;# ...&lt;/span&gt;

    &lt;span class="c1"&gt;# One possibility is to allow nesting AdditionalOutputs inside each&lt;/span&gt;
    &lt;span class="c1"&gt;# other.&lt;/span&gt;
    &lt;span class="c1"&gt;# This would allow quite a bit of flexibility, while also simplifying&lt;/span&gt;
    &lt;span class="c1"&gt;# the implementation of Output...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I think I should keep on thinking about this.
Before I make any changes one way or the other, I should switch topics to the coverage topic, and work on marking up all of the code that I decided to change.&lt;/p&gt;
&lt;p&gt;This entry is finished a bit earlier than most of the recent ones, so let's just call it there and let me wind down properly for a change.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Diary 2023-01-08</title><link href="https://mwchase.neocities.org/diary-2023-01-08" rel="alternate"></link><published>2023-01-08T05:00:00-05:00</published><updated>2023-01-08T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-01-08:/diary-2023-01-08</id><summary type="html">&lt;p class="first last"&gt;Just kind of spaced out all day, apparently?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Not a great day for accomplishing stuff.
I'm going to have to really try to work on my various projects tomorrow.&lt;/p&gt;
&lt;p&gt;As for right now, I'm going to get to bed, and maybe take some notes on projects while I'm over there.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Short post"></category></entry><entry><title>Diary 2023-01-07</title><link href="https://mwchase.neocities.org/diary-2023-01-07" rel="alternate"></link><published>2023-01-07T05:00:00-05:00</published><updated>2023-01-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-01-07:/diary-2023-01-07</id><summary type="html">&lt;p class="first last"&gt;Secrets&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's see what I did...&lt;/p&gt;
&lt;p&gt;I'm letting some ideas for MOTR kind of percolate.
I'm also trying to get started on another project, and it's just...
Ugh, the writer's block is so intense.&lt;/p&gt;
&lt;p&gt;I'm going to have to figure out a way around it, but not right now.
Like, tomorrow.
I need to wind down for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Short post"></category></entry><entry><title>Coding 2023-01-06</title><link href="https://mwchase.neocities.org/coding-2023-01-06" rel="alternate"></link><published>2023-01-06T05:00:00-05:00</published><updated>2023-01-06T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-01-06:/coding-2023-01-06</id><summary type="html">&lt;p class="first last"&gt;Gradually discovering the form that the code &amp;quot;should have&amp;quot; been in.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;My planned changes to MOTR's top layer are getting a bit more ambitious.
Basically, I want to abstract out the logic of &amp;quot;what actual operations get performed on &lt;tt class="docutils literal"&gt;artifact.Output&lt;/tt&gt;'s data&amp;quot;.&lt;/p&gt;
&lt;p&gt;The basic idea is to make the core logic kind of transducer-y, and have supplementary classes that can add additional behavior for specific output types.
This is much cleaner in my head than the current system, which kind of mingles different stages of computation, and gets it all to &amp;quot;work&amp;quot; because the types are constrained.
If I can pull out the type-specific stuff and make the remainder generic, then I should be able to ignore &amp;quot;what specific stuff the code does in the main methods&amp;quot;, because the methods themselves can't act on that information; they can only pass stuff to helper objects with a matching parametric type.&lt;/p&gt;
&lt;p&gt;I'm going to need more time to work through these ideas, but I think this is all going in the right direction.
I need to get to bed for now, though.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Diary 2023-01-05</title><link href="https://mwchase.neocities.org/diary-2023-01-05" rel="alternate"></link><published>2023-01-05T05:00:00-05:00</published><updated>2023-01-05T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-01-05:/diary-2023-01-05</id><summary type="html">&lt;p class="first last"&gt;Another day that was more-or-less productive, but not in the areas I blog about.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was distracted working through the Cracking the Cryptic hunt.
That's one puzzle past the intro, and it was, um, tougher.
And the one after that... I don't even know.
We'll see.&lt;/p&gt;
&lt;p&gt;Anyway, nothing more to talk about tonight.
I'll get back to work on MOTR when I feel like it.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Short post"></category></entry><entry><title>Coding 2023-01-04</title><link href="https://mwchase.neocities.org/coding-2023-01-04" rel="alternate"></link><published>2023-01-04T05:00:00-05:00</published><updated>2023-01-04T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-01-04:/coding-2023-01-04</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;This class has a bad name. If I can get rid of the class, I won't have to think of a better one.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I have a hypothesis about why &lt;tt class="docutils literal"&gt;InputAccumulator&lt;/tt&gt; is troublesome to rename.
Let's see if it makes sense in text as well as in my head.&lt;/p&gt;
&lt;p&gt;The problem is that it's basically a reified right fold (hey, spell check is back! Too bad it doesn't know that &amp;quot;reified&amp;quot; is a word.)
Anyway, that's not the whole story, but I don't think the bits I'm leaving out matter, except insofar as they make everything more awkward.&lt;/p&gt;
&lt;p&gt;The point is, let's have a look at how a right fold is typed in, say, Haskell.
&lt;tt class="docutils literal"&gt;(a &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; b &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; b) &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; b &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; [a] &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; b&lt;/tt&gt;
The &lt;tt class="docutils literal"&gt;InputAccumulator&lt;/tt&gt; is like this, except the types are specialized and I pretended that I can have existential types.
The &amp;quot;list&amp;quot; basically doesn't exist in any explicit sense, and only implicitly exists in terms of the object that gets built up.
So, it's like, let's pass the function and the initial value to &lt;tt class="docutils literal"&gt;foldr&lt;/tt&gt;, but it's not really &lt;tt class="docutils literal"&gt;foldr&lt;/tt&gt;.
It's like...
&lt;tt class="docutils literal"&gt;(a &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; b &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; b) &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; b &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; wait actually I don't know if it's possible to express this in Haskell's type system, and I'm fairly sure most people wouldn't want to&lt;/tt&gt;
I guess the closest equivalent would be
&lt;tt class="docutils literal"&gt;((a &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; b &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; b), b) &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; a &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; ((a &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; b &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; b), b)&lt;/tt&gt; or something, subject to additional constraints that I believe the types involved are expressive enough to &lt;em&gt;not&lt;/em&gt; give us for free...
I'm not saying that the fact that this concept is awkward in Haskell &lt;em&gt;necessarily&lt;/em&gt; means I shouldn't do it in &lt;em&gt;Python&lt;/em&gt; the way I'm doing it, but given the way that my hobby Python sometimes ends up looking, it does legitimately raise the question.
Because the actual fold stuff is only done in one place in the code, it's not a great burden to rewrite it.
(Except that I would also need to surface the possibility of mapping over the final value, which is a thing that I do sometimes because of reasons, but surely there's a more sensible way to do that, as well...)&lt;/p&gt;
&lt;p&gt;What this would basically entail would be pulling implementation details of &lt;tt class="docutils literal"&gt;InputAccumulator&lt;/tt&gt; into &lt;tt class="docutils literal"&gt;artifact.Output&lt;/tt&gt;, and replacing its methods with some helper functions.
This would have some side effects in which error messages &lt;em&gt;make more sense&lt;/em&gt;, because the failures are coming from the &amp;quot;correct&amp;quot; class all of a sudden.
The main issue then is how to package this up and then unpackage it for the &lt;tt class="docutils literal"&gt;artifact.Output&lt;/tt&gt;, when there's no longer a single class to work with.
This is going to take some more thought.&lt;/p&gt;
&lt;p&gt;And right now, it's already way too late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Weekly Roundup 2023-01-03</title><link href="https://mwchase.neocities.org/weekly-roundup-2023-01-03" rel="alternate"></link><published>2023-01-03T05:00:00-05:00</published><updated>2023-01-03T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-01-03:/weekly-roundup-2023-01-03</id><summary type="html">&lt;p class="first last"&gt;It's a little rough how I thought about some of these things &lt;em&gt;a lot&lt;/em&gt;, and it still wasn't enough.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I continued to plan renamings for MOTR.&lt;/li&gt;
&lt;li&gt;Thursday: More renaming stuff...&lt;/li&gt;
&lt;li&gt;Friday: I had trouble renaming one module, at least temporarily.&lt;/li&gt;
&lt;li&gt;Saturday: I sketched out ideas for making one part of MOTR's interface make a little more sense, which unfortunately entails a lot of changes under the hood.&lt;/li&gt;
&lt;li&gt;Sunday: I moved on to renaming other things, and had trouble with that again. Maybe I should be approaching this like... if I got rid of this module, what functionality would that impede?&lt;/li&gt;
&lt;li&gt;Monday: On the road again...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to keep up with what I've been doing.
Maybe change some things up, maybe not.
(Ugh, what did I do to Neovim to break my spellcheck under some circumstances?)&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="MOTR"></category><category term="Python"></category></entry><entry><title>Diary 2023-01-02</title><link href="https://mwchase.neocities.org/diary-2023-01-02" rel="alternate"></link><published>2023-01-02T05:00:00-05:00</published><updated>2023-01-02T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-01-02:/diary-2023-01-02</id><summary type="html">&lt;p class="first last"&gt;Let's see how trying to get back to normal goes. I should maybe take notes.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right.
We did some traveling today, and I am super happy to take that excuse to have a short post.
I'm going to work hard to decompress, because, despite my genuine efforts, my sleep health ended up... questionable, over vacation.&lt;/p&gt;
&lt;p&gt;I can't think of anything else to mention.
I mean, I've been tearing through Cracking The Cryptic's hunt for January, but I assume it's going to get harder now that I'm past the intro.&lt;/p&gt;
&lt;p&gt;Anyway, nothing else to waffle about, so let's finish this.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Short post"></category></entry><entry><title>Coding 2023-01-01</title><link href="https://mwchase.neocities.org/coding-2023-01-01" rel="alternate"></link><published>2023-01-01T05:00:00-05:00</published><updated>2023-01-01T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2023-01-01:/coding-2023-01-01</id><summary type="html">&lt;p class="first last"&gt;The names are &lt;em&gt;less&lt;/em&gt; abstract, but they still feel &lt;em&gt;too&lt;/em&gt; abstract...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm going to write a quick post tonight, and try to finish up with plenty of time until the new year.&lt;/p&gt;
&lt;p&gt;I was focusing on renaming the &lt;tt class="docutils literal"&gt;input_accumulator&lt;/tt&gt; stuff.
Once I feel good about those names, I'll put the commentary from the last post into the &lt;tt class="docutils literal"&gt;flex&lt;/tt&gt; source, and then get to work on updating names.&lt;/p&gt;
&lt;p&gt;Right now, I'm thinking that &lt;tt class="docutils literal"&gt;ValueAdaptor&lt;/tt&gt; gets renamed to &lt;tt class="docutils literal"&gt;Selector&lt;/tt&gt;, and the &lt;tt class="docutils literal"&gt;InputAccumulator&lt;/tt&gt; protocol maybe gets renamed to &lt;tt class="docutils literal"&gt;MultiSelector&lt;/tt&gt;.
I may also consider collapsing the implementations back into a single class that handles mapping somehow, I'm not sure.
&lt;tt class="docutils literal"&gt;MultiSelector&lt;/tt&gt; is probably not quite right.
The idea is that a &lt;tt class="docutils literal"&gt;Selector&lt;/tt&gt; combines a &lt;tt class="docutils literal"&gt;select.Label&lt;/tt&gt; and a function to map the wrapped value to a path segment, and the other class is responsible for folding the segments together with an initial value.
So, &lt;em&gt;ideally&lt;/em&gt;, there should be something more descriptive of that than &lt;tt class="docutils literal"&gt;MultiSelector&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;Selectors&lt;/tt&gt;.
&lt;tt class="docutils literal"&gt;CombinedSelectors&lt;/tt&gt;?
&lt;tt class="docutils literal"&gt;SelectorCombiner&lt;/tt&gt;?&lt;/p&gt;
&lt;p&gt;I hope it's clear why I think this needs some time to bake.&lt;/p&gt;
&lt;p&gt;Anyway, I'm about done with this for now.
I'll think about it more next year.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2022-12-31</title><link href="https://mwchase.neocities.org/coding-2022-12-31" rel="alternate"></link><published>2022-12-31T05:00:00-05:00</published><updated>2022-12-31T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-12-31:/coding-2022-12-31</id><summary type="html">&lt;p class="first last"&gt;This is going to make the implementation ever so slightly squirrellier than the Platonic ideal, but, um, tough.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, starting the entry a little early today, because I just came up with a breakthrough, and I need to document it to get it all the way fleshed out.&lt;/p&gt;
&lt;p&gt;Basically, I've got a provisional name replacement for &lt;tt class="docutils literal"&gt;flex&lt;/tt&gt;: &lt;tt class="docutils literal"&gt;artifact&lt;/tt&gt;.
Once I had that, I started looking over the various bits defined in the module, and I realized something about some of the helper classes I wrote: they're not so much misnamed, as they &lt;strong&gt;maybe&lt;/strong&gt; shouldn't exist at all.&lt;/p&gt;
&lt;p&gt;This turns out to be trickier than I thought it was before I started typing.
Let's have a look at two &lt;tt class="docutils literal"&gt;Part&lt;/tt&gt; definitions that illustrate what I need to work through.&lt;/p&gt;
&lt;p&gt;Here's how they look currently:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;HTML_DIR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_parametric_command&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Extra&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;_flex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FlexOut&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;
        &lt;span class="n"&gt;_reports&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accumulator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;coverage&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;suffix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;index.html&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;_parametric&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;no_parameters&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mypy&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,)),&lt;/span&gt;
        &lt;span class="n"&gt;HTML_LABEL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;_flex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ArgParent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;--html-report&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="o"&gt;...&lt;/span&gt;

&lt;span class="n"&gt;JUNIT_XML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_parametric_command&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;_flex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FlexOut&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pathlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;
        &lt;span class="n"&gt;_reports&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accumulator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;suffix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;junit.xml&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;pathlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;_parametric&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;no_parameters&lt;/span&gt;&lt;span class="p"&gt;(()),&lt;/span&gt;
        &lt;span class="n"&gt;JUNIT_LABEL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;_flex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ExtraParent&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;--junit-xml&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And then let's update the names in those and make a few other tweaks:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;HTML_DIR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_parametric_command&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Implicit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;_artifact&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;_reports&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accumulator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;coverage&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;suffix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;index.html&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;_parametric&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;no_parameters&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mypy&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,)),&lt;/span&gt;
        &lt;span class="n"&gt;HTML_LABEL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;_artifact&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ArgParent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;--html-report&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="o"&gt;...&lt;/span&gt;

&lt;span class="n"&gt;JUNIT_XML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_parametric_command&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;_artifact&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;_reports&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accumulator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;suffix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;junit.xml&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;pathlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;_parametric&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;no_parameters&lt;/span&gt;&lt;span class="p"&gt;(()),&lt;/span&gt;
        &lt;span class="n"&gt;JUNIT_LABEL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;_artifact&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ImplicitParent&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;--junit-xml&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Some things that come to mind are relatively minor, such as that &lt;tt class="docutils literal"&gt;Argument&lt;/tt&gt; should probably have an alternative constructor called something like &lt;tt class="docutils literal"&gt;prefixed&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;But the big issue that I need to figure out is those &lt;tt class="docutils literal"&gt;ArgParent&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;ImplicitParent&lt;/tt&gt; classes.
What I hope to do is to essentially turn the &lt;tt class="docutils literal"&gt;HTML_DIR&lt;/tt&gt; definition &amp;quot;inside-out&amp;quot;, so that the description of how the command is actually constructed lives at the top level.
I think technically this changes the semantics because the &lt;tt class="docutils literal"&gt;Artifact&lt;/tt&gt; instance has less control over how it's &amp;quot;rendered&amp;quot;, but I also think that doesn't matter, because the &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; instance should only appear in one context anyway.&lt;/p&gt;
&lt;p&gt;(Also of note, there's &lt;em&gt;another&lt;/em&gt; &lt;tt class="docutils literal"&gt;Artifact&lt;/tt&gt; implementation that corresponds to output, and it should &lt;em&gt;also&lt;/em&gt; have access to whatever the main one does in this area; currently, it does not.)&lt;/p&gt;
&lt;p&gt;Comparing these usages, the &lt;tt class="docutils literal"&gt;HTML_DIR&lt;/tt&gt; is saying &amp;quot;if we ensure that this &lt;em&gt;directory&lt;/em&gt; exists, we can predict the file that will be written to it&amp;quot;.
The &lt;tt class="docutils literal"&gt;JUNIT_XML&lt;/tt&gt; is saying &amp;quot;let's write a file to this path, and we had better make sure the parent exists&amp;quot;.
In the former case, the &lt;em&gt;child&lt;/em&gt; is implicit in the constructed command.
In the latter case, the &lt;em&gt;parent&lt;/em&gt; is implicit.&lt;/p&gt;
&lt;p&gt;Let's try changing things up modestly.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;HTML_DIR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_parametric_command&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Argument&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prefixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;--html-report&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;_artifact&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;_reports&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accumulator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;coverage&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;suffix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;_parametric&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;no_parameters&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mypy&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,)),&lt;/span&gt;
        &lt;span class="n"&gt;HTML_LABEL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;_artifact&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ImplicitChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;index.html&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="o"&gt;...&lt;/span&gt;

&lt;span class="n"&gt;JUNIT_XML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_parametric_command&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Argument&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prefixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;--junit-xml&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;_artifact&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;_reports&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accumulator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;suffix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;junit.xml&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;pathlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;_parametric&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;no_parameters&lt;/span&gt;&lt;span class="p"&gt;(()),&lt;/span&gt;
        &lt;span class="n"&gt;JUNIT_LABEL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;_artifact&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ImplicitParent&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The relevant changes to the interface look &lt;em&gt;really small&lt;/em&gt; from this perspective, but they represent a pretty involved change to the implementation.
Let's skip over the &lt;tt class="docutils literal"&gt;prefixed&lt;/tt&gt; stuff, because that's trivial.&lt;/p&gt;
&lt;p&gt;Including line-numbers for some reference to myself later...&lt;/p&gt;
&lt;p&gt;It's hard to say how these changes should relate to lines 265-7, because the &lt;tt class="docutils literal"&gt;map&lt;/tt&gt; fields aren't typically doing anything &lt;em&gt;interesting&lt;/em&gt;.
When we get to 268, there's the &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; creation, which needs to be modified in the case of an &lt;tt class="docutils literal"&gt;ImplicitChild&lt;/tt&gt;, but left alone if there is nothing or an &lt;tt class="docutils literal"&gt;ImplicitParent&lt;/tt&gt;.
The expression from 269-78 would similarly need to use the possibly-updated value.
Lines 280-2 apply the &lt;em&gt;outer&lt;/em&gt; specification, so should use the parametric from before the &lt;tt class="docutils literal"&gt;ImplicitChild&lt;/tt&gt; is applied.
In the event that &lt;tt class="docutils literal"&gt;ImplicitParent&lt;/tt&gt; is passed, the block starting at line 284 should be entered, but the method calls to the object can be inlined.&lt;/p&gt;
&lt;p&gt;Let's now have a look at &lt;tt class="docutils literal"&gt;OutputFromInput&lt;/tt&gt;.
The current implementation is... &lt;em&gt;aggressively&lt;/em&gt; golfed in terms of pure statement count, so it's possible I'll need to break it up if I want to replicate this logic.
&lt;tt class="docutils literal"&gt;OutputFromInput.convert&lt;/tt&gt; starts by pulling the &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt; from the wrapped input.
This should correspond to line 264.
Note that the &lt;tt class="docutils literal"&gt;OutputFromInput&lt;/tt&gt; expects the &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt; to have been updated beforehand.
I might need to change this, because I can't use these new &lt;tt class="docutils literal"&gt;Implicit&lt;/tt&gt; ideas if I don't have a &lt;tt class="docutils literal"&gt;PathStr&lt;/tt&gt; to apply them to, which is not guaranteed.
Alternatively, the &lt;tt class="docutils literal"&gt;OutputFromInput&lt;/tt&gt; could &lt;em&gt;require&lt;/em&gt; the caller to pass a &lt;tt class="docutils literal"&gt;PathStr&lt;/tt&gt;, and then have a separate &lt;tt class="docutils literal"&gt;map&lt;/tt&gt; step...
So, assume the wrapped &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; &lt;em&gt;must&lt;/em&gt; have a compatible type, and then operate on that in the same general way as &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt;.
It looks like 265 onward could work the same, and maybe be a common function.
Question: should &lt;tt class="docutils literal"&gt;OutputFromInput&lt;/tt&gt; accept the injected values?
I forget why I had it discard that argument...
For what it's worth, it also happens with &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt;.
I'm also looking at the way I'm putting this together and thinking it it would make sense to just move the &lt;tt class="docutils literal"&gt;inject_registry&lt;/tt&gt; calls off of the &amp;quot;accumulator&amp;quot; classes, to reduce the API surface.
However, doing that &lt;em&gt;might&lt;/em&gt; break things...
Anyway, I believe that &lt;tt class="docutils literal"&gt;OutputFromInput&lt;/tt&gt; would need to keep some of the logic that's in &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt;.
I think the logic common to &lt;tt class="docutils literal"&gt;OutputFromInput&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; is from 176-86, which replaces lines 118-20 in &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;I think this is all of the information I need to fix this stuff up.
As of this writing, there's time tonight for me to attempt this, but I'd rather focus on continuing to plan.&lt;/p&gt;
&lt;p&gt;First thing I'd like to try: removing the &lt;tt class="docutils literal"&gt;inject_registry&lt;/tt&gt; wrappers and try doing the injection after the parametric is extracted.
I kind of want to try that before any more planning, then get into planning seriously.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;It's later now. I'm going to try a quick rewrite and see what breaks, if anything.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;All right, it looks like that was clean.&lt;/p&gt;
&lt;p&gt;I'm not going to put in much more work on this tonight, so let's switch to seeing which files I want to hit next.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;validators&lt;/tt&gt;: Looks good to me.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;command&lt;/tt&gt;: Needs the extra -&amp;gt; implicit rewrite; &lt;tt class="docutils literal"&gt;base_cmd&lt;/tt&gt; can probably be deleted and noted in case I decide I actually need it; &lt;tt class="docutils literal"&gt;Metadata&lt;/tt&gt; should maybe be called &lt;tt class="docutils literal"&gt;Command&lt;/tt&gt;?&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;input_accumulator&lt;/tt&gt;: Needs a few passes to get it to make sense.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;installer&lt;/tt&gt;: Needs to be split into two or three modules, which can then be evaluated individually.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;label&lt;/tt&gt;: Is totally fine, no need to worry.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;parametric&lt;/tt&gt;: I'm punting on.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'll try looking at &lt;tt class="docutils literal"&gt;input_accumulator&lt;/tt&gt;, then &lt;tt class="docutils literal"&gt;installer&lt;/tt&gt;, then &lt;tt class="docutils literal"&gt;command&lt;/tt&gt;.
For now, though, I'm going to wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="notes to self"></category></entry><entry><title>Coding 2022-12-30</title><link href="https://mwchase.neocities.org/coding-2022-12-30" rel="alternate"></link><published>2022-12-30T05:00:00-05:00</published><updated>2022-12-30T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-12-30:/coding-2022-12-30</id><summary type="html">&lt;p class="first last"&gt;It turns out there may have been a reason I haven't come up with a better name yet?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I'm still thinking about what to call the &lt;tt class="docutils literal"&gt;flex&lt;/tt&gt; classes instead of &lt;tt class="docutils literal"&gt;Flex*&lt;/tt&gt;, and I feel like I haven't gotten anywhere yet.
I'm still looking for some kind of unified metaphor, but given the somewhat odd way they're created to be passed (outputs have to be created from function or class calls, which look near enough the same, but inputs have to be retrieved from a &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt;), I haven't found anything that really ties any of this up with a bow.&lt;/p&gt;
&lt;p&gt;I once again let things get too late, so I'm going to just do a short entry.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short entry"></category></entry><entry><title>Coding 2022-12-29</title><link href="https://mwchase.neocities.org/coding-2022-12-29" rel="alternate"></link><published>2022-12-29T05:00:00-05:00</published><updated>2022-12-29T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-12-29:/coding-2022-12-29</id><summary type="html">&lt;p class="first last"&gt;Finding problems, looking for solutions.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got distracted, so this is late again.
Let's have a look at some minor tweaks to &lt;tt class="docutils literal"&gt;parameters&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;I want to remove some of the repetition of the module names in the class and function names.
Now, that could also bleed out into renaming the alias, because it's currently a little Pokémon-speak-y.
(Granted, that isn't stopping me in most places, so it's not a high priority.)&lt;/p&gt;
&lt;p&gt;Let's have a look at the &lt;tt class="docutils literal"&gt;generate_parameters&lt;/tt&gt; function, though.
That takes a set of labels, a, let's call it &lt;tt class="docutils literal"&gt;constants&lt;/tt&gt; for now, and optionally a set of parameters to augment.
The result is an iterator over a set of updated &lt;tt class="docutils literal"&gt;parameters&lt;/tt&gt; objects.&lt;/p&gt;
&lt;p&gt;I don't think there's another meaningful way to iterate over &lt;tt class="docutils literal"&gt;parameters&lt;/tt&gt; objects, so the current way the name works is&lt;/p&gt;
&lt;p&gt;fine.&lt;/p&gt;
&lt;p&gt;But I wonder if there's a more explicit way to describe what it does.&lt;/p&gt;
&lt;p&gt;Like the point is, you pass in a set of labels to iterate over, the constants to draw the values from, and an existing set of selected variables...&lt;/p&gt;
&lt;p&gt;In some sense the point of all of these data structures is that they represent &lt;em&gt;selections&lt;/em&gt; out of multiple possible values.
So, what if we had &lt;tt class="docutils literal"&gt;select.Label&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;select.Labels&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;select.Selections&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;select.SELECTIONS&lt;/tt&gt;, and &lt;tt class="docutils literal"&gt;select.select&lt;/tt&gt;?
I'll let those ideas stand for now, and move on to other things for the moment.&lt;/p&gt;
&lt;p&gt;On the &lt;tt class="docutils literal"&gt;registry&lt;/tt&gt;/&lt;tt class="docutils literal"&gt;constants&lt;/tt&gt; side of things, the big change I'd make would be to re-export &lt;tt class="docutils literal"&gt;Label&lt;/tt&gt; to provide a module interface that's consistent with &lt;tt class="docutils literal"&gt;parameters&lt;/tt&gt;/&lt;tt class="docutils literal"&gt;select&lt;/tt&gt;/whatever.&lt;/p&gt;
&lt;p&gt;Next up: whether to make any big changes to &lt;tt class="docutils literal"&gt;flex&lt;/tt&gt;.
I feel like it does need some changes, but I'm not sure what those changes look like.
One thing of note is that it's not a run-time dependency of &lt;tt class="docutils literal"&gt;parametric&lt;/tt&gt;, so it's free to draw in many other dependencies...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;validators&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;command&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;input_accumulator&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;installer&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;parametric&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;cmd&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;mkdir&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;parameters&lt;/tt&gt;/&lt;tt class="docutils literal"&gt;variables&lt;/tt&gt;/&lt;tt class="docutils literal"&gt;select&lt;/tt&gt;/whatever&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;registry&lt;/tt&gt;/&lt;tt class="docutils literal"&gt;constants&lt;/tt&gt;/whatever&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;facts&lt;/tt&gt; (&lt;tt class="docutils literal"&gt;requirements&lt;/tt&gt;)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;io&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let's ignore &lt;tt class="docutils literal"&gt;cmd&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;mkdir&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;facts&lt;/tt&gt;, and &lt;tt class="docutils literal"&gt;io&lt;/tt&gt; off the bat, because they're in more core positions.
It's a bit much to go into the remainder of those, so let's focus on &lt;tt class="docutils literal"&gt;flex&lt;/tt&gt;.
The basic purpose of the &lt;tt class="docutils literal"&gt;flex&lt;/tt&gt; classes is to interact with the &lt;tt class="docutils literal"&gt;parameters&lt;/tt&gt;/&lt;tt class="docutils literal"&gt;variables&lt;/tt&gt;/&lt;tt class="docutils literal"&gt;select&lt;/tt&gt; systems to make sure that a given output file is specified once per command and is different for each set of selections used to generate a command, and that related inputs can be passed multiple times to a single command if desired.
There are two main classes there, and a bunch of auxiliary classes.
Let's see what's needed to instantiate these main classes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;FlexOut&lt;/tt&gt; needs:&lt;ul&gt;
&lt;li&gt;a &amp;quot;&lt;tt class="docutils literal"&gt;PathStrAccumulator&lt;/tt&gt;, which is basically a way to take a base path, and update it according to a value derived from a selection.&lt;/li&gt;
&lt;li&gt;a mapping function that takes the final path from the above and converts it to the desired type.&lt;/li&gt;
&lt;li&gt;a parametric that produces the output names; this field is both poorly named, and should be made optional.&lt;/li&gt;
&lt;li&gt;the label corresponding to the &lt;tt class="docutils literal"&gt;FlexIn&lt;/tt&gt; that gets created; the caller is currently responsible for creating this, but should not be.&lt;/li&gt;
&lt;li&gt;The helper for potentially requiring a parent directory to exist; this has to go somewhere, and I'm ambivalent about its current status.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;FlexIn&lt;/tt&gt; needs:&lt;ul&gt;
&lt;li&gt;a &lt;tt class="docutils literal"&gt;parametric&lt;/tt&gt; that produces an &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; wrapped around the ultimately-desired type.&lt;/li&gt;
&lt;li&gt;an ordered collection of &lt;tt class="docutils literal"&gt;ValueAdaptor&lt;/tt&gt;s, which are what's responsible for deriving &lt;tt class="docutils literal"&gt;Path&lt;/tt&gt;s from selections to pass into the accumulator mentioned above.&lt;/li&gt;
&lt;li&gt;An additional field that I don't think callers are supposed to care about.
Since &lt;tt class="docutils literal"&gt;FlexIn&lt;/tt&gt; objects don't seem to be instantiated outside of the &lt;tt class="docutils literal"&gt;flex&lt;/tt&gt; module, this seems like a safe assumption.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This stuff is all kind of named after how it behaves in the context of multiple configurations.
It's &amp;quot;flexible&amp;quot; because you can define a command-line argument once, and it will automatically adjust to the pool of parameters it's supposed to select from.&lt;/p&gt;
&lt;p&gt;As such, this is a bad name, because what most people will care about is how it behaves in the context of a single configuration.
In a single configuration, these classes need to be produced or obtained in various ways to pass into helper functions that create a &lt;tt class="docutils literal"&gt;Part&lt;/tt&gt; for a parametric command.&lt;/p&gt;
&lt;p&gt;I'm going to have to think about this.
For now, it's late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-12-28</title><link href="https://mwchase.neocities.org/coding-2022-12-28" rel="alternate"></link><published>2022-12-28T05:00:00-05:00</published><updated>2022-12-28T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-12-28:/coding-2022-12-28</id><summary type="html">&lt;p class="first last"&gt;Starting to rework more names&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I'm going to try to review the names in my new modules.
So, starting in &lt;tt class="docutils literal"&gt;parametric&lt;/tt&gt;...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;label&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;parameters&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;registry&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;typed_mapping&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;flex&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm feeling pretty good about &lt;tt class="docutils literal"&gt;label&lt;/tt&gt;, so let's start by considering &lt;tt class="docutils literal"&gt;typed_mapping&lt;/tt&gt;.
The basic &lt;em&gt;concept&lt;/em&gt; of the &amp;quot;typed mapping&amp;quot; is really more like it's a function that conforms to some protocol, and the function can be updated to produce new functions.
Something about functions, maps, finite domains...&lt;/p&gt;
&lt;p&gt;Honestly, &lt;tt class="docutils literal"&gt;FunctionOnFiniteSet&lt;/tt&gt; seems reasonable, since the modules and classes are intended to be used with aliases, so there's no concern about length.&lt;/p&gt;
&lt;p&gt;So, next up, &lt;tt class="docutils literal"&gt;registry&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;parameters&lt;/tt&gt;.
These need to be on the short side.
One is a function from a typed label to a value of that type.
The other is a function from a typed label of a collection of objects to a member of a corresponding collection.
I'm a little bit wondering if I want to change them back to &lt;tt class="docutils literal"&gt;objects&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;items&lt;/tt&gt;?
My problem with that is, I don't think it really communicates the intended readings of &amp;quot;any instance whatsoever&amp;quot; and &amp;quot;an item of a collection&amp;quot;.&lt;/p&gt;
&lt;p&gt;I could have &lt;tt class="docutils literal"&gt;constants&lt;/tt&gt; instead of &lt;tt class="docutils literal"&gt;registry&lt;/tt&gt;, maybe?&lt;/p&gt;
&lt;p&gt;I got distracted so it's getting late, but let's leave that there for now.
I'll mull this over and try to expand things out.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Weekly Roundup 2022-12-27</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-12-27" rel="alternate"></link><published>2022-12-27T05:00:00-05:00</published><updated>2022-12-27T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-12-27:/weekly-roundup-2022-12-27</id><summary type="html">&lt;p class="first last"&gt;Weird, self-inflicted problems...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I audited MOTR's dependencies, and put together some general plans for handling updates to them.&lt;/li&gt;
&lt;li&gt;Thursday: I reviewed the lines of missed coverage in MOTR.&lt;/li&gt;
&lt;li&gt;Friday: I put in some work improving the test coverage.&lt;/li&gt;
&lt;li&gt;Saturday: I ended up derailed into trying to remove &lt;tt class="docutils literal"&gt;isinstance&lt;/tt&gt; checks.&lt;/li&gt;
&lt;li&gt;Sunday: Some of the &lt;tt class="docutils literal"&gt;isinstance&lt;/tt&gt; checks came out easily, and some...&lt;/li&gt;
&lt;li&gt;Monday: I continued to try to pull out the &lt;tt class="docutils literal"&gt;isinstance&lt;/tt&gt; checks, and it continued to be a pain.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I've got a few more checks I want to pull out, and then I can get back to addressing coverage.
I actually finally figured out the &amp;quot;&amp;quot;&amp;quot;right&amp;quot;&amp;quot;&amp;quot; way to remove the ones that were giving me trouble, which &lt;em&gt;may&lt;/em&gt; have ended up doing some implicit casts, unfortunately, but oh well.
&lt;em&gt;Hopefully&lt;/em&gt;, the type annotations are all honest...&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-12-26</title><link href="https://mwchase.neocities.org/coding-2022-12-26" rel="alternate"></link><published>2022-12-26T05:00:00-05:00</published><updated>2022-12-26T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-12-26:/coding-2022-12-26</id><summary type="html">&lt;p class="first last"&gt;Feature request if I ever work on NABTO seriously: type checking should provide some visibility into how it's reasoning, because where I am right now just feels awful.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I had a good day today, and got some work done on MOTR, but right now, it feels like Mypy got me a reasonable distance and fixed some bugs, and then it, like, betrayed me.&lt;/p&gt;
&lt;p&gt;I was working on replacing &lt;tt class="docutils literal"&gt;isinstance&lt;/tt&gt; checks inside one module, where part of the implementation was stubbed out because nothing needed that part yet.
I was having some persistent troubles writing a function to deal with the stubbed-out code, until I worked out that I was getting type errors when I implemented the stubs, because the type signatures on the stub were wrong, and the stub was papering over that.&lt;/p&gt;
&lt;p&gt;Once I'd addressed that, I would have liked Mypy to accept all of the code, but it's rejecting &lt;em&gt;something&lt;/em&gt; about the remaining code, and I'm unclear about how to fix it.&lt;/p&gt;
&lt;p&gt;I'm going to keep on trying to make sense of the errors I'm getting, and also I'm going to look into whether it's possible to regain some conciseness, after my attempt to remove some nested conditionals resulted in &lt;em&gt;a lot&lt;/em&gt; of method signatures.&lt;/p&gt;
&lt;p&gt;For now, I should wrap things up, and I might pick at these errors a bit more, even if I probably shouldn't at the moment.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-12-25</title><link href="https://mwchase.neocities.org/coding-2022-12-25" rel="alternate"></link><published>2022-12-25T05:00:00-05:00</published><updated>2022-12-25T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-12-25:/coding-2022-12-25</id><summary type="html">&lt;p class="first last"&gt;I really appreciate, I think, how some of the stuff that I'm doing to Mypy that probably &lt;em&gt;shouldn't&lt;/em&gt; work, just... does.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Dealing with these &lt;tt class="docutils literal"&gt;isinstance&lt;/tt&gt; calls is hairier than I wanted it to be.
I took care of some of them earlier today, and had to reconsider my approach for others later.
I haven't tried to fix those yet, maybe tomorrow, maybe next week.&lt;/p&gt;
&lt;p&gt;In any case, I did replace some imprecise types with mildly more specific ones, and pulled the relevant logic out of the function and stuck it at the top level.
That should open up some similar refactorings later, to help flatten out some methods even more.&lt;/p&gt;
&lt;p&gt;At the end of the day, it is the end of the day, and I didn't take enough time to write this post up beforehand, so I'm going to cut this off abruptly now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-12-24</title><link href="https://mwchase.neocities.org/coding-2022-12-24" rel="alternate"></link><published>2022-12-24T05:00:00-05:00</published><updated>2022-12-24T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-12-24:/coding-2022-12-24</id><summary type="html">&lt;p class="first last"&gt;It's a good thing I'm not competing with anything, because &lt;em&gt;wow&lt;/em&gt;, this is some careful deliberation.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I had a look at the missing coverage in &lt;tt class="docutils literal"&gt;command_builder.py&lt;/tt&gt;, and I concluded that, while it should be relatively straightforward to throw together a test at some level of abstraction, I feel like there should be some way to encode the checks that aren't being hit into the type system and remove them from the runtime code.&lt;/p&gt;
&lt;p&gt;So, what would that look like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Create a new typevar for representing the &lt;tt class="docutils literal"&gt;module_args&lt;/tt&gt; value.&lt;/li&gt;
&lt;li&gt;This propagates to the usages of the &lt;tt class="docutils literal"&gt;CommandBuilder&lt;/tt&gt; in &lt;tt class="docutils literal"&gt;parametric_command&lt;/tt&gt;, and secondarily to the client-style modules.&lt;/li&gt;
&lt;li&gt;The immediate change would be through the addition of a new parameter to &lt;tt class="docutils literal"&gt;ParametricCommandMeta&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;One question this raises is whether commands that accept a module argument should be &lt;em&gt;required&lt;/em&gt; to be passed one, but it should be safe to err on the side of strictness to start with.&lt;/li&gt;
&lt;li&gt;The key point is that the &lt;tt class="docutils literal"&gt;module_or_adaptor&lt;/tt&gt; field would also need to become parameterized, and I haven't yet thought of anything that seems like a &lt;em&gt;good&lt;/em&gt; way to do that.
A &lt;em&gt;way&lt;/em&gt; to do that is to create a parameterized protocol, and two classes that implement it, somehow scoping the implementation of each to a different value of the variable (probably by using self annotations of the protocol? Does that even work?), which should then localize the &lt;tt class="docutils literal"&gt;with_module&lt;/tt&gt; calls to the paths where it's statically asserted to succeed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thinking about what would improve the codebase, I think the thing to do is to try to eliminate the &lt;tt class="docutils literal"&gt;isinstance&lt;/tt&gt; checks that have test coverage.
That makes the typing a bit easier to reason about, and also eliminates some conditionals, so the behavior of the code should be less squirrelly.
If all of that works, then I can look into propagating the type information like I was talking about.&lt;/p&gt;
&lt;p&gt;For now, I'm going to wind down, and I'll see what I can do in the next few days.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-12-23</title><link href="https://mwchase.neocities.org/coding-2022-12-23" rel="alternate"></link><published>2022-12-23T05:00:00-05:00</published><updated>2022-12-23T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-12-23:/coding-2022-12-23</id><summary type="html">&lt;p class="first last"&gt;Just do the thing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I pushed up test coverage on MOTR a little bit.
I added some error path tests, and improved the errors they're looking for.
I deleted some functions that weren't accomplishing anything.
It shouldn't be &lt;em&gt;hard&lt;/em&gt; to put them back if I discover I need them, but I don't &lt;em&gt;think&lt;/em&gt; I'll need them.&lt;/p&gt;
&lt;p&gt;I didn't get much done today because of travel; we'll see how I do in the next few days, but I hope to cut down on the coverage misses, then work on renaming and reorganizing, then rework some of the high-level usages, and expand the highest-level wrappers until it's ready for a release.&lt;/p&gt;
&lt;p&gt;I don't know how much of that I can get down in the next week, or in the next month.
I'm just going to have to take it a bit at a time.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-12-22</title><link href="https://mwchase.neocities.org/coding-2022-12-22" rel="alternate"></link><published>2022-12-22T05:00:00-05:00</published><updated>2022-12-22T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-12-22:/coding-2022-12-22</id><summary type="html">&lt;p class="first last"&gt;I just realized I missed some test and plugin code. Oh well, not too important.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;After I thought through those changes yesterday, I decided to prioritize increasing coverage and other improvements for now.&lt;/p&gt;
&lt;p&gt;One of the &amp;quot;other improvements&amp;quot; centers around test execution time.
I hadn't realized it before, but the test execution is not &lt;em&gt;just&lt;/em&gt; taken up by the type tests (which I'll address by splitting the relevant module out into its own set of packages).
There are also tests of the customized &lt;tt class="docutils literal"&gt;Build&lt;/tt&gt; task (which should maybe be called &lt;tt class="docutils literal"&gt;PythonBuild&lt;/tt&gt;?).
These tests take up about half of the execution time, and the type tests take up basically the other half.
I can probably speed up the build tests by mocking the &lt;tt class="docutils literal"&gt;cmd&lt;/tt&gt; module so the &lt;tt class="docutils literal"&gt;Cmd&lt;/tt&gt; class doesn't actually hit the filesystem.
I'll look into that later.&lt;/p&gt;
&lt;p&gt;Coverage misses review:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;parametric_command&lt;/tt&gt; is missing one line.
That line looks like it could be factored out, but I don't think it's worth it.
The required test is to create two &lt;tt class="docutils literal"&gt;ValueAdaptor&lt;/tt&gt; objects with the same &lt;tt class="docutils literal"&gt;Label&lt;/tt&gt;, and put them on the same &lt;tt class="docutils literal"&gt;ParametricCommandMeta&lt;/tt&gt; object, then have a &lt;tt class="docutils literal"&gt;ParametricCommand&lt;/tt&gt; attempt to &lt;tt class="docutils literal"&gt;build()&lt;/tt&gt; given that metadata.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;python_helpers&lt;/tt&gt; is missing one line.
I think this line will be relevant for running coverage.py.
Perhaps the thing to do is to make stub implementations for coverage, and have tests that just import those modules.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;input_accumulator&lt;/tt&gt; is missing one line of coverage, and I'm not comfortable trying to add it until I've audited the relevant names, because the data flow around that line is confusing, and it's more or less my fault.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;flex&lt;/tt&gt; is missing three lines of coverage.
One of them appears to be unnecessary and can probably be deleted.
One of them can probably be deleted with some care.
The remaining line requires a simple dummy test to cover.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;command_builder&lt;/tt&gt; is missing one line, that requires a simple dummy test to cover.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;build&lt;/tt&gt; is missing two lines, which will be much easier to cover if I figure out the mocking I want to use.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;installer&lt;/tt&gt; is missing two lines, which can be tested relatively easily.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;pip&lt;/tt&gt; is missing six lines, of which five can be tested trivially, and one needs a little more thought to test properly.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;parametric&lt;/tt&gt; is missing twelve lines, and probably needs a thorough review to plan tests for them.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;command&lt;/tt&gt; is missing seven lines.
I can reduce or eliminate six of them with some careful rewrites, and the remaining line...
I honestly think it's best to just delete it, because it doesn't really look like it would pull its weight if I &lt;em&gt;did&lt;/em&gt; use it.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;not_output&lt;/tt&gt; is missing four lines, and those lines are easy to cover, but I'd like to consider, later, what it would take to hit those lines in an integrated sense.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;validators&lt;/tt&gt; is missing five lines.
Many of the tests above would hit one of them, and I'm interested in writing tests for the other four, just because it'd be a nasty shock if someone were somehow debugging MOTR interactively, and suddenly something's &lt;tt class="docutils literal"&gt;repr&lt;/tt&gt; was broken.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All right, let's call this here.
I'll be on the road tomorrow, so I don't know if I'll be up for writing any of those tests, but hopefully over the next week...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-12-21</title><link href="https://mwchase.neocities.org/coding-2022-12-21" rel="alternate"></link><published>2022-12-21T05:00:00-05:00</published><updated>2022-12-21T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-12-21:/coding-2022-12-21</id><summary type="html">&lt;p class="first last"&gt;Collating five different sources of information to conclude that what I want to do is &lt;em&gt;probably&lt;/em&gt; easy and fine.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was thinking about working on MOTR, and I realized that, before I do anything else, I want to audit my dependencies to check for urgent updates.
I know Trio has some stuff coming down the pipe that I need to be ready for.
And I can make some improvements to how I'm requiring Cement if I use a newer version.
Here are MOTR's direct dependencies, and notes on them:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;attrs&lt;/tt&gt;: has a new interface that I would like to switch to at some point.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;blessed&lt;/tt&gt;: It looks like nothing breaking is happening. I'll have to revisit it when I look at some issues with the templates.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;cement&lt;/tt&gt;: newer versions provide a nicer way to pull in the following dependencies:&lt;ul&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;colorlog&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;jinja2&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;pyyaml&lt;/tt&gt;: I want to figure out what it takes to drop this dependency, because it's for reading configuration files, and I don't... I'm not... You can't &lt;em&gt;fit&lt;/em&gt; a motrfile in yaml.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;pyrsistent&lt;/tt&gt;: I think I want to cut down on the usage of this slightly, because I'm fairly sure I'm not playing to the strengths of &lt;tt class="docutils literal"&gt;PVector&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;PSet&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;tqdm&lt;/tt&gt;: I have some ideas for trying to make the progress bar a little nicer, but I'm going to hold off on trying them out for now.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;trio&lt;/tt&gt;: Some of the interfaces I'm using are changing, and also there are some interactions with Cement that I want to address.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;virtualenv&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;wheel-filename&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let's have a quick look at the Trio changes.&lt;/p&gt;
&lt;p&gt;The upcoming change is to &lt;tt class="docutils literal"&gt;trio.MultiError&lt;/tt&gt; creation, or lack thereof.
In order to handle everything properly, I need to:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;add &lt;tt class="docutils literal"&gt;strict_exception_groups=True&lt;/tt&gt; to the &lt;tt class="docutils literal"&gt;trio.run&lt;/tt&gt; call&lt;/li&gt;
&lt;li&gt;replace the &lt;tt class="docutils literal"&gt;contextlib.suppress(_exc.MOTRTaskError)&lt;/tt&gt; with, um, &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;exceptiongroup.catch({_exc.MOTRTaskError:&lt;/span&gt; noop})&lt;/tt&gt;, or something?&lt;/li&gt;
&lt;li&gt;Figure out what Cement does when it gets a &lt;tt class="docutils literal"&gt;BaseExceptionGroup&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;Fix any tests that this breaks. Like, can I write catch handlers that will preferentially reraise any error besides the expected one, and reraise the expected error type if there are no others? Is pytest getting changes to handle exception groups? I don't think these off-the-cuff ideas are quite enough...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The other Trio-related change I want to make is to stop telling Cement to handle SIGINT.
This requires getting a small number of changes just right, which shouldn't be &lt;em&gt;hard&lt;/em&gt;, but it took a bunch of effort to verify that this was the case.
And I'm still not totally sure.&lt;/p&gt;
&lt;p&gt;Anyway, I'll look into making those changes later.
For now, I should wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Weekly Roundup 2022-12-20</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-12-20" rel="alternate"></link><published>2022-12-20T05:00:00-05:00</published><updated>2022-12-20T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-12-20:/weekly-roundup-2022-12-20</id><summary type="html">&lt;p class="first last"&gt;Bouncing around, but making progress.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I carefully traced the data flow required to instantiate an environment in MOTR's high-level interface, because it's really not obvious how it all fits together.&lt;/li&gt;
&lt;li&gt;Thursday: With that information at hand, I was able to improve the quality of the new tests in MOTR.&lt;/li&gt;
&lt;li&gt;Friday: I reviewed how some of the code paths I want to test are meant to be invoked, and planned some stuff out.&lt;/li&gt;
&lt;li&gt;Saturday: We watched the MST3K season finale. That was a lot.&lt;/li&gt;
&lt;li&gt;Sunday: I got sidetracked by Jerma's holiday stream(s), so, no normal post.&lt;/li&gt;
&lt;li&gt;Monday: I tossed together the tests, and got MOTR up above 97% coverage. I concluded that the names at the high level really need to change.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to relax for a few days, try to work on MOTR, relax a bit more, then work a bit more.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-12-19</title><link href="https://mwchase.neocities.org/coding-2022-12-19" rel="alternate"></link><published>2022-12-19T05:00:00-05:00</published><updated>2022-12-19T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-12-19:/coding-2022-12-19</id><summary type="html">&lt;p class="first last"&gt;(Before looking at the code.) &amp;quot;I don't understand why it needs this step in the middle.&amp;quot; (After looking at the code.) &amp;quot;I understand why it needs this step in the middle, and I &lt;em&gt;hate&lt;/em&gt; it.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did a bunch of other stuff today, but at long last, I managed to grind out the tests to increase coverage for the &lt;tt class="docutils literal"&gt;flex.py&lt;/tt&gt; module.
In the process, I established that &amp;quot;bundle related arguments together&amp;quot; seems to work fine, but also that a bunch of my names don't get any more intuitive the more I stare at them, so I really need to look into changing them around.&lt;/p&gt;
&lt;p&gt;I guess I'll try to take notes on that starting some time next week.
Anyway, not going to dwell on this stuff right now.
Best get things wrapped up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Diary 2022-12-18</title><link href="https://mwchase.neocities.org/diary-2022-12-18" rel="alternate"></link><published>2022-12-18T05:00:00-05:00</published><updated>2022-12-18T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-12-18:/diary-2022-12-18</id><summary type="html">&lt;p class="first last"&gt;Wasn't expecting to be watching TV for like four hours.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hm, I didn't anticipate how things were going to go in terms of stuff to do today, so I don't have anything much to write about.&lt;/p&gt;
&lt;p&gt;I did do some reorganization in a side project, and messed around in a different side project, but nothing really worth writing about yet.&lt;/p&gt;
&lt;p&gt;I'm going to try to wrap things up for now, and actually get stuff done for MOTR tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Short post"></category></entry><entry><title>Diary 2022-12-17</title><link href="https://mwchase.neocities.org/diary-2022-12-17" rel="alternate"></link><published>2022-12-17T05:00:00-05:00</published><updated>2022-12-17T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-12-17:/diary-2022-12-17</id><summary type="html">&lt;p class="first last"&gt;Why did the fake British accents in this movie sound like Monty Python's fake American accents?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm not sure I can process anything after the MST3K season finale.
That movie was very, very little, until it was so, so much, and then it went back to being nothing.
Like the movie blew its entire &lt;em&gt;emotion&lt;/em&gt; budget on one scene at the end?
Bizarre, on so many levels.&lt;/p&gt;
&lt;p&gt;Anyway, let's see what I'm up for doing tomorrow; I really need to wrap up right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Short post"></category></entry><entry><title>Coding 2022-12-16</title><link href="https://mwchase.neocities.org/coding-2022-12-16" rel="alternate"></link><published>2022-12-16T05:00:00-05:00</published><updated>2022-12-16T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-12-16:/coding-2022-12-16</id><summary type="html">&lt;p class="first last"&gt;Stumbling across my old ideas of what &amp;quot;best practices&amp;quot; might be, that turned out not to pan out.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The next step for increasing test coverage for MOTR, is to refresh my memory.
I see that the next stuff I want to exercise is currently, in existing code, kind of just tossing around &lt;tt class="docutils literal"&gt;FlexIn&lt;/tt&gt; objects in a way that isn't quite satisfying, according to my gut reaction.&lt;/p&gt;
&lt;p&gt;Like, this shouldn't be relevant to the tests, but it feels a little weird to have the same &lt;tt class="docutils literal"&gt;FlexIn&lt;/tt&gt; object appear twice in the expressions going into the command...
Like... the &lt;tt class="docutils literal"&gt;FlexIn&lt;/tt&gt; and its derived &lt;tt class="docutils literal"&gt;LessFlexOut&lt;/tt&gt; should &lt;em&gt;always&lt;/em&gt; be paired, but I guess I don't have enough examples to decide on how to do it generally.
Although, it doesn't have to be general.
It could just as well be a function that returns a &lt;em&gt;sequence&lt;/em&gt; of &lt;tt class="docutils literal"&gt;Part&lt;/tt&gt;s, and I just call it like &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;.add_parts(*func(...))&lt;/span&gt;&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;When I have time to work on the tests, I'll have to experiment with making interfaces like that, and update the existing code if the result is satisfying.&lt;/p&gt;
&lt;p&gt;Anyway, I let things go way too late again, so I have to cut this off here.
I'm not sure I'll get anything done tomorrow, so let's see how the weekend goes.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-12-15</title><link href="https://mwchase.neocities.org/coding-2022-12-15" rel="alternate"></link><published>2022-12-15T05:00:00-05:00</published><updated>2022-12-15T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-12-15:/coding-2022-12-15</id><summary type="html">&lt;p class="first last"&gt;Improving the test revealed that I was missing some key data in the metadata objects I was creating, so it's good I got that out of the way.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I've properly juiced up the test that I wrote.
It turned out to, um, not need the helper functions I wrote, because those make sense in the context of MOTR's python- and pip- related hooks, and when I'm literally faking every part of the commands, it doesn't really make a difference.&lt;/p&gt;
&lt;p&gt;My goal now is to extend this test to run through more elaborate logic, feeding command outputs to inputs in a secondary command, and mapping those inputs back to outputs.
I'm not going to try to do that now; I finished this up a little earlier than usual, and I'd rather take the extra time than extend this work out tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-12-14</title><link href="https://mwchase.neocities.org/coding-2022-12-14" rel="alternate"></link><published>2022-12-14T05:00:00-05:00</published><updated>2022-12-14T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-12-14:/coding-2022-12-14</id><summary type="html">&lt;p class="first last"&gt;My code's not &lt;em&gt;magic&lt;/em&gt;. I just... I needed to verify that...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, let's take a look at MOTR's code...&lt;/p&gt;
&lt;p&gt;My goal here is to trace things back from the flake8 test.
Let's see how this breaks down...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;test_flake8.make_changes&lt;/tt&gt; defines a function called &lt;tt class="docutils literal"&gt;make&lt;/tt&gt;, which takes two arguments: &lt;tt class="docutils literal"&gt;parametric&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;package_data&lt;/tt&gt;.&lt;ul&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;package_data&lt;/tt&gt; is passed into &lt;tt class="docutils literal"&gt;api.cli.build.build&lt;/tt&gt; to return &lt;tt class="docutils literal"&gt;Facts[Objects]&lt;/tt&gt;, and inject information about which Python versions to use for &lt;tt class="docutils literal"&gt;flake8&lt;/tt&gt;.
The &lt;tt class="docutils literal"&gt;package_data&lt;/tt&gt; comes from &lt;tt class="docutils literal"&gt;api.package.combine_packages&lt;/tt&gt;.
This is a &lt;tt class="docutils literal"&gt;PythonPackages&lt;/tt&gt; object, and the relevant behavior partially lives in the constants defined in that package, and partly in &lt;tt class="docutils literal"&gt;api.cli.build.build()&lt;/tt&gt;, which puts the necessary values under the necessary keys.
&lt;strong&gt;TODO:&lt;/strong&gt; make a helper function in &lt;tt class="docutils literal"&gt;package&lt;/tt&gt; for carrying out the changes, rather than having them done in the return statement of &lt;tt class="docutils literal"&gt;api.cli.build.build()&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;parametric&lt;/tt&gt; pulls in the information from the modified &lt;tt class="docutils literal"&gt;Objects&lt;/tt&gt;, and the argument further down is from &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;api.cli.flake8.BASE.add_parts(...).build()&lt;/span&gt;&lt;/tt&gt;.
This &lt;tt class="docutils literal"&gt;add_parts()&lt;/tt&gt; return value is a &lt;tt class="docutils literal"&gt;ParametricCommand&lt;/tt&gt;.
Its &lt;tt class="docutils literal"&gt;build()&lt;/tt&gt; method calls the &lt;tt class="docutils literal"&gt;command_builder.CommandBuilder.facts()&lt;/tt&gt; method from the &lt;tt class="docutils literal"&gt;_build()&lt;/tt&gt; method, which is really complicated, but I think the important thing is the &lt;tt class="docutils literal"&gt;ParametricCommandMeta&lt;/tt&gt; that had &lt;tt class="docutils literal"&gt;with_adaptor()&lt;/tt&gt; called on it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Okay, I'm lost again.
Let's check out the &lt;tt class="docutils literal"&gt;facts()&lt;/tt&gt; method?
Oh, wow, my names for these things got &lt;em&gt;janked&lt;/em&gt;.
Basically, at some point, parametric information about how to construct the specific strain of environment required for the operation is injected into the &lt;tt class="docutils literal"&gt;ParametricCommand&lt;/tt&gt; via &lt;tt class="docutils literal"&gt;with_adaptor()&lt;/tt&gt;, and the &lt;tt class="docutils literal"&gt;build()&lt;/tt&gt; method on that object retrieves it, and passes it to &lt;tt class="docutils literal"&gt;facts()&lt;/tt&gt;, which combines it with the &lt;tt class="docutils literal"&gt;installer_registry&lt;/tt&gt; data to pass it to &lt;tt class="docutils literal"&gt;installer.install()&lt;/tt&gt;.
The &lt;tt class="docutils literal"&gt;installer_registry&lt;/tt&gt; is on the &lt;tt class="docutils literal"&gt;command.Metadata&lt;/tt&gt;, and is, in these specific cases, populated from the &lt;tt class="docutils literal"&gt;PythonCmd&lt;/tt&gt; helper.&lt;/p&gt;
&lt;p&gt;So, for a synthetic version to work, I need to create a &lt;tt class="docutils literal"&gt;command.Metadata&lt;/tt&gt; that has the desired installer data stored under a known key.
In addition, I need a versions adaptor wrapped around a known key, which needs to be explicitly passed in, associated with a &lt;tt class="docutils literal"&gt;PVector[installer.PathWith[EnvironmentArgs]]&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;I apologize for how completely and thoroughly opaque that was, but I needed to go over this really thoroughly in order to remind myself where everything actually gets instantiated.&lt;/p&gt;
&lt;p&gt;Maybe tomorrow, I can actually do something with all of this.
For now, I'm done.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Weekly Roundup 2022-12-13</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-12-13" rel="alternate"></link><published>2022-12-13T05:00:00-05:00</published><updated>2022-12-13T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-12-13:/weekly-roundup-2022-12-13</id><summary type="html">&lt;p class="first last"&gt;This is one of the things that you know it's good for you because it's unpleasant.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I tried to figure out the proper interface for a test helper function.&lt;/li&gt;
&lt;li&gt;Thursday: I got the proper interface, by splitting the function in two. I also made a slight organizational change to the tests directory.&lt;/li&gt;
&lt;li&gt;Friday: I confirmed that the helper functions worked, and cleaned up &lt;tt class="docutils literal"&gt;conftest.py&lt;/tt&gt; a little.&lt;/li&gt;
&lt;li&gt;Saturday: I realized that I've forgotten how (and &lt;em&gt;whether&lt;/em&gt;) the various interfaces required for using a high-level wrapper around a Python script actually get invoked.&lt;/li&gt;
&lt;li&gt;Sunday: Travel out. Fried.&lt;/li&gt;
&lt;li&gt;Monday: Travel back. Fried.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to &lt;em&gt;very methodically&lt;/em&gt; document the flow of data through my tests, so I can figure out how this code is currently &amp;quot;supposed to be written&amp;quot;, and whether I want to change that.
And other stuff.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="more travel..."></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Diary 2022-12-12</title><link href="https://mwchase.neocities.org/diary-2022-12-12" rel="alternate"></link><published>2022-12-12T05:00:00-05:00</published><updated>2022-12-12T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-12-12:/diary-2022-12-12</id><summary type="html">&lt;p class="first last"&gt;On the road again, again, again, again...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, we traveled again today, so I just didn't plan to do much to write about.
My plan for the coming week is to nail down whether and how the current high-level tests for MOTR are creating correct &lt;tt class="docutils literal"&gt;Compendium&lt;/tt&gt; objects, and to pick up some side stuff that I got unblocked on a technical level yesterday.&lt;/p&gt;
&lt;p&gt;For now, I'm going to wind down and get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Short post"></category></entry><entry><title>Diary 2022-12-11</title><link href="https://mwchase.neocities.org/diary-2022-12-11" rel="alternate"></link><published>2022-12-11T05:00:00-05:00</published><updated>2022-12-11T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-12-11:/diary-2022-12-11</id><summary type="html">&lt;p class="first last"&gt;One step forward, two steps back...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;We traveled today, and I spaced out.&lt;/p&gt;
&lt;p&gt;On the plus side, I did manage to finally fix some abstruse technical issues in a side project, so now I can get back to working on that.&lt;/p&gt;
&lt;p&gt;Besides that, I've been working on the latest puzzle hunt from the Cracking the Cryptic patreon.
I've &lt;em&gt;sort of&lt;/em&gt; solved it.
I've got the last puzzle solved, but I keep messing up the second-to-last puzzle, which is supposed to be a prerequisite for the last puzzle.
I should hopefully get things done reasonably within a week.
Anyway, I let things go way too late and I desperately need to wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Short post"></category></entry><entry><title>Coding 2022-12-10</title><link href="https://mwchase.neocities.org/coding-2022-12-10" rel="alternate"></link><published>2022-12-10T05:00:00-05:00</published><updated>2022-12-10T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-12-10:/coding-2022-12-10</id><summary type="html">&lt;p class="first last"&gt;Expert on relevant code shrugs and says &amp;quot;lol i dunno&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, let's see &lt;em&gt;what I was doing&lt;/em&gt; with these high levels of abstractions...&lt;/p&gt;
&lt;p&gt;The &amp;quot;pattern&amp;quot; for interacting with with the code seems to be as follows:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Given the label associated with the versions, also have a &lt;tt class="docutils literal"&gt;PVector[PathWith[EnvironmentArgs]]&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Also, construct a &lt;tt class="docutils literal"&gt;Parametric[Objects]&lt;/tt&gt; that contains the proper data to run the commands, which is...
um...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Okay, so this all made sense at the time.
I think.
I've got a fake &lt;tt class="docutils literal"&gt;Executable&lt;/tt&gt; which contains a label, which needs to be used as an index in the &lt;em&gt;installer&lt;/em&gt; registry...&lt;/p&gt;
&lt;p&gt;You can tell this code isn't ready for anyone else to use, because it kind of seems like it's not ready for &lt;em&gt;me&lt;/em&gt; to use it...&lt;/p&gt;
&lt;p&gt;Okay, here's the plan.
I'm going to take things easy this weekend.
Maybe work on something else.
Then next week, I'm going to document the data flow very, &lt;em&gt;very&lt;/em&gt; carefully, and take notes on any names that could be different, because the fact that so many of these names lack any semantic content doesn't &lt;em&gt;help&lt;/em&gt; anything.
For now, I need to rest up and get ready to travel.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-12-09</title><link href="https://mwchase.neocities.org/coding-2022-12-09" rel="alternate"></link><published>2022-12-09T05:00:00-05:00</published><updated>2022-12-09T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-12-09:/coding-2022-12-09</id><summary type="html">&lt;p class="first last"&gt;I appreciate that the code was simple enough that it all worked on the first try (modulo errors at the &lt;em&gt;usage site&lt;/em&gt; that had nothing to do with the way I wrote the code)&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The new test helper code I added is in good shape now.
Running &lt;tt class="docutils literal"&gt;motr&lt;/tt&gt; on itself results in everything being good except for missing about 50 lines of coverage, out of 2360.&lt;/p&gt;
&lt;p&gt;I wired the new helper functions into some existing tests, and the result is... I don't feel strongly, but I'm not changing it back.
Now, I just need to look over those old tests, and figure out what I need to get the new tests to exercise more code paths.
Basically, to take the existing tests, and copy their logic.
This may end up requiring some of the code that I removed in revision 672 because the current low-power tests didn't need it.
Which is exactly why I made sure to have a separate commit removing it; this way it's easy to bring it back.&lt;/p&gt;
&lt;p&gt;Anyway, that's what I'll try to work on the next chance I have, which, I don't know for sure when that's going to be, but whatever.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-12-08</title><link href="https://mwchase.neocities.org/coding-2022-12-08" rel="alternate"></link><published>2022-12-08T05:00:00-05:00</published><updated>2022-12-08T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-12-08:/coding-2022-12-08</id><summary type="html">&lt;p class="first last"&gt;Just a little bit at a time, just a little bit at a time...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I managed my time poorly once again, so here's what I dashed out quickly, and then I'm going to publish:&lt;/p&gt;
&lt;p&gt;I added a &lt;tt class="docutils literal"&gt;__init__.py&lt;/tt&gt; file to the tests directory so I can do a relative import of the helpers module I just added.
Maybe I'll reorder that a little later, but there's no time right now.
Inside the helper file, I put two functions.
One takes a &lt;tt class="docutils literal"&gt;Facts[Objects]&lt;/tt&gt; and an &lt;tt class="docutils literal"&gt;Objects&lt;/tt&gt;, and calls &lt;tt class="docutils literal"&gt;.update()&lt;/tt&gt; on the &lt;tt class="docutils literal"&gt;Objects&lt;/tt&gt; that it gets from the &lt;tt class="docutils literal"&gt;Facts[Objects]&lt;/tt&gt;, with the other &lt;tt class="docutils literal"&gt;Objects&lt;/tt&gt; that was passed.
The other function takes a &lt;tt class="docutils literal"&gt;Facts[Objects]&lt;/tt&gt; and any number of &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt; arguments.
It extracts the &lt;tt class="docutils literal"&gt;Objects&lt;/tt&gt; from the &lt;tt class="docutils literal"&gt;Facts[Objects]&lt;/tt&gt;, then calls &lt;tt class="docutils literal"&gt;.facts()&lt;/tt&gt; on each &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt; that was passed in.&lt;/p&gt;
&lt;p&gt;Together, these sidestep the API design issues I was having by having two smaller functions that do less each than the one large function I was visualizing, and are less awkward to lay out the parameters for, thanks to the level of nesting this adds.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Anyway&lt;/em&gt;, I'll actually have a chance to try this stuff out later.
For now, I just wanted it put together and ready to think about.
No more writing for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2022-12-07</title><link href="https://mwchase.neocities.org/coding-2022-12-07" rel="alternate"></link><published>2022-12-07T05:00:00-05:00</published><updated>2022-12-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-12-07:/coding-2022-12-07</id><summary type="html">&lt;p class="first last"&gt;Not sure what &amp;quot;a good interface&amp;quot; even looks like in this context.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I ended up spacing out and it's late, so here are some quick notes about the helper functions I want to consolidate:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;There is an initial call that produces a &lt;tt class="docutils literal"&gt;Facts[Objects]&lt;/tt&gt;, followed by merging a limited amount of data into the &lt;tt class="docutils literal"&gt;Objects&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Then, for each &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt; passed in, just yield from the &lt;tt class="docutils literal"&gt;Facts&lt;/tt&gt;, given the &lt;tt class="docutils literal"&gt;Objects&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;I was interested in verifying the &lt;tt class="docutils literal"&gt;Objects&lt;/tt&gt; against the stated requirements of the &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt;s.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm not sure how much caching I want to do.
I guess, on reflection, I could get away with making this a helper function, but it's a little tricky to visualize the right interface.
Like, is &lt;tt class="docutils literal"&gt;def __call__(self, facts: Facts[Objects], overrides: Objects, *parametrics: Parametric[object]) &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; Facts[None]:&lt;/tt&gt; reasonable?
I'll need to think about it.&lt;/p&gt;
&lt;p&gt;For now, I'll get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Weekly Roundup 2022-12-06</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-12-06" rel="alternate"></link><published>2022-12-06T05:00:00-05:00</published><updated>2022-12-06T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-12-06:/weekly-roundup-2022-12-06</id><summary type="html">&lt;p class="first last"&gt;It's nice to finally be in a mood to increase the coverage.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I wrote down the apparent requirements to make a fake program module in MOTR.&lt;/li&gt;
&lt;li&gt;Thursday: I implemented most of those requirements, except for the last one.&lt;/li&gt;
&lt;li&gt;Friday: I put together something that may or may not implement the final requirement.&lt;/li&gt;
&lt;li&gt;Saturday: We watched Species.&lt;/li&gt;
&lt;li&gt;Sunday: I started planning tests for the uncovered code.&lt;/li&gt;
&lt;li&gt;Monday: I added the most basic of coverage, and immediately found a bug.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to improve the quality of the new test in MOTR, and tighten up existing tests.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-12-05</title><link href="https://mwchase.neocities.org/coding-2022-12-05" rel="alternate"></link><published>2022-12-05T05:00:00-05:00</published><updated>2022-12-05T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-12-05:/coding-2022-12-05</id><summary type="html">&lt;p class="first last"&gt;Maybe there's some kind of sampling bias, because the &amp;quot;obviously correct&amp;quot; code is usually easy to cover, so if I haven't covered a function completely, it's probably doing &lt;em&gt;something&lt;/em&gt; horrible. Even if that's the case, I, um, don't care.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I added a small amount of code coverage today, and it immediately revealed a bug that had eluded all other checks.
This has happened a bunch before.
Whenever I write tests for some squirrelly bit of code, it seems to always turn out it was accidentally making bad type assumptions, or has a critical bit of logic inverted, or whatever.&lt;/p&gt;
&lt;p&gt;I've read stuff online talking about how full code coverage isn't valuable, but I'd really rather exercise these weird code paths before I ship something.
Maybe other people can write this kind of code with no bugs.
If so, good for them, and when they're working on their code bases, they're free to apply standards to their work that match up with that track record.
For my hobby projects, I'll be applying standards that apply to my track record with these hobby projects, and that means 100% coverage as table stakes.&lt;/p&gt;
&lt;p&gt;Now, as it turns out, the test I wrote, that one that found the bug that I had to fix, is actually kind of on the weak side of things, and I'm going to need to extend things in several ways, some of which will increase coverage, and some of which won't, at least outside of the sense of &amp;quot;tests should have 100% coverage, so adding a new test should move the coverage percentage closer to 100%&amp;quot;.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I need to test the &lt;tt class="docutils literal"&gt;EnvVar&lt;/tt&gt;-related code paths for the other &lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt; implementations besides &lt;tt class="docutils literal"&gt;FlexOut&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;I need to generate a proper &lt;tt class="docutils literal"&gt;Compendium&lt;/tt&gt; from test data.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I may prioritize the latter, just because it'll make existing and new tests much stronger.&lt;/p&gt;
&lt;p&gt;Actually, that's a good thing for me to consider while I work on the tests: should it always be the case that a valid &lt;tt class="docutils literal"&gt;ParametricCommand&lt;/tt&gt;'s &lt;tt class="docutils literal"&gt;build()&lt;/tt&gt; method should produce a &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt; that, when passed all required (and possibly some additional, unnecessary) data to its &lt;tt class="docutils literal"&gt;facts()&lt;/tt&gt; method, produces a &lt;tt class="docutils literal"&gt;Facts&lt;/tt&gt; that, when passed to &lt;tt class="docutils literal"&gt;api.build()&lt;/tt&gt;, produces a &lt;tt class="docutils literal"&gt;Compendium&lt;/tt&gt; without erroring on any step?
I &lt;em&gt;think&lt;/em&gt; that's a reasonable correctness criterion, so, either later tonight, or sometime next week, I'll see about writing a helper to handle that.&lt;/p&gt;
&lt;p&gt;The helper would have to do stuff like validate that all necessary data is passed, because right now, the code doesn't really establish that.
(It would also need to precompute some of the facts to actually get that far, but, um, oh well.)&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to wrap this up and post it a little early, so I can relax later tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-12-04</title><link href="https://mwchase.neocities.org/coding-2022-12-04" rel="alternate"></link><published>2022-12-04T05:00:00-05:00</published><updated>2022-12-04T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-12-04:/coding-2022-12-04</id><summary type="html">&lt;p class="first last"&gt;Just a little bit at a time, and it adds up.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, it turns out I was taking things easy again today, so let's see about the kinds of things I need to be able to run the tests I want to write.
Starting with the attempts to just exercise the code.&lt;/p&gt;
&lt;p&gt;I need to create a label object, and from there, the first thing I want is to create something like &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;parametric_command.EnvVar(flex.FlexOut(reports.accumulator(suffix=&amp;quot;test.txt&amp;quot;),&lt;/span&gt; lambda x: x, &lt;span class="pre"&gt;parametric.no_parameters(()),&lt;/span&gt; label), &amp;quot;TEST_VAR&amp;quot;)&lt;/tt&gt;.
Let's see if it likes having that code in there, not executed yet.&lt;/p&gt;
&lt;p&gt;I could try to adapt the existing tests into versions that interact with this new stub code, but I don't feel like pushing myself further right now, and I'm going to hold on to feeling satisfied with the amount of work that I happen to have done at any given time.&lt;/p&gt;
&lt;p&gt;So, I'm done for now, and we'll see what I manage tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Diary 2022-12-03</title><link href="https://mwchase.neocities.org/diary-2022-12-03" rel="alternate"></link><published>2022-12-03T05:00:00-05:00</published><updated>2022-12-03T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-12-03:/diary-2022-12-03</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;What if humans are the real monsters?&amp;quot; (Narrator: &amp;quot;Actually, monsters were the real monsters.&amp;quot;)&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I didn't get anything done today that I want to write about.
We saw a movie.
It was silly.&lt;/p&gt;
&lt;p&gt;I'm spacing out, and I don't have anything else to say.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Short post"></category></entry><entry><title>Coding 2022-12-02</title><link href="https://mwchase.neocities.org/coding-2022-12-02" rel="alternate"></link><published>2022-12-02T05:00:00-05:00</published><updated>2022-12-02T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-12-02:/coding-2022-12-02</id><summary type="html">&lt;p class="first last"&gt;It looks really complicated, but actually it can be very simple, unless I'm badly mistaken and it has to be extremely complicated.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, I might have been kind of out of it again today.
The air is really harsh and makes it hard to breathe and stuff like that.
Anyway, let's crack open my... unreleased legacy code?&lt;/p&gt;
&lt;p&gt;The core question here is, what do the first two arguments to &lt;tt class="docutils literal"&gt;CommandBuilder&lt;/tt&gt; need to be?
The first argument is an &lt;tt class="docutils literal"&gt;Executable&lt;/tt&gt;, which includes a script name.
The second argument is a &lt;tt class="docutils literal"&gt;command.Metadata&lt;/tt&gt;, and it is &lt;em&gt;optional&lt;/em&gt;, so I might be able to get away with not passing anything.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Sadly, maybe not.
The existing examples pass installer information in the &lt;tt class="docutils literal"&gt;Metadata&lt;/tt&gt; instance, which...
Wait...
They're only passing that because the pip command has to actually accomplish something.
The installer information doesn't establish any task dependency relationships, so it should be safe to leave the installer be.
So, let's see what I think will work...&lt;/p&gt;
&lt;p&gt;Okay, I have some syntactically valid Python code here.
The goal now is to exercise unused code paths in my new wrapper code, and &lt;em&gt;hopefully&lt;/em&gt; figure out the correctness criteria for writing the tests, because I confused myself badly the last time I tried to work that out.&lt;/p&gt;
&lt;p&gt;I think the fundamental goal is: no matter what combination of parametric labels and parametric combinators, I'm never trying to put two different values into the same environment variable.&lt;/p&gt;
&lt;p&gt;Anyway, we'll see when I'm able to put all of that together.
For now, I'm going to wind down again.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-12-01</title><link href="https://mwchase.neocities.org/coding-2022-12-01" rel="alternate"></link><published>2022-12-01T05:00:00-05:00</published><updated>2022-12-01T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-12-01:/coding-2022-12-01</id><summary type="html">&lt;p class="first last"&gt;Maybe I should re-evaluate the names before I work on the coverage? I don't know...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't really focus on MOTR today, so I'm going to try to make some quick work around what I worked out yesterday.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;All right, that's enough for now.
I've gotten nearly everything I wrote up yesterday sketched out, and what remains is... unintuitive.
There's a bunch of ... stuff ... that the wrappers I've written up all use, but the helper code is ostensibly Python-specific.
So, what I need to do is, when I'm feeling better and more focused, is to re-work-out the types and values involved in constructing the arguments to these functions.&lt;/p&gt;
&lt;p&gt;For now, I'm going to wind down again.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-11-30</title><link href="https://mwchase.neocities.org/coding-2022-11-30" rel="alternate"></link><published>2022-11-30T05:00:00-05:00</published><updated>2022-11-30T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-11-30:/coding-2022-11-30</id><summary type="html">&lt;p class="first last"&gt;The bad names are still bad.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, it's late, and I'm trying to get up to speed with how I put things together in MOTR's wrappers.
I'm going to list the stuff that looks necessary to see if it gets everything I need to know, into my head.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;A subclass of &lt;tt class="docutils literal"&gt;Program&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;An &lt;tt class="docutils literal"&gt;adaptor&lt;/tt&gt; around a &lt;tt class="docutils literal"&gt;ParameterLabel[PathWith[SomeEnvironmentArgs]]&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;A &lt;tt class="docutils literal"&gt;Label[PathWith[SomeInstallerArgs]]&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Specify the type of entry point.&lt;/li&gt;
&lt;li&gt;An alias to &lt;tt class="docutils literal"&gt;CommandBuilder[EntryType, ProgramSubclass, SomeInstallerArgs]&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;An alias to &lt;tt class="docutils literal"&gt;OptionBuilder[ProgramSubclass]&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;An executable wrapper around the installer args label, the command name, and an instance of the entry point type.&lt;/li&gt;
&lt;li&gt;The final absolutely-required bit is kind of hard to describe; it pulls together most of the above.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Things I'm noticing:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;There are some names that I didn't update yet.&lt;/li&gt;
&lt;li&gt;Others of the names don't yet have something to update to, but they need to be changed. There are a lot of methods that are (obliquely) named after internal concepts, and it's not obvious from these names why you'd want to ever call the methods.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tomorrow, I'm either going to try to fill in dummy versions of that stuff in the test code, or do something else entirely.
We'll see then.
For now...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Weekly Roundup 2022-11-29</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-11-29" rel="alternate"></link><published>2022-11-29T05:00:00-05:00</published><updated>2022-11-29T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-11-29:/weekly-roundup-2022-11-29</id><summary type="html">&lt;p class="first last"&gt;I think this went pretty well for this time of year. I will not check to confirm.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I didn't get much done because we were on the road.&lt;/li&gt;
&lt;li&gt;Thursday: I roughed out some code that I'm really not sure whether it would have worked.&lt;/li&gt;
&lt;li&gt;Friday: I figured out that there were other issues with the code, unrelated to whether it would actually work, so I scaled back my changes. I started updating the code base...&lt;/li&gt;
&lt;li&gt;Saturday: ...and finished up those updates, had a slightly tricky merge, then started planning where to go next.&lt;/li&gt;
&lt;li&gt;Sunday: I started working on those plans, and quickly realized that I'm going to need to rework the public interface of MOTR to make more sense.&lt;/li&gt;
&lt;li&gt;Monday: I didn't get much done because we were on the road.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I want to consider making a few more changes to MOTR's code, but maybe I'll just move ahead with writing the tests.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Travel"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Diary 2022-11-28</title><link href="https://mwchase.neocities.org/diary-2022-11-28" rel="alternate"></link><published>2022-11-28T05:00:00-05:00</published><updated>2022-11-28T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-11-28:/diary-2022-11-28</id><summary type="html">&lt;p class="first last"&gt;On the road again again.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;We traveled some more today, so I'm not going to try to spin things up for MOTR.&lt;/p&gt;
&lt;p&gt;What happened today...
We watched the Roger Corman &lt;em&gt;House of Usher&lt;/em&gt;.
It was pretty good, especially by the standards of Roger Corman Poe movies.&lt;/p&gt;
&lt;p&gt;Let's see...
Nothing else to report.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Short post"></category></entry><entry><title>Coding 2022-11-27</title><link href="https://mwchase.neocities.org/coding-2022-11-27" rel="alternate"></link><published>2022-11-27T05:00:00-05:00</published><updated>2022-11-27T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-11-27:/coding-2022-11-27</id><summary type="html">&lt;p class="first last"&gt;It'd be cool if this were obvious &lt;em&gt;a priori&lt;/em&gt;, but &lt;em&gt;a posteriori&lt;/em&gt; is better than nothing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I started putting together dummy instances of the various protocols that need to be implemented for a new MOTR... um... middle-end?
There are two directions to go from here:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Let's see what's absolutely necessary from looking at the existing modules for wrapping third-party utilities.&lt;/li&gt;
&lt;li&gt;If it's a little inconvenient and fiddly for me to implement this stuff in an internal testing library, it'll be so much worse for hypothetical third-party maintainers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, I'm not imagining that anyone else is going to want to use MOTR—certainly not in its current state, and, in terms of simple probability, probably not after I've tried to polish it up some—but the &lt;em&gt;entire point&lt;/em&gt; of MOTR is for me to get deep into its guts for the past few years or whatever, so I can avoid going to the same effort for other projects.&lt;/p&gt;
&lt;p&gt;A quick review of the general user profiles:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Someone who doesn't care about any of the internals; some other project is using MOTR, and they rely on the maintainer to work out how it should all fit together, and document any quirks of usage.&lt;/li&gt;
&lt;li&gt;A project maintainer, who should be able to write a concise motrfile from built-in and third-party wrappers, which provide well-defined extension points for things like plugin arguments.&lt;/li&gt;
&lt;li&gt;A wrapper developer, who should be able to write straightforward wrappers around third-party utilities.
(The current state of the wrappers shows the &amp;quot;straightforward&amp;quot; part to be, um, &lt;em&gt;deeply&lt;/em&gt; aspirational.)&lt;/li&gt;
&lt;li&gt;Me, who is secretly all of the others as well.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The problem with the current &lt;tt class="docutils literal"&gt;api&lt;/tt&gt; module is that it's approximately the motrfile helper code that you need if the wrapper code &lt;em&gt;does not exist&lt;/em&gt;, which it didn't at the time, but now it does.
Mostly.&lt;/p&gt;
&lt;p&gt;Anyway, I think in order to move forward, I'm going to want some kind of separate modules for the two use cases.
Ideally, the built-in wrappers can simply use the module for third-party wrappers.&lt;/p&gt;
&lt;p&gt;Something like...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Here is a module that allows you to define environments and installers&lt;/li&gt;
&lt;li&gt;Here is a module that allows you to write wrappers around Python scripts&lt;/li&gt;
&lt;li&gt;Here is a module that allows you to write a motrfile using wrappers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And the existing monolithic folder that contains basically all of that needs to be split up.&lt;/p&gt;
&lt;p&gt;I'll look into that after I've gotten coverage properly up.
For now, I want to finish this entry &lt;em&gt;before&lt;/em&gt; it gets really late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-11-26</title><link href="https://mwchase.neocities.org/coding-2022-11-26" rel="alternate"></link><published>2022-11-26T05:00:00-05:00</published><updated>2022-11-26T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-11-26:/coding-2022-11-26</id><summary type="html">&lt;p class="first last"&gt;It's really gratifying that there weren't problems where there weren't supposed to be problems.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I got some solid work in on MOTR today.
I finished up the typing issues, fixed some minor formatting issues, and had no test issues, which is a good sign, because I shouldn't have been changing any behavior.&lt;/p&gt;
&lt;p&gt;There were some issues with the merges.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The first merge had the issue that it was not a merge, because I hadn't diverged from an ancestor, so instead I had to, from the changed topic, mark the current topic as the ancestor topic, and add an empty commit.
I feel like there should be a better way to do that, in terms of ergonomics, and there probably is; I just didn't ask.&lt;/li&gt;
&lt;li&gt;The second merge was more of a straightforward &amp;quot;there are pervasive changes in the code that are right next to each other, and the diff algorithm decided to be cautious&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, now I'm feeling good to add tests around this code, now that the types for it make a bit more sense.
To review what I need to start with:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;InstallerArgs&lt;/tt&gt; instance&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;EnvironmentArgs&lt;/tt&gt; instance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are some other things, but I don't want to think too hard right now.
Once I've had some more sleep, I can review the relevant code, now that I've messed with it, and figure out the right way to access the relevant classes and functions.&lt;/p&gt;
&lt;p&gt;For now, I need to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-11-25</title><link href="https://mwchase.neocities.org/coding-2022-11-25" rel="alternate"></link><published>2022-11-25T05:00:00-05:00</published><updated>2022-11-25T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-11-25:/coding-2022-11-25</id><summary type="html">&lt;p class="first last"&gt;Discarding ideas that didn't quite work. Maybe I'll be able to re-satisfy their purpose, if I can show that I need to.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I wasn't able to focus all that well today, and I'm going to blame Thanksgiving for that.
Now, let's see what I've got...&lt;/p&gt;
&lt;p&gt;I thought some about that snippet I posted yesterday, and tried to fix it up a bit.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MultiInstaller&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Protocol&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;TInstaller_contra&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__call__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MultiInstaller&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;TInstaller&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;__key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;TInstaller&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;TInstaller&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;All right, let's see what it takes to make this happen...&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Well, I'm trying to do sensible things here, but there are limits.
I'm not totally sure if this is all going to work, but if it does, I'm going to need to rethink some of my decisions.&lt;/p&gt;
&lt;p&gt;Either I need to rethink my earlier decisions, or I need to rein in the scope of my changes, which is... not a huge problem, because that means deleting a bunch of code that I don't trust.
Actually, let's try reining stuff in now...&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Changes are rippling outward.
Either this will end up completely unworkable, or it will be poised to make a lot more sense.
We'll see...&lt;/p&gt;
&lt;p&gt;Anyway, it's too late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-11-24</title><link href="https://mwchase.neocities.org/coding-2022-11-24" rel="alternate"></link><published>2022-11-24T05:00:00-05:00</published><updated>2022-11-24T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-11-24:/coding-2022-11-24</id><summary type="html">&lt;p class="first last"&gt;What does this code do? Breaks everything, probably.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So my focus today was... bad.&lt;/p&gt;
&lt;p&gt;Let's see what I can do for MOTR, quickly.&lt;/p&gt;
&lt;p&gt;So, I took some notes earlier, and there's one idea that they just kind of glossed over, and there's a chance the quick-and-easy implementation of this idea would not work...&lt;/p&gt;
&lt;p&gt;Basically, I want a typed mapping &lt;tt class="docutils literal"&gt;Protocol&lt;/tt&gt; argument that looks something like&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MultiInstaller&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Protocol&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;TInstaller_contra&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__call__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MultiInstaller&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;TInstaller&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;__key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;TInstaller&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Installer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;TInstaller&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This code is pretty fiddly, even if you ignore the fact that it needs weird plugins to work with Mypy.
My major task in the coming days is to evaluate whether that code would actually work; it doesn't quite fit with the other usages of &lt;tt class="docutils literal"&gt;TypedMapping&lt;/tt&gt;, and it could be just different enough to fail typechecking.&lt;/p&gt;
&lt;p&gt;If that doesn't work, I'm going to need to work out some of the &lt;tt class="docutils literal"&gt;TypedMapping&lt;/tt&gt;-like stuff that I want from scratch.&lt;/p&gt;
&lt;p&gt;It's kind of a pain, but if I can get this to work, it will make some of the new code both more robust and powerful, and easier to understand, in an area that sorely needs robustness and comprehensibility.&lt;/p&gt;
&lt;p&gt;Anyway, it's way late and I need to wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Diary 2022-11-23</title><link href="https://mwchase.neocities.org/diary-2022-11-23" rel="alternate"></link><published>2022-11-23T05:00:00-05:00</published><updated>2022-11-23T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-11-23:/diary-2022-11-23</id><summary type="html">&lt;p class="first last"&gt;On the road &lt;em&gt;again&lt;/em&gt;...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;We traveled &lt;em&gt;more&lt;/em&gt; today, and so I'm kind of out of it.
On the plus side, I've got some experimental changes to MOTR planned that should address some of the misgivings I have about the current versions of the type hints.
Hopefully, I'll be up for trying them out in a side topic tomorrow.&lt;/p&gt;
&lt;p&gt;Anyway, I shouldn't be procrastinating like I am, so this post is getting the short end of things, as it were.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Short post"></category></entry><entry><title>Weekly Roundup 2022-11-22</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-11-22" rel="alternate"></link><published>2022-11-22T05:00:00-05:00</published><updated>2022-11-22T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-11-22:/weekly-roundup-2022-11-22</id><summary type="html">&lt;p class="first last"&gt;So close to making test improvements! How exciting!&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I made some obvious improvements to MOTR's code.&lt;/li&gt;
&lt;li&gt;Thursday: I started to refresh my memory on how some of MOTR's new code holds together. I came up with some unfortunately-complicated ideas about how to make certain areas of the code reusable.&lt;/li&gt;
&lt;li&gt;Friday: I came up with some much less complicated ideas, that should suffice for now.&lt;/li&gt;
&lt;li&gt;Saturday: After focusing on the improvements side of things, I decided to take a look at the uncovered code in MOTR. In my experience, such code is suspect, because it tends to be the case that I'm not &lt;em&gt;manually&lt;/em&gt; exercising uncovered code. Sadly, this part of the code is very elaborate and hard for me to follow without walking myself back through things.&lt;/li&gt;
&lt;li&gt;Sunday: I started planning out how to write tests for specific areas of uncovered code.&lt;/li&gt;
&lt;li&gt;Monday: I was not up for working on this stuff, so I tried to take things as easy as I could manage, which is... eh, not very, when I only think to check how I'm doing at the end of the day.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to be traveling some for the holidays, but hopefully I'll get some time to actually touch the code.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="MOTR"></category><category term="Python"></category></entry><entry><title>Diary 2022-11-21</title><link href="https://mwchase.neocities.org/diary-2022-11-21" rel="alternate"></link><published>2022-11-21T05:00:00-05:00</published><updated>2022-11-21T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-11-21:/diary-2022-11-21</id><summary type="html">&lt;p class="first last"&gt;Sometimes life messes with you in tiny, insignificant ways that still add up.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I could start on the work I set myself for improving MOTR's tests, but I don't feel like it currently.
I've got a headache right now, and I just want to lie down and shut out the world for a bit.&lt;/p&gt;
&lt;p&gt;I sat around for a bit to see if I'd think of something else to write, and I did not, so I'm going to stop pushing myself for tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Short post"></category></entry><entry><title>Coding 2022-11-20</title><link href="https://mwchase.neocities.org/coding-2022-11-20" rel="alternate"></link><published>2022-11-20T05:00:00-05:00</published><updated>2022-11-20T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-11-20:/coding-2022-11-20</id><summary type="html">&lt;p class="first last"&gt;It would be cool if I could &lt;em&gt;remember&lt;/em&gt; that this is how stuff works, but oh well.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Unfortunately, I didn't get started until late today.
Fortunately, I have a bit of time.
So, I'm going to try to lay out what I need to make a &lt;tt class="docutils literal"&gt;ParametricCommand&lt;/tt&gt; where I don't need to think about how the pip-related stuff works.&lt;/p&gt;
&lt;p&gt;The basic &lt;tt class="docutils literal"&gt;ParametricCommand&lt;/tt&gt; comes from calling &lt;tt class="docutils literal"&gt;ParametricCommandMeta.with_adaptor()&lt;/tt&gt;.
The argument is a &lt;tt class="docutils literal"&gt;ValueAdaptor[PathWith[EnvironmentArgs]]&lt;/tt&gt;.
The calling object is a &lt;tt class="docutils literal"&gt;ParametricCommandMeta[TEntry, TProgram, TInstallerArgs]&lt;/tt&gt;.
So, to make a version of this with test hooks, I need to pick an &lt;tt class="docutils literal"&gt;Entry&lt;/tt&gt; type, subclass &lt;tt class="docutils literal"&gt;Program&lt;/tt&gt;, and create custom implementations of &lt;tt class="docutils literal"&gt;InstallerArgs&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;EnvironmentArgs&lt;/tt&gt;.
(It seems slightly unfortunate that the types of &lt;tt class="docutils literal"&gt;InstallerArgs&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;EnvironmentArgs&lt;/tt&gt; implementations don't interrelate in any sensible way, but I don't think I can deal with that without higher-kinded types or a deep redesign, which may be called for.)&lt;/p&gt;
&lt;p&gt;There's a bit more to be done around this stuff, but it should be really easy to make basic implementations, since I don't &lt;em&gt;think&lt;/em&gt; the implementations need to &amp;quot;actually do anything&amp;quot;.&lt;/p&gt;
&lt;p&gt;In any case, I've run out of time for now, so I'm going to wrap up for now, and try to work on this in the coming days and weeks.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-11-19</title><link href="https://mwchase.neocities.org/coding-2022-11-19" rel="alternate"></link><published>2022-11-19T05:00:00-05:00</published><updated>2022-11-19T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-11-19:/coding-2022-11-19</id><summary type="html">&lt;p class="first last"&gt;At least I know what these bits of dead code are &lt;em&gt;for&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I've got a bit more time.
Let's see about improving MOTR.&lt;/p&gt;
&lt;p&gt;After doing some planning for rewrites, I decided to take a look at coverage misses, because I'm currently blocking these rewrites on getting the coverage up.&lt;/p&gt;
&lt;p&gt;One really prominent set of coverage misses focuses around the &lt;tt class="docutils literal"&gt;EnvVar&lt;/tt&gt; class, which it looks like I'm currently not using at all.
&lt;tt class="docutils literal"&gt;EnvVar&lt;/tt&gt; is one of three wrapper classes that go around a &lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt;.
These wrapper classes take the value in the &lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt;, and inject it into the generated command in various places.
&lt;tt class="docutils literal"&gt;EnvVar&lt;/tt&gt; is for injecting a &lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt; value into an environment variable.
I don't know offhand of a program that works that way, but I think I shouldn't discount the possibility.&lt;/p&gt;
&lt;p&gt;As far as testing this behavior, I &lt;em&gt;could&lt;/em&gt; try to verify the actions of the functions directly, but I should be looking into verifying the design, and I'd like to try and verify the intended higher-level behavior, which is that you can't &amp;quot;double up&amp;quot; on a &lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt;'s value by parameterizing &lt;em&gt;fewer&lt;/em&gt; variables than the &lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt; contains.&lt;/p&gt;
&lt;p&gt;Let's see what this looks like...&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;fundamental&lt;/em&gt; range of behavior is between &lt;tt class="docutils literal"&gt;FlexIn&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;FlexOut&lt;/tt&gt;, because &lt;tt class="docutils literal"&gt;LessFlexOut&lt;/tt&gt; should mostly act like a &lt;tt class="docutils literal"&gt;FlexIn&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;FlexIn&lt;/tt&gt;: here is a specific range of values that something else generated.&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;FlexOut&lt;/tt&gt;: here is a means of generating values.&lt;/p&gt;
&lt;p&gt;The basic check here is that there is:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Every command gets exactly one value for the &lt;tt class="docutils literal"&gt;EnvVar&lt;/tt&gt;, and no &lt;tt class="docutils literal"&gt;EnvVar&lt;/tt&gt; of a &lt;tt class="docutils literal"&gt;FlexOut&lt;/tt&gt; produces the same value twice.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thinking about this, I'd kind of rather have some kind of framework for testing this rather than trying to put stuff together ad-hoc.
I'm going to have to spend some time thinking about that.&lt;/p&gt;
&lt;p&gt;Anyway, it's late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-11-18</title><link href="https://mwchase.neocities.org/coding-2022-11-18" rel="alternate"></link><published>2022-11-18T05:00:00-05:00</published><updated>2022-11-18T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-11-18:/coding-2022-11-18</id><summary type="html">&lt;p class="first last"&gt;It's unfortunate that I figured this all out hours ago, and then &lt;em&gt;didn't write the post&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Time management mess-up write post quick go!&lt;/p&gt;
&lt;p&gt;I figured out a less disruptive way to handle &amp;quot;this use case requires reaching deep into a nested data structure to swap out a sentinel value&amp;quot;: because the actual value is a &lt;tt class="docutils literal"&gt;Label&lt;/tt&gt; that corresponds to a structure involving the implementation of a particular interface, I can implement that interface with a class that's not instantiable.
I don't know for sure if that's how I want to do this long term, but the resulting code should be very close to what I have now, except now I have proper access to &amp;quot;this complicated nested state with a hole in the middle&amp;quot;.&lt;/p&gt;
&lt;p&gt;Anyway I have to stop writing now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category><category term="short post"></category></entry><entry><title>Coding 2022-11-17</title><link href="https://mwchase.neocities.org/coding-2022-11-17" rel="alternate"></link><published>2022-11-17T05:00:00-05:00</published><updated>2022-11-17T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-11-17:/coding-2022-11-17</id><summary type="html">&lt;p class="first last"&gt;Shockingly complicated.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Let's see.
The quickest way to get plans for updating code is to see what corresponds to the updates on the code I haven't written yet.&lt;/p&gt;
&lt;p&gt;Um.
I'll try again.&lt;/p&gt;
&lt;p&gt;I have three-ish groups of modules that aren't implemented in either topic.
These modules have some correspondence with other modules that &lt;em&gt;are&lt;/em&gt; implemented, but I would like to rewrite to some degree.
I feel like it would be &amp;quot;more efficient&amp;quot; if I did the rewrites before bringing in more code that would need equivalent rewrites.&lt;/p&gt;
&lt;p&gt;So.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;pyinstrument&lt;/li&gt;
&lt;li&gt;limit-coverage&lt;/li&gt;
&lt;li&gt;coverage subcommands&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm going to try putting detailed notes in the Kanban board, but I'll summarize things here as I go.&lt;/p&gt;
&lt;p&gt;Two of these modules will work similarly to &lt;tt class="docutils literal"&gt;_api.cli.python&lt;/tt&gt;.
So, refresh my memory about what's in there...&lt;/p&gt;
&lt;p&gt;Well, this is a little unpleasant.
I look at a helper function with a single statement, and there's just &lt;em&gt;so much&lt;/em&gt; to unpack about making the code in question reusable.&lt;/p&gt;
&lt;p&gt;Like either I need to break up the data at several levels of abstraction, or I have to create a placeholder that's never supposed to be emitted...
If I could mark the placeholder as &amp;quot;not-supposed-to-be-used&amp;quot;, maybe I'd feel better...&lt;/p&gt;
&lt;p&gt;Why is this so &lt;em&gt;hard&lt;/em&gt;?
Anyway, I'll have to think about this.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-11-16</title><link href="https://mwchase.neocities.org/coding-2022-11-16" rel="alternate"></link><published>2022-11-16T05:00:00-05:00</published><updated>2022-11-16T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-11-16:/coding-2022-11-16</id><summary type="html">&lt;p class="first last"&gt;I completely forgot about some of the pointless code in here. So strange.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did some basic cleanup to MOTR's code today.
The first thing I did was to remove some test code that wasn't accomplishing anything.
The second thing I did was to touch up some of the documentation to remove references to outdated terminology.&lt;/p&gt;
&lt;p&gt;Looking over what I have queued up for myself, there are two obvious courses of action:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Triage the majority of modules that I wasn't quite sure what to do with.&lt;/li&gt;
&lt;li&gt;Look over the empty files, and figure out what I need to know before I feel comfortable filling them in.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In any case, that's not happening tonight.
Maybe later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Weekly Roundup 2022-11-15</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-11-15" rel="alternate"></link><published>2022-11-15T05:00:00-05:00</published><updated>2022-11-15T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-11-15:/weekly-roundup-2022-11-15</id><summary type="html">&lt;p class="first last"&gt;Once again, definite progress, but &lt;em&gt;really frustrating&lt;/em&gt; how much downtime there was.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I started listing files in MOTR that I need to look over.&lt;/li&gt;
&lt;li&gt;Thursday: I decided to move those files into a kanban board instead of a blog post. I ended up getting distracted complaining about the various options I found.&lt;/li&gt;
&lt;li&gt;Friday: I ended up settling on the option that I had the least complaints about. (Basically, since I'm not planning to share this board, I don't think it should be on Trello taking up space. Much better to take up space on my hard drive, NAS, onsite backups, and offsite backups. (... If you were wondering how I was able to get my laptop working again &lt;em&gt;relatively quickly&lt;/em&gt;...))&lt;/li&gt;
&lt;li&gt;Saturday: I was stressed out so I tried to take things easy.&lt;/li&gt;
&lt;li&gt;Sunday: We traveled, so I tried to take things easy.&lt;/li&gt;
&lt;li&gt;Monday: We traveled, so I tried to take things easy.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to actually work through the kanban board, now that I've loaded every file into it.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="MOTR"></category><category term="Trello"></category><category term="kanban"></category></entry><entry><title>Diary 2022-11-14</title><link href="https://mwchase.neocities.org/diary-2022-11-14" rel="alternate"></link><published>2022-11-14T05:00:00-05:00</published><updated>2022-11-14T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-11-14:/diary-2022-11-14</id><summary type="html">&lt;p class="first last"&gt;Travel continues to be rough.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;And we're back.
Traveling in the opposite direction does not have the opposite effect, unfortunately.&lt;/p&gt;
&lt;p&gt;I don't really want to look at my screen, so I'm going to keep the waffling to a minimum.
Hopefully I'll be up for writing more in the coming week.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Short entry"></category></entry><entry><title>Diary 2022-11-13</title><link href="https://mwchase.neocities.org/diary-2022-11-13" rel="alternate"></link><published>2022-11-13T05:00:00-05:00</published><updated>2022-11-13T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-11-13:/diary-2022-11-13</id><summary type="html">&lt;p class="first last"&gt;This was entirely predictable. Doesn't mean I have to like it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;We traveled today.
I'm not up for writing stuff.&lt;/p&gt;
&lt;p&gt;Yesterday, I made some good progress on the task tracking for MOTR.
The big thing I ended up realizing/remembering is that I can't just get the coverage to be all the way up, I also have to actually write a bunch of these modules.
Hopefully, I can also delete some of them.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to shut things down for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Short entry"></category></entry><entry><title>Diary 2022-11-12</title><link href="https://mwchase.neocities.org/diary-2022-11-12" rel="alternate"></link><published>2022-11-12T05:00:00-05:00</published><updated>2022-11-12T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-11-12:/diary-2022-11-12</id><summary type="html">&lt;p class="first last"&gt;Let's see how much I can focus on anything...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm writing this entry early, because I want to be ready to go to bed as soon as possible later tonight.
I've been under some stress recently, probably due to the time change, some unusual travel, and a few other factors.&lt;/p&gt;
&lt;p&gt;I'd really like to be able to get work done on my various projects, but I can no longer ignore the results of pushing myself to get stuff done.
So, my plan for now is to publish this entry, and get any work that I feel up to done, all around dinner, and then.&lt;/p&gt;
&lt;p&gt;Just.&lt;/p&gt;
&lt;p&gt;Take.&lt;/p&gt;
&lt;p&gt;Things.&lt;/p&gt;
&lt;p&gt;Easy.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Short entry"></category></entry><entry><title>Coding 2022-11-11</title><link href="https://mwchase.neocities.org/coding-2022-11-11" rel="alternate"></link><published>2022-11-11T05:00:00-05:00</published><updated>2022-11-11T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-11-11:/coding-2022-11-11</id><summary type="html">&lt;p class="first last"&gt;I'm starting to really respect the idea of making a function (er, &amp;quot;message receiver&amp;quot;?) into a sentence.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;This is quick because I was distracted, but I've added a few more of the files in the project to the board, and one thing I'm noticing about my code is, regardless of whether you believe in self-documenting code, some of the stuff I've written is clearly not.&lt;/p&gt;
&lt;p&gt;Like, when these functions have four or five arguments, it should be at least a little clearer what the dang &lt;em&gt;deal&lt;/em&gt; is.&lt;/p&gt;
&lt;p&gt;I just now got an offline Kanban app working, so we'll see what I think of that going forward.&lt;/p&gt;
&lt;p&gt;Anyway, I absolutely have to get ready for bed now, and I'm not sure how much more I'll get done tomorrow or over the weekend, but whatever.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-11-10</title><link href="https://mwchase.neocities.org/coding-2022-11-10" rel="alternate"></link><published>2022-11-10T05:00:00-05:00</published><updated>2022-11-10T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-11-10:/coding-2022-11-10</id><summary type="html">&lt;p class="first last"&gt;I should get &amp;quot;I completely forget what I was doing, and cannot justify this situation to my satisfaction.&amp;quot; on a t-shirt. Nobody would be able to read it without getting deep inside my personal bubble, but &lt;em&gt;I'd&lt;/em&gt; know what it said.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, I decided to track the files to look at in a kanban board, rather than copy around lists in blog posts.
I've already copied the previous post's information into a Trello board, but then I got distracted because, like,&lt;/p&gt;
&lt;p&gt;Trello is &lt;em&gt;fine&lt;/em&gt;, and it definitely makes sense if I want to share my board, but for something like this, I feel like ideally I'd like something that:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Is offline and saves to a local file that I can back up myself&lt;/li&gt;
&lt;li&gt;Gives me all of the features out of the box without trying to upsell me&lt;/li&gt;
&lt;li&gt;Successfully launches&lt;/li&gt;
&lt;li&gt;Bonus: lets me pull in my boards from Trello (/Zenkit, which appears to have... a bunch of the same boards as my Trello? I completely forget what I was doing, and cannot justify this situation to my satisfaction.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For some reason, this intersection of requests seems to be &lt;em&gt;overly strict&lt;/em&gt;.
And that's gotten me distracted.&lt;/p&gt;
&lt;p&gt;At some point, I think I need to try to build this myself, if I think it should be possible to write an offline kanban app that actually works instead of crashing and saying vague and mean things about my GPU, or trying to upsell me.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to try and add a few more cards to the Trello, because Trello is &lt;em&gt;fine&lt;/em&gt;.
I should wrap up this post now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-11-09</title><link href="https://mwchase.neocities.org/coding-2022-11-09" rel="alternate"></link><published>2022-11-09T05:00:00-05:00</published><updated>2022-11-09T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-11-09:/coding-2022-11-09</id><summary type="html">&lt;p class="first last"&gt;It doesn't feel great throwing myself under the bus.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;A bunch of stuff happened today, but it's all wrapped up.
Now, I want to do &lt;em&gt;something&lt;/em&gt; with MOTR.&lt;/p&gt;
&lt;p&gt;I ran the tests again to see if anything had broken in the last few days, and it &lt;em&gt;did&lt;/em&gt;.
A bunch of the typing tests broke because I had a helper function that, as of today, needs a &lt;tt class="docutils literal"&gt;#type: ignore&lt;/tt&gt; line on the definition.
But, that was simple to take care of once I figured out that the error that was &lt;em&gt;failing&lt;/em&gt; every test wasn't coming &lt;em&gt;from&lt;/em&gt; every test.&lt;/p&gt;
&lt;p&gt;And now, I've got all of this code to look over.&lt;/p&gt;
&lt;p&gt;Nothing specific:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The type plugin code&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;_api/cli_types/command_builder.py&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;_api/cli_types/entry.py&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;_api/cli_types/flex.py&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;_api/cli_types/input_accumulator.py&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;_api/cli_types/label.py&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;_api/cli_types/not_output.py&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Something specific:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;_api/build.py&lt;/tt&gt; needs a documentation update.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;_api/cli_types/command.py&lt;/tt&gt; has that helper function that I'm not sure whether it should exist.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;_api/cli_types/installer.py&lt;/tt&gt; I vaguely remember thinking that this module should be split up. Maybe.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It's late and I'm not up to going over the rest of these.
I ended up getting a little distracted by how weird some of the code I've written looks.
Like, normally, suite of a &lt;tt class="docutils literal"&gt;for&lt;/tt&gt; loop makes up &lt;em&gt;at least&lt;/em&gt; half of the lines of code in the loop.&lt;/p&gt;
&lt;p&gt;I'm too tired to process a lot of this for now, so I'm going to just push this onto tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Weekly Roundup 2022-11-08</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-11-08" rel="alternate"></link><published>2022-11-08T05:00:00-05:00</published><updated>2022-11-08T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-11-08:/weekly-roundup-2022-11-08</id><summary type="html">&lt;p class="first last"&gt;Unpleasant but productive. Let's see about getting rid of that first one, hm?&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: My attempts to get back to working on MOTR were hindered by the fac that the tests ended up failing, but only sometimes.&lt;/li&gt;
&lt;li&gt;Thursday: The bug that was breaking the tests got fixed promptly. I started renaming things.&lt;/li&gt;
&lt;li&gt;Friday: I kept up with that, but tried to keep things short because I was writing that entry very late.&lt;/li&gt;
&lt;li&gt;Saturday: I took a day off from this coding stuff, and I maybe should have written the post ahead of time, but I didn't.&lt;/li&gt;
&lt;li&gt;Sunday: I ended up doing most of the work after I posted, which... not ideal, for various reasons, but it is what it is.&lt;/li&gt;
&lt;li&gt;Monday: I did some final cleanup that was needed around the renames.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I've got a bunch of stuff happening &lt;em&gt;during&lt;/em&gt; the week, so we'll have to see how I work around that.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="MOTR"></category><category term="bad time management"></category></entry><entry><title>Coding 2022-11-07</title><link href="https://mwchase.neocities.org/coding-2022-11-07" rel="alternate"></link><published>2022-11-07T05:00:00-05:00</published><updated>2022-11-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-11-07:/coding-2022-11-07</id><summary type="html">&lt;p class="first last"&gt;Simple updates and fixes.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;After the last entry, I zoned out and finished the renaming.
Towards the end, I realized that I'd made some changes on the documentation topic that touch code not yet released in the coverage topic.
So, to do The Right Thing in terms of the new interfaces, I switched to the coverage topic and made updates to just those classes, then merged and fixed the conflicts.
The merge was pretty painless, and I'd really like to attribute it to using Mercurial, but realistically, it was probably because I made sure to get it out of the way as soon as I could.&lt;/p&gt;
&lt;p&gt;Anyway, next up I'll either be carefully going through each individual file, or I'll think of something new to change that's more targeted.&lt;/p&gt;
&lt;p&gt;Either way, I'm done for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Diary 2022-11-06</title><link href="https://mwchase.neocities.org/diary-2022-11-06" rel="alternate"></link><published>2022-11-06T04:00:00-05:00</published><updated>2022-11-06T04:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-11-06:/diary-2022-11-06</id><summary type="html">&lt;p class="first last"&gt;And once again, trying to unwind knocks me flat for a day.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right.
I spent most of today just kind of relaxing, but I'm feeling okay right now.
Sadly, there isn't time to do much.&lt;/p&gt;
&lt;p&gt;I'm going to try to make some updates to MOTR after I publish this, but I'm not feeling up to writing much coherent yet.&lt;/p&gt;
&lt;p&gt;I'm just going to cut this here, and encourage everyone not to push themselves too hard, and then I'll try to follow that advice myself.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Short entry"></category></entry><entry><title>Diary 2022-11-05</title><link href="https://mwchase.neocities.org/diary-2022-11-05" rel="alternate"></link><published>2022-11-05T04:00:00-04:00</published><updated>2022-11-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-11-05:/diary-2022-11-05</id><summary type="html">&lt;p class="first last"&gt;I can't think of what to put here.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was only so-so at taking things easy for most of the day, but oh boy am I taking things easy right now.&lt;/p&gt;
&lt;p&gt;I ended up feeling up to doing some work on the latest MOTR rewrite, but I'm going to take a break from that now.&lt;/p&gt;
&lt;p&gt;If I can focus tomorrow, I'll get to work on it again.
If I can't, oh well.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Short entry"></category></entry><entry><title>Coding 2022-11-04</title><link href="https://mwchase.neocities.org/coding-2022-11-04" rel="alternate"></link><published>2022-11-04T04:00:00-04:00</published><updated>2022-11-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-11-04:/coding-2022-11-04</id><summary type="html">&lt;p class="first last"&gt;Getting really tempted to start dating these one minute before midnight.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Time management messed up again.
In order to recover, I'm going to need to not work on MOTR tomorrow, then work on it Saturday afternoon.&lt;/p&gt;
&lt;p&gt;(Regular reminder that the dates on these posts don't make it very clear which day of the week I'm writing them on.)&lt;/p&gt;
&lt;p&gt;Anyway, I am continuing to rework the names in MOTR's core.
I shouldn't try to go into too much more detail now.
(In fact, I should &lt;em&gt;stop working on it for now&lt;/em&gt;, but, eh.)
I'll try to summarize how things are going in the entry that I write on Saturday, which will be dated Sunday.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-11-03</title><link href="https://mwchase.neocities.org/coding-2022-11-03" rel="alternate"></link><published>2022-11-03T04:00:00-04:00</published><updated>2022-11-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-11-03:/coding-2022-11-03</id><summary type="html">&lt;p class="first last"&gt;Adding metaphors to the code so it hopefully takes less work to interpret.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I figured out what was breaking MOTR, and filed a bug upstream.
I'm not proud of the bug, but it got the job done, many thanks to the maintainers.&lt;/p&gt;
&lt;p&gt;So, I've got a few minutes, let's see about breaking the tests on purpose.
The big overall change I want to put in for legibility, is to switch from adding &amp;quot;requirements&amp;quot; to a &amp;quot;registry&amp;quot;, whatever that is, to putting &amp;quot;facts&amp;quot; into a &amp;quot;compendium&amp;quot;.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;I've gotten the code to typecheck, but there is much more to do, and no time now to do it in.
Over the next few days, I'm going to divide my time between getting other checks to pass, and doing more renames.
There is plenty more to do there, and it feels good to have finally gotten started on all of this.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-11-02</title><link href="https://mwchase.neocities.org/coding-2022-11-02" rel="alternate"></link><published>2022-11-02T04:00:00-04:00</published><updated>2022-11-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-11-02:/coding-2022-11-02</id><summary type="html">&lt;p class="first last"&gt;I left my code alone for a bit, and when I came back, it was &lt;em&gt;haunted&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I thought I was going to be able to get a little quick work on MOTR, but it ended up not being the quick work I expected.&lt;/p&gt;
&lt;p&gt;It seems Pytest made some changes that broke a plugin I was using, until I added an additional requirement, but now I'm getting test failures that feel totally random, even though they're sort of reproducible.&lt;/p&gt;
&lt;p&gt;Okay, no, somehow these tests that execute a linear series of actions are behaving non-deterministically.
This is going to bother me for &lt;em&gt;days&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I don't deserve this treatment.&lt;/p&gt;
&lt;p&gt;Anyway, I'll work on this later, when I'm better-rested to handle these mysteries.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Weekly Roundup 2022-11-01</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-11-01" rel="alternate"></link><published>2022-11-01T04:00:00-04:00</published><updated>2022-11-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-11-01:/weekly-roundup-2022-11-01</id><summary type="html">&lt;p class="first last"&gt;Still a little freaked out from whatever broke my old laptop.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I tried to implement a little of what I want for the parser code.&lt;/li&gt;
&lt;li&gt;Thursday: Bad time management.&lt;/li&gt;
&lt;li&gt;Friday: I tried to rough out a bit more of the support code for parsing.&lt;/li&gt;
&lt;li&gt;Saturday: I watched MST3K.&lt;/li&gt;
&lt;li&gt;Sunday: I... worked on tabletop roleplaying stuff, apparently.&lt;/li&gt;
&lt;li&gt;Monday: I didn't do much worth writing about.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I want to get back to messing around with MOTR, now that my laptop seems to be working somewhat reliably.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Time management issues"></category></entry><entry><title>Diary 2022-10-31</title><link href="https://mwchase.neocities.org/diary-2022-10-31" rel="alternate"></link><published>2022-10-31T04:00:00-04:00</published><updated>2022-10-31T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-10-31:/diary-2022-10-31</id><summary type="html">&lt;p class="first last"&gt;Another one that's safe to skip.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I ended up messing with other stuff today, and I think I made some interesting progress, but I'll have to give it a bit more time.&lt;/p&gt;
&lt;p&gt;I'd like it if I could get myself to put in work on the stuff I have blog tags for, but at least I put in some work on &lt;em&gt;something&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;If I can get motivation to work on code stuff, I should try to make changes to MOTR, since I came up with some changes that should clarify things, or at least make them less generic.&lt;/p&gt;
&lt;p&gt;Anyway, I let things slip badly again, oh well.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Short entry"></category></entry><entry><title>Diary 2022-10-30</title><link href="https://mwchase.neocities.org/diary-2022-10-30" rel="alternate"></link><published>2022-10-30T04:00:00-04:00</published><updated>2022-10-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-10-30:/diary-2022-10-30</id><summary type="html">&lt;p class="first last"&gt;Apparently, I took things easy today.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I ended up not doing &lt;em&gt;much&lt;/em&gt; today, so I'll just pretty much accept that.&lt;/p&gt;
&lt;p&gt;One thing I did work some on is something that I've started working on recently with my wife.
I'm trying to start a game of Ironsworn: Starforged, with the idea that I'll be playing it mostly solo, but asking my wife for oracle decisions.
Right now, I'm pinning down the setting and my character's backstory.
This morning, I copied in the setting truths from my notebook to my laptop, so now I can work on collating them and figuring out the implications.&lt;/p&gt;
&lt;p&gt;Having my wife make the choices worked out all right in setting up the truths, but I haven't yet tried it with much larger tables.&lt;/p&gt;
&lt;p&gt;Anyway, I'm reading over the beginning of the rulebook again to see if there are elements I should be incorporating into my notes.
A bit more work on this stuff, and I should be able to get started.&lt;/p&gt;
&lt;p&gt;Anyway, that's all I've got, and I really shouldn't try to come up with more.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Short entry"></category></entry><entry><title>Diary 2022-10-29</title><link href="https://mwchase.neocities.org/diary-2022-10-29" rel="alternate"></link><published>2022-10-29T04:00:00-04:00</published><updated>2022-10-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-10-29:/diary-2022-10-29</id><summary type="html">&lt;p class="first last"&gt;Movies that are shot partially in 3D are weird. Like, separated by decades, they still need to tell the audience when to put on their glasses? Like, you're poking stuff at the screen, you don't need to also break the fourth wall at the same time.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;More MST3k tonight.
That movie was a lot (in terms of the special effects sequences) and a little (in terms of the plot).&lt;/p&gt;
&lt;p&gt;I'm actually not quite sure when I'll be able to properly ramp up in the things I want to work on.
Stuff is happening this weekend, I think, and over the next few weeks.
Maybe I should just work on getting stuff done in the morning.&lt;/p&gt;
&lt;p&gt;Either way, nothing's happening now, and if I don't wrap up, nothing's happening later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Short entry"></category></entry><entry><title>Coding 2022-10-28</title><link href="https://mwchase.neocities.org/coding-2022-10-28" rel="alternate"></link><published>2022-10-28T04:00:00-04:00</published><updated>2022-10-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-10-28:/coding-2022-10-28</id><summary type="html">&lt;p class="first last"&gt;Apparently, what makes me happy is to just &lt;em&gt;commit&lt;/em&gt; to an approach.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Minor technical issue: worked around!&lt;/p&gt;
&lt;p&gt;Time management: still in terrible shape!&lt;/p&gt;
&lt;p&gt;The next step in my quest to carefully design the environment on which to build stuff in Lua, is to figure out how I want to do stuff like &amp;quot;annotate fields with their name&amp;quot;.&lt;/p&gt;
&lt;p&gt;My general feeling is that things should work like &lt;tt class="docutils literal"&gt;{ { field = &lt;span class="pre"&gt;{...}&lt;/span&gt; } }&lt;/tt&gt;, where there could be many &amp;quot;field&amp;quot; tables, and the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;{...}&lt;/span&gt;&lt;/tt&gt; corresponds to a table that gets passed to &lt;tt class="docutils literal"&gt;converter_function_passed_by_client_code(table.unpack(v))&lt;/tt&gt;.
That way, the current behavior of the enum module could be approximated by mapping &lt;tt class="docutils literal"&gt;function(field) for k, v in field do table.insert(v, k) end return field end&lt;/tt&gt; over &lt;tt class="docutils literal"&gt;ipairs(fields_table)&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;There are some issues here.
I think I want to have similar power to &lt;tt class="docutils literal"&gt;table.insert&lt;/tt&gt;, but doing it like this means that the field tables get modified in place, then collected into a new table, which feels not-quite right.
Like, either it should return a new table without touching the original, or it should update the original table and return the same table.
I don't know which of those I prefer from a pragmatic perspective.
(My gut says &amp;quot;avoid mutations as much as possible&amp;quot;, but if I felt that was worth basing my pragmatic stances off of, &lt;em&gt;I wouldn't be doing this in Lua&lt;/em&gt;.)&lt;/p&gt;
&lt;p&gt;The &amp;quot;don't look inside the sausage factory answer&amp;quot; is to come up with an alternative to mapping over an ipairs that just loops over the table and assigns the result of the mapping function over the existing value, regardless of whether they're the same.&lt;/p&gt;
&lt;p&gt;I'm cutting this entry off for now, but now I've got the next question for later:&lt;/p&gt;
&lt;p&gt;Is that idea something I'd want to reuse in other contexts, or just some form of utility function I'd want for building up this kind of data?&lt;/p&gt;
&lt;p&gt;I'm going to need to phrase this question very carefully, due to the nested structure of the tables, and the number of functions I'd like to have in play.
I'll take about a day to think about this, at least.
For now, I need to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Lua"></category><category term="Crafting Interpreters"></category></entry><entry><title>Diary 2022-10-27</title><link href="https://mwchase.neocities.org/diary-2022-10-27" rel="alternate"></link><published>2022-10-27T04:00:00-04:00</published><updated>2022-10-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-10-27:/diary-2022-10-27</id><summary type="html">&lt;p class="first last"&gt;It's safe to skip this.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;My time management slipped again.
There's no way for me to get out an entry that's any better than this.
I still want to post something daily, technology permitting, but sometimes it's not going to be all that much.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Short entry"></category></entry><entry><title>Coding 2022-10-26</title><link href="https://mwchase.neocities.org/coding-2022-10-26" rel="alternate"></link><published>2022-10-26T04:00:00-04:00</published><updated>2022-10-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-10-26:/coding-2022-10-26</id><summary type="html">&lt;p class="first last"&gt;I'm going to need my laptop to stop being weird for a bit...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, my laptop is still giving me some technical issues, but I'm going to put them in the &amp;quot;annoying, with a planned workaround&amp;quot; bucket for now.&lt;/p&gt;
&lt;p&gt;Anyway, I'm still not ramping up super quickly, so for now, I'm just working on parts of the stuff I was planning out two days ago.
I decided to start small, and implement the &amp;quot;ordered fields&amp;quot; helper.
With that, I can have my arbitrary criterion satisfied (&amp;quot;I shouldn't need to quote the field names when I define them&amp;quot;) without having to explode out the creation process into a bunch of metamethods that may or may not fully make sense.
While I was at it, I made sure it's possible to have arguments that don't do anything in terms of the final result, so they can act as spacers between groups.&lt;/p&gt;
&lt;p&gt;I'm going to have to wait to see what I think of using this code, because it's late, but, like, just make a bit of progress at a time.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Lua"></category><category term="Crafting Interpreters"></category></entry><entry><title>Weekly Roundup 2022-10-25</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-10-25" rel="alternate"></link><published>2022-10-25T04:00:00-04:00</published><updated>2022-10-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-10-25:/weekly-roundup-2022-10-25</id><summary type="html">&lt;p class="first last"&gt;I am gradually progressing from &amp;quot;painfully stressed&amp;quot; to &amp;quot;just really, really annoyed&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: [FOOTAGE MISSING]&lt;/li&gt;
&lt;li&gt;Thursday: [FOOTAGE MISSING]&lt;/li&gt;
&lt;li&gt;Friday: [FOOTAGE MISSING]&lt;/li&gt;
&lt;li&gt;Saturday: I had everything together enough to be comfortable trying to post again.&lt;/li&gt;
&lt;li&gt;Sunday: I tried to get back into the Crafting Interpreters stuff, and promptly ended up kind of confused.&lt;/li&gt;
&lt;li&gt;Monday: I decided to try biting the bullet and settling on an enum representation that wasn't &lt;em&gt;absolutely as theoretically concise as possible&lt;/em&gt;.
Note that I just &lt;em&gt;decided&lt;/em&gt;, I didn't actually write any code.
I'm not coming back into this stuff at full speed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to ramp back up, but maybe I'll just mess around and see if that makes me feel better.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Missing entries"></category></entry><entry><title>Coding 2022-10-24</title><link href="https://mwchase.neocities.org/coding-2022-10-24" rel="alternate"></link><published>2022-10-24T04:00:00-04:00</published><updated>2022-10-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-10-24:/coding-2022-10-24</id><summary type="html">&lt;p class="first last"&gt;Preparing to sacrifice extreme terseness, because otherwise it'll be a pain to implement and have a bunch of mystery bugs.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I know it's pretty basic, but every time I think about this enum stuff, I end up going in circles.&lt;/p&gt;
&lt;p&gt;I'm currently leaning towards &amp;quot;the stuff I'm thinking of doing with metamethods is too confusing at every level&amp;quot;, so I'm considering other ways to have names in order.
Like, let's compare...&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;ordered&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;abc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ghi&lt;/span&gt;  &lt;span class="c1"&gt;-- Complicated under the covers&lt;/span&gt;

&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;ordered&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="n"&gt;abc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ghi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}}}&lt;/span&gt; &lt;span class="c1"&gt;-- A bit wordy&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On reflection, it is wordier, for sure, but it's mostly going to end up on distinct lines anyway, and it gives me a convenient way to make things that contain their name: define a function to process each table, and run it over the table.&lt;/p&gt;
&lt;p&gt;I think that gives me something good to try next time around.&lt;/p&gt;
&lt;p&gt;I wish I'd gotten further, but to be honest, I'm still not totally sure my laptop isn't going to suffer some horrible failure, only &lt;em&gt;mostly&lt;/em&gt; sure.&lt;/p&gt;
&lt;p&gt;Anyway, I need to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Lua"></category><category term="Crafting Interpreters"></category></entry><entry><title>Coding 2022-10-23</title><link href="https://mwchase.neocities.org/coding-2022-10-23" rel="alternate"></link><published>2022-10-23T04:00:00-04:00</published><updated>2022-10-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-10-23:/coding-2022-10-23</id><summary type="html">&lt;p class="first last"&gt;Don't remember what I was doing &lt;em&gt;a month ago&lt;/em&gt;? That's okay, neither do I.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm not going to get too far with anything tonight, but I want to refresh my memory on the Earley parser stuff.
Looking at the last entry in this tag through the website, I see that I was in the middle of writing some changes to the enum modules I wrote.&lt;/p&gt;
&lt;p&gt;My notes there just talk about &amp;quot;taking an iterator&amp;quot;, so that's just, like, okay, take the values returned by an iterator function, and then feed them into the... ah, good, the previous Lua post actually explains this stuff.&lt;/p&gt;
&lt;p&gt;Let's see, what do I want to call this stuff?&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The table that either accumulates or chains names and potentially values can be called &lt;tt class="docutils literal"&gt;fields&lt;/tt&gt;.
From a purity craze perspective, I'd try for the chaining, but it's probably easier to implement with it just accumulating into a table.
Remembering that the fields need to be required to be strings.&lt;/li&gt;
&lt;li&gt;From there, the &lt;tt class="docutils literal"&gt;opairs&lt;/tt&gt; function I've already written can be used to &lt;em&gt;extract&lt;/em&gt; the data.&lt;/li&gt;
&lt;li&gt;Something in there needs to handle defaulting arguments that aren't given, but I'm not sure what's the best way to handle that.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I think I need to do some planning on paper to properly hash a lot of this out.&lt;/p&gt;
&lt;p&gt;Anyway, it's late, and I need to wrap things up.
It wouldn't do to stay up too late on this laptop just as soon as it becomes possible again.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Lua"></category><category term="Crafting Interpreters"></category></entry><entry><title>Diary 2022-10-22</title><link href="https://mwchase.neocities.org/diary-2022-10-22" rel="alternate"></link><published>2022-10-22T04:00:00-04:00</published><updated>2022-10-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-10-22:/diary-2022-10-22</id><summary type="html">&lt;p class="first last"&gt;If you're in my situation, just don't be. *taps forehead*&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, that &lt;em&gt;sucked&lt;/em&gt;.
Several days after my laptop appeared to be working again, it started showing the same issue as before.
At that point, I gave up on it.&lt;/p&gt;
&lt;p&gt;I'm writing this entry on a new laptop that I installed linux on from scratch.
Here are some notes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Not going to get anywhere without disabling secure boot in the BIOS.&lt;/li&gt;
&lt;li&gt;I had a number of issues around resume, that may or may not be fixed.
The last thing I tried was to switch from hybrid to discrete graphics in the BIOS, and that &lt;em&gt;seems&lt;/em&gt; to have fixed horrible screen issues on resume.
I also disabled the nvidia suspend and resume services, which &lt;em&gt;may&lt;/em&gt; have been causing a different set of resume issues.
The other thing I kept was to switch to the proprietary drivers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No obvious problems yet; hopefully I'll manage to publish this entry tonight.&lt;/p&gt;
&lt;p&gt;Anyway, the broad takeaway from this isn't any particular technical advice, but &amp;quot;Try to avoid having to do non-mainstream tech stuff to your main electronic device when you don't have some kind of fallback available.&amp;quot;&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="End hiatus"></category><category term="hopefully"></category></entry><entry><title>Weekly Roundup 2022-10-18</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-10-18" rel="alternate"></link><published>2022-10-18T04:00:00-04:00</published><updated>2022-10-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-10-18:/weekly-roundup-2022-10-18</id><summary type="html">&lt;p class="first last"&gt;Pushing for an update Saturday night (&amp;quot;Sunday&amp;quot; in the entry) was maybe not the best idea, but, um, oh well.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I tried to figure out a proper middle ground between Python and Koka for representing variables.&lt;/li&gt;
&lt;li&gt;Thursday: I thought a bit more about that, and concluded I need some more experience with other programming languages.&lt;/li&gt;
&lt;li&gt;Friday: I had a bad day for writing/working, so I just kind of punted.&lt;/li&gt;
&lt;li&gt;Saturday: I punted deliberately.&lt;/li&gt;
&lt;li&gt;Sunday: My laptop got broken so badly that I elected to reinstall the OS from scratch. Getting this done and recovering most of my files took most of the day.&lt;/li&gt;
&lt;li&gt;Monday: I wasn't quite done with restoring everything.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to ramp back up on NABTO related stuff and MOTR.
I'll be keeping an eye out for any performance degradation like my laptop was experiencing like before it really broke, but that doesn't seem to be happening.
Which, on the one hand, is good, but on the other hand, I don't know which factors to worry about, since it's mostly the same files, on all the same hardware, and all that's changed is that the system is freshly installed with a new distro version, and the disk layout is different.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Technical issues"></category></entry><entry><title>Diary 2022-10-17</title><link href="https://mwchase.neocities.org/diary-2022-10-17" rel="alternate"></link><published>2022-10-17T04:00:00-04:00</published><updated>2022-10-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-10-17:/diary-2022-10-17</id><summary type="html">&lt;p class="first last"&gt;Still recovering...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm still reconstituting my laptop, so I'm not pushing myself too hard yet.
I've taken care of most of the low-hanging fruit, and the backup did &lt;em&gt;a lot&lt;/em&gt; of work, so there are only a few notable omissions that I'm just going to leave be for now.&lt;/p&gt;
&lt;p&gt;I need to cool off properly, so I'm going to take that time out of writing this entry.
Hopefully, I'll be able to ramp back up soonish.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Short entry"></category></entry><entry><title>Diary 2022-10-16</title><link href="https://mwchase.neocities.org/diary-2022-10-16" rel="alternate"></link><published>2022-10-16T04:00:00-04:00</published><updated>2022-10-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-10-16:/diary-2022-10-16</id><summary type="html">&lt;p class="first last"&gt;Laptop fixed. Updates unpaused indefinitely.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I spent literally all day wrangling my laptop back into a usable state, so I'm not going to do much more for now.
(I haven't actually confirmed that it'll stand up to my typical usage, but it's holding up to stuff that seems &lt;em&gt;comparable&lt;/em&gt; to what I was doing when everything broke down.)&lt;/p&gt;
&lt;p&gt;I did make some progress planning renames for MOTR, so I can get on with that tomorrow if I'm actually done with fixing things.&lt;/p&gt;
&lt;p&gt;(I am not done with fixing things. Publishing this entry is going to require a bizarre command-line invocation, and possibly changes to the publishing script to make it more robust.)&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to try to cool off now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Short entry"></category></entry><entry><title>Diary 2022-10-15</title><link href="https://mwchase.neocities.org/diary-2022-10-15" rel="alternate"></link><published>2022-10-15T04:00:00-04:00</published><updated>2022-10-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-10-15:/diary-2022-10-15</id><summary type="html">&lt;p class="first last"&gt;Trying to get off my own back.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was planning to take things easy today, and that comes into play now.
We're going to watch a bad movie a few minutes from now, and I'm just going to relax.&lt;/p&gt;
&lt;p&gt;Tomorrow, I'll try to have things together, but the plan for now is to chill out.
I'm not going to overthink other stuff to put in this entry.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Short entry"></category></entry><entry><title>Diary 2022-10-14</title><link href="https://mwchase.neocities.org/diary-2022-10-14" rel="alternate"></link><published>2022-10-14T04:00:00-04:00</published><updated>2022-10-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-10-14:/diary-2022-10-14</id><summary type="html">&lt;p class="first last"&gt;Not a very organized day, oh well.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Ugh, where does the time go?
Both in the day, and between the months?&lt;/p&gt;
&lt;p&gt;Anyway, I shook things up a very small amount today, and that may or may not explain why I messed up my end-of-the-day schedule.
An alternative explanation is just that I don't have anything new to say about NABTO currently, and so I ended up kind of stalling for a while.
Perhaps there are multiple factors in play.&lt;/p&gt;
&lt;p&gt;Anyway I didn't do stuff worth writing about today, but I can plan things out for the next few days:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I'm going to take things easy tomorrow.&lt;/li&gt;
&lt;li&gt;After that, I'm going to either catch myself back up on the Earley parser, or start doing programming language tutorials.
Ideally both, I think.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, I should not be writing this this late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Short entry"></category></entry><entry><title>Coding 2022-10-13</title><link href="https://mwchase.neocities.org/coding-2022-10-13" rel="alternate"></link><published>2022-10-13T04:00:00-04:00</published><updated>2022-10-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-10-13:/coding-2022-10-13</id><summary type="html">&lt;p class="first last"&gt;The low-level details of language design are &lt;em&gt;really complicated&lt;/em&gt;, sheesh.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;After writing some more jank Koka, I &lt;em&gt;believe&lt;/em&gt; that the state of local variables is the same after each call to &lt;tt class="docutils literal"&gt;resume()&lt;/tt&gt; in Koka.
Maybe there's an obvious reason that it has to be that way, but I was frankly pulling my mind in too many directions at once to be able to tell.&lt;/p&gt;
&lt;p&gt;So, let's think some more about how variables should act.
The big hurdle if I &lt;em&gt;do&lt;/em&gt; go with &amp;quot;all stack variables are predictably-sized fat pointers to arbitrarily shaped objects on the heap, and there's a reference count somewhere&amp;quot;, is that it gets kind of hard to to write a pure function, at least I think so.&lt;/p&gt;
&lt;p&gt;Supposing we have a list/vector type that works kind of like in Python, because I think I want that.
It's &lt;em&gt;possible&lt;/em&gt; to express read-only semantics for the fat pointers here, but it doesn't actually &lt;em&gt;help&lt;/em&gt;, because something else can take a reference to the object and mutate it.
This is what has me thinking &amp;quot;hm, maybe capabilities would be useful somehow&amp;quot;.
Like, if a function relies on &lt;tt class="docutils literal"&gt;val&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;box&lt;/tt&gt;, and &lt;tt class="docutils literal"&gt;tag&lt;/tt&gt; type references to external data, then it shouldn't be possible to break purity by changing the objects behind those references, because they can't change from the perspective of the function.&lt;/p&gt;
&lt;p&gt;This is complicated, so I'm going to try to break it down into reasonable steps.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&amp;quot;Hey, I want a language that's similarly dynamic to Python, but it has an effet system.&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;Well, it's not obvious how to reconcile the effect system with how Python handles writing functions, so it doesn't make sense to work on the object system before addressing that.&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;So, I want to be able to write a Koka-pure function that relies on module-level variables.&amp;quot;&lt;ul&gt;
&lt;li&gt;This has some weird implications even before I get into trying to implement it, because it implies some way of saying &amp;quot;unlike other functions, this functions is &lt;em&gt;not&lt;/em&gt; callable immediately after it is defined, but only after some external condition is met&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&amp;quot;I bet something like Rust or Pony could help with this.&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, if I want things to work the way I think I want them to, then I need to be able to implement the following setup:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Variables that are referenced via (probably fat) pointers, to data on the heap that contains some necessary metadata, and the actual data.&lt;/li&gt;
&lt;li&gt;The ability to construct mutable variables.&lt;/li&gt;
&lt;li&gt;The ability to define functions.&lt;/li&gt;
&lt;li&gt;A basic type system.&lt;/li&gt;
&lt;li&gt;A basic effect system.&lt;ul&gt;
&lt;li&gt;Which handles mutability of shared state.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I won't say that's &lt;em&gt;a lot&lt;/em&gt; of the work, but if I can't do that much, then I need to reconsider the entire big picture of the design.&lt;/p&gt;
&lt;p&gt;The near-term stuff to do goes as follows, but not in any particular order:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Take more of these notes&lt;/li&gt;
&lt;li&gt;Go through Rust tutorials&lt;/li&gt;
&lt;li&gt;Go through Pony tutorials&lt;/li&gt;
&lt;li&gt;Get back to Crafting Interpreters, and therefore, my Earley parser yak shave.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It's good that I have goals, but next up, I need a plan to make sure I actually work on them.
I'll see how that goes.
Anyway, no more to do for today.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="NABTO"></category><category term="Koka"></category></entry><entry><title>Coding 2022-10-12</title><link href="https://mwchase.neocities.org/coding-2022-10-12" rel="alternate"></link><published>2022-10-12T04:00:00-04:00</published><updated>2022-10-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-10-12:/coding-2022-10-12</id><summary type="html">&lt;p class="first last"&gt;Trying to take things slowly with language design. Very, very slowly.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;While I let renaming stuff for MOTR percolate a little, I'm going to consider some thoughts about how NABTO &amp;quot;should&amp;quot; work.
The current topic: how even do variables work?&lt;/p&gt;
&lt;p&gt;Let me see if I can explain what has me so unsure.
Consider the following Python code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;getter_and_setter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;[[],&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;getter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;setter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;nonlocal&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;
        &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new_value&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;getter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;setter&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now, I understand Koka just well enough to expect that the relevant type signatures in an equivalent function definition would look somewhat different.
Let's see how things shake out...&lt;/p&gt;
&lt;p&gt;So.
This doesn't compile.
But the error it produces is very informative.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;fun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;getter&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;setter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;initial_value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na na-Variable"&gt;_&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;(()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na na-Variable"&gt;_&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;int,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na na-Variable"&gt;_&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;())&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;initial_value&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;new_value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;new_value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It would be worth figuring out if it's possible to get this to compile, because I think I want code like this to work in NABTO, but I also want it to have sensible effect typing.&lt;/p&gt;
&lt;p&gt;Anyway, the basic thing I learned about Koka from writing that code is that Koka distinguishes between local variables, and heap variables, in terms of the effect system.
My initial, probably faulty read of the compiler error is that a variable has to be allocated on the heap in order to close over it.
I'd be more confident of this, or alternatively know that I have it wrong, if I had a better understanding of how variable allocation is controlled in Koka.&lt;/p&gt;
&lt;p&gt;Anyway, this may or may not be moot, because one thing I'm not sure of is whether values in NABTO should act more like Python values, or Koka values.
I'm leaning towards Python (heap allocated, reference counted), but I'm not sure what knock-on effects that has on the design.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;In any case&lt;/em&gt;, my thinking on the above code snippets is that equivalent code &lt;em&gt;should&lt;/em&gt; be possible in NABTO, but it &lt;em&gt;should have effects attached to the types&lt;/em&gt;.
This is because the returned functions &lt;em&gt;cannot&lt;/em&gt; be pure in the Koka sense, so they must have some effect other than raising an exception or diverging.&lt;/p&gt;
&lt;p&gt;My intuition about this is, I need to get some experience with how variables work in Koka, and, say, Rust and Pony.
I believe that would cover a good portion of the relevant design space.&lt;/p&gt;
&lt;p&gt;Anyway, I need to wrap up for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="NABTO"></category><category term="Koka"></category></entry><entry><title>Weekly Roundup 2022-10-11</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-10-11" rel="alternate"></link><published>2022-10-11T04:00:00-04:00</published><updated>2022-10-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-10-11:/weekly-roundup-2022-10-11</id><summary type="html">&lt;p class="first last"&gt;It's probably going to take at least a few more weeks before I can be properly proud of MOTR's quality.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I took care of some confusing names in MOTR's core.&lt;/li&gt;
&lt;li&gt;Thursday: I updated a type definition and set myself up to fix code for quite a while.&lt;/li&gt;
&lt;li&gt;Friday: I got most of the way (or possibly just &amp;quot;most of the way&amp;quot;, I don't quite remember) fixing the type errors.&lt;/li&gt;
&lt;li&gt;Saturday: I fixed up the types, and set myself the next level of work: fixing the &lt;em&gt;tests&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Sunday: I finished a few other sundry checks and got to work prioritizing other tasks.&lt;/li&gt;
&lt;li&gt;Monday: I drilled down from that into prioritizing the TODO comments littering the code.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to nail down the details on some of these TODOs.
And whatever else I feel like.
Maybe try to sketch some stuff out for NABTO.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="MOTR"></category><category term="Mypy"></category><category term="pytest"></category></entry><entry><title>Coding 2022-10-10</title><link href="https://mwchase.neocities.org/coding-2022-10-10" rel="alternate"></link><published>2022-10-10T04:00:00-04:00</published><updated>2022-10-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-10-10:/coding-2022-10-10</id><summary type="html">&lt;p class="first last"&gt;It's not a dealbreaker if I can't come up with better names, but I definitely want to try.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The first thing on that list I put together yesterday was fixing &lt;tt class="docutils literal"&gt;# TODO:&lt;/tt&gt; comments.
Instead of jumping in at random, I'm going to try to prioritize them.
Some are good to work on now, and others should go on the &amp;quot;release&amp;quot; topic once I've fixed up the coverage.&lt;/p&gt;
&lt;p&gt;Soon:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;Reconsider the name of &amp;quot;requirements&amp;quot;, at both a type and module level.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Reconsider the name of &amp;quot;registry&amp;quot;, at both a type and module level.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Rename &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;(Input|Output).path&lt;/span&gt;&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;value&lt;/tt&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Reconsider the names of &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;I was thinking of renaming &lt;tt class="docutils literal"&gt;Target&lt;/tt&gt; and related classes to &lt;tt class="docutils literal"&gt;Outcome&lt;/tt&gt;, but maybe what I want to do is call them &lt;tt class="docutils literal"&gt;Artifact&lt;/tt&gt;, or something?
I feel like any choice I make is going to have some terminological issues.
Like, &lt;tt class="docutils literal"&gt;Target&lt;/tt&gt; isn't &lt;em&gt;inaccurate&lt;/em&gt;, but doesn't communicate much.
Contrastingly, &lt;tt class="docutils literal"&gt;Artifact&lt;/tt&gt; gives a clearer picture of the general usage, but doesn't really fit some critical cases.
Looking at both of those choices, &lt;tt class="docutils literal"&gt;Outcome&lt;/tt&gt; actually just feels like a bad compromise...
Basically, this name should refer to something that can be thought of in three related contexts:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;An effect of a task that can be reasoned about in other contexts, an &lt;tt class="docutils literal"&gt;Outcome&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;A condition that must hold in order for a task to start, a &lt;tt class="docutils literal"&gt;Prerequisite&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;An externally visible result that the user can request MOTR to provide, currently a &lt;tt class="docutils literal"&gt;NamedOutcome&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Later:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Clean up the pip installer code&lt;/li&gt;
&lt;li&gt;Reconsider the name of the &lt;tt class="docutils literal"&gt;base_cmd&lt;/tt&gt; helper function.&lt;/li&gt;
&lt;li&gt;I've got a TODO in the &lt;tt class="docutils literal"&gt;parametric&lt;/tt&gt; module that I don't remember the context for what I was saying...
Basically, one of the validation helpers on the parametric metadata is meant to determine whether the metadata can be used in an &lt;tt class="docutils literal"&gt;InputAccumulator&lt;/tt&gt;.
The case in question triggers when the &lt;tt class="docutils literal"&gt;multivalue_labels&lt;/tt&gt; field has a non-&lt;tt class="docutils literal"&gt;None&lt;/tt&gt; value.
When that field has a non-&lt;tt class="docutils literal"&gt;None&lt;/tt&gt; value, that means it contains a collection of labels.
No labels &lt;em&gt;except for&lt;/em&gt; the ones in that collection are allowed to take more than one.
That means it's acceptable for the &lt;tt class="docutils literal"&gt;InputAccumulator&lt;/tt&gt; to accumulate more labels, as long as ultimately, only the &lt;tt class="docutils literal"&gt;multivalue_labels&lt;/tt&gt; take on multiple values.
I &lt;em&gt;think&lt;/em&gt; that means I can just remove the branch that emits the message?
Maybe?&lt;/li&gt;
&lt;li&gt;Speaking of &lt;tt class="docutils literal"&gt;InputAccumulator&lt;/tt&gt;...
Oh yeah, I added a bunch of classes and protocols, and now I don't know if my terminology makes any sense.
But anyway, the only TODO comment I have in there is, &lt;em&gt;I think&lt;/em&gt;, about how I'm calling a validation helper where the name of the helper doesn't match the context it's called in, which implies that I need to reconsider the name of the &lt;tt class="docutils literal"&gt;not_flex_out_because()&lt;/tt&gt; helper, or write an explanatory comment justifying its usage.&lt;/li&gt;
&lt;li&gt;There's a pretty basic and more-or-less self-explanatory TODO in &lt;tt class="docutils literal"&gt;parametric_command&lt;/tt&gt; that's waiting for proper test coverage.&lt;/li&gt;
&lt;li&gt;Bonus thought: &lt;tt class="docutils literal"&gt;cli_types&lt;/tt&gt; doesn't seem like a good name?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I can make some of the &amp;quot;soon&amp;quot; changes easily enough, but others I feel like I need to take more time to consider them.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Update from the end of the night: I did the &lt;tt class="docutils literal"&gt;path&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;value&lt;/tt&gt; renames because they were trivial, but I need to give some more thought to the others.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-10-09</title><link href="https://mwchase.neocities.org/coding-2022-10-09" rel="alternate"></link><published>2022-10-09T04:00:00-04:00</published><updated>2022-10-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-10-09:/coding-2022-10-09</id><summary type="html">&lt;p class="first last"&gt;Sure, it all acts basically the same, but it's all, like, cleaner on the inside.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got MOTR to run on the new branch as well as it's going to, after fixing up &lt;em&gt;a lot&lt;/em&gt; of code and tests.
And now I'm figuring, why not just hit the rest of the TODOs next, and clean everything up as well as I can?&lt;/p&gt;
&lt;p&gt;This is a little unfortunate.
I did a bunch of work earlier today, but now I'm writing it up at the last moment, so I'm just kind of like &amp;quot;Yeah, I did a lot of stuff, a few hours ago, so it's not fresh in my mind any more.&amp;quot;&lt;/p&gt;
&lt;p&gt;I do remember that I did run into some issues with how I was doing mocking, but it was fortunately pretty isolated, and I came up with a not-great solution that's good enough.
The fundamental issue there is that I didn't have &amp;quot;code that I owned&amp;quot; at the place that I wanted to mock.
Actually, that does suggest a possibility for addressing this in a more principled way: create an internal-ish helper function that wraps the third-party code in question, and mock that.
Before I get into that, I should see if there's a better way to write the tests in question.&lt;/p&gt;
&lt;p&gt;See, one thing that I ended up discovering while I was fixing test code, is that I've let the test code kind of lag behind how I want to use this stuff, and when I make the sensible updates to make it consistent, it also gets a bit more robust to the changes I was making, which is fortunate.&lt;/p&gt;
&lt;p&gt;So, here's the general idea for what kind of changes I want to make next:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Address &lt;tt class="docutils literal"&gt;# TODO:&lt;/tt&gt;s.&lt;/li&gt;
&lt;li&gt;Re-evaluate tests.&lt;/li&gt;
&lt;li&gt;Maybe tweak the code a bit more.&lt;/li&gt;
&lt;li&gt;Address all pylint messages.
(Possibly by adding more ignores.)&lt;/li&gt;
&lt;li&gt;Set up documentation generation.&lt;/li&gt;
&lt;li&gt;Develop plan for extending test coverage on &amp;quot;release&amp;quot; topic.&lt;/li&gt;
&lt;li&gt;Execute plan, then merge to &amp;quot;future&amp;quot; and address any conflicts.&lt;/li&gt;
&lt;li&gt;Cut patch release.&lt;/li&gt;
&lt;li&gt;Update motrfile from release.&lt;/li&gt;
&lt;li&gt;Merge to &amp;quot;future&amp;quot;.&lt;/li&gt;
&lt;li&gt;Cut minor release.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That seems like a lot, but all of these quality improvements should hopefully make it easier to handle writing new tests against the &amp;quot;release&amp;quot; topic's code.
Not in any kind of direct material sense, just that I won't get distracted going &amp;quot;But the code could be so much better&amp;quot;, because it &lt;em&gt;already is&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Anyway, I let things go too late, so I'm going to cut things off awkwardly and abruptly.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-10-08</title><link href="https://mwchase.neocities.org/coding-2022-10-08" rel="alternate"></link><published>2022-10-08T04:00:00-04:00</published><updated>2022-10-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-10-08:/coding-2022-10-08</id><summary type="html">&lt;p class="first last"&gt;Just needed some time to be totally sure that the easy solution was probably the right one.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, the code in MOTR passes type checking.
Now, I need to fix a whole bunch of test failures as a result of messing with all of the interfaces.&lt;/p&gt;
&lt;p&gt;It turns out that fixing the type errors wasn't too bad, because I punted on &amp;quot;how do I tell the user what went wrong in the event of a task aborting the execution?&amp;quot;.
I think the answer there is to take some of the code I wrote for the custom build task, and turn that into proper library code.&lt;/p&gt;
&lt;p&gt;Anyway, I had too much screen time today, and it's late, so I'm going to wrap up earlier than usual and try to recover.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-10-07</title><link href="https://mwchase.neocities.org/coding-2022-10-07" rel="alternate"></link><published>2022-10-07T04:00:00-04:00</published><updated>2022-10-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-10-07:/coding-2022-10-07</id><summary type="html">&lt;p class="first last"&gt;Closing in on being ready for a commit.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Another day of spotty time management.
I did, however, fix all of the easy type errors around switching MOTR to using multiplexers.
What remains now is the entry point that actually uses all of this.
I'm going to need to make some decisions about how the data &lt;em&gt;gets back out&lt;/em&gt; of the tasks, now that I've completely changed how it's handled inside them.
This might need some new helper methods, we'll see.&lt;/p&gt;
&lt;p&gt;Anyway, progress, that's good.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-10-06</title><link href="https://mwchase.neocities.org/coding-2022-10-06" rel="alternate"></link><published>2022-10-06T04:00:00-04:00</published><updated>2022-10-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-10-06:/coding-2022-10-06</id><summary type="html">&lt;p class="first last"&gt;After this, I might finally try to fix signals just to get that over with.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I messed up time management, so let's see if there's anything I can do quickly.&lt;/p&gt;
&lt;p&gt;Well, I can update the type definitions of a &lt;tt class="docutils literal"&gt;Task&lt;/tt&gt; and break everything...&lt;/p&gt;
&lt;p&gt;And now everything is broken, but it looks like generally a pretty simple fix.
One thing I've held off on is deciding whether or not the &lt;tt class="docutils literal"&gt;Execution.multiplexer&lt;/tt&gt; field should have a default.
I can't think of a reason not to, but I want to hold off from committing to it for now.&lt;/p&gt;
&lt;p&gt;So, plan for tomorrow:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Fix the messages out of Mypy.
This will be interesting in terms of fixing the callers into the code, because I've just completely changed the interface for retrieving completed streams.&lt;/li&gt;
&lt;li&gt;Decide whether I want to default the multiplexer field.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once those are taken care of, it's time to start documenting until I find something that offends my sensibilities again.&lt;/p&gt;
&lt;p&gt;Anyway, it's way too late and I'm going to try to get ready for bed as soon as I can.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-10-05</title><link href="https://mwchase.neocities.org/coding-2022-10-05" rel="alternate"></link><published>2022-10-05T04:00:00-04:00</published><updated>2022-10-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-10-05:/coding-2022-10-05</id><summary type="html">&lt;p class="first last"&gt;The chaos is settling down, for the moment.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, let's see...
I completed a round of renaming, but I still want to work through more.&lt;/p&gt;
&lt;p&gt;Right now, I'm trying to figure out what to name two internal and low-level classes, because the current names are really unintuitive.&lt;/p&gt;
&lt;p&gt;Basically, one class represents, I guess, the ambient state of a single run of MOTR, relating the registry, a reporting interface, the results, and a reference to each running task.
Later, it'll have a stream multiplexer attached to it.&lt;/p&gt;
&lt;p&gt;That class uses another class as a helper.
The point of the helper class is to wrap a bunch of helpful boilerplate around the execution of a task; this makes it easier to write task classes or functions, because there's no reason to change this behavior, so third-party (ish) code shouldn't be responsible for implementing it.&lt;/p&gt;
&lt;p&gt;I ended up calling them &lt;tt class="docutils literal"&gt;Execution&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Step&lt;/tt&gt;, and renaming some internal classes.
The results are leaps and bounds beyond what there was before, which were the same names as related, but &lt;em&gt;completely different&lt;/em&gt; classes elsewhere in the application.
(Some of those classes were also renamed, but just making the name unique wasn't enough.)&lt;/p&gt;
&lt;p&gt;That's some good work for today, but there are many more passes to do.
Before I move around, I should probably work on beefing up the documentation here to make sure I still like the names after I've tried to really use them.&lt;/p&gt;
&lt;p&gt;Anyway, it's late and I want to wrap up for tonight, so...&lt;/p&gt;
&lt;p&gt;Bye.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Weekly Roundup 2022-10-04</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-10-04" rel="alternate"></link><published>2022-10-04T04:00:00-04:00</published><updated>2022-10-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-10-04:/weekly-roundup-2022-10-04</id><summary type="html">&lt;p class="first last"&gt;I did stuff! Some of it was probably not worth the opportunity cost in, like, sleep.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: Now that I can make any change to MOTR that I want to, without worrying about breaking the motrfile, I fixed what is basically a tiny cosmetic issue with the code.&lt;/li&gt;
&lt;li&gt;Thursday: I started laying out the types that I want to use with MOTR going forward.&lt;/li&gt;
&lt;li&gt;Friday: I realized that I wasn't &lt;em&gt;done&lt;/em&gt; laying that stuff out.&lt;/li&gt;
&lt;li&gt;Saturday: I fixed the most obvious issues I saw with my initial ideas there.&lt;/li&gt;
&lt;li&gt;Sunday: I, unfortunately, did things all at the wrong time, but I put together a prototype of those new classes.&lt;/li&gt;
&lt;li&gt;Monday: I took the time to figure out what was &lt;em&gt;definitely&lt;/em&gt; wrong with that code that I prototyped as fast as I could, late at night.
Then I started renaming classes and attributes in the broader codebase.
Everything in this topic is all messed up, but that's what it's &lt;em&gt;for&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to continue on with the cleanup, and hopefully &lt;em&gt;try&lt;/em&gt; to handle screentime and sleep better.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-10-03</title><link href="https://mwchase.neocities.org/coding-2022-10-03" rel="alternate"></link><published>2022-10-03T04:00:00-04:00</published><updated>2022-10-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-10-03:/coding-2022-10-03</id><summary type="html">&lt;p class="first last"&gt;I think some of this is not getting a good night's sleep after the latest round of vaccines.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;MOTR status: I fixed the obvious issues with the code I prototyped last night, and then I got excited about doing renames, and everything is broken, but I'm already happy with how it'll be when I get it to &lt;em&gt;stop&lt;/em&gt; being broken.&lt;/p&gt;
&lt;p&gt;I'm not going to try to push this past the hour mark, so that's about it.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-10-02</title><link href="https://mwchase.neocities.org/coding-2022-10-02" rel="alternate"></link><published>2022-10-02T04:00:00-04:00</published><updated>2022-10-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-10-02:/coding-2022-10-02</id><summary type="html">&lt;p class="first last"&gt;I'll be honest, I can't think of anything to say here, and the actual post isn't doing much better.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Quick status update on MOTR, because my time management is backsliding.&lt;/p&gt;
&lt;p&gt;I've drafted out the improved ideas I had for the multiplexed stream stuff.
It all looks like it should mostly work, and my goal now is to make that statement less qualified.
I need tests of the behavior, that cover all of the ways things could go wrong.&lt;/p&gt;
&lt;p&gt;I think there are also some edge cases that I'm not properly handling, because I'm not sure what properly handling them looks like.&lt;/p&gt;
&lt;p&gt;It probably wasn't the best decision to put in all of this work so late at night, but I wanted stuff to be put together and working &lt;em&gt;now&lt;/em&gt;, dangit.&lt;/p&gt;
&lt;p&gt;Anyway, no point in messing around any longer.
I'll try to explain what I did in proper detail later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-10-01</title><link href="https://mwchase.neocities.org/coding-2022-10-01" rel="alternate"></link><published>2022-10-01T04:00:00-04:00</published><updated>2022-10-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-10-01:/coding-2022-10-01</id><summary type="html">&lt;p class="first last"&gt;Taking things a bit slow, partly because I didn't get very good sleep last night.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, after I published yesterday's entry, I spent some time thinking, and found a way to make the public interface nicer, and the internal interface easier to implement.&lt;/p&gt;
&lt;p&gt;So, the other side of things is how to set up the &lt;tt class="docutils literal"&gt;ReceiveStream&lt;/tt&gt; interface.
I was testing earlier today, and attrs classes, even frozen ones, appear to work fine as keys of &lt;tt class="docutils literal"&gt;WeakKeyDictionary&lt;/tt&gt;s
So, that'll work for my purposes, in concert with a few other options.&lt;/p&gt;
&lt;p&gt;I don't have time to try this stuff out right now, since there are some other things planned for tonight, but I should be able to put it all together by tomorrow afternoon.&lt;/p&gt;
&lt;p&gt;For now, I'm going to take things easy, as planned.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-09-30</title><link href="https://mwchase.neocities.org/coding-2022-09-30" rel="alternate"></link><published>2022-09-30T04:00:00-04:00</published><updated>2022-09-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-09-30:/coding-2022-09-30</id><summary type="html">&lt;p class="first last"&gt;Try something out. Instantly encounter problems.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I tried to dive right into the stream multiplexer stuff, and I discovered that my initial sketch of a design has... problems.
So far, I've identified two major things that need to be addressed.&lt;/p&gt;
&lt;p&gt;One is that I'm trying to express the underlying keys in terms of tuples of strings, but the public interface in terms of strings.
So does the protocol just, like, have methods with &lt;em&gt;both&lt;/em&gt; signatures?&lt;/p&gt;
&lt;p&gt;The other is that I hadn't thought too hard about how to implement &amp;quot;a &lt;tt class="docutils literal"&gt;trio.abc.ReceiveStream&lt;/tt&gt; subclass where instances are backed by a concrete multiplexer, and each instance pulls from the same memoized bytes, keeps track of its place, and awaits more data if it reaches the end&amp;quot;.&lt;/p&gt;
&lt;p&gt;I've got some ideas here, but I don't think they're going to come together in the next few minutes, so I'm just going to sleep on this for a bit.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-09-29</title><link href="https://mwchase.neocities.org/coding-2022-09-29" rel="alternate"></link><published>2022-09-29T04:00:00-04:00</published><updated>2022-09-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-09-29:/coding-2022-09-29</id><summary type="html">&lt;p class="first last"&gt;Still working on finding the right pace, but at least I can ramble.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I had some fun yesterday, time to have a bit more.&lt;/p&gt;
&lt;p&gt;Right now, the definition I want to mess with is &lt;tt class="docutils literal"&gt;RuntimeAction = &lt;span class="pre"&gt;typing.Callable[[],&lt;/span&gt; typing.Awaitable[tuple[_result.Result, typing.Mapping[str, &lt;span class="pre"&gt;str]]]]&lt;/span&gt;&lt;/tt&gt;.
I want it to look more like &lt;tt class="docutils literal"&gt;Task = &lt;span class="pre"&gt;typing.Callable[[Something],&lt;/span&gt; typing.Awaitable[_result.Result]]&lt;/tt&gt;, where &lt;tt class="docutils literal"&gt;Something&lt;/tt&gt; is an interface that takes a stream name and a stream.&lt;/p&gt;
&lt;p&gt;So, since this stuff is pretty tightly wedded to trio internals, then we have that the &amp;quot;stream&amp;quot; argument must be a &lt;tt class="docutils literal"&gt;trio.abc.ReceiveStream&lt;/tt&gt;, and there are a few operations that I want to support using them.
One is for calling code to enter a stream name, and block until that stream completes, then cache and return the result.
The other is to have some kind of &amp;quot;wrapper&amp;quot; implementation of the interface, that has a &amp;quot;prefix&amp;quot; that it adds to calls of the underlying implementation.
So, let's suppose that stream names are non-empty tuples of strings.&lt;/p&gt;
&lt;p&gt;And...&lt;/p&gt;
&lt;p&gt;I got distracted by other things.
So, let's plan this for later:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;New module defining the interface, and two implementations:
Concrete and wrapper.&lt;/li&gt;
&lt;li&gt;Interface handles associating the streams to a key, and caching their data.
Consumers of the interface &lt;em&gt;should not&lt;/em&gt; interact with the stream directly after they pass it in.&lt;/li&gt;
&lt;li&gt;Call it &lt;tt class="docutils literal"&gt;StreamMultiplexer&lt;/tt&gt; or something.&lt;/li&gt;
&lt;li&gt;The module goes in &lt;tt class="docutils literal"&gt;core&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I think this all makes sense.
At least, I think so now.
We'll see about later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-09-28</title><link href="https://mwchase.neocities.org/coding-2022-09-28" rel="alternate"></link><published>2022-09-28T04:00:00-04:00</published><updated>2022-09-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-09-28:/coding-2022-09-28</id><summary type="html">&lt;p class="first last"&gt;Nice to get rid of these lines that I didn't write, that don't do anything useful. A little annoying that I didn't notice they were there for quite some time.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, making changes to the future branch of MOTR.
I could work on the documentation, or I could address some bits in the code that just annoy me when I think about them...&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gh"&gt;diff --git a/src/motr/motr_app.py b/src/motr/motr_app.py&lt;/span&gt;
&lt;span class="gd"&gt;--- a/src/motr/motr_app.py&lt;/span&gt;
&lt;span class="gi"&gt;+++ b/src/motr/motr_app.py&lt;/span&gt;
&lt;span class="gu"&gt;@@ -15,7 +15,6 @@ if typing.TYPE_CHECKING:&lt;/span&gt;

&lt;span class="w"&gt; &lt;/span&gt;# configuration defaults
&lt;span class="w"&gt; &lt;/span&gt;CONFIG = init_defaults(&amp;quot;motr&amp;quot;)
&lt;span class="gd"&gt;-CONFIG[&amp;quot;motr&amp;quot;][&amp;quot;foo&amp;quot;] = &amp;quot;bar&amp;quot;&lt;/span&gt;


&lt;span class="w"&gt; &lt;/span&gt;class MOTR(App):
&lt;span class="gh"&gt;diff --git a/src/motr/templates/command1.jinja2 b/src/motr/templates/command1.jinja2&lt;/span&gt;
deleted file mode 100644
&lt;span class="gd"&gt;--- a/src/motr/templates/command1.jinja2&lt;/span&gt;
&lt;span class="gi"&gt;+++ /dev/null&lt;/span&gt;
&lt;span class="gu"&gt;@@ -1,4 +0,0 @@&lt;/span&gt;
&lt;span class="gd"&gt;-&lt;/span&gt;
&lt;span class="gd"&gt;-Example Template (templates/command1.jinja2)&lt;/span&gt;
&lt;span class="gd"&gt;-&lt;/span&gt;
&lt;span class="gd"&gt;-Foo =&amp;gt; {{ foo }}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Aw, yeah, that's the good stuff.&lt;/p&gt;
&lt;p&gt;The next thing I'd really like to look into is fixing up the signal handling interactions, but that could take a while and it's late, so instead, I'll figure out what I want to focus on first.
Probably the revamp of runtime actions/tasks/whatever.
That should be fiddly, and break everything before making it better, and I want to be sure it actually works.&lt;/p&gt;
&lt;p&gt;First I get that working, then I get it documented.
Then I start documenting things one level up.&lt;/p&gt;
&lt;p&gt;For now, I'm going to wind down for a while.
Still working on getting a good schedule together...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Weekly Roundup 2022-09-27</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-09-27" rel="alternate"></link><published>2022-09-27T04:00:00-04:00</published><updated>2022-09-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-09-27:/weekly-roundup-2022-09-27</id><summary type="html">&lt;p class="first last"&gt;I finally got tired of putting off fixing the names.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I planned out a more general way of creating &amp;quot;enums&amp;quot; for the Lox interpreter.&lt;/li&gt;
&lt;li&gt;Thursday: I did a little work on that plan.&lt;/li&gt;
&lt;li&gt;Friday: I got back to MOTR, and investigated the coverage gaps.&lt;/li&gt;
&lt;li&gt;Saturday: I tried to come up with a good way to address some coverage gaps.&lt;/li&gt;
&lt;li&gt;Sunday: I tried to come up with a different way. When I tried actually plugging the gap, the result did not bring me joy, which kind of calls into question how helpful these &amp;quot;helpers&amp;quot; are.&lt;/li&gt;
&lt;li&gt;Monday: I decided to change tack a bit, by documenting the code as I want it to be, and introducing changes to the release-like code that accord with insights I gain from documentation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to slowly work on spinning up documentation stuff.
And maybe get back to Crafting Interpreters.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Coding"></category></entry><entry><title>Coding 2022-09-26</title><link href="https://mwchase.neocities.org/coding-2022-09-26" rel="alternate"></link><published>2022-09-26T04:00:00-04:00</published><updated>2022-09-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-09-26:/coding-2022-09-26</id><summary type="html">&lt;p class="first last"&gt;Thinking I'm wrestling with Mercurial, when actually I'm wrestling with &lt;em&gt;my intuitions&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was thinking about how bad it feels that I'm trying to push through covering code that I no longer fully understand, &lt;em&gt;but&lt;/em&gt;, if I try to make the code clearer, that means breaking internal compatibility post-release, until I re-update my motrfile.&lt;/p&gt;
&lt;p&gt;So, I can't update my code if I don't understand it, but I can't make it understandable without updating it.&lt;/p&gt;
&lt;p&gt;Right now, I'm going to see if I can make a way around that conflict.&lt;/p&gt;
&lt;p&gt;First off, I'm considering full test coverage non-negotiable.
I find horrible bugs in non-covered lines shamefully often, so I'm going to keep that check on.&lt;/p&gt;
&lt;p&gt;Now, going forward, I want full Pylint runs.&lt;/p&gt;
&lt;p&gt;But here's the thing I'm going to try changing: I'm going to develop in multiple topics.
Here's what I'm thinking:
I branch a &amp;quot;future&amp;quot; topic off of the current horribly bloated main development topic.
In that topic, I focus on documentation and code updates.
Whenever I properly understand some high-level code, I switch back to the topic I'm on now, which is called, um, &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;input-map&lt;/span&gt;&lt;/tt&gt;, and appears to contain... the majority of the commits in the repository... and is nearly a year old.&lt;/p&gt;
&lt;p&gt;All right, so &lt;em&gt;first&lt;/em&gt; I'm going to try to close out the related bugs, make a tracking issue for test coverage, and make a new topic based off that.
I'll disable pylint in the test-coverage branch, then make the &amp;quot;future&amp;quot; branch, and re-enable pylint there.
This new topic is for source code changes only.
Increases to test coverage go in the test coverage topic, and then get merged into future.
The desired end state is that both topics pass MOTR completely, and future is descended from every commit in test coverage.
That way, I can cut an 0.1.6 release from test coverage, then create a new tracking issue to update the motrfile.
Merge that into future, address the conflicts, and cut 0.2.0 from the future, turning it into the past!&lt;/p&gt;
&lt;p&gt;It couldn't be simpler!
... To gloss over a large amount of work, especially for just one developer, but whatever, I feel better about this plan than about what I was doing before.&lt;/p&gt;
&lt;p&gt;Let's break this down a little.
Regardless of what I do in the medium term, it can only improve things to clean up the state of the issue tracker and get the towncrier files in order.
I'm going to just list the bugs it looks like I need to close out:&lt;/p&gt;
&lt;p&gt;51 through 55 are questionable, and I'd rather put them in the 0.2.0 push, in that I've started on them, but I'm not &lt;em&gt;entirely&lt;/em&gt; done until the motrfile is rewritten.
Note that this is excepting 53, which is &lt;em&gt;complete&lt;/em&gt;, and the thing that the current topic is &lt;em&gt;named after&lt;/em&gt;.
I also haven't done 66, and that kind of needs to happen at some point.&lt;/p&gt;
&lt;p&gt;56, 57, technically 58, technically 59, 60, 62, 63, 64, 65 I think, 77 is started but I'll be able to do much better when I bump the Python version requirement.&lt;/p&gt;
&lt;p&gt;So, it'll be pretty quick to get that housekeeping done, so I'll take care of it now...&lt;/p&gt;
&lt;p&gt;On further reflection, I ended up only marking a few issues as properly done, but I should be able to move forward now.&lt;/p&gt;
&lt;p&gt;Okay, I made the topics, and... I am having trouble.
I forget how to make changes show up in multiple topics, or if that even makes sense, so let's see...&lt;/p&gt;
&lt;p&gt;I'm very confused, and this might not be an intended workflow.
A bunch of things I tried didn't work, so let's see if I can reason my way to something that does.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Dangit.
I was doing everything fine, but I was getting tripped up because the &amp;quot;future&amp;quot; branch is labeled with its issue number, and I &lt;em&gt;already had&lt;/em&gt; a documentation issue, so I just used that, so the merge commit is &lt;em&gt;supposed to&lt;/em&gt; be in the lower number topic.
This will mess something up at some point, I guess.&lt;/p&gt;
&lt;p&gt;But yeah, this all seems to work the way I wanted it to, when I'm not making it overly fancy and confusing myself.&lt;/p&gt;
&lt;p&gt;I think I've been trying to pack too much work into my days, so I'm going to space things out.&lt;/p&gt;
&lt;p&gt;All right, time to wrap up.
Next time I get to work on this stuff, I'm going to try out some rewrites I've had in my back pocket for months, just waiting for a chance to mess with.&lt;/p&gt;
&lt;p&gt;Anyway, I should start winding down now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-09-25</title><link href="https://mwchase.neocities.org/coding-2022-09-25" rel="alternate"></link><published>2022-09-25T04:00:00-04:00</published><updated>2022-09-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-09-25:/coding-2022-09-25</id><summary type="html">&lt;p class="first last"&gt;Well, that was a bit disappointing...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;With the benefit of a good night's sleep, I realize that it doesn't really make sense for MOTR to support flake8-json, so my next guess for &amp;quot;what is this helper function for&amp;quot; is a pytest plugin of some kind.&lt;/p&gt;
&lt;p&gt;Ideally I wouldn't be do this kind of guesswork because I would have &lt;em&gt;written down my reasoning somewhere I can find it&lt;/em&gt;, but the best I can do is to try to come up with a plan to avoid this scenario in the future.&lt;/p&gt;
&lt;p&gt;Anyway, looks like there are a bunch of candidates in terms of Pytest plugins...
Do I see anything I like...&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;pytest-codestyle&lt;/span&gt;&lt;/tt&gt; isn't something I'd use, but it fits with how MOTR works better than other things I've looked at.&lt;/p&gt;
&lt;p&gt;Hm...&lt;/p&gt;
&lt;p&gt;The integration looks good in terms of what the code does, but using these interfaces is horribly awkward, which is on me, either then, or now.&lt;/p&gt;
&lt;p&gt;It's a pain, but I don't think I can progress on this unless I get the documentation written so I can see a summary of how and why any of this stuff is supposed to be used.&lt;/p&gt;
&lt;p&gt;I don't know how much I'll get down tomorrow, but I'll maybe try it over the next week.&lt;/p&gt;
&lt;p&gt;For now, I need to wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-09-24</title><link href="https://mwchase.neocities.org/coding-2022-09-24" rel="alternate"></link><published>2022-09-24T04:00:00-04:00</published><updated>2022-09-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-09-24:/coding-2022-09-24</id><summary type="html">&lt;p class="first last"&gt;Forcing myself to do something, just, not very much.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Let's see if there are any quick hits I can do with MOTR.
For now, I'm going to sort by &lt;em&gt;least&lt;/em&gt; lines missing, and skip the Mypy plugin, as well as validation logic.
So, by those standards, the first module to hit is...
&lt;tt class="docutils literal"&gt;python_helpers&lt;/tt&gt;.
Okay, let's see what the deal is...&lt;/p&gt;
&lt;p&gt;I've got two helper things in here, and I can't remember precisely what either of them is &lt;em&gt;for&lt;/em&gt;.
One of them extends the command to be given, and the other creates a &lt;tt class="docutils literal"&gt;Static&lt;/tt&gt; containing an option for some program.&lt;/p&gt;
&lt;p&gt;With the context I'm seeing for the latter one, it looks like the point of that is to bundle up a flag and a plugin package.
I'm blanking on which thing this could be for, but it kind of sounds like a flake8 plugin might fit the bill?
Nothing really jumped out at me as &amp;quot;yes, that is what I was thinking of&amp;quot; when I checked, but &lt;a class="reference external" href="https://github.com/PyCQA/flake8-json"&gt;flake8-json&lt;/a&gt; looks like a reasonable thing to support.&lt;/p&gt;
&lt;p&gt;Sadly, time, and so I'm going to leave this for myself to work on in the morning&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-09-23</title><link href="https://mwchase.neocities.org/coding-2022-09-23" rel="alternate"></link><published>2022-09-23T04:00:00-04:00</published><updated>2022-09-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-09-23:/coding-2022-09-23</id><summary type="html">&lt;p class="first last"&gt;Carefully trying to redefine &amp;quot;late&amp;quot; to mean something sensibly earlier. Also, I forget if I already did this, but whatever.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Ugh, I didn't get things done with the Lox code today, so instead, how about I try to refresh my memory about MOTR's code on the way into the weekend?&lt;/p&gt;
&lt;p&gt;Okay, I've got thirteen files that need to have improved coverage:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;motr._api.cli.build&lt;/tt&gt;: Missing some failure paths that it's going to take either a rewrite, or some &amp;quot;interesting&amp;quot; mocking to hit...&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;motr._api.cli_types.command&lt;/tt&gt;: I think this was involved in all of the renames I wanted to do.
There are several paths missing.
Resolving &lt;tt class="docutils literal"&gt;Executable&lt;/tt&gt; values as environment variables and extra IO, and some unimplemented paths that look obvious from context...
There's also a helper function that needs to be either deleted or renamed.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;motr._api.cli_types.command_builder&lt;/tt&gt;: Missing error case, and extending an &lt;tt class="docutils literal"&gt;OptionBuilder&lt;/tt&gt;, which seems like a sensible thing to do, I think...&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;motr._api.cli_types.flex&lt;/tt&gt;: Missing unprefixed parent argument, protocol methods on some of the classes, &lt;tt class="docutils literal"&gt;FlexOut&lt;/tt&gt; with no parent.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;motr._api.cli_types.input_accumulator&lt;/tt&gt;: Missing some validation code.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;motr._api.cli_types.installer&lt;/tt&gt;: Missing some validation failures.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;motr._api.cli_types.not_output&lt;/tt&gt;: These functions are validation helpers, and just need to exercise some failure and happy paths.
Some of the names should be updated as well, which should have mercifully little fallout.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;motr._api.cli_types.parametric&lt;/tt&gt;: This is one of the major support modules for the new system.
It's mostly missing coverage on its validation paths, but it's also got partial coverage on a block that I'll need to think about how to address...&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;motr._api.cli_types.parametric_command&lt;/tt&gt;: Needs to use one of the helper classes it defines, and it's missing an error path.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;motr._api.helpers.python_helpers&lt;/tt&gt;: Missing coverage on a helper method and a helper function.
Hopefully it's not too hard to determine when they'd merit usage.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;motr._api.installers.pip&lt;/tt&gt;: This module is pulling double duty and should be pulled apart, but in any case, it's mostly missing validation, and the usage of a Python version specified as a string.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;motr.validators&lt;/tt&gt;: A validation helper that needs to raise a validation failure, have its documentation retrieved when the decorated function is documented, and when it is &lt;em&gt;not&lt;/em&gt; documented.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Outside of the main source tree, there's also some Mypy plugin code missing a branch that I'll need to know Mypy better to know if I should write a test or convert it to an assertion.&lt;/p&gt;
&lt;p&gt;Aside from the plugin code, I could probably get okay results just writing tests for the files in ascending order of absolute coverage misses.
I just need some order to work through this stuff, that makes enough sense that I don't second-guess myself.&lt;/p&gt;
&lt;p&gt;Anyway, it's late, and I want to wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-09-22</title><link href="https://mwchase.neocities.org/coding-2022-09-22" rel="alternate"></link><published>2022-09-22T04:00:00-04:00</published><updated>2022-09-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-09-22:/coding-2022-09-22</id><summary type="html">&lt;p class="first last"&gt;Frantically triaging my sleep schedule, but I still got &lt;em&gt;something&lt;/em&gt; done. Next time around, I'll try to prioritize sleep, but I panicked.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I let time get away from me today and I need to shut things down asap to recover, so I'm just going to list what I did from the stuff I laid out yesterday:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;strong&gt;Prototype of&lt;/strong&gt; helper function to create a table that adds names in order, and can optionally associate values to those names.
(Missing: special casing for numerical indices, and detection of duplicate indices.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Still to be done:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;New enum module that uses a single-shot callable table, taking an iterator.&lt;/li&gt;
&lt;li&gt;enum class&lt;/li&gt;
&lt;li&gt;Use the new enum module&lt;/li&gt;
&lt;li&gt;Use enum classes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Lua"></category><category term="Crafting Interpreters"></category><category term="Lox"></category></entry><entry><title>Coding 2022-09-21</title><link href="https://mwchase.neocities.org/coding-2022-09-21" rel="alternate"></link><published>2022-09-21T04:00:00-04:00</published><updated>2022-09-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-09-21:/coding-2022-09-21</id><summary type="html">&lt;p class="first last"&gt;If enum is so great, why isn't there an enum 2?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, let's see what I can manage for the Earley parser setup.
I'm focusing on how to represent the rules, which is basically the following structure:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;strong&gt;symbols&lt;/strong&gt; are either &lt;strong&gt;nonterminals&lt;/strong&gt; or &lt;strong&gt;terminals&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;terminals&lt;/strong&gt; are token types, and this might finally be what convinces me to try to wire up enum and class stuff.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;nonterminals&lt;/strong&gt; are keys in the rules table, where the corresponding values are &lt;strong&gt;ordered tables&lt;/strong&gt; of &lt;strong&gt;key arrays&lt;/strong&gt; mapped to &lt;strong&gt;semantic actions&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;semantic actions&lt;/strong&gt; are just callbacks that take the corresponding matches and return &lt;em&gt;something&lt;/em&gt;, which is considered to be the value of whatever matches.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Well then.
If I think I need to combine enums and classes, let's see how that looks...&lt;/p&gt;
&lt;p&gt;There are some other uses of enums that would be simplified if I could figure out some way to pass arguments to the constructor.&lt;/p&gt;
&lt;p&gt;The conclusion that I ultimately come to is that my current enum implementation is placing too much effort on semantic minimalism in the calling context.
It can express one style of things very concisely, but it's very difficult to deviate from this.&lt;/p&gt;
&lt;p&gt;I'm going to try prototyping something that requires a little more syntax, but should work better with the general code base.&lt;/p&gt;
&lt;p&gt;Hm, something's not clicking for me, and I think I need to work through some logic.
There are basically several different ways to assign values to the members of an enum:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The value is a function of just the member's name&lt;/li&gt;
&lt;li&gt;The value is a function of the member's position in the overall sequence of members&lt;/li&gt;
&lt;li&gt;The value is a function of arbitrary data associated with the member&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, if I want to keep up with my motif of &amp;quot;use iterators a bunch&amp;quot;, I could say &amp;quot;instead of a table, the enum constructor should take an iterator, that produces indices, names, and optionally values; if the value is absent, it uses the name&amp;quot;.
Then, I can split the current syntactic sugar into a table that accumulates names into an array, a normal table, and applying iterator combinators over existing iterators.&lt;/p&gt;
&lt;p&gt;Then, the question is, what combining this decomposed concept with the class code looks like.&lt;/p&gt;
&lt;p&gt;So, the New Enum doesn't take an argument, it just returns a table that can be called, exactly once.
This table, and the return value of calling it, is the enum.
It needs to be smuggled into the class creation function, so it can be marked as the type of the instances that will be created when it is called, but it needs to be delegating to the original constructor.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Create the enum constructor&lt;/li&gt;
&lt;li&gt;Allocate a local to hold the original class constructor&lt;/li&gt;
&lt;li&gt;Write a function to store the constructor in the local, and return the enum constructor&lt;/li&gt;
&lt;li&gt;Add this constructor to the class creation arguments, and then return the resulting class, which is actually the enum constructor (which is actually the enum)&lt;/li&gt;
&lt;li&gt;The caller must now invoke the constructor with an iterator that provides triples of the form &lt;tt class="docutils literal"&gt;index, name, {args}&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I guess it would kind of make sense for the enum constructor to set itself up like an ordered table, so that the &lt;tt class="docutils literal"&gt;opairs&lt;/tt&gt; function I wrote can iterate over its members in order.&lt;/p&gt;
&lt;p&gt;So, here are the things I need to write:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Helper function to create a table that adds names in order, and can optionally associate values to those names&lt;/li&gt;
&lt;li&gt;New enum module that is based around a callable-once table that takes an iterator&lt;/li&gt;
&lt;li&gt;Prove these out by replacing the existing enum usages; write any necessary helper functions&lt;/li&gt;
&lt;li&gt;New enum class module that properly combines classes and the new enum&lt;/li&gt;
&lt;li&gt;Update the usages to switch to the class-based enum&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sadly, I was a bit out of it today, so I've once again just got planning, and I don't feel like trying to actually care out these plans right now.
We'll see how tomorrow goes.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Lua"></category><category term="Crafting Interpreters"></category><category term="Lox"></category></entry><entry><title>Weekly Roundup 2022-09-20</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-09-20" rel="alternate"></link><published>2022-09-20T04:00:00-04:00</published><updated>2022-09-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-09-20:/weekly-roundup-2022-09-20</id><summary type="html">&lt;p class="first last"&gt;I decided to take things easy, which meant that my posts got generally longer. This actually makes perfect sense.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I came up with some plans for object-oriented code in my version of the Lox interpreter.&lt;/li&gt;
&lt;li&gt;Thursday: I implemented those plans.&lt;/li&gt;
&lt;li&gt;Friday: I prepared to add some runtime correctness checks to the interpreter code.&lt;/li&gt;
&lt;li&gt;Saturday: I added those checks.&lt;/li&gt;
&lt;li&gt;Sunday: I decided that I was tired of implementing top-down parsers, for this, and in general, so let's see how far I can get trying to implement an Earley parser instead.&lt;/li&gt;
&lt;li&gt;Monday: I started prototyping the support classes for implementing an Earley parser in pure Lua.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to keep up writing and publishing these posts earlier than before.
It's not, like, a miracle cure, but I think it's helping me regain my focus.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="coding"></category><category term="I can't follow tutorials apparently"></category></entry><entry><title>Coding 2022-09-19</title><link href="https://mwchase.neocities.org/coding-2022-09-19" rel="alternate"></link><published>2022-09-19T04:00:00-04:00</published><updated>2022-09-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-09-19:/coding-2022-09-19</id><summary type="html">&lt;p class="first last"&gt;One step at a time...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got some things done today.
Basically, just a prototype for a set of functions for a data structure on top of Lua tables, to store keys and values, but also to maintain insertion order.&lt;/p&gt;
&lt;p&gt;That should be part of what I need to be able to incrementally construct the grammar.
I just need to write some more functions that delegate to that as keys in a higher-order table.
And also to work out some way to represent sequences in a way that indexing is comprehensible.
I've done stuff along those lines before, but I'm going to need to think about how I want to do it.&lt;/p&gt;
&lt;p&gt;Like, I need a mapping from sequences of values to a canonical representation that (I think) needs to be able to retrieve the values.&lt;/p&gt;
&lt;p&gt;Hopefully, I'll have a plan there in a few days.
For now, I need to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Lua"></category><category term="Crafting Interpreters"></category><category term="Lox"></category></entry><entry><title>Coding 2022-09-18</title><link href="https://mwchase.neocities.org/coding-2022-09-18" rel="alternate"></link><published>2022-09-18T04:00:00-04:00</published><updated>2022-09-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-09-18:/coding-2022-09-18</id><summary type="html">&lt;p class="first last"&gt;I feel like my excuse is slightly better this time, but only slightly.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was thinking pretty hard about trying to beef up my &lt;tt class="docutils literal"&gt;enum&lt;/tt&gt; function, but initial efforts didn't work, and I decided that trying to combine enums and classes wasn't worth it for now.&lt;/p&gt;
&lt;p&gt;Anyway, then I spent most of today in a haze, so I didn't get much else done before now.
I have concluded that I want to change up the stuff that I try to do relative to the tutorial, not because I refuse to do things that way because I know better, but because I've &lt;em&gt;done&lt;/em&gt; things that way, and I want a change of pace.&lt;/p&gt;
&lt;p&gt;So, I'm trying to figure out what it would take to parse Lox with an Earley parser instead of recursive descent.&lt;/p&gt;
&lt;p&gt;Now, I tried to get some hands-on experience with Earley parsers, um, at the beginning of &lt;em&gt;this year&lt;/em&gt;, apparently...
Based on &lt;a class="reference external" href="https://loup-vaillant.fr/tutorials/earley-parsing/"&gt;this series&lt;/a&gt;, which I'll be working from again.&lt;/p&gt;
&lt;p&gt;I'm going to take things as they go, so maybe I'll get stuff done tonight, but what I want most is to &lt;em&gt;plan&lt;/em&gt; this stuff properly.&lt;/p&gt;
&lt;p&gt;Let's see what the current Lox expression grammar looks like in Earley parser terms:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;expression &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; equality&lt;/tt&gt; (identity)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;equality &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; equality &lt;span class="pre"&gt;[&amp;quot;!=&amp;quot;&lt;/span&gt; &lt;span class="pre"&gt;&amp;quot;==&amp;quot;]&lt;/span&gt; comparison&lt;/tt&gt; (expr.binary)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;equality &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; comparison&lt;/tt&gt; (identity)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;comparison &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; comparison &lt;span class="pre"&gt;[&amp;quot;&amp;gt;&amp;quot;&lt;/span&gt; &lt;span class="pre"&gt;&amp;quot;&amp;gt;=&amp;quot;&lt;/span&gt; &amp;quot;&amp;lt;&amp;quot; &lt;span class="pre"&gt;&amp;quot;&amp;lt;=&amp;quot;]&lt;/span&gt; term&lt;/tt&gt; (expr.binary)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;comparison &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; term&lt;/tt&gt; (identity)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;term &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; term &lt;span class="pre"&gt;[&amp;quot;+&amp;quot;&lt;/span&gt; &lt;span class="pre"&gt;&amp;quot;-&amp;quot;]&lt;/span&gt; factor&lt;/tt&gt; (expr.binary)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;term &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; factor&lt;/tt&gt; (identity)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;factor &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; factor &lt;span class="pre"&gt;[&amp;quot;/&amp;quot;&lt;/span&gt; &lt;span class="pre"&gt;&amp;quot;*&amp;quot;]&lt;/span&gt; unary&lt;/tt&gt; (expr.binary)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;factor &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; unary&lt;/tt&gt; (identity)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;unary &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="pre"&gt;[&amp;quot;!&amp;quot;&lt;/span&gt; &lt;span class="pre"&gt;&amp;quot;-&amp;quot;]&lt;/span&gt; unary&lt;/tt&gt; (expr.unary)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;unary &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; primary&lt;/tt&gt; (identity)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;primary &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; NUMBER&lt;/tt&gt; (identity)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;primary &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; STRING&lt;/tt&gt; (identity)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;primary &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; [&amp;quot;true&amp;quot; &amp;quot;false&amp;quot; &amp;quot;nil&amp;quot;]&lt;/tt&gt; (identity)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;primary &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; &amp;quot;(&amp;quot; expression &amp;quot;)&amp;quot;&lt;/tt&gt; (expr.grouping or just identity, except it has to discard the parentheses)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Basically, each rule is going to be a non-terminal symbol on the left-hand-side, zero or more symbols on the right-hand-side, and a callback to construct the expression once it knows it has a parse.&lt;/p&gt;
&lt;p&gt;(Now, if I can get all of this to work, that means I can drop the final &amp;quot;accumulate&amp;quot; step from the scanner and build everything in an iterator.)&lt;/p&gt;
&lt;p&gt;Actually, to make this parse totally work, I do need to &lt;em&gt;handle&lt;/em&gt; the EOF token somehow...&lt;/p&gt;
&lt;p&gt;Anyway, I let this go too late, so I'm going to cut this here, and think about how to handle the data structures later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Lua"></category><category term="Crafting Interpreters"></category><category term="Lox"></category></entry><entry><title>Coding 2022-09-17</title><link href="https://mwchase.neocities.org/coding-2022-09-17" rel="alternate"></link><published>2022-09-17T04:00:00-04:00</published><updated>2022-09-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-09-17:/coding-2022-09-17</id><summary type="html">&lt;p class="first last"&gt;The code is longer now, but at least it's all optional...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've wired in a bunch of the stuff I was working on yesterday, and so now the interpreter code has a bunch of run-time correctness checks.
Getting those checks in means that the code is relatively more verbose.
It turns out I don't get to flex &lt;em&gt;as hard&lt;/em&gt; on Java if I try to actually deliver all of the functionality that the book's code is relying on.&lt;/p&gt;
&lt;p&gt;It occurs to me that, if I put in the work to rework things in a... somewhat confusing way, I can fit my &amp;quot;enum&amp;quot; code into the paradigm of my &amp;quot;class&amp;quot; code, and then I'd get access to isinstance checks for enums.&lt;/p&gt;
&lt;p&gt;Anyway, I can't do that right now, because I've got too much else that I want to do right now.
Hopefully I'll get it all together tomorrow.
I'll at least try to plan things out after I post this.
Once this is either implemented or scrapped, I'll try to get into the parser.
I'm not ready to mess with that yet.&lt;/p&gt;
&lt;p&gt;Anyway, best wrap things up over here.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Lua"></category><category term="Crafting Interpreters"></category><category term="Lox"></category></entry><entry><title>Coding 2022-09-16</title><link href="https://mwchase.neocities.org/coding-2022-09-16" rel="alternate"></link><published>2022-09-16T04:00:00-04:00</published><updated>2022-09-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-09-16:/coding-2022-09-16</id><summary type="html">&lt;p class="first last"&gt;Me working with my own code: &amp;quot;These precious and delicate flowers must be protected from external mutation.&amp;quot; Me working with other people's code: &amp;quot;So, I figured out how to install an unoptimized package so I could write breakpoints into the code in site-packages.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Reverse Polish Notation challenge is complete... ish...
I didn't think of a way to disambiguate how many arguments an operator takes, so I just didn't implement the unary case.&lt;/p&gt;
&lt;p&gt;I'm reading over stuff on parsing, and I'm not sure how exactly I want to handle it.
It seems like I could set things up internally in a similar manner to the scanner, but I can't really give &amp;quot;function that produces a tree&amp;quot; an iterator interface in this context, so it might look kind of weird(er).&lt;/p&gt;
&lt;p&gt;Anyway, I want to finish up soon, so I'm just going to try to tweak the interface for contracts, and add &amp;quot;decorator&amp;quot; support to classes if I get that done quickly.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, contracts interface tweak went fine.
Now for class decoration.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, that code seems to be in place.
My priority over the next few days is to shore up contract usage over the codebase.
I may also want to add a &lt;tt class="docutils literal"&gt;destructured&lt;/tt&gt; higher-order-function so I can skip some explicit destructurings in the protocol methods.&lt;/p&gt;
&lt;p&gt;Actually, one last module to add, won't even test it yet, and then I'll post.
It's a thing for generating read-only proxies around tables.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, that's all set for now, but I need, like, a spell-checker for metatable fields :/&lt;/p&gt;
&lt;p&gt;Enough messing around, time to publish and work on the other stuff I want to get done.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Lua"></category><category term="Crafting Interpreters"></category><category term="Lox"></category></entry><entry><title>Coding 2022-09-15</title><link href="https://mwchase.neocities.org/coding-2022-09-15" rel="alternate"></link><published>2022-09-15T04:00:00-04:00</published><updated>2022-09-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-09-15:/coding-2022-09-15</id><summary type="html">&lt;p class="first last"&gt;I flex on Java. I'm pretty sure nothing that can in any way be thought of as representing Java cares.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, good work, me.&lt;/p&gt;
&lt;p&gt;I've got a basic single-dispatch multi-function-y thing with no inheritance.
Nice and lean.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Like, I know it's not &lt;em&gt;fair&lt;/em&gt; to compare my Lua version to the Java version, since the Java code is constrained for pedagogical reasons, but it takes less Lua code to put together the functionality I need &lt;em&gt;from scratch&lt;/em&gt; than it does to force Java to sort of have metaprogramming.
Just look:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;
&lt;span class="normal"&gt;22&lt;/span&gt;
&lt;span class="normal"&gt;23&lt;/span&gt;
&lt;span class="normal"&gt;24&lt;/span&gt;
&lt;span class="normal"&gt;25&lt;/span&gt;
&lt;span class="normal"&gt;26&lt;/span&gt;
&lt;span class="normal"&gt;27&lt;/span&gt;
&lt;span class="normal"&gt;28&lt;/span&gt;
&lt;span class="normal"&gt;29&lt;/span&gt;
&lt;span class="normal"&gt;30&lt;/span&gt;
&lt;span class="normal"&gt;31&lt;/span&gt;
&lt;span class="normal"&gt;32&lt;/span&gt;
&lt;span class="normal"&gt;33&lt;/span&gt;
&lt;span class="normal"&gt;34&lt;/span&gt;
&lt;span class="normal"&gt;35&lt;/span&gt;
&lt;span class="normal"&gt;36&lt;/span&gt;
&lt;span class="normal"&gt;37&lt;/span&gt;
&lt;span class="normal"&gt;38&lt;/span&gt;
&lt;span class="normal"&gt;39&lt;/span&gt;
&lt;span class="normal"&gt;40&lt;/span&gt;
&lt;span class="normal"&gt;41&lt;/span&gt;
&lt;span class="normal"&gt;42&lt;/span&gt;
&lt;span class="normal"&gt;43&lt;/span&gt;
&lt;span class="normal"&gt;44&lt;/span&gt;
&lt;span class="normal"&gt;45&lt;/span&gt;
&lt;span class="normal"&gt;46&lt;/span&gt;
&lt;span class="normal"&gt;47&lt;/span&gt;
&lt;span class="normal"&gt;48&lt;/span&gt;
&lt;span class="normal"&gt;49&lt;/span&gt;
&lt;span class="normal"&gt;50&lt;/span&gt;
&lt;span class="normal"&gt;51&lt;/span&gt;
&lt;span class="normal"&gt;52&lt;/span&gt;
&lt;span class="normal"&gt;53&lt;/span&gt;
&lt;span class="normal"&gt;54&lt;/span&gt;
&lt;span class="normal"&gt;55&lt;/span&gt;
&lt;span class="normal"&gt;56&lt;/span&gt;
&lt;span class="normal"&gt;57&lt;/span&gt;
&lt;span class="normal"&gt;58&lt;/span&gt;
&lt;span class="normal"&gt;59&lt;/span&gt;
&lt;span class="normal"&gt;60&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;ephemeron&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;ephemeron&amp;quot;&lt;/span&gt;

&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;class_from_instance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ephemeron&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="kr"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;make_destructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;slots&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;instance_args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="kr"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="kr"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;ipairs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;slots&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;instance_args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="kr"&gt;end&lt;/span&gt;
    &lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;table.unpack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instance_args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kr"&gt;end&lt;/span&gt;
&lt;span class="kr"&gt;end&lt;/span&gt;

&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;destructors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ephemeron&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;protocol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;implementations&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;impls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ephemeron&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="kr"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="kr"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;pairs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;implementations&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;impls&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;
  &lt;span class="kr"&gt;end&lt;/span&gt;
  &lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...)&lt;/span&gt;
    &lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="n"&gt;impls&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;class_from_instance&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;]](&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...)&lt;/span&gt;
  &lt;span class="kr"&gt;end&lt;/span&gt;
&lt;span class="kr"&gt;end&lt;/span&gt;

&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;slots&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;table.move&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;

  &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;instance_meta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

  &lt;span class="kr"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="kr"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;pairs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;do&lt;/span&gt;
    &lt;span class="kr"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;string&amp;quot;&lt;/span&gt; &lt;span class="kr"&gt;then&lt;/span&gt;
      &lt;span class="n"&gt;instance_meta&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;
    &lt;span class="kr"&gt;end&lt;/span&gt;
  &lt;span class="kr"&gt;end&lt;/span&gt;

  &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="kr"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;
    &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{...}&lt;/span&gt;
    &lt;span class="kr"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="kr"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;ipairs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;slots&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="kr"&gt;end&lt;/span&gt;
    &lt;span class="n"&gt;class_from_instance&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;
    &lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;setmetatable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instance_meta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kr"&gt;end&lt;/span&gt;
  &lt;span class="n"&gt;destructors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;make_destructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;slots&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;
&lt;span class="kr"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;class&lt;/span&gt;
&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;protocol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;protocol&lt;/span&gt;

&lt;span class="kr"&gt;function&lt;/span&gt; &lt;span class="nc"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;destructure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="n"&gt;destructors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;class_from_instance&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;]](&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kr"&gt;end&lt;/span&gt;

&lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;I'm &lt;em&gt;not even using all of that code yet&lt;/em&gt;, and it's still shorter than the initial version of &lt;tt class="docutils literal"&gt;GenerateAst.java&lt;/tt&gt;.
And, of course, it's regular Lua.
That said, there are a few things I want to add.
I've got the weird &lt;tt class="docutils literal"&gt;local X = function&lt;/tt&gt; construct because I'm planning to add contract enforcement to the public API, which will add a few lines.&lt;/p&gt;
&lt;p&gt;This is all used like&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;
&lt;span class="normal"&gt;6&lt;/span&gt;
&lt;span class="normal"&gt;7&lt;/span&gt;
&lt;span class="normal"&gt;8&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;disinherit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;disinherit&amp;quot;&lt;/span&gt;

&lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;binary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;disinherit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;left&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;operator&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;right&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="n"&gt;grouping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;disinherit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;expression&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="n"&gt;literal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;disinherit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;value&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="n"&gt;unary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;disinherit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;operator&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;right&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;and&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;
&lt;span class="normal"&gt;22&lt;/span&gt;
&lt;span class="normal"&gt;23&lt;/span&gt;
&lt;span class="normal"&gt;24&lt;/span&gt;
&lt;span class="normal"&gt;25&lt;/span&gt;
&lt;span class="normal"&gt;26&lt;/span&gt;
&lt;span class="normal"&gt;27&lt;/span&gt;
&lt;span class="normal"&gt;28&lt;/span&gt;
&lt;span class="normal"&gt;29&lt;/span&gt;
&lt;span class="normal"&gt;30&lt;/span&gt;
&lt;span class="normal"&gt;31&lt;/span&gt;
&lt;span class="normal"&gt;32&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;expr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;lox/expr&amp;quot;&lt;/span&gt;

&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;printast&lt;/span&gt;

&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="kr"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;parenthesize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...)&lt;/span&gt;
  &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;(&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kr"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="kr"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;ipairs&lt;/span&gt; &lt;span class="p"&gt;{...}&lt;/span&gt; &lt;span class="kr"&gt;do&lt;/span&gt;
    &lt;span class="nb"&gt;table.insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;table.insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;printast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="kr"&gt;end&lt;/span&gt;
  &lt;span class="nb"&gt;table.insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;table.concat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kr"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;printast&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;disinherit&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;protocol&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;expr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;binary&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;binary&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="n"&gt;parenthesize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;binary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lexeme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;binary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;binary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kr"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;expr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grouping&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;grouping&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="n"&gt;parenthesize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;group&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grouping&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;expression&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kr"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;expr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;literal&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;literal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;tostring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;literal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kr"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;expr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unary&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unary&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="n"&gt;parenthesize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lexeme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kr"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="n"&gt;printast&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;I'm going to have to think about this some, because setting up contracts as-is will do Bad Things to the protocol function.
Like, if you put contracts on a constructor, as-is, that'll break protocols because now you don't have access to the base constructor.
Either the protocol method needs to have some way of getting the &amp;quot;underlying function&amp;quot;, or the &lt;tt class="docutils literal"&gt;class&lt;/tt&gt; function needs to have some way of taking an optional callback to transform the constructor before it ever gets called.
I'm inclined to do things the latter way, although, to get that ergonomic, it'd need some tweaks to the contracts interface, which is no big deal.&lt;/p&gt;
&lt;p&gt;Anyway, it's getting late, although not as late as it's gotten before, and I want to wrap up, so I'm going to post this, consider this other stuff later, and try to knock out the Reverse Polish Notation challenge tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Lua"></category><category term="Crafting Interpreters"></category><category term="Lox"></category></entry><entry><title>Coding 2022-09-14</title><link href="https://mwchase.neocities.org/coding-2022-09-14" rel="alternate"></link><published>2022-09-14T04:00:00-04:00</published><updated>2022-09-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-09-14:/coding-2022-09-14</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;I don't like the problems with this approach, so I'll invent new problems :)&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm trying something a little different today by writing this up earlier, so I have fewer excuses to stay up at night, because my sleep was just... so messed up.
Anyway, I completed the multiline comment challenge, after a few hiccups.&lt;/p&gt;
&lt;p&gt;So, next up is &amp;quot;Representing code&amp;quot;, and it's actually a good thing I'm trying to write this earlier in the day, because I'm going to need to think about how I implement this stuff this time.&lt;/p&gt;
&lt;p&gt;That's because this chapter talks about different programming paradigms and ways of laying out classes, and how to bridge gaps between different styles, and let's see how what I'm doing kind of messes with all of that...&lt;/p&gt;
&lt;p&gt;I'm implementing as little as possible when it comes to &amp;quot;object-oriented features&amp;quot;.
Currently, the way I'm writing &amp;quot;classes&amp;quot; in my code doesn't handle any reuse.
The point is more to avoid downstream consumers of an object needing to explicitly require a module to get at basic operations on that object.
Another potential motivation that would get me to write something would be if I had polymorphism; that is, if multiple kinds of object implemented the same operation in different ways
However, that's not what I'd use for what Robert Nystrom is using the visitor pattern for, for exactly the reason that he's using the visitor pattern.&lt;/p&gt;
&lt;p&gt;The other issue here is that Lua doesn't do static type-checks (unless something really fancy came out when I wasn't looking), and missing fields just resolve to &lt;tt class="docutils literal"&gt;nil&lt;/tt&gt;, so my best hope there is to error out as early as possible.&lt;/p&gt;
&lt;p&gt;Thinking about these problems, a solution begins to take shape:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&amp;quot;classes&amp;quot; somehow involves a callable constructor, which creates &amp;quot;instances&amp;quot;, and somehow provides access to the &lt;tt class="docutils literal"&gt;__index&lt;/tt&gt; table for the type of the instances.&lt;/li&gt;
&lt;li&gt;These constructors can use the contracts code I wrote earlier.&lt;/li&gt;
&lt;li&gt;Those contracts can be defined inline using a function factory that takes a key name as input.&lt;/li&gt;
&lt;li&gt;The &amp;quot;visitors&amp;quot; should be Python-style protocol functions like &lt;tt class="docutils literal"&gt;len&lt;/tt&gt;.
They should be defined &lt;em&gt;unlike&lt;/em&gt; how Python does them.
Instead, they should mostly use a table associating the constructor callable to the implementation for the instances of that callable.&lt;/li&gt;
&lt;li&gt;Just realized the &lt;tt class="docutils literal"&gt;__index&lt;/tt&gt;-like table should be an ephemeron table, which is no big deal.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The big thing I need to work out before I start writing code is, what kind of callable should the constructors be, and how it should relate to the &lt;tt class="docutils literal"&gt;__index&lt;/tt&gt; table (which need not actually hook into the metatable system in that way).&lt;/p&gt;
&lt;p&gt;Anyway, I'll ponder that for a while, and try to take things easy for the rest of the day.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Lua"></category><category term="Crafting Interpreters"></category><category term="Lox"></category></entry><entry><title>Weekly Roundup 2022-09-13</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-09-13" rel="alternate"></link><published>2022-09-13T04:00:00-04:00</published><updated>2022-09-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-09-13:/weekly-roundup-2022-09-13</id><summary type="html">&lt;p class="first last"&gt;These entries are really helpful for contextualizing to myself &lt;em&gt;when I did something&lt;/em&gt;&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I started working on Crafting Interpreters in Lua, again.&lt;/li&gt;
&lt;li&gt;Thursday: Since I'm starting fresh, I realized I could vary up my approach a little.&lt;/li&gt;
&lt;li&gt;Friday: I got some work done...&lt;/li&gt;
&lt;li&gt;Saturday: I finished the chapter, but I decided I wanted to polish the code some before moving on.&lt;/li&gt;
&lt;li&gt;Sunday: I made changes that make it possible to test the interpreter, which is convenient, since I'm using it as the entry point for all of the internals.&lt;/li&gt;
&lt;li&gt;Monday: I got everything taken care of for now, except for the challenges.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week,&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-09-12</title><link href="https://mwchase.neocities.org/coding-2022-09-12" rel="alternate"></link><published>2022-09-12T04:00:00-04:00</published><updated>2022-09-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-09-12:/coding-2022-09-12</id><summary type="html">&lt;p class="first last"&gt;I wonder if I'll end up with some kind of weird functional Lua library from all of this.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, here's the deal:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Test coverage is maxed out.&lt;/li&gt;
&lt;li&gt;Functions in the scanner module are rewritten to make more sense.
(The problems with them were all my fault.)&lt;/li&gt;
&lt;li&gt;I've gotten documentation sort of working, I think.
I'm not sure what to document, but at least I've got the infrastructure to do so.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm not feeling super excited to document the core modules, since those are potentially going to get all changed around in later chapters.
I guess I can look into documenting the supporting modules I'm writing.&lt;/p&gt;
&lt;p&gt;For now, though, I want to take things easy and get back to this later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Lua"></category><category term="Crafting Interpreters"></category><category term="Lox"></category></entry><entry><title>Coding 2022-09-11</title><link href="https://mwchase.neocities.org/coding-2022-09-11" rel="alternate"></link><published>2022-09-11T04:00:00-04:00</published><updated>2022-09-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-09-11:/coding-2022-09-11</id><summary type="html">&lt;p class="first last"&gt;I didn't work on Python stuff today because ???&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The code is a little tidier now.
I created an object to act as a proxy to the file system and the shell, and converted the interpreter to delegate to that object.
This means I should be able to test the interpreter without it trying to exit the test runner, which, maybe Lunit can stop those shenanigans, but I'd much rather just not bother.
If I can cut this off before it needs the tooling to intervene, I might as well.&lt;/p&gt;
&lt;p&gt;I fixed some errors that I introduced in the rewrite, so now the majority of this stuff basically works.&lt;/p&gt;
&lt;p&gt;What's missing:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The remainder of the test coverage&lt;ul&gt;
&lt;li&gt;General test mocks for the host system abstraction&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Documentation&lt;ul&gt;
&lt;li&gt;Figuring out what documentation should look like&lt;/li&gt;
&lt;li&gt;And whether it's compatible with my habit of returning functions instead of tables from modules.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Doing the challenges &lt;em&gt;on a branch&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, that's that for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Lua"></category><category term="Crafting Interpreters"></category><category term="Lox"></category></entry><entry><title>Coding 2022-09-10</title><link href="https://mwchase.neocities.org/coding-2022-09-10" rel="alternate"></link><published>2022-09-10T04:00:00-04:00</published><updated>2022-09-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-09-10:/coding-2022-09-10</id><summary type="html">&lt;p class="first last"&gt;I think I'm going to have to rename or reconsider some of my functions, because the relation between the meaning of the name and the behavior is... confusing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The chapter on the scanner is done, but I'm not ready to move on.
The test coverage is way too low, I hit all sorts of errors testing things manually, and there are a bunch of questionable choices that I made in the service of getting things done.&lt;/p&gt;
&lt;p&gt;I ended up writing more code to interact with Lua's native protocols, and this just feels sensible to me.
If you write code to work with an object system, then it works with that object system, but if you write code to transform iterators, then it works with &lt;em&gt;everything&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I've been tweaking things pretty hard as far as auto-formatting goes, and I'm still not really satisfied.
Currently, I'm using &lt;a class="reference external" href="https://github.com/Koihik/LuaFormatter"&gt;LuaFormatter&lt;/a&gt; with a bunch of custom configuration, which overall gives me &lt;em&gt;most&lt;/em&gt; of what I want.&lt;/p&gt;
&lt;p&gt;But yeah, I need to take a break from getting code in, and work on verifying and documenting the stuff that's in there now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Lua"></category><category term="Crafting Interpreters"></category><category term="Lox"></category></entry><entry><title>Coding 2022-09-09</title><link href="https://mwchase.neocities.org/coding-2022-09-09" rel="alternate"></link><published>2022-09-09T04:00:00-04:00</published><updated>2022-09-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-09-09:/coding-2022-09-09</id><summary type="html">&lt;p class="first last"&gt;Spacing out and then cramming is not the best strategy for anything, but it's what I did, so...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I just put together what I believe is the minimal implementation for how I want the interpreter object to work.&lt;/p&gt;
&lt;p&gt;I wasn't focusing on much stuff today, so I didn't have much time for this, and I'm dashing out this entry way too late.&lt;/p&gt;
&lt;p&gt;Tomorrow, I'll try to finish up the chapter, and if I do, I'll write tests in order to get the coverage up, and maybe try documenting some stuff.&lt;/p&gt;
&lt;p&gt;Anyway, I have to go, now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Lua"></category><category term="Crafting Interpreters"></category><category term="Lox"></category></entry><entry><title>Coding 2022-09-08</title><link href="https://mwchase.neocities.org/coding-2022-09-08" rel="alternate"></link><published>2022-09-08T04:00:00-04:00</published><updated>2022-09-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-09-08:/coding-2022-09-08</id><summary type="html">&lt;p class="first last"&gt;Trying to push my Lua code closer to the metal. The moon-metal. Whatever.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was looking over my previous code for Crafting Interpreters, and I found an interesting comment.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;-- Can this be switched to the iterator protocol?&lt;/span&gt;
&lt;span class="c1"&gt;-- Don&amp;#39;t try yet. That kind of speculative refactoring can go... poorly.&lt;/span&gt;
&lt;span class="kr"&gt;function&lt;/span&gt; &lt;span class="nc"&gt;scanner_index&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;scan_tokens&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And I thought...
It's a fresh codebase.
Why not try it now?&lt;/p&gt;
&lt;div class="admonition smiley smiley-glitchy"&gt;
&lt;p class="first admonition-title"&gt;:) (glitchy)&lt;/p&gt;
&lt;p class="last"&gt;Dewit.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;To do this right, I need to get a handle on just what this would entail.
Basically, I want to think of jlox's &lt;tt class="docutils literal"&gt;scanTokens()&lt;/tt&gt; method instead as a top-level function that takes a source string and returns a Lua iterator of tokens.
Now, the end goal (for now) is to accumulate this iterator state into a table, so I put together a little module that I think looks reasonable:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;iterator_function&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;initial_value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_closing_value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;accumulator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;control_variable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;initial_value&lt;/span&gt;
  &lt;span class="kr"&gt;while&lt;/span&gt; &lt;span class="n"&gt;control_variable&lt;/span&gt; &lt;span class="o"&gt;~=&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt; &lt;span class="kr"&gt;do&lt;/span&gt;
    &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;loop_variables&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;iterator_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;control_variable&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
    &lt;span class="n"&gt;control_variable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;loop_variables&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="kr"&gt;if&lt;/span&gt; &lt;span class="n"&gt;control_variable&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt; &lt;span class="kr"&gt;then&lt;/span&gt;
      &lt;span class="kr"&gt;break&lt;/span&gt;
    &lt;span class="kr"&gt;end&lt;/span&gt;
    &lt;span class="nb"&gt;table.insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;accumulator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;table.unpack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;loop_variables&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
  &lt;span class="kr"&gt;end&lt;/span&gt;
  &lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="n"&gt;accumulator&lt;/span&gt;
&lt;span class="kr"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;I'm not sure if I'll actually use this, but it all basically makes sense.
It essentially handles the Lua iterator protocol, and uses a function to condense the possibly-multiple return values into a single result.&lt;/p&gt;
&lt;p&gt;Anyway, the basic picture of what I'm going for with &lt;tt class="docutils literal"&gt;scan_tokens()&lt;/tt&gt; is to make that into an iterator that uses the source code as the invariant state, and packs the &lt;tt class="docutils literal"&gt;start&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;current&lt;/tt&gt;, and &lt;tt class="docutils literal"&gt;line&lt;/tt&gt; values into a table in the control variable.
Then the methods translate into functions that take arguments of &lt;tt class="docutils literal"&gt;source&lt;/tt&gt; and the control variable.&lt;/p&gt;
&lt;p&gt;Okay, that all went smoothly, except for right at the end:
The &lt;tt class="docutils literal"&gt;scanToken()&lt;/tt&gt; method reaches out to the static &lt;tt class="docutils literal"&gt;error()&lt;/tt&gt; method on the core &lt;tt class="docutils literal"&gt;Lox&lt;/tt&gt; class, and that...
It makes me feel...
I don't like doing that...&lt;/p&gt;
&lt;p&gt;Last time around, I passed the whole interpreter to the &lt;tt class="docutils literal"&gt;Scanner&lt;/tt&gt; class I wrote, so it could call the method.
And this is vaguely annoying to do with the way I wrote this, because I guess I'd need to change the state variable...&lt;/p&gt;
&lt;p&gt;Okay, updating the state variable wasn't too hard, and now there's just two things I want to do currently:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Wrap the various bits where I construct a control variable in functions, so I know where to update if I add more fields to the control variable.&lt;/li&gt;
&lt;li&gt;Make the &lt;tt class="docutils literal"&gt;Lox&lt;/tt&gt; class that the state variable needs an instance of... exist.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But I can't work on those right now, because it is late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Lua"></category><category term="Crafting Interpreters"></category><category term="Lox"></category></entry><entry><title>Coding 2022-09-07</title><link href="https://mwchase.neocities.org/coding-2022-09-07" rel="alternate"></link><published>2022-09-07T04:00:00-04:00</published><updated>2022-09-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-09-07:/coding-2022-09-07</id><summary type="html">&lt;p class="first last"&gt;Getting flashbacks to I-don't-know-how-many years ago.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I started grinding through the Scanning chapter of Crafting Interpreters, and as can be expected, there's just a bunch of &amp;quot;Okay, Java is doing this, so the rough equivalent in Lua is ...&amp;quot;&lt;/p&gt;
&lt;p&gt;I'm referring a bunch to my previous attempt, because I don't think anything was fundamentally wrong with it, I just got a little... messy.&lt;/p&gt;
&lt;p&gt;Oh, also, I got a wrapper written around one of the tools called &lt;a class="reference external" href="https://www.npmjs.com/package/lua-fmt"&gt;lua-fmt&lt;/a&gt;, so now I can write complete garbage formatting and then tell my laptop to fix it for me.
It doesn't mind.&lt;/p&gt;
&lt;p&gt;Anyway, I'm coming up on a bit where I feel like I put a bunch of effort into it in the previous iteration, but I don't remember how that effort was directed.
Like, what was I trying to do?
Presumably, it had something to do with switching variables between being top-level locals and instance values?
I can only assume?&lt;/p&gt;
&lt;p&gt;In general, I'm not sure I trust these static variables.
They feel... singleton-y?&lt;/p&gt;
&lt;p&gt;Anyway, I'll try to get on with this more tomorrow.
Hopefully writing some tests will illuminate the situation.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Lua"></category><category term="Crafting Interpreters"></category><category term="Lox"></category></entry><entry><title>Weekly Roundup 2022-09-06</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-09-06" rel="alternate"></link><published>2022-09-06T04:00:00-04:00</published><updated>2022-09-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-09-06:/weekly-roundup-2022-09-06</id><summary type="html">&lt;p class="first last"&gt;I made some mistakes which I am trying to recover from.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I'm not sure what happened before writing the post, but I did think about NABTO during it.&lt;/li&gt;
&lt;li&gt;Thursday: I worked out some stuff that I'd like to work in Python's types, and, by extension, that I'd like to work in NABTO's types. It's likely to be pretty hard to implement, unfortunately.&lt;/li&gt;
&lt;li&gt;Friday: I tried to translate the Lox interpreter to Rust, and gave up on that because that's just too many different not-familiar-enough things to juggle.&lt;/li&gt;
&lt;li&gt;Saturday: I made an effort to learn tooling for Lua, and put together something that seems promising.&lt;/li&gt;
&lt;li&gt;Sunday: I got back into Python code, and did a little work on MOTR, and &lt;em&gt;way too much&lt;/em&gt; work on one of my other projects, trying to diagnose an issue that was ultimately either a bug in attrs or a limitation of Python; either way, not my fault, but not hard to fix once I understood what was going wrong.&lt;/li&gt;
&lt;li&gt;Monday: After all of that, I was catastrophically tired, and didn't get much done. Oh well.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to get more done on various coding fronts.
Per Lua's philosophy of &amp;quot;build the stuff you need yourself&amp;quot;, I'm putting together some interesting scaffolding for development.
I'll try to describe that some once I've really used it, rather than writing so-so tests for it.&lt;/p&gt;
</content><category term="Weekly Roundup"></category><category term="Lua"></category><category term="Lox"></category><category term="MOTR"></category><category term="bad decisions"></category></entry><entry><title>Coding 2022-09-05</title><link href="https://mwchase.neocities.org/coding-2022-09-05" rel="alternate"></link><published>2022-09-05T04:00:00-04:00</published><updated>2022-09-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-09-05:/coding-2022-09-05</id><summary type="html">&lt;p class="first last"&gt;Uuuuuuuuuuugh.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't actually get much done today.
I did clean things up from yesterday a bit.&lt;/p&gt;
&lt;p&gt;But, because I was up so late working on this stuff last night, I was totally wiped out today and couldn't focus on anything.&lt;/p&gt;
&lt;p&gt;So, cleaned stuff up, and I don't want to repeat that experience, so I'm going to just take the L for today.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-09-04</title><link href="https://mwchase.neocities.org/coding-2022-09-04" rel="alternate"></link><published>2022-09-04T04:00:00-04:00</published><updated>2022-09-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-09-04:/coding-2022-09-04</id><summary type="html">&lt;p class="first last"&gt;By the way, shout out to attrs for fixing a bug I was hacking around. Minus shoutout for not fixing it all the way.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I tried to work on MOTR and another project today, and the results were so-so at best.
Maybe if I had a pomodoro and switched off.
Anyway, I did make some progress.
I added a few lines of coverage to MOTR, and upgraded the Python version of the other project so I could use some newer typing features.&lt;/p&gt;
&lt;p&gt;My plan with the other project is to strip out a shockingly large amount of code in the service of relying on the standard library for more things.
Before I'm ready to delete that code, I need to get the replacement code to work, and as to how that's going... it's going...&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Since then, I've gotten most tests to pass, deleted the majority of the rest, and the remainder are... confounding.
It's some weird tension between, yes, the original intention of the tests is completely invalidated, and the documentation is all horribly out of date...
But on the other hand, I'm staring daggers at the test code, and I can't see why the tests aren't passing.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;I fixed it, and it sucked, and it was completely not my fault.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;This is all true.
Quick summary, since it's late?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Attrs tries to make get_type_hints work by populating the &lt;tt class="docutils literal"&gt;__globals__&lt;/tt&gt; attribute on the generated &lt;tt class="docutils literal"&gt;__init__&lt;/tt&gt;.
It does this using &lt;tt class="docutils literal"&gt;dict.update()&lt;/tt&gt;, so further updates to the module namespace have no effect.
Ergo, can't use forward references.&lt;/p&gt;
&lt;p&gt;Fortunately, I was already calculating all of the necessary information for the old system, so I didn't actually need to figure out how to do anything differently, I just hooked up the seemingly-dead code, and the tests just started working.&lt;/p&gt;
&lt;p&gt;That said, there's a bunch more to be done here.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Excellent.
Now, SLEEP!&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;... Not sure I like your tone.
Nevertheless...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Python"></category><category term="MOTR"></category></entry><entry><title>Coding 2022-09-03</title><link href="https://mwchase.neocities.org/coding-2022-09-03" rel="alternate"></link><published>2022-09-03T04:00:00-04:00</published><updated>2022-09-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-09-03:/coding-2022-09-03</id><summary type="html">&lt;p class="first last"&gt;Just a stunning amount of setup, oh well.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got a bunch of tooling more-or-less working for developing with Lua.
We'll see if it all actually works out, because I was just focusing on getting things to more-or-less pass.
Right now, I'm trying out:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/boolangery/sphinx-lua"&gt;sphinx-lua&lt;/a&gt; with &lt;a class="reference external" href="https://pradyunsg.me/furo/"&gt;Furo&lt;/a&gt;, and using &lt;a class="reference external" href="https://www.pyinvoke.org/"&gt;Invoke&lt;/a&gt; instead of the makefiles.
I haven't actually tried to document code with this yet, and if it doesn't work, I'll just switch to &lt;a class="reference external" href="https://stevedonovan.github.io/ldoc/"&gt;LDoc&lt;/a&gt;.
Getting sphinx-lua to run right took some weird additions to the requirements file, so I'm not super-attached to it yet, but given the ability to use Furo's dark mode, I'll try to take it.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/dcurrie/lunit"&gt;lunitx&lt;/a&gt; and &lt;a class="reference external" href="https://github.com/lunarmodules/luacov"&gt;LuaCov&lt;/a&gt;.
Notes on getting this working: I had to add &lt;tt class="docutils literal"&gt;LUA_INIT=require 'luacov'&lt;/tt&gt; to the environment for the &lt;tt class="docutils literal"&gt;lunit.sh&lt;/tt&gt; call, because I didn't see another way to make it load the module, but it all seemed to work, once I created a proper &lt;tt class="docutils literal"&gt;.luacov&lt;/tt&gt; file.
Update: while I was writing the stuff down below, I realized I could just call &lt;tt class="docutils literal"&gt;lua &lt;span class="pre"&gt;-llunitx&lt;/span&gt; tests/*&lt;/tt&gt;, so I did that instead, because I'm not sure what the wrapper does in comparison, and I'd rather call Lua directly I think?
&lt;strong&gt;Late-breaking update: That did weird stuff to coverage, so I switched it back.
Not sure what was going on there...&lt;/strong&gt;
The other part of it was getting lunitx tests happy with how &lt;a class="reference external" href="https://github.com/mpeterv/luacheck"&gt;Luacheck&lt;/a&gt; wants me to write modules.
Here's the pattern that I settled on:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;lunit&amp;quot;&lt;/span&gt;

&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TEST_CASE&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;test file name&amp;gt;&amp;quot;&lt;/span&gt;

&lt;span class="kr"&gt;function&lt;/span&gt; &lt;span class="nc"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test_etc&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kr"&gt;end&lt;/span&gt;

&lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;With this, I'm not creating any globals, and it's all working through lunitx's compatibility layers, so it can discover the tests.
Now, I need to get to writing some code so I can test it.&lt;/p&gt;
&lt;p&gt;Some of that code may end up being random bits of scaffolding, because, Lua.
Anyway, I feel like I've written enough, and I don't want to delay this post any.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Lua"></category><category term="Crafting Interpreters"></category><category term="Lox"></category></entry><entry><title>Coding 2022-09-02</title><link href="https://mwchase.neocities.org/coding-2022-09-02" rel="alternate"></link><published>2022-09-02T04:00:00-04:00</published><updated>2022-09-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-09-02:/coding-2022-09-02</id><summary type="html">&lt;p class="first last"&gt;Painfully little progress, painfully much pain&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, so, I'm really not feeling great right now, so I'm going to explain what I tried to do, then I'm going to lie down or something for a while.&lt;/p&gt;
&lt;p&gt;I mentioned &lt;a class="reference external" href="http://craftinginterpreters.com/"&gt;Crafting Interpreters&lt;/a&gt; yesterday, and I decided to pick it back up.
Now, I've got a few attempted projects that try to port the first half to other languages.
One in Lua that's in a weird state because I left a bunch of the challenge code in, so that's not a great baseline.
One in Python that I don't quite remember what I was doing, but I don't want to get back into Python code right now, because I'm on some kind of Quixotic quest for perfection with MOTR.&lt;/p&gt;
&lt;p&gt;A quixotic quest for perfection, hm?
That sounds like some of the descriptions of Rust.
I thought, maybe I could pick Rust back up, and translate the Java code to Rust code.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Max could not.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I don't know whether it's that I'm, uh, rusty with Rust, that it's uniquely annoying to translate from Java to Rust, or just that I'm &lt;em&gt;extremely tired&lt;/em&gt;, but currently I'm just not feeling it.
At least I know this wasn't anything to do with the borrow checker, because I did not get the code far enough for that to matter.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;In support of &amp;quot;I'm out of practice with Rust&amp;quot;; well, I just... am.&lt;/li&gt;
&lt;li&gt;In support of &amp;quot;The translation is annoying&amp;quot;; so, I guess I should be converting these &lt;tt class="docutils literal"&gt;throws&lt;/tt&gt; declarations to &lt;tt class="docutils literal"&gt;Result&lt;/tt&gt;s?
Maybe?
I'm not sure?&lt;/li&gt;
&lt;li&gt;In support of &amp;quot;I'm extremely tired&amp;quot;; I &lt;em&gt;am&lt;/em&gt; extremely tired.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are a few different tacks I can and should take to deal with this:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Work through a proper Rust tutorial.&lt;/li&gt;
&lt;li&gt;Read the current chapter to the end, developing a plan for translation.&lt;/li&gt;
&lt;li&gt;Potentially, for now use a language I'm more familiar with, like Lua.&lt;/li&gt;
&lt;li&gt;Get some dang sleep.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I know what I should be working on to start with, so I'm going to try to wrap up earlier than usual tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="Rust"></category><category term="Crafting Interpreters"></category><category term="Lox"></category></entry><entry><title>Coding 2022-09-01</title><link href="https://mwchase.neocities.org/coding-2022-09-01" rel="alternate"></link><published>2022-09-01T04:00:00-04:00</published><updated>2022-09-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-09-01:/coding-2022-09-01</id><summary type="html">&lt;p class="first last"&gt;Just sticking various words on the front of &amp;quot;types&amp;quot; and going &amp;quot;Oh, &lt;em&gt;no&lt;/em&gt;.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm a little out of it again, so I'm going to focus on one particular thing that I want in NABTO, but I also, just, want in general.&lt;/p&gt;
&lt;p&gt;Okay, so this is seemingly simple to describe in plain language, but it looks to me like it inevitably brings in a lot of complication when I try to formalize it.&lt;/p&gt;
&lt;p&gt;So, it's a type, that takes three variables.
Two of them are normal type variables.
The other one is...
A higher-kinded type that takes two arguments.
In Python runtime terms, it's easiest to express the whole type as a tuple, so let's go with that.
Call the higher-kinded variable &lt;tt class="docutils literal"&gt;HKT&lt;/tt&gt;, and then there are two possible ways to inhabit this type:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;MagicType[HKT, T, V] = tuple[HKT[T, V]] | MagicType[HKT, T, U] + tuple[HKT[U, V]]&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Where &lt;tt class="docutils literal"&gt;+&lt;/tt&gt; between types indicates &amp;quot;the type of the concatenation of tuples of these two types&amp;quot; which I'm pretty sure isn't ever going to be a thing.
Functionally, it's something like variadic generics, so it's as if we could define a union of variadic generics...&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;MagicVariadic[HKT, T, V] = (HKT[T, &lt;span class="pre"&gt;V],)&lt;/span&gt; | (*MagicVariadic[HKT, T, U], HKT[U, V])&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Which is still not a thing that the syntax is likely to permit.
(This would be used like &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;tuple[*MagicVariadic[HKT,&lt;/span&gt; T, V]]&lt;/tt&gt;)&lt;/p&gt;
&lt;p&gt;I could imagine trying to write a plugin that would make that all sort of work, possibly in conjunction with existing plugins.
But I don't think that's happening until Python 3.11 comes out.&lt;/p&gt;
&lt;div class="admonition smiley smiley-glitchy"&gt;
&lt;p class="first admonition-title"&gt;:) (glitchy)&lt;/p&gt;
&lt;p class="last"&gt;Not that it's not fun to imagine people trying to process that crazy syntax, but you should probably explain what this is &lt;em&gt;for&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;All right, so, I've got two motivating examples, and one of them kind of reduces to the other, so I'll do the other one first.&lt;/p&gt;
&lt;p&gt;Suppose &lt;tt class="docutils literal"&gt;HKT[T, U]&lt;/tt&gt; is &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Callable[[T],&lt;/span&gt; U]&lt;/tt&gt;.
Now if you have a &lt;tt class="docutils literal"&gt;T&lt;/tt&gt; and a &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;tuple[*MagicVariadic[OneArgCall,&lt;/span&gt; T, V]]&lt;/tt&gt;, then you can loop or &lt;tt class="docutils literal"&gt;functools.reduce()&lt;/tt&gt; the tuple over the variable to obtain a &lt;tt class="docutils literal"&gt;V&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;(In NABTO, the effect type would need to be tracked somehow.)&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;&lt;em&gt;Someone's&lt;/em&gt; going to want to know whether looping or &lt;tt class="docutils literal"&gt;functools.reduce()&lt;/tt&gt; is better.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&amp;quot;Better&amp;quot;.
Anyway, I was messing around earlier, and using &lt;tt class="docutils literal"&gt;functools.reduce()&lt;/tt&gt; was always slower than an explicit loop, &lt;em&gt;but&lt;/em&gt; I was able to get them pretty close by binding &lt;tt class="docutils literal"&gt;functools.reduce()&lt;/tt&gt; as a default argument.
I'm not going to give actual percentages, because if the functions are heavy enough, they'll swamp the difference.
So, if you find yourself in this situation, go with whatever solution you're more comfortable with, and be ready to profile the code if it does seem slow.&lt;/p&gt;
&lt;p&gt;Anyway, the other place I ended up wanting something like this was in the graph code I was messing with.
I had the idea of a &lt;em&gt;composed&lt;/em&gt; edge, an edge that follows an &lt;tt class="docutils literal"&gt;Edge[T, U]&lt;/tt&gt; to an &lt;tt class="docutils literal"&gt;Edge[U, V]&lt;/tt&gt;.
And why stop at one composition, hmm?
Or allow the compositions to form some kind of binary tree.
Better to just lean on the associative property and collapse them all together.
I can't prove I need this from a performance perspective, but it's just &lt;em&gt;unaesthic&lt;/em&gt; to allow arbitrary binary structures that all &amp;quot;mean the same thing&amp;quot;.&lt;/p&gt;
&lt;p&gt;(Actually, from that perspective, there definitely needs to be a &lt;em&gt;canonical&lt;/em&gt; form.)&lt;/p&gt;
&lt;p&gt;Let's chase that thought for a sec.&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;MagicTuple[HKT, T, V] = tuple[HKT[T, V]] | tuple[HKT[T, U], MagicTuple[HKT[U, &lt;span class="pre"&gt;V]]]&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;I just realized that the &lt;tt class="docutils literal"&gt;U&lt;/tt&gt; is kind of coming out of nowhere in literally all of these.
Throw &amp;quot;existential types&amp;quot; on the pile...&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p&gt;Hooray!&lt;/p&gt;
&lt;p class="last"&gt;Suffering!&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I know, I know.&lt;/p&gt;
&lt;p&gt;Anyway, however it's represented, we then want the conceptual ability to map as follows:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;Edge[T, U] &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="pre"&gt;Callable[[T],&lt;/span&gt; frozenset[U]] &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="pre"&gt;Callable[[frozenset[T]],&lt;/span&gt; frozenset[U]]&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Just a bunch of Haskell-inspired nonsense that I'm pretty sure Haskell wouldn't even let you do.&lt;/p&gt;
&lt;p&gt;There are two wolves inside of me.
One of them knows, intellectually, that trying to implement all of this type &lt;em&gt;stuff&lt;/em&gt; is probably a bad idea.
The other one &lt;em&gt;really wants it, come ooon&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Meh, at least it's only my problem if I try to do this.&lt;/p&gt;
&lt;p&gt;Thinking over this, I think the way forward is to consider a bunch of problems separately:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Get back into Koka in order to better learn effect systems and to get a handle on the types.&lt;/li&gt;
&lt;li&gt;Try to implement features of interest, such as my ideas about inheritance, in smaller, specific-purpose experimental languages.&lt;/li&gt;
&lt;li&gt;Maybe start over with Crafting Interpreters or something similar.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, I'm tired and I have other things I want to do, so I'm going to cap this off for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="NABTO"></category><category term="very specific goals"></category></entry><entry><title>Diary 2022-08-31</title><link href="https://mwchase.neocities.org/diary-2022-08-31" rel="alternate"></link><published>2022-08-31T04:00:00-04:00</published><updated>2022-08-31T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-08-31:/diary-2022-08-31</id><summary type="html">&lt;p class="first last"&gt;Apparently I just kind of zoned out for a while?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I have no memory of where the time went today, at least, not after I &amp;quot;fixed&amp;quot; the technical difficulties that kept me from publishing yesterday.
Basically, my home folder was too big, so I made some drastic adjustments that fit with how I actually &lt;em&gt;use&lt;/em&gt; the files that I moved around, so the result should be fine.
We'll see.
There's a bit more that I &lt;em&gt;can&lt;/em&gt; do to alleviate the situation, but I don't need to.
I probably should though.&lt;/p&gt;
&lt;p&gt;Anyway, there's some work to be done on this still that's in other areas, and I don't want to think about that right now.&lt;/p&gt;
&lt;p&gt;ANYWAY.&lt;/p&gt;
&lt;p&gt;I've been thinking about NABTO, and there are some scary interdependencies there.
Like, when you have imports as a &lt;em&gt;runtime&lt;/em&gt; concept, then that means that the import system needs to handle &lt;tt class="docutils literal"&gt;st&amp;lt;h&amp;gt;&lt;/tt&gt; effects, and I'm not totally sure what that looks like.
It's &lt;em&gt;possible&lt;/em&gt; that trying to combine &amp;quot;dynamic language&amp;quot; with &amp;quot;Koka-style effect types&amp;quot; will result in something completely unrecognizable for reusing code, but I'm not really sure yet.
I don't want to give up on the idea before I've thoroughly explored it.
Sadly, I don't have time right now, because it's late and I'm struggling not to make weird typos.&lt;/p&gt;
&lt;p&gt;Anyway, that's enough time spent trying to write more of this post.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Technical difficulties"></category></entry><entry><title>Weekly Roundup 2022-08-30</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-08-30" rel="alternate"></link><published>2022-08-30T04:00:00-04:00</published><updated>2022-08-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-08-30:/weekly-roundup-2022-08-30</id><summary type="html">&lt;p class="first last"&gt;It was definitely nice to get the site design stuff out of the way.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I pondered some facets of programming language design.&lt;/li&gt;
&lt;li&gt;Thursday: I gave a terrible working title to the vague collection of language ideas I've been messing with in my head, and laid out some of the details of it, or at least possibilities of the details.&lt;/li&gt;
&lt;li&gt;Friday: I tried to describe basic programs, and rather quickly ran into some esoteric-feeling issues.&lt;/li&gt;
&lt;li&gt;Saturday: I rolled out the updated stylesheet and templates, at long last.&lt;/li&gt;
&lt;li&gt;Sunday: I got work done on MOTR.&lt;/li&gt;
&lt;li&gt;Monday: I did some more work on MOTR, and ran into weird snags writing tests that were technically (very technically, I feel) my fault.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to keep on with MOTR, and other stuff, and I've had enough technical difficulties before writing this entry that I frankly don't want to think too hard about it right now.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-08-29</title><link href="https://mwchase.neocities.org/coding-2022-08-29" rel="alternate"></link><published>2022-08-29T04:00:00-04:00</published><updated>2022-08-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-08-29:/coding-2022-08-29</id><summary type="html">&lt;p class="first last"&gt;Trust nobody, &lt;em&gt;especially&lt;/em&gt; not yourself.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The package tests are improved, and I'm trying to get the &lt;tt class="docutils literal"&gt;Build&lt;/tt&gt; tests working.
It's slow going, because the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;pyproject-build&lt;/span&gt;&lt;/tt&gt; command is failing.
After I wired stuff up enough that I could actually see the errors, I'm pretty sure they're indicating that there's something wrong with the synthetic packages I'm having it build, but...&lt;/p&gt;
&lt;p&gt;Wait.
It's trying to find the package name instead of the module name.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Ugh, TOML, why?&lt;/p&gt;
&lt;p&gt;Well, in any case, I shouldn't have too much trouble testing the error case.&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;You should explain.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Wh—&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;You should explain what was going wrong.
After all, everything was spec-conformant except for your code.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Ugh, &lt;em&gt;fine&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;So, here's the code that was broken:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;# ...&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;tool.flit.module&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;module_name&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And here's what worked:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;# ...&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;flit&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;module&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;module_name&lt;/span&gt;&lt;span class="p"&gt;}}},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That dict is an argument to the &lt;tt class="docutils literal"&gt;tomli_w.dumps&lt;/tt&gt; function.
As I saw it, I had two basic options for how to generate the synthetic &lt;tt class="docutils literal"&gt;pyproject.toml&lt;/tt&gt; file.
Either I could substitute into a template, or I could generate the data corresponding to the contents of the file, and convert it to a string.
I decided to manipulate the data, because I figured that would be less of a pain than setting up templating or a big format string.
I'm... not sure that was the case, but at least now I've cleared what's hopefully the biggest hurdle to that.&lt;/p&gt;
&lt;p&gt;See, the difference between those two snippets is, one works, and the other doesn't, and the one that works, works because it's writing data that corresponds to this block from the examples in Flit's documentation:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;[tool.flit.module]&lt;/span&gt;
&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;nsist&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In TOML, this corresponds to a table containing a key called &amp;quot;name&amp;quot;, and that table is described by one of the above snippets.
See, TOML has a bunch of &lt;a class="reference external" href="https://toml.io/en/v1.0.0#table"&gt;syntactic sugar&lt;/a&gt;, and those dots in the file don't correspond to the dots in the first snippet.
They correspond to the &lt;em&gt;table nesting&lt;/em&gt; in the second snippet.&lt;/p&gt;
&lt;p&gt;So, before I fixed this, I was writing the table I needed to write, to some weird gibberish key in the top level, rather than the nice telescoping whatever that's going on there.&lt;/p&gt;
&lt;p&gt;I'd read this in the documentation back when TOML was taking off, but I didn't think through the implications this had for generating TOML from data rather than from text.&lt;/p&gt;
&lt;p&gt;So, there it is, one of the hurdles I had to clear was that I wasn't thinking hard enough about the format that my data was in.
Happy?&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;Always.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;O...kay.&lt;/p&gt;
&lt;p&gt;Anyway, I let this go late and I need to get to bed now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category><category term="WHY?"></category><category term="Oh"></category><category term="That's why"></category></entry><entry><title>Coding 2022-08-28</title><link href="https://mwchase.neocities.org/coding-2022-08-28" rel="alternate"></link><published>2022-08-28T04:00:00-04:00</published><updated>2022-08-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-08-28:/coding-2022-08-28</id><summary type="html">&lt;p class="first last"&gt;I was actually a little surprised at how broken the existing code was. Oh well, that's how it is when there aren't tests.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I got a little bit done on MOTR.
I added some tests, and deleted the code that the test was exercising.
I admit the test coverage for both versions of the code paths involved is... not great.&lt;/p&gt;
&lt;p&gt;Tomorrow, I'll try to shore up those tests a little, then get on with the next major test coverage hole: running the &lt;tt class="docutils literal"&gt;Build&lt;/tt&gt; action against synthetic data.&lt;/p&gt;
&lt;p&gt;We'll see how that goes, but for now, I really really need to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="MOTR"></category></entry><entry><title>Site Design 2022-08-27</title><link href="https://mwchase.neocities.org/site-design-2022-08-27" rel="alternate"></link><published>2022-08-27T04:00:00-04:00</published><updated>2022-08-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-08-27:/site-design-2022-08-27</id><summary type="html">&lt;p class="first last"&gt;I wonder how this looks on real phones now, instead of the simulator I was using.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I gave the redesign a few days to sit, and made a few final tweaks.
It's time to push it out the door!
Time for a slightly wider central column, slight tweaks to the color scheme, more big chunky lines with rounded bits, and&lt;/p&gt;
&lt;div class="admonition smiley smiley-normal"&gt;
&lt;p class="first admonition-title"&gt;:)&lt;/p&gt;
&lt;p class="last"&gt;And me!&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Yep, I decided to spin off my whole unsettling smiley bit that I've done a few times since... a year ago, and turned it into one of those little character avatars that I see Rust blogs and other blogs use.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;This was a good idea.&lt;/p&gt;
&lt;div class="admonition smiley smiley-glitchy"&gt;
&lt;p class="first admonition-title"&gt;:) (glitchy)&lt;/p&gt;
&lt;p class="last"&gt;This &lt;em&gt;is&lt;/em&gt; a good idea!&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;In all seriousness, I think this has some potential for Missable Mysteries, if I ever, um, get back to it.&lt;/p&gt;
&lt;p&gt;Anyway, I want to take care of some other things, so this is just going to be a quick entry showing off the changes.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Blog Setup"></category><category term="Redesign"></category><category term="Release"></category></entry><entry><title>Coding 2022-08-26</title><link href="https://mwchase.neocities.org/coding-2022-08-26" rel="alternate"></link><published>2022-08-26T04:00:00-04:00</published><updated>2022-08-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-08-26:/coding-2022-08-26</id><summary type="html">&lt;p class="first last"&gt;I have so many different ideas for what &amp;quot;some boilerplate&amp;quot; could be like...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've been thinking a bit more about NABTO, and I realized that there's something I need to address entirely before anything remotely object-oriented enters the picture.&lt;/p&gt;
&lt;p&gt;Here is a Hello World program in Koka:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;fun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hello world!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// println output&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here is a Hello World program in Python:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hello world!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The Koka code has the &lt;tt class="docutils literal"&gt;println()&lt;/tt&gt; call inside the main function, while the Python version has it at the top level of the module.
In Koka, module-level code is analyzed and acted on at compile time, while in Python, it's executed when the module is imported at run time.
This means that either we need to restrict which effects are permissible at the module level, or we need to allow imports in NABTO to potentially emit arbitrary effects, once.&lt;/p&gt;
&lt;p&gt;Hm, that &amp;quot;once&amp;quot; makes something occur to me.
The &lt;tt class="docutils literal"&gt;import&lt;/tt&gt; statement in Python and the &lt;tt class="docutils literal"&gt;require()&lt;/tt&gt; function in Lua are, due to the way they memoize their results, kind of like delayed values that immediately get forced.&lt;/p&gt;
&lt;p&gt;Okay, it just occurred to me that I probably don't want to go down this road.
If the importing module is responsible in any way for handling the effects from the module that it imports, then that means that the values &lt;em&gt;in&lt;/em&gt; a module can depend on &lt;em&gt;where it's first imported&lt;/em&gt;.
That seems less than ideal to me.
To counter that, there could be some kind of runtime service that handles the effects from importing a module.
Suppose some user code &lt;em&gt;wants&lt;/em&gt; to mess with the effect handling, though?&lt;/p&gt;
&lt;p&gt;I don't know if I'm satisfied with this idea, but maybe if there were some kind of sandboxed execution facility, so that someone who wanted custom effect handling could &amp;quot;simply&amp;quot; create an object to emulate the runtime, and within that emulated runtime, imports would be done completely freshly.&lt;/p&gt;
&lt;p&gt;I'm tempted to see if the syntax could be made to support Lua's function call syntax, so that there's just a function instead of a statement.
If this were a function, it would effectively only propagate errors and non-termination to the calling code, and all other effects would &amp;quot;pass through&amp;quot; the intervening layers to the runtime.&lt;/p&gt;
&lt;p&gt;Final question to consider for tonight: does the fact that call trees all trace back to the &lt;tt class="docutils literal"&gt;__main__&lt;/tt&gt; module, combined with the ideas I've been going over, come together in a way that's elegant, inelegant, or pointless?&lt;/p&gt;
&lt;p&gt;Well, let's look at the Hello World program for NABTO.
It's going to be something like &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;println(&amp;quot;Hello&lt;/span&gt; &lt;span class="pre"&gt;World!&amp;quot;)&lt;/span&gt;&lt;/tt&gt; (probably with some boilerplate at the beginning).
The runtime will import the module, and the import system will handle the text output effect.
Then, it will finish with the module, and exit.&lt;/p&gt;
&lt;p&gt;A more complex program will end up importing multiple modules, and suspending execution during the imports, then resuming, possibly with an error.&lt;/p&gt;
&lt;p&gt;This all seems to make sense to me, but I really should sleep on it before I think I'm sure.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="speculation"></category><category term="NABTO"></category></entry><entry><title>Coding 2022-08-25</title><link href="https://mwchase.neocities.org/coding-2022-08-25" rel="alternate"></link><published>2022-08-25T04:00:00-04:00</published><updated>2022-08-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-08-25:/coding-2022-08-25</id><summary type="html">&lt;p class="first last"&gt;Oh boy, I sure have been thinking about this, apparently.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I figured I'd keep on thinking about the programming language concept I sort of mentioned last night.
Before I do anything else, I want to name it so I can have something convenient to refer to, but I don't want to commit to a name yet.
As such, I'll use a working title that practically demands to be replaced, once a suitable replacement suggests itself:&lt;/p&gt;
&lt;p&gt;Name Already Been Thought Of, or NABTO.
This is an allusion to trying to come up with some punchy, memorable name, and oops, it's already in use.
With its somewhat unusual combination of different points of articulation and voicing, NABTO is the programmer art of names, which is what I need, psychologically, to get on with it.&lt;/p&gt;
&lt;p&gt;So, one of the major inspirations for NABTO is Python.
I use Python a lot, and I wonder what it would be like to use a language that is like Python, but, at a few points, does things the way I would do them, seeing how they worked out in Python.&lt;/p&gt;
&lt;p&gt;Two big pain points for me in Python are inheritance and &lt;tt class="docutils literal"&gt;__init__&lt;/tt&gt; methods.
As of the last few years, when I'm left to my own devices, I use inheritance rarely, and explicit &lt;tt class="docutils literal"&gt;__init__&lt;/tt&gt; methods less.
Here are the statistics from the current MOTR codebase:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Classes that inherit:&lt;ul&gt;
&lt;li&gt;From &lt;tt class="docutils literal"&gt;typing.Generic&lt;/tt&gt;: 20&lt;/li&gt;
&lt;li&gt;From &lt;tt class="docutils literal"&gt;typing.Protocol&lt;/tt&gt;: 16&lt;/li&gt;
&lt;li&gt;From &lt;tt class="docutils literal"&gt;enum.Enum&lt;/tt&gt;: 3&lt;/li&gt;
&lt;li&gt;Internally: 9&lt;/li&gt;
&lt;li&gt;From third-party code: 3&lt;/li&gt;
&lt;li&gt;From an exception: 2&lt;/li&gt;
&lt;li&gt;Not at all: 41 (+2 required to exist by third-party code, but with no inheritance)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Explicit definitions of &lt;tt class="docutils literal"&gt;__init__&lt;/tt&gt;: 0 (thank you, &lt;a class="reference external" href="https://www.attrs.org/"&gt;attrs&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, from looking over these, we have 39 instances of inheriting from the standard library to get specific functionality, most of the internal ones and the exceptions are cases of ontological inheritance, and the third-party stuff is to hook into third-party functionality by inheriting a bunch of functionality.&lt;/p&gt;
&lt;p&gt;Ontological inheritance is one of three kinds laid out in &lt;a class="reference external" href="https://www.sicpers.info/2018/03/why-inheritance-never-made-any-sense/"&gt;this post&lt;/a&gt;.
The others are abstract data type inheritance and implementation inheritance.
For my purposes, I'm going to separately consider &lt;em&gt;inheriting the implementation from a concrete class&lt;/em&gt; and &lt;em&gt;inheriting the implementation from an abstract class&lt;/em&gt;.
I like this distinction because I generally distrust the former, and I apparently do the latter &lt;em&gt;a lot&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;So, if I want NABTO to reflect my own ideas about how to code, how do these different types of inheritance look?&lt;/p&gt;
&lt;p&gt;Suppose we consider different types of inheritance to be associated with different types of type.&lt;/p&gt;
&lt;p&gt;We can have &lt;strong&gt;concrete types&lt;/strong&gt; that represent some data in memory and a set of associated behaviors.
We can have &lt;strong&gt;ontological types&lt;/strong&gt; that represent open or closed sets of values.
We can have &lt;strong&gt;abstract data types&lt;/strong&gt; that represent the contracts that a value upholds.
We can have &lt;strong&gt;mixin types&lt;/strong&gt; that provide implementations of behavior without reference to state.&lt;/p&gt;
&lt;p&gt;As to how these types can relate to each other:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;strong&gt;concrete types&lt;/strong&gt; can have their instances point to other values, which will also be instances of &lt;strong&gt;concrete types&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;concrete types&lt;/strong&gt; can be added to open &lt;strong&gt;ontological types&lt;/strong&gt;; multiple inheritance imposes no constraints on ordering.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;concrete types&lt;/strong&gt; can implement the contracts of &lt;strong&gt;abstract data types&lt;/strong&gt;; multiple inheritance imposes no constraints on ordering.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;concrete types&lt;/strong&gt; can inherit from &lt;strong&gt;mixin types&lt;/strong&gt;; multiple inheritance imposes constraints on ordering, and I think the safe bet is C3.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ontological types&lt;/strong&gt; can relate to each other, and I'm not sure they should relate to anything else?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;abstract data types&lt;/strong&gt; can require that their operations take values of specific &lt;strong&gt;concrete types&lt;/strong&gt;, or that conform to other &lt;strong&gt;abstract data types&lt;/strong&gt;, but I don't know if it makes sense for them to care about &lt;strong&gt;ontological types&lt;/strong&gt; or &lt;strong&gt;mixin types&lt;/strong&gt;; they can also inherit from each other to express relations like &amp;quot;a sequence is also a container&amp;quot; or whatever.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mixin types&lt;/strong&gt; can inherit from each other, and their methods can specify &lt;strong&gt;concrete types&lt;/strong&gt;, or ideally &lt;strong&gt;abstract data types&lt;/strong&gt;, in their signatures.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Right, signatures.
I kind of want to see how gradual typing looks when it isn't bolted on after-the-fact.
Maybe there are languages out there that are trying that, but after all of the languages I name-checked yesterday, I feel a little researched-out.&lt;/p&gt;
&lt;p&gt;That off-hand reference I made to open &lt;em&gt;or closed&lt;/em&gt; ontological types earlier made me realize something.
Exception handlers in Python are like match statements that only work on instances of a particular type, passing through specific mechanisms.
I'm really interested in Koka's ideas about minimalism; seeing them in action caused some ideas that have been kicking around in my head for over a decade to make sense, so let's see if anything inspires me there...&lt;/p&gt;
&lt;p&gt;First off, I had some ideas for using one type &lt;em&gt;like&lt;/em&gt; another type.
Like, &lt;strong&gt;concrete types&lt;/strong&gt; and &lt;strong&gt;abstract data types&lt;/strong&gt; could be used as ontological types for some purposes, and a &lt;strong&gt;concrete type&lt;/strong&gt; could be used as an &lt;strong&gt;abstract data type&lt;/strong&gt;.
My gut feeling is that using &lt;strong&gt;concrete types&lt;/strong&gt; like that is likely to be a problem a lot of the time, but I think experience is worth more than feelings, so I think it should be allowed, but warned against.
That way, if someone really needs it, they've got it.&lt;/p&gt;
&lt;p&gt;(This sort of clarifies some of the uses of &lt;strong&gt;concrete types&lt;/strong&gt;, above.
&lt;em&gt;Actually&lt;/em&gt;, it's a &lt;strong&gt;concrete type&lt;/strong&gt; being interpreted as an &lt;strong&gt;abstract data type&lt;/strong&gt;.)&lt;/p&gt;
&lt;p&gt;It's getting late, and this post is apparently quite long, so I'm just going to spitball some thoughts about how different types of types could interact with match constructs.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Only &lt;strong&gt;concrete types&lt;/strong&gt; could perform destructuring match, since the other types don't specify a structure.
I haven't gone over the aspects of &lt;strong&gt;concrete types&lt;/strong&gt; that should make destructuring possible.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ontological types&lt;/strong&gt; could check for membership, which is straightforward enough.&lt;/li&gt;
&lt;li&gt;I'm not clear on what &lt;strong&gt;abstract data types&lt;/strong&gt; or &lt;strong&gt;mixin types&lt;/strong&gt; could do in the context of a match.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After thinking about this a little more, my feeling is that &lt;strong&gt;concrete types&lt;/strong&gt; should handle their own destructuring, so the language- or library- level matches should deal with &lt;strong&gt;ontological types&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;In any case, this doesn't quite feel fully baked, but I want to be done with writing tonight.
I think what I need to do is put together a Sphinx project for documenting how I think this all should work, before I try to prototype it.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="untitled-language"></category><category term="speculation"></category><category term="NABTO"></category></entry><entry><title>Coding 2022-08-24</title><link href="https://mwchase.neocities.org/coding-2022-08-24" rel="alternate"></link><published>2022-08-24T04:00:00-04:00</published><updated>2022-08-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-08-24:/coding-2022-08-24</id><summary type="html">&lt;p class="first last"&gt;This is going to look so much nicer after I roll out the new stylesheet.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I figured I'd talk some about something that's been on my mind, something that got me looking into Koka.
It's &lt;a class="reference external" href="https://eev.ee/blog/2015/02/28/sylph-the-programming-language-i-want/"&gt;this post&lt;/a&gt;.
There are a bunch of interesting ideas in there, and I'm interested in seeing, more or less, what happens if I aim for a point in the design space somewhere in the convex hull of this post, Koka, Python, and the CLOS (n.b. I do not know Common Lisp, so I'm trying to get this through reading The Art of the Metaobject Protocol).&lt;/p&gt;
&lt;p&gt;There are &lt;em&gt;a lot&lt;/em&gt; of fiddly points to consider.
Like, should there be a Python-style descriptor protocol?
Koka (and Perl, I think, and presumably other things) style nullary functions with implicit parens?
Both, somehow?&lt;/p&gt;
&lt;p&gt;But I want to focus on one bit from Eevee's post, where she's talking about Python, and I'm not sure she's correct.&lt;/p&gt;
&lt;p&gt;Let's quote the relevant bit.&lt;/p&gt;
&lt;blockquote&gt;
Magic methods work differently from other methods, in that they only work when assigned to the class and not when assigned to an instance. It turns out there’s not actually a good reason for this.&lt;/blockquote&gt;
&lt;p&gt;This is going to need a bit of unpacking.&lt;/p&gt;
&lt;p&gt;To start with, let's talk specifically about infix operators, like &lt;tt class="docutils literal"&gt;+&lt;/tt&gt;.
Haskell and Koka implement infix operators with a bunch of syntactic sugar, that allows the representation of the operator to be named in prefix form.
So, if you crack open the definition of, say, list concatenation, you get&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;ys&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ys&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="kt"&gt;:&lt;/span&gt;&lt;span class="n"&gt;xs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ys&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;xs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ys&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;or&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;// Append two lists.&lt;/span&gt;
&lt;span class="n"&gt;pub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;fun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;(++)&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;list&amp;lt;a&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ys&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;list&amp;lt;a&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;list&amp;lt;a&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;append(xs,ys)&lt;/span&gt;

&lt;span class="c1"&gt;// Append two lists.&lt;/span&gt;
&lt;span class="na"&gt;pub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;fun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;list&amp;lt;a&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ys&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;list&amp;lt;a&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;list&amp;lt;a&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;xs&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="ge"&gt;Cons&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;xx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ge"&gt;Cons&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;ys&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="ge"&gt;Nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ys&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Unlike Haskell or Koka, Python implements &amp;quot;define an implementation of an infix operator&amp;quot; by having the class in question define a method named with &lt;tt class="docutils literal"&gt;__double_underscores__&lt;/tt&gt;, like &lt;tt class="docutils literal"&gt;+&lt;/tt&gt; with &lt;tt class="docutils literal"&gt;__add__&lt;/tt&gt;.
(And &lt;tt class="docutils literal"&gt;__radd__&lt;/tt&gt;, and there's also &lt;tt class="docutils literal"&gt;__iadd__&lt;/tt&gt;, which should do something &lt;em&gt;similar&lt;/em&gt; to &lt;tt class="docutils literal"&gt;__add__&lt;/tt&gt; but not the same, and...)&lt;/p&gt;
&lt;p&gt;Python also uses this kind of mechanism for unary operations, and various other bits of built-in functions and syntax.
Now, what &amp;quot;works&amp;quot; here is the mapping between &amp;quot;fancy syntax&amp;quot; and &amp;quot;the actual method implementation&amp;quot;.
If you have&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;my_var&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;then executing that code is going to result in the &lt;tt class="docutils literal"&gt;__add__&lt;/tt&gt; method being looked up on the &lt;em&gt;type&lt;/em&gt; of &lt;tt class="docutils literal"&gt;my_var&lt;/tt&gt;, and passed &lt;tt class="docutils literal"&gt;my_var&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;3&lt;/tt&gt;.
You can get similar behavior by invoking the method directly on the instance, although this is brittle in certain ways:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;my_var&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="fm"&gt;__add__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;my_var&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;(If we used a user-defined type for the right-hand side, this would not necessarily hold.
This is getting into that &lt;tt class="docutils literal"&gt;__radd__&lt;/tt&gt; stuff from earlier.)&lt;/p&gt;
&lt;p&gt;What Eevee is pondering is the equivalent of&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;my_var&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="fm"&gt;__add__&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;custom_add_function&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;my_var&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="fm"&gt;__add__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;my_var&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This is not likely to work, because Python doesn't look up the &amp;quot;magic&amp;quot; method on the instance at all.&lt;/p&gt;
&lt;p&gt;As to why I'm not currently comfortable with the statement that &amp;quot;there's not actually a good reason for this&amp;quot;, we'll have to look at the reasons that I do see for it.&lt;/p&gt;
&lt;p&gt;If I'm understanding my experiments correctly, attribute access in Python essentially &amp;quot;looks&amp;quot; in two different directions.&lt;/p&gt;
&lt;p&gt;On an instance that is not a type, &lt;tt class="docutils literal"&gt;instance.attr&lt;/tt&gt; will check the instance dictionary for &lt;tt class="docutils literal"&gt;attr&lt;/tt&gt;, and the instance dictionary of its type, and its type's ancestors.
The behavior is eerily configurable if you're determined, and the default behavior is slightly more involved than I feel like summarizing currently.&lt;/p&gt;
&lt;p&gt;On an instance that is a type, the &lt;tt class="docutils literal"&gt;my_type.attr&lt;/tt&gt; situation is similar, except that now the &lt;em&gt;instance&lt;/em&gt; has type ancestors to contend with, as well as the ancestors of its types.
(The type of a type should be a subtype of the type of its supertypes, so there's no problem only checking the type of the instance itself.)&lt;/p&gt;
&lt;p&gt;Where things get hairy is not necessarily &lt;tt class="docutils literal"&gt;__add__&lt;/tt&gt;, but one of the more commonly invoked operations of a type.&lt;/p&gt;
&lt;p&gt;Suppose we want to create a type whose instances can be called like a function.
This looks like&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyClass&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__call__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now, one type whose instances are often called like a function is... &lt;tt class="docutils literal"&gt;type&lt;/tt&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TalkyMeta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__call__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;            &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hi there!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="fm"&gt;__call__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Talky&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;metaclass&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;TalkyMeta&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;Talky&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="go"&gt;Hi there!&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;__main__.Talky object at 0x7fd4850de110&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;As long as we have types acting as the main entry point for constructing their instances, using the &lt;tt class="docutils literal"&gt;__call__&lt;/tt&gt; method, then we can't look up all &amp;quot;magic&amp;quot; methods on the instance without making it &lt;em&gt;highly inconvenient&lt;/em&gt; to construct an instance of a type that overrides &lt;tt class="docutils literal"&gt;__call__&lt;/tt&gt; so its instances can emulate functions.&lt;/p&gt;
&lt;p&gt;For what it's worth, Lua's metamethods avoid taking a stand on this by not allowing the instance to access the metamethods via instancing unless you specifically hook it up like that.
There's one table for metamethods, and another table for extra attributes visible on the instance, and maybe they're the same table, but they don't &lt;em&gt;have to be&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;It's getting late, so I'll just say that my gut feeling is that, instead of trying to make the magic method lookup take the instance dictionary into account, it should (somehow) get its own mapping on the type, distinct from the &amp;quot;stuff that the instance delegates to explicitly&amp;quot;.&lt;/p&gt;
&lt;p&gt;This raises a bunch of questions in the context of language design, so this idea is way more of a starting point than an ending point, so there's plenty more for me to think about, later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category><category term="untitled-language"></category><category term="speculation"></category></entry><entry><title>Weekly Roundup 2022-08-23</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-08-23" rel="alternate"></link><published>2022-08-23T04:00:00-04:00</published><updated>2022-08-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-08-23:/weekly-roundup-2022-08-23</id><summary type="html">&lt;p class="first last"&gt;Soon™&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I looked into the blog's mobile usability issues, since apparently the blog is in the mobile crawler bucket.&lt;/li&gt;
&lt;li&gt;Thursday: I did a bunch of work on the draft changes to the templates and stylesheet, and virtually no work on the post.&lt;/li&gt;
&lt;li&gt;Friday: I made a bunch of progress on the redesign.&lt;/li&gt;
&lt;li&gt;Saturday: I didn't get too much done, because I was watching a baseball game on Twitch.&lt;/li&gt;
&lt;li&gt;Sunday: Some work done, but it didn't really feel like much.&lt;/li&gt;
&lt;li&gt;Monday: I basically finished my stretch goals for the redesign.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to take a few days off from the redesign, check over it, and roll it out, let's say, over the weekend.
Ish.
I've got other stuff I want to mess around with in the meantime, but I'm not sure how much I'm up for, since I was sick yesterday and didn't fully realize it.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Site Design 2022-08-22</title><link href="https://mwchase.neocities.org/site-design-2022-08-22" rel="alternate"></link><published>2022-08-22T04:00:00-04:00</published><updated>2022-08-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-08-22:/site-design-2022-08-22</id><summary type="html">&lt;p class="first last"&gt;Closing in...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've been tweaking things, and now I think I just need some time to consider any further changes I may want to change.&lt;/p&gt;
&lt;p&gt;When I tested out the Bonus Content, I ran into some issues that imply to me that I need to remake it.
Fortunately, it's just the assets, all of the code and styling is done.
I might have time to redo this after this post, but I don't want to block this post on that.&lt;/p&gt;
&lt;p&gt;I didn't get to the Python code I wanted to update, but oh well.
Not sure about next weekend, but we'll see.&lt;/p&gt;
&lt;p&gt;Anyway, I want to wrap up for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Blog Setup"></category><category term="Redesign"></category></entry><entry><title>Diary 2022-08-21</title><link href="https://mwchase.neocities.org/diary-2022-08-21" rel="alternate"></link><published>2022-08-21T04:00:00-04:00</published><updated>2022-08-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-08-21:/diary-2022-08-21</id><summary type="html">&lt;p class="first last"&gt;I'm not sure what &lt;em&gt;happened&lt;/em&gt; to today, but sure, whatever.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, the blog code is handling the new directive for the Bonus Content.
I still need to create the theming to go along with it, and make sure I can properly integrate it with the stylesheet, but at least I know I won't trip over my shoelaces at the finish line.&lt;/p&gt;
&lt;p&gt;I finished my stretch goals for the tooling stuff for my other writing today, so that's good.&lt;/p&gt;
&lt;p&gt;And I took some design notes on the Bonus Content.&lt;/p&gt;
&lt;p&gt;Sadly, I didn't have time to work on the Python code or the writing, but I'll at least try to lay the groundwork for the writing tomorrow.
I just created the project file that I'm going to import the current draft into.
That's a small step, and I could do it at any time, so why not now, I figure.&lt;/p&gt;
&lt;p&gt;That doesn't apply to anything else, because I have like half an hour to midnight, and I'd rather not spend all of it on these entries.&lt;/p&gt;
&lt;p&gt;Basic tasks for tomorrow:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Refresh my memory on the Python code, maybe start fixing stuff up.&lt;/li&gt;
&lt;li&gt;Sketch concrete designs for the Bonus Content.&lt;/li&gt;
&lt;li&gt;Get on with importing the draft.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The big thing I need to handle that is to try and actually do stuff in the morning.
For now, I'm going to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="I should figure out something useful to put in here"></category></entry><entry><title>Diary 2022-08-20</title><link href="https://mwchase.neocities.org/diary-2022-08-20" rel="alternate"></link><published>2022-08-20T04:00:00-04:00</published><updated>2022-08-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-08-20:/diary-2022-08-20</id><summary type="html">&lt;p class="first last"&gt;CONFUSED blogger HELD HOSTAGE by PSYCHO UMPIRE&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, so, this isn't going to be a long entry because I didn't have time to come up with anything.
I like that things are coming together with the site design, but I've got other stuff I want to be working on.&lt;/p&gt;
&lt;p&gt;I think my best bet there is to get to bed as soon as I can, then make sure I have a properly relaxing morning.
We'll see how that plan works out for me.&lt;/p&gt;
&lt;p&gt;Basically, I want to take care of the following things:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Art design for the remaining parts of the site rework.&lt;/li&gt;
&lt;li&gt;Code support for the remaining parts of the site rework.&lt;/li&gt;
&lt;li&gt;Final tweaks to some of the support tooling for my other writing.&lt;/li&gt;
&lt;li&gt;Begin the next editing pass on the other writing.&lt;/li&gt;
&lt;li&gt;Juggle python projects.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Yeah, this seems somewhat... ambitious.
But we'll see tomorrow.
For now, I need to sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category><category term="Rushed"></category></entry><entry><title>Site Design 2022-08-19</title><link href="https://mwchase.neocities.org/site-design-2022-08-19" rel="alternate"></link><published>2022-08-19T04:00:00-04:00</published><updated>2022-08-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-08-19:/site-design-2022-08-19</id><summary type="html">&lt;p class="first last"&gt;Readying all sorts of cursed nonsense...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Things are coming together on the redesign.
More accent colors showing things off and spacing things out, better scrolling behavior, local fonts so my fonts get served from the same CDN as my content, tags overhauled to show up properly...&lt;/p&gt;
&lt;p&gt;By the way, I don't &lt;em&gt;mind&lt;/em&gt; if anyone tries to copy stuff from this site's CSS, either before or after I roll out the update, but if it does occur to you, keep in mind that I'm self-taught, and using trial and error on a small set of browser configurations.
While I believe the style and template updates will represent a net improvement in presentation quality, there could be all kinds of regressions or unaddressed issues.&lt;/p&gt;
&lt;p&gt;I want to take a few days to poke around for additional issues, and work on the Sweet Bonus Feature that I was prioritizing everything else over.
At some point, I should maybe try to put together some kind of automated tool for evaluating drafts of the blog without having to click around myself to find every issue like &amp;quot;Oh no, this rule is applying too much&amp;quot;, or &amp;quot;this element still has the wrong width if the screen is too narrow&amp;quot; or &amp;quot;there are too many scroll bars&amp;quot;.&lt;/p&gt;
&lt;p&gt;Anyway, yeah, a better phone experience is coming.
At least, assuming that &amp;quot;smush it into a smaller viewport than apparently anything on the market, and assume it works at all intermediate resolutions&amp;quot; is valid &lt;em&gt;enough&lt;/em&gt; as a way of improving the phone experience.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Blog Setup"></category><category term="Oh geez"></category><category term="I should be putting stuff in here again..."></category></entry><entry><title>Site Design 2022-08-18</title><link href="https://mwchase.neocities.org/site-design-2022-08-18" rel="alternate"></link><published>2022-08-18T04:00:00-04:00</published><updated>2022-08-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-08-18:/site-design-2022-08-18</id><summary type="html">&lt;p class="first last"&gt;Tags are coming back.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I made a bunch of improvements or changes to the site layout and templates on a branch, and I'll hopefully be able to roll it out soon.&lt;/p&gt;
&lt;p&gt;I spent too long working on that to have anything more substantive to write in this entry byyyyye&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Blog Setup"></category></entry><entry><title>Site Design 2022-08-17</title><link href="https://mwchase.neocities.org/site-design-2022-08-17" rel="alternate"></link><published>2022-08-17T04:00:00-04:00</published><updated>2022-08-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-08-17:/site-design-2022-08-17</id><summary type="html">&lt;p class="first last"&gt;Pondering some shakeups and improvements...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;While I was thinking about stuff to do, I remembered that Google was yelling at me about mobile usability.
(I don't know, the blog works fine on &lt;em&gt;my&lt;/em&gt; phone...)&lt;/p&gt;
&lt;p&gt;Anyway, that got me thinking about updates to make to the site.&lt;/p&gt;
&lt;p&gt;For myself, I want to look into a few possibilities:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Make the main content area wider, mainly to fit more code on the screen when I'm messing with code blocks.
So, my maximum goal there is 76 characters.&lt;/li&gt;
&lt;li&gt;Add previous/next controls to the &lt;em&gt;top&lt;/em&gt; of pages that only have them at the bottom (and vice versa, if applicable)&lt;/li&gt;
&lt;li&gt;SECRET BONUS STUFF&lt;/li&gt;
&lt;li&gt;Maybe I can try to get tags working again?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Google is raising a bunch of usability issues, but it's not raising them about any pages &lt;em&gt;currently&lt;/em&gt;, and it only raises them about &lt;em&gt;a few pages at a time&lt;/em&gt;, which...
That's weird, right?
I'm not doing anything radically different on different pages that would result in &lt;em&gt;exactly seven&lt;/em&gt; pages having issues with:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Small text (it can't be complaining about the main body text, right? That's 18px)&lt;/li&gt;
&lt;li&gt;Clickable elements too close together&lt;/li&gt;
&lt;li&gt;Viewport not set&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I guess I'm going to have to research viewport stuff.
Like, what's the viewport to set for &amp;quot;it's a static blog, I don't care&amp;quot;?&lt;/p&gt;
&lt;p&gt;From further messing-around, I haven't gotten it to pin down a specific broken page, so I'm going to ignore the text and clickable elements for now, and look into the viewport, because I could believe that's an issue even if it doesn't show up when I have it test a page (???).&lt;/p&gt;
&lt;p&gt;In any case, I'm going to finish up and publish this post, then queue up some reading for later on responsive web design, because I guess I need to look into that.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Blog Setup"></category></entry><entry><title>Weekly Roundup 2022-08-16</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-08-16" rel="alternate"></link><published>2022-08-16T04:00:00-04:00</published><updated>2022-08-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-08-16:/weekly-roundup-2022-08-16</id><summary type="html">&lt;p class="first last"&gt;An entirely predictable slowdown.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I planned out some stuff for generating HTML with Koka.&lt;/li&gt;
&lt;li&gt;Thursday: I went a little further with that, speculating about various representations that would make sense at different stages.&lt;/li&gt;
&lt;li&gt;Friday: I did work on the HTML stuff and other stuff, mostly the HTML stuff.&lt;/li&gt;
&lt;li&gt;Saturday: I was wiped out from traveling.&lt;/li&gt;
&lt;li&gt;Sunday: I revisited some of the code that MOTR is &lt;em&gt;for&lt;/em&gt;, and updated it.&lt;/li&gt;
&lt;li&gt;Monday: I was wiped out from traveling again, so I decided to mess with a new project that I'd picked up over the weekend.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I don't know, I'm not quite up for planning I guess.
Try to get spun back up with Koka, maybe.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-08-15</title><link href="https://mwchase.neocities.org/coding-2022-08-15" rel="alternate"></link><published>2022-08-15T04:00:00-04:00</published><updated>2022-08-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-08-15:/coding-2022-08-15</id><summary type="html">&lt;p class="first last"&gt;*Waves hands erratically, muttering about &amp;quot;monotone&amp;quot;*&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Uuuugh...&lt;/p&gt;
&lt;p&gt;We were wiped out by travel today, so I'm going to just focus on the graph stuff I was working on earlier.&lt;/p&gt;
&lt;p&gt;Basically, I don't have a specific usage in mind for this, but I feel like it'd be interesting to have a &lt;tt class="docutils literal"&gt;Graph[T]&lt;/tt&gt; data type that can hold many different types of data (so it's functionally going to end up as a &lt;tt class="docutils literal"&gt;Graph[T | U | V | W | &lt;span class="pre"&gt;...]&lt;/span&gt;&lt;/tt&gt;, and I admit I'm not sure if I can strike a good balance between useful interface and type safety here...), that takes typed edges to move between vertices.
(The likely endpoint for this, if it makes any significant progress, is &amp;quot;not-very-good database&amp;quot;.)&lt;/p&gt;
&lt;p&gt;One thing that I wanted was to have a distinction between &amp;quot;edges added explicitly&amp;quot; and &amp;quot;edges calculated from other edges&amp;quot;.
(And potentially, some of these &amp;quot;calculated&amp;quot; edges could have the ability to act as a shortcut for adding explicit edges, provided there's a unique minimal graph satisfying &amp;quot;this edge goes between these points&amp;quot;.)
Now, something that I hadn't fully worked out until recently, and I think it's going to be significant, is that &amp;quot;calculated&amp;quot; edges can't just produce an arbitrary value; it has to be an actual vertex in the graph, and the only way to guarantee that is to only work with the graph structure, and ignore the actual contents of the vertices.&lt;/p&gt;
&lt;p&gt;The thing that I'm trying to figure out right now is, when does it make sense to talk about following an edge backwards?
Explicit edges can always be followed backwards.&lt;/p&gt;
&lt;p&gt;Let's do a hand-wavey induction thing and consider, supposing we have some collection of &amp;quot;reversible&amp;quot; edges, how can they be composed?&lt;/p&gt;
&lt;p&gt;Basically, an edge takes a vertex in a graph to a set of other vertices, so &amp;quot;calculated&amp;quot; edges need to just combine and work with these sets.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;We can produce an edge by intersecting the sets of two edges, and reverse that edge by intersecting their reversals; similarly for unions.&lt;/li&gt;
&lt;li&gt;We can also compose two edges and union the resulting set of sets; I'm not sure that intersecting the set of sets makes sense.
... Rather, it's that I &lt;em&gt;think&lt;/em&gt; the union reverses cleanly, and the intersection doesn't.
With the union, you're basically saying &amp;quot;this edge, then this edge&amp;quot;.
With the intersection, I was going to try to work through some stuff, but then I realized, wait; you can make the intersection of the composition &lt;em&gt;shrink&lt;/em&gt; by &lt;em&gt;adding edges&lt;/em&gt;.
That's wrong, I think.&lt;/li&gt;
&lt;li&gt;We can extend an existing edge with a predicate function that takes two variables; this does allow us to reach into the vertex data, but only for the purpose of choosing a course of action regarding vertices that exist.&lt;/li&gt;
&lt;li&gt;Now, maybe there's some way to extend that concept, because I know I want something like:&lt;ul&gt;
&lt;li&gt;An edge that exists if underlying edge &lt;tt class="docutils literal"&gt;E1&lt;/tt&gt; exists&lt;/li&gt;
&lt;li&gt;But only if the target vertex has an edge &lt;tt class="docutils literal"&gt;E2&lt;/tt&gt; to vertex &lt;tt class="docutils literal"&gt;V&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;This is fundamentally just a predicate that requires the graph in order to define it, so let's just throw another variable in there.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I realized the stuff in that list, not quite in the order that I placed it up there, so now I've got two things:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Confidence that every edge type I've thought of should be reversible.&lt;/li&gt;
&lt;li&gt;Knowledge that I have to be careful with the graph-based predicate idea.
Like, that's going to break if it's possible to express the idea of &amp;quot;express this edge if this other edge &lt;em&gt;doesn't&lt;/em&gt; exist&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;An incomplete list of things that should probably work with that:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Reasoning about the unions of arbitrary sets&lt;/li&gt;
&lt;li&gt;Reasoning about the intersections of predefined sets&lt;/li&gt;
&lt;li&gt;Filtering a set based on a predicate that doesn't refer to the graph&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A lot of this graph stuff is basically a recreation of the &amp;quot;calculated&amp;quot; edge stuff, which implies that it should be possible to express these &amp;quot;graph&amp;quot; predicates &lt;em&gt;as&lt;/em&gt; edges, and instead of &amp;quot;three-argument predicate&amp;quot;, have something that's just &amp;quot;if this edge exists, and this other edge leads from the [start/end] of that edge, to at least one other vertex&amp;quot;.
(Maybe allow reasoning about cardinality in order to be &lt;em&gt;fancy&lt;/em&gt;, but it's not obvious to me why the threshold should ever be higher than 1.)&lt;/p&gt;
&lt;p&gt;This has been some good rubber-ducking for a project that I don't have any idea what I'm going to do with it, and frankly, I'll take that.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-08-14</title><link href="https://mwchase.neocities.org/coding-2022-08-14" rel="alternate"></link><published>2022-08-14T04:00:00-04:00</published><updated>2022-08-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-08-14:/coding-2022-08-14</id><summary type="html">&lt;p class="first last"&gt;Hate to see it when a bunch of stuff failed, and the only thing that changed on my end was the passage of time.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm still kind of out of it, so instead of holding myself to grinding out some improvements to MOTR, I had a look at one of the projects I intend to use it with.
The project had suffered some bitrot, so I took the time to update the things that had changed.&lt;/p&gt;
&lt;p&gt;Basically:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;It was using my old fork of flake8-html, so I pushed my local copy to GitHub, and pointed both MOTR and this project's requirements files to the branch, so that other people could, in theory, run the test suites and see the failures for themselves.
I also updated the fork with the latest commits from master.
And pinned the flake8 version for now.&lt;/li&gt;
&lt;li&gt;Mypy got some good updates that I had to update some of my code to deal with.
The result probably makes more sense.&lt;/li&gt;
&lt;li&gt;The shiv build step included an argument being passed to pip that broke the build because it wasn't recognized.
So I removed it, and it seems fine?
I wonder why I had it in the first place...
Ah, looks like I was checking for any fallout from a then-upcoming change to pip, that went in, so they took out the option to enable it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, one reason I'd been looking at this repo is that it hosts my punq fork (which I'm going to rename, for sure).
The fork relies on the behavior of PEP 563 to construct nicely namespaced types in a registry for dependency injection.
My impression of the plans for annotations is &amp;quot;switch to PEP 649, once we figure out how&amp;quot;, so I figured I'd investigate things in this area.
I'm aware that the switch will break the punq fork in fascinating ways (and I'm not totally clear on how original punq will handle it when it comes around), but my impression from looking at some of this code, and thinking about the rest, is that I can probably just get rid of a bunch of non-standard behavior, replace it with &lt;tt class="docutils literal"&gt;NewType&lt;/tt&gt;s, and delete a whole bunch of code that I barely remember writing, but that I know for a fact isn't anybody else's fault.&lt;/p&gt;
&lt;p&gt;I'm thinking I'll mostly write this weekend off and mess around with other stuff, but once I've got my energy back, I think it'd make sense to alternate between updating MOTR and this other repository.
Like, make changes to one repository, run tests, spend a few minutes on the other, run tests, go back to check the first set of tests...&lt;/p&gt;
&lt;p&gt;That seems like it makes sense.
Next week, or later, I'll see how it shakes out in practice.&lt;/p&gt;
&lt;p&gt;I've got a bit more time tonight, so I'm going to mess around with something else for now, to blow off steam.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2022-08-13</title><link href="https://mwchase.neocities.org/diary-2022-08-13" rel="alternate"></link><published>2022-08-13T04:00:00-04:00</published><updated>2022-08-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-08-13:/diary-2022-08-13</id><summary type="html">&lt;p class="first last"&gt;One hundred miles of travel. Head full of swirling thoughts that are getting jammed trying to leave, because they're all trying to go at once.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;We were on the road for a while, so I'm not really capable of focusing on stuff.
My short-term plan is to write this entry, then scribble some ideas on paper.&lt;/p&gt;
&lt;p&gt;There are a bunch of ideas swirling around in my head, and I need to take some time to crystallize them, and hopefully I'll be able to pursue them later, either in Python once I have MOTR in an acceptable condition, or in some other language if it'd be a better fit.&lt;/p&gt;
&lt;p&gt;Stuff about graph data types, and what inheritance should accomplish in a programming language idea I'm messing with.
And probably other things that I'm not remembering offhand.
There's no direct relationship between any of these ideas, but I'm thinking about them at the same time.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Learning Koka 2022-08-12</title><link href="https://mwchase.neocities.org/learning-koka-2022-08-12" rel="alternate"></link><published>2022-08-12T04:00:00-04:00</published><updated>2022-08-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-08-12:/learning-koka-2022-08-12</id><summary type="html">&lt;p class="first last"&gt;I'm going to need to write more stuff down and stop trying to get this done in my head.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm having a kind of distracting few days, so I might not get much written for a few entries.&lt;/p&gt;
&lt;p&gt;I did mess with some other stuff in Koka earlier today, but I didn't have much luck; it looks like some of the generics stuff I wanted to do is not super obvious in the documentation, if it's even possible.&lt;/p&gt;
&lt;p&gt;Anyway, I'll write some quick obvious code for the HTML stuff.&lt;/p&gt;
&lt;p&gt;Hm, wasn't as quick as I thought, and also I found some limitations in the vim plugin for Koka, which isn't a surprise, since I think it's a third-party thing.&lt;/p&gt;
&lt;p&gt;I don't want to stay up overlong, so I'm going to start winding down now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Learning Koka"></category></entry><entry><title>Learning Koka 2022-08-11</title><link href="https://mwchase.neocities.org/learning-koka-2022-08-11" rel="alternate"></link><published>2022-08-11T04:00:00-04:00</published><updated>2022-08-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-08-11:/learning-koka-2022-08-11</id><summary type="html">&lt;p class="first last"&gt;Not totally confident about this approach, but let's see how it shakes out...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm going to stick to the HTML stuff for now, rather than switching with the structuring concurrency.&lt;/p&gt;
&lt;p&gt;I have a feeling that I'm doing something kind of imprecise with my mental models of this tag rendering stuff, so let's see what happens if I try to lay down some details.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ge"&gt;Tag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;html&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="ge"&gt;Just&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ge"&gt;Tag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;head&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ge"&gt;Just&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]))),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ge"&gt;Tag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;body&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ge"&gt;Just&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]))),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Which should turn into&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Obviously, the Koka code is not how stuff should be written out manually...&lt;/p&gt;
&lt;p&gt;And to tweak the output a bit...&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ge"&gt;Tag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;html&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="ge"&gt;Just&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ge"&gt;Tag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;head&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ge"&gt;Just&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]))),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ge"&gt;Tag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;body&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ge"&gt;Just&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]))),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Which should produce&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;How it gets there&lt;/em&gt; doesn't feel straightforward to me.
Like, maybe there can be a list of lines, where each line is a list of elements, and once the line includes a line break, it gets split up into a bunch of lines?&lt;/p&gt;
&lt;p&gt;So there's then another representation like&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="ge"&gt;StartTag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;html&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]),&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="ge"&gt;StartTag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;head&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]),&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="ge"&gt;EndTag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;head&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="ge"&gt;StartTag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;body&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]),&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="ge"&gt;EndTag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;body&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="ge"&gt;EndTag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;html&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I've drafted out basic code for representing this stuff, but I should figure out how to represent stuff like &amp;quot;tags that don't reflow their content in a templating context&amp;quot;.&lt;/p&gt;
&lt;p&gt;I'll have to think about that some, maybe switch gears again later.
For now, I'm tired.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Learning Koka"></category></entry><entry><title>Learning Koka 2022-08-10</title><link href="https://mwchase.neocities.org/learning-koka-2022-08-10" rel="alternate"></link><published>2022-08-10T04:00:00-04:00</published><updated>2022-08-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-08-10:/learning-koka-2022-08-10</id><summary type="html">&lt;p class="first last"&gt;All of this &lt;em&gt;stuff&lt;/em&gt; going on with HTML that I usually don't think about...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I thought about stuff to do with Koka, and I ended up deciding to try to focus on one subsystem from the hypothetical CGI idea: just generating HTML.&lt;/p&gt;
&lt;p&gt;The basic thing I'm interested in trying to do, is to make the generated HTML indent nicely.
If you ask around online, people will tell you this is &amp;quot;not important&amp;quot; and such, but I'm looking for something that interests me, rather than that addresses any burning need.&lt;/p&gt;
&lt;p&gt;I'm thinking some kind of library of functions that lets you write all of this as code.
Have functions for each tag.
So, what we need to know about how this stuff all works?&lt;/p&gt;
&lt;p&gt;Well, there's the doctype thing.
Some tags can only appear in specific contexts, which it &lt;em&gt;might&lt;/em&gt; make sense to express in the type system.
For now, I'll just think about that in terms of the &lt;tt class="docutils literal"&gt;&amp;lt;html&amp;gt;&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;&amp;lt;head&amp;gt;&lt;/tt&gt;, and &lt;tt class="docutils literal"&gt;&amp;lt;body&amp;gt;&lt;/tt&gt; tags, since those are simple.&lt;/p&gt;
&lt;p&gt;Maybe try to separately address &amp;quot;this is how to convert this tag object to a string&amp;quot; and &amp;quot;this is how tag objects are allowed to relate to each other&amp;quot;.&lt;/p&gt;
&lt;p&gt;Like, a generic representation of &amp;quot;HTML tags, but ignoring all semantics&amp;quot;...
That looks something like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;a tag name&lt;/li&gt;
&lt;li&gt;an alist of attribute-value pairs&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;maybe&amp;lt;&amp;gt;&lt;/tt&gt; a structure that represents the tag contents, which can be, say, &lt;tt class="docutils literal"&gt;maybe&amp;lt;&amp;gt;&lt;/tt&gt; a string, followed by a vector or list of tag-text pairs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I believe a few tags would need special-casing (I'm thinking &lt;tt class="docutils literal"&gt;&amp;lt;pre&amp;gt;&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;&amp;lt;script&amp;gt;&lt;/tt&gt; at least), but the majority should be able to work from just that.&lt;/p&gt;
&lt;p&gt;Anyway, I let this get late.
I'll actually try to code stuff later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Learning Koka"></category></entry><entry><title>Weekly Roundup 2022-08-09</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-08-09" rel="alternate"></link><published>2022-08-09T04:00:00-04:00</published><updated>2022-08-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-08-09:/weekly-roundup-2022-08-09</id><summary type="html">&lt;p class="first last"&gt;Computers are weird.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I tried to explain what interests me about Koka.&lt;/li&gt;
&lt;li&gt;Thursday: I talked about using Koka for a specific practical-ish application.&lt;/li&gt;
&lt;li&gt;Friday: I speculated about what a structured concurrency library in Koka would look like.&lt;/li&gt;
&lt;li&gt;Saturday: I did some more work on CGI in Koka, and ran into bizarre issues that kind of make me want to come up with some other project for Koka, and I'll mess with rolling my own CGI library in Lua or whatever.&lt;/li&gt;
&lt;li&gt;Sunday: I started reviewing MOTR's codebase to look for obvious problems, and sorted them in rough order of when I want to be working on them.&lt;/li&gt;
&lt;li&gt;Monday: I finished the review, though I'm going to need a few more passes.
I also made some of the changes, and got to see how justified they were because I was squinting at some lines going &amp;quot;Wait, &lt;em&gt;which&lt;/em&gt; of these attribute accesses is broken?&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I guess I'll look for some other project to switch off with for the structured concurrency stuff.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-08-08</title><link href="https://mwchase.neocities.org/coding-2022-08-08" rel="alternate"></link><published>2022-08-08T04:00:00-04:00</published><updated>2022-08-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-08-08:/coding-2022-08-08</id><summary type="html">&lt;p class="first last"&gt;Got to get rid of the Smurf-oriented programming.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Starting again, picking up from yesterday...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Change ASAP&lt;ul&gt;
&lt;li&gt;Names&lt;ul&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;CommandBuilder&lt;/tt&gt; needs a different name for the &lt;tt class="docutils literal"&gt;command&lt;/tt&gt; attribute, which needs a new name for its type.&lt;/li&gt;
&lt;li&gt;In fact, I believe the type should be renamed &lt;tt class="docutils literal"&gt;Executable&lt;/tt&gt;, after the fact that the &lt;tt class="docutils literal"&gt;x&lt;/tt&gt; bit is set on the file, and &lt;em&gt;its&lt;/em&gt; &lt;tt class="docutils literal"&gt;command&lt;/tt&gt; attribute should be &lt;tt class="docutils literal"&gt;name&lt;/tt&gt; instead.
The same file has some type aliases that derive from the type, and they should be updated as well.
Consider renaming &lt;tt class="docutils literal"&gt;Metadata&lt;/tt&gt;, mainly because it's not a very descriptive name.
It might fare better if I moved it to the &lt;tt class="docutils literal"&gt;command_builder&lt;/tt&gt; module.
Consider that.&lt;/li&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;entry&lt;/tt&gt; module seems reasonable, but come back to it later.&lt;/li&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;flex&lt;/tt&gt; module feels like it needs an overhaul, but I'm not sure what to replace anything with.
Changes may propagate to the &lt;tt class="docutils literal"&gt;parametric&lt;/tt&gt; module.&lt;/li&gt;
&lt;li&gt;A lot of the class names in &lt;tt class="docutils literal"&gt;input_accumulator&lt;/tt&gt; are kind of awkward, but I don't have a clear idea of what to replace them with, because I think I need to figure out more about the usage.
All the same, it's worth seeing if the decorators can be turned into classmethods.&lt;/li&gt;
&lt;li&gt;In &lt;tt class="docutils literal"&gt;installers&lt;/tt&gt;, I think maybe &lt;tt class="docutils literal"&gt;Environment&lt;/tt&gt; should be &lt;tt class="docutils literal"&gt;ExecutionEnvironment&lt;/tt&gt;.
I'm not really sure, though.&lt;/li&gt;
&lt;li&gt;Not sure if the &lt;tt class="docutils literal"&gt;parameters&lt;/tt&gt; module needs anything.&lt;/li&gt;
&lt;li&gt;A bunch of the functions in the &lt;tt class="docutils literal"&gt;parametric&lt;/tt&gt; module could be converted to methods.
I'm not sure about &amp;quot;should&amp;quot;...&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;motr._api.cli_types.registry&lt;/tt&gt; could do with some renames.
Like, the point of it is just that these are the constants, maybe, to go with the parameters.&lt;/li&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;typed_mapping&lt;/tt&gt; module and protocols could also do with a rename.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;motr._api.cli.build&lt;/tt&gt; could do with the same classmethod rewrite I'm considering elsewhere, if I go through with it.&lt;/li&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;cli&lt;/tt&gt; modules have the general thing of, I should probably combine the python versions adaptor and the pip arguments label into a single object of some kind.
And there are other changes I want to make, that I've laid out elsewhere.
I'm skimming over this stuff, so I'm going to have to go into more detail again later.&lt;/li&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;python_helpers&lt;/tt&gt; module needs the &lt;tt class="docutils literal"&gt;requirement_invocation&lt;/tt&gt; function to be renamed.
Not sure about anything else.&lt;/li&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;reports&lt;/tt&gt; module could have the &lt;tt class="docutils literal"&gt;acumulator&lt;/tt&gt; function renamed, or not.
We'll see.&lt;/li&gt;
&lt;li&gt;Don't know about the &lt;tt class="docutils literal"&gt;pip&lt;/tt&gt; module, name-wise.
Or otherwise.&lt;/li&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;package&lt;/tt&gt; module has some functions that I should see if I can get rid of.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Everything else&lt;ul&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;isinstance()&lt;/tt&gt; calls in the &lt;tt class="docutils literal"&gt;command&lt;/tt&gt; module.&lt;/li&gt;
&lt;li&gt;I'm considering dropping many uses of &lt;tt class="docutils literal"&gt;PVector[T]&lt;/tt&gt;, since I'm not really, like, using any part of the interface beyond what I'd get from a &lt;tt class="docutils literal"&gt;Tuple[T, &lt;span class="pre"&gt;...]&lt;/span&gt;&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;isinstance()&lt;/tt&gt; calls in the &lt;tt class="docutils literal"&gt;parametric_command&lt;/tt&gt; module.
Also, there are some types that could be improved with a typed mapping.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;reduce_parameterization()&lt;/tt&gt; could have the arguments reorganized a little so that &lt;tt class="docutils literal"&gt;reducer&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;initial_value&lt;/tt&gt; are in a single container object.&lt;/li&gt;
&lt;li&gt;Some of the internal strings in &lt;tt class="docutils literal"&gt;motr._api.cli.build&lt;/tt&gt; are wrong, and need to be fixed before the next release.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Change after the next release&lt;ul&gt;
&lt;li&gt;Names&lt;ul&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;cmd_&lt;/tt&gt; function is somewhat unfortunate.
Consider converting to a classmethod?&lt;/li&gt;
&lt;li&gt;I'm a little iffy on whether to keep the &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; names.
They could be &lt;tt class="docutils literal"&gt;Prerequisite&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Outcome&lt;/tt&gt;, for example, but those are mega long.
This would spill over into the &lt;tt class="docutils literal"&gt;not_output&lt;/tt&gt; module.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;mkdir&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;make_parent&lt;/tt&gt; could be moved if &lt;tt class="docutils literal"&gt;cmd_&lt;/tt&gt; is, for consistency.&lt;/li&gt;
&lt;li&gt;Same for &lt;tt class="docutils literal"&gt;write_bytes&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;I think there could be a better name for &lt;tt class="docutils literal"&gt;motr._api.build&lt;/tt&gt; and its &lt;tt class="docutils literal"&gt;build()&lt;/tt&gt; function, but I think to find it, I'd also need to find a better name for &lt;tt class="docutils literal"&gt;motr.core.registry&lt;/tt&gt;.
Which, to be fair, it definitely needs a better name.&lt;/li&gt;
&lt;li&gt;I've got a note to rename &lt;tt class="docutils literal"&gt;motr._api.requirements.action&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;task&lt;/tt&gt;.
This would go along with some changes to &lt;tt class="docutils literal"&gt;core&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Similarly, &lt;tt class="docutils literal"&gt;name_target&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;name_outcome&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;About &lt;tt class="docutils literal"&gt;requirements&lt;/tt&gt; overall...
I feel like something should change, but I've got time to figure things out.&lt;/li&gt;
&lt;li&gt;And, &lt;tt class="docutils literal"&gt;target&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;outcome&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;I've got a rename queued up for &lt;tt class="docutils literal"&gt;motr.core.target_name&lt;/tt&gt; as well.&lt;/li&gt;
&lt;li&gt;And &lt;tt class="docutils literal"&gt;motr.core.target&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Everything else&lt;ul&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;motr._api.actions&lt;/tt&gt; modules, as well as &lt;tt class="docutils literal"&gt;motr._api.cli.build&lt;/tt&gt; need an overhaul to their interfaces, which is going to start with changes in &lt;tt class="docutils literal"&gt;motr.core.runner&lt;/tt&gt;.
Basically, I want to change from &amp;quot;return a mapping of output when done&amp;quot; to &amp;quot;pass in some kind of callback for registering output streams&amp;quot;.&lt;/li&gt;
&lt;li&gt;I want to beef up the details of some of the &lt;tt class="docutils literal"&gt;typed_mapping&lt;/tt&gt; stuff, and also I want to spin it out into its own package.
Making it into a package would allow me to use it in other projects, and also make the test runs faster in MOTR.&lt;/li&gt;
&lt;li&gt;I'm not sure if this counts as &amp;quot;name&amp;quot; or &amp;quot;everything else&amp;quot;, but I'm not totally sold on the way I'm doing re-exports from the &lt;tt class="docutils literal"&gt;api&lt;/tt&gt; module.
Like, is this confusing to people who aren't me?
I need to figure that out.&lt;/li&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;base&lt;/tt&gt; controller is huge and needs to be broken up.
I don't know how, exactly, but it's too big.&lt;/li&gt;
&lt;li&gt;I should see whether I want to add any classes to the &lt;tt class="docutils literal"&gt;exc&lt;/tt&gt; module.&lt;/li&gt;
&lt;li&gt;I've got a bunch of renames cued up in &lt;tt class="docutils literal"&gt;motr.core.registry&lt;/tt&gt;.
The thing I'd like to figure out is, what's a better name for all of this than &amp;quot;registry&amp;quot;?
&lt;tt class="docutils literal"&gt;DependencyGraph&lt;/tt&gt;?
Let's go with that for now.&lt;/li&gt;
&lt;li&gt;As I said, I want to tweak some things in &lt;tt class="docutils literal"&gt;motr.core.runner&lt;/tt&gt;.
Like, renaming &lt;tt class="docutils literal"&gt;RuntimeAction&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;Task&lt;/tt&gt;, and &lt;tt class="docutils literal"&gt;Target&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt; to, um...
Apparently, &lt;tt class="docutils literal"&gt;Request&lt;/tt&gt;, and, let's say...
&lt;tt class="docutils literal"&gt;RequestTask&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;motr.ext.ext_maybe_format&lt;/tt&gt; I think needs to be broken up into multiple extensions, but we'll see.&lt;/li&gt;
&lt;li&gt;Paired changes to &lt;tt class="docutils literal"&gt;motr.main&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;motr.motr_app&lt;/tt&gt; around disabling Cement's ctrl-c signal handling so Trio can have it.&lt;/li&gt;
&lt;li&gt;The line &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;CONFIG[&amp;quot;motr&amp;quot;][&amp;quot;foo&amp;quot;]&lt;/span&gt; = &amp;quot;bar&amp;quot;&lt;/tt&gt; needs to go.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Well, that's a good start for noting this stuff down.
I did this earlier in the day, so maybe I'll feel like making some of these changes later.
We'll see.&lt;/p&gt;
&lt;p&gt;Okay, it's later, and I did some updates.
Things are better, but there's more to be done.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-08-07</title><link href="https://mwchase.neocities.org/coding-2022-08-07" rel="alternate"></link><published>2022-08-07T04:00:00-04:00</published><updated>2022-08-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-08-07:/coding-2022-08-07</id><summary type="html">&lt;p class="first last"&gt;Sometimes it's &lt;em&gt;really obvious&lt;/em&gt; what I should have named things, sometimes not.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, let's start another pass through the MOTR code, to see what changes I want to make.
I'm going to divide this into two pairs of categories: changes to make as soon as possible versus after the next release; and changes to names, and everything else.
My plan is to hold off on &amp;quot;everything else&amp;quot; until I have full test coverage, rather than 94%.&lt;/p&gt;
&lt;p&gt;But let's break this down:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;ASAP&lt;ul&gt;
&lt;li&gt;Names&lt;ul&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;CommandBuilder&lt;/tt&gt; needs a different name for the &lt;tt class="docutils literal"&gt;command&lt;/tt&gt; attribute, which needs a new name for its type.&lt;/li&gt;
&lt;li&gt;In fact, I believe the type should be renamed &lt;tt class="docutils literal"&gt;Executable&lt;/tt&gt;, after the fact that the &lt;tt class="docutils literal"&gt;x&lt;/tt&gt; bit is set on the file, and &lt;em&gt;its&lt;/em&gt; &lt;tt class="docutils literal"&gt;command&lt;/tt&gt; attribute should be &lt;tt class="docutils literal"&gt;name&lt;/tt&gt; instead.
The same file has some type aliases that derive from the type, and they should be updated as well.
Consider renaming &lt;tt class="docutils literal"&gt;Metadata&lt;/tt&gt;, mainly because it's not a very descriptive name.
It might fare better if I moved it to the &lt;tt class="docutils literal"&gt;command_builder&lt;/tt&gt; module.
Consider that.&lt;/li&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;entry&lt;/tt&gt; module seems reasonable, but come back to it later.&lt;/li&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;flex&lt;/tt&gt; module feels like it needs an overhaul, but I'm not sure what to replace anything with.
Changes may propagate to the &lt;tt class="docutils literal"&gt;parametric&lt;/tt&gt; module.&lt;/li&gt;
&lt;li&gt;A lot of the class names in &lt;tt class="docutils literal"&gt;input_accumulator&lt;/tt&gt; are kind of awkward, but I don't have a clear idea of what to replace them with, because I think I need to figure out more about the usage.
All the same, it's worth seeing if the decorators can be turned into classmethods.&lt;/li&gt;
&lt;li&gt;In &lt;tt class="docutils literal"&gt;installers&lt;/tt&gt;, I think maybe &lt;tt class="docutils literal"&gt;Environment&lt;/tt&gt; should be &lt;tt class="docutils literal"&gt;ExecutionEnvironment&lt;/tt&gt;.
I'm not really sure, though.&lt;/li&gt;
&lt;li&gt;Not sure if the &lt;tt class="docutils literal"&gt;parameters&lt;/tt&gt; module needs anything.&lt;/li&gt;
&lt;li&gt;A bunch of the functions in the &lt;tt class="docutils literal"&gt;parametric&lt;/tt&gt; module could be converted to methods.
I'm not sure about &amp;quot;should&amp;quot;...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Everything else&lt;ul&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;isinstance()&lt;/tt&gt; calls in the &lt;tt class="docutils literal"&gt;command&lt;/tt&gt; module.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;isinstance()&lt;/tt&gt; calls in the &lt;tt class="docutils literal"&gt;parametric_command&lt;/tt&gt; module.
Also, there are some types that could be improved with a typed mapping.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;reduce_parameterization()&lt;/tt&gt; could have the arguments reorganized a little so that &lt;tt class="docutils literal"&gt;reducer&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;initial_value&lt;/tt&gt; are in a single container object.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Post-next-release&lt;ul&gt;
&lt;li&gt;Names&lt;ul&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;cmd_&lt;/tt&gt; function is somewhat unfortunate.
Consider converting to a classmethod?&lt;/li&gt;
&lt;li&gt;I'm a little iffy on whether to keep the &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; names.
They could be &lt;tt class="docutils literal"&gt;Prerequisite&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Outcome&lt;/tt&gt;, for example, but those are mega long.
This would spill over into the &lt;tt class="docutils literal"&gt;not_output&lt;/tt&gt; module.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;mkdir&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;make_parent&lt;/tt&gt; could be moved if &lt;tt class="docutils literal"&gt;cmd_&lt;/tt&gt; is, for consistency.&lt;/li&gt;
&lt;li&gt;Same for &lt;tt class="docutils literal"&gt;write_bytes&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;I think there could be a better name for &lt;tt class="docutils literal"&gt;motr._api.build&lt;/tt&gt; and its &lt;tt class="docutils literal"&gt;build()&lt;/tt&gt; function, but I think to find it, I'd also need to find a better name for &lt;tt class="docutils literal"&gt;motr.core.registry&lt;/tt&gt;.
Which, to be fair, it definitely needs a better name.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Everything else&lt;ul&gt;
&lt;li&gt;I didn't get to this normally, but the line &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;CONFIG[&amp;quot;motr&amp;quot;][&amp;quot;foo&amp;quot;]&lt;/span&gt; = &amp;quot;bar&amp;quot;&lt;/tt&gt; needs to go, for obvious reasons.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I got distracted with stuff today, so I didn't have time to get through all of this.
Tomorrow, I'll pick back up from the &lt;tt class="docutils literal"&gt;parametric&lt;/tt&gt; module.&lt;/p&gt;
&lt;p&gt;It's nearly midnight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Learning Koka 2022-08-06</title><link href="https://mwchase.neocities.org/learning-koka-2022-08-06" rel="alternate"></link><published>2022-08-06T04:00:00-04:00</published><updated>2022-08-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-08-06:/learning-koka-2022-08-06</id><summary type="html">&lt;p class="first last"&gt;Still at the stage where I can do a bunch of fancy stuff that makes complete sense, then comprehensively trip over my shoelaces at the last possible moment, apparently.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I didn't get much done today, but I did sketch out some helper functions that seem to work, at least with the interactive compiler.
I seem to be having some issues using them in compiled code; I'll have to look into that later.&lt;/p&gt;
&lt;p&gt;Anyway, my basic plans here are to really firm up the environment variable processing, focus on the response headers after that, and then just start messing around with writing templates or some other form of document generation.&lt;/p&gt;
&lt;p&gt;For now, though, I'm going to get to sleep and wonder what I'm doing wrong in my &lt;tt class="docutils literal"&gt;main()&lt;/tt&gt; function.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Learning Koka"></category></entry><entry><title>Learning Koka 2022-08-05</title><link href="https://mwchase.neocities.org/learning-koka-2022-08-05" rel="alternate"></link><published>2022-08-05T04:00:00-04:00</published><updated>2022-08-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-08-05:/learning-koka-2022-08-05</id><summary type="html">&lt;p class="first last"&gt;Explaining what I'm doing in order to lay out how it's completely wrong.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, I don't think I really explained this, but I'm sort of alternating what I'm focusing on in looking into in Koka.
Yesterday, I was seeing how much of the script side of CGI could be implemented in Koka.
Now, I'm sketching out how to handle structured concurrency.&lt;/p&gt;
&lt;p&gt;So, let's see about that.&lt;/p&gt;
&lt;p&gt;So far, I've got two distinct effects that I think need to be supported.
One for &amp;quot;resume the current execution at some future point&amp;quot; or, in other words &amp;quot;schedule the resumption of the current code in the future&amp;quot;.
And one for &amp;quot;schedule an additional execution, and ensure that all such executions have completed at some future point&amp;quot;.&lt;/p&gt;
&lt;p&gt;These are the equivalents of &lt;tt class="docutils literal"&gt;await&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;nursery.start_soon()&lt;/tt&gt; in Trio.&lt;/p&gt;
&lt;p&gt;I poked around with this a little, and I am not sure I'm writing things correctly.
I currently don't have an argument to the &lt;tt class="docutils literal"&gt;await&lt;/tt&gt; function in the &lt;tt class="docutils literal"&gt;async&lt;/tt&gt; effect, and I think it actually needs an argument to describe when to resume.
Like, a higher-order function that takes the resume function as an argument.
And some kind of queue to put them in, I guess...&lt;/p&gt;
&lt;p&gt;Anyway, we'll see how much focus I have to put into this later.
For now, I need to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Learning Koka"></category></entry><entry><title>Learning Koka 2022-08-04</title><link href="https://mwchase.neocities.org/learning-koka-2022-08-04" rel="alternate"></link><published>2022-08-04T04:00:00-04:00</published><updated>2022-08-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-08-04:/learning-koka-2022-08-04</id><summary type="html">&lt;p class="first last"&gt;Here's a project, and here's why it won't work. Let's see how much of it I can still try to do.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'd mentioned yesterday that I want to think about more concrete problems before I mess with trying to do structured concurrency in Koka.&lt;/p&gt;
&lt;p&gt;As to the specific thing I'm choosing, it's not a good fit, I don't think, but I'm interested in at least laying out why it's not.
And what is it?&lt;/p&gt;
&lt;p&gt;Okay, so, I never used &lt;abbr title="Common Gateway Interface"&gt;CGI&lt;/abbr&gt; scripts directly.
I used to see other people use them all over the place, but by the time I was working on web server stuff for work, I was doing things that used the &lt;abbr title="Web Server Gateway Interface"&gt;WSGI&lt;/abbr&gt;.
I don't know why, but I just decided, let's see how any of this actually worked.&lt;/p&gt;
&lt;p&gt;So, I've got &lt;a class="reference external" href="https://datatracker.ietf.org/doc/html/rfc3875"&gt;RFC 3875&lt;/a&gt;, and I'm looking over it and comparing what it wants to what's possible in Koka (assuming I don't write extensions).&lt;/p&gt;
&lt;p&gt;Here's what I've concluded from what I've looked at so far:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;CGI deals with standard input, standard output, and environment variables.
The environment variables are expected to have a bunch of structure that the script should interpret before it performs any other I/O.&lt;/li&gt;
&lt;li&gt;Koka should be entirely able to handle the standard output side of things.
Writing CGI scripts in Koka would benefit from a library to generate HTML, and, I think, HTTP headers.&lt;/li&gt;
&lt;li&gt;Koka should be able to handle the environment variables.
The main thing I would need, is to have a case insensitive comparison for traversing the association list.
(Which I later realized, after mentioning the concept earlier, that Koka's standard library &lt;em&gt;does&lt;/em&gt; expect and support.)
And then a bunch of processing steps.&lt;/li&gt;
&lt;li&gt;I think the big stumbling block is the &lt;tt class="docutils literal"&gt;CONTENT_LENGTH&lt;/tt&gt; variable.
This is in octets, which is what you call bytes if you don't want to get well-actually-ed.
The RFC states &amp;quot;the script MUST NOT attempt to read more than CONTENT_LENGTH bytes&amp;quot;.
Right now, Koka's facilities for reading from standard input are... limited.
The standard library provides the &lt;tt class="docutils literal"&gt;readline()&lt;/tt&gt; function, which reads from standard input, in UTF-8, either a line of text (discarding the newline), or 1023 code points, whichever is shorter; I'm not clear on what happens if it doesn't get an explicit end to the line within 1023 code points.
In any case, the point is, CGI really wants the script to be working in bytes at the boundary, and I don't think Koka is up for that yet.
I don't know if supporting this kind of thing is on the radar.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, Koka, which is, keep in mind, experimental and under development, appears to not be ready for the entirety of a use case that it's not explicitly meant to support.
I think that's fine for now, and I'd like to mess with the areas that it can support.
If it works well, maybe I'll end up with a little static site generator.
I don't see such a thing replacing Pelican for me, but it could be neat.&lt;/p&gt;
&lt;p&gt;Anyway, I didn't exactly use my time super well today, so I'm not going to go much further for now.
I'll try to break things down in a little more detail later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Learning Koka"></category></entry><entry><title>Learning Koka 2022-08-03</title><link href="https://mwchase.neocities.org/learning-koka-2022-08-03" rel="alternate"></link><published>2022-08-03T04:00:00-04:00</published><updated>2022-08-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-08-03:/learning-koka-2022-08-03</id><summary type="html">&lt;p class="first last"&gt;I'm missing some subtleties around imports in Koka. Oh well, more to research.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, Koka.
Why am I interested in it?
The main thing that's special about Koka vs the other languages I know, is its effect system.
As far as I'm currently aware, the effect system does two-ish things.
At least one and a half.
It allows library writers to define new flow control concepts, and customize existing ones.
This is because it's sort of like exceptions, but resumable, and, if you opt into the fancy code generation, resumable multiple times.
The other thing is, unhandled effects are part of the signature for the function that's not handling them, so they can be used to mark side effects.&lt;/p&gt;
&lt;p&gt;Now, what has me interested is, well...&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;pub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;fun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;list&amp;lt;a&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;e&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;e&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;list&amp;lt;b&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;xs&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="ge"&gt;Cons&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;xx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ge"&gt;Cons&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;xx&lt;/span&gt;&lt;span class="k"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="ge"&gt;Nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ge"&gt;Nil&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The precise details of the code aren't too important, what's interesting is the signature.
&lt;tt class="docutils literal"&gt;map&lt;/tt&gt; takes a list of objects of some type, applies a function to each element, and produces a list of the results.
So far, so normal.
But the other thing going on here is the &lt;tt class="docutils literal"&gt;e&lt;/tt&gt;, representing the effects of the input function &lt;tt class="docutils literal"&gt;f&lt;/tt&gt;.
Those effects are passed along and emitted by the call to &lt;tt class="docutils literal"&gt;map&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;So, if you wrap a &lt;tt class="docutils literal"&gt;map&lt;/tt&gt; call in a handler for a custom effect that is emitted by &lt;tt class="docutils literal"&gt;f&lt;/tt&gt;...
You should be able to use the same library function to map using a function that, say, does cooperative multitasking, as not.
Basically, what I'm seeing here, is higher-order functions that are transparent to &lt;a class="reference external" href="https://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function/"&gt;function color&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Koka's an experimental language, and that's the experiment I'm interested in.
I want to see what happens if you put &lt;a class="reference external" href="https://vorpus.org/blog/notes-on-structured-concurrency-or-go-statement-considered-harmful/"&gt;structured concurrency&lt;/a&gt;'s new primitive into a language that's designed to be tiny and extensible, and make a bunch of decisions differently from Python.
(I am &lt;a class="reference external" href="https://github.com/koka-lang/koka/issues/169"&gt;not the first person&lt;/a&gt; who's been curious what this would be like.)&lt;/p&gt;
&lt;p&gt;Before I design too much of that, I want to get some more experience with Koka, so my plan is to mess around with Koka trying to solve a somewhat more concrete problem.
More on that tomorrow...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Learning Koka"></category></entry><entry><title>Weekly Roundup 2022-08-02</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-08-02" rel="alternate"></link><published>2022-08-02T04:00:00-04:00</published><updated>2022-08-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-08-02:/weekly-roundup-2022-08-02</id><summary type="html">&lt;p class="first last"&gt;Major milestones, achieved quietly.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: It was a slow day, but I did what I could.&lt;/li&gt;
&lt;li&gt;Thursday: I got some stuff done, but also I got really distracted.&lt;/li&gt;
&lt;li&gt;Friday: I got a bit more done, and started turning my distraction into blog posts.&lt;/li&gt;
&lt;li&gt;Saturday: I messed around a little with Koka, and didn't quite get anywhere impressive.&lt;/li&gt;
&lt;li&gt;Sunday: I did some planning for improvements to MOTR.&lt;/li&gt;
&lt;li&gt;Monday: I executed on the planning of the improvements to MOTR, and I only had one of the functions do the exact opposite of what it was supposed to once!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to take a break from writing, and focus on process improvements there.
I don't know that I'll blog about that, so I might end up mixing things up a little as far as what categories I use during the week.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-08-01</title><link href="https://mwchase.neocities.org/coding-2022-08-01" rel="alternate"></link><published>2022-08-01T04:00:00-04:00</published><updated>2022-08-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-08-01:/coding-2022-08-01</id><summary type="html">&lt;p class="first last"&gt;Documentation for the &lt;tt class="docutils literal"&gt;frobnicator&lt;/tt&gt; parameter: &amp;quot;This is the frobnicator. The function needs it in order to frobnicate.&amp;quot; :(&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I wrote up the helper methods for MOTR, and after some &lt;em&gt;slight&lt;/em&gt; implementation issues, I got them added to one of the tests.&lt;/p&gt;
&lt;p&gt;Then, I got back into documenting stuff.
I think it's time for me to start reconsidering the names of some of this stuff, because some of this code is hard to document when the names clearly have nothing to do with the purpose.&lt;/p&gt;
&lt;p&gt;So, that's going to be the next stretch of work I do with this code: collect all of my misgivings about class and function names into a single place so I can prioritize them.
I may also take notes on some functionality changes I want: stuff like removing &lt;tt class="docutils literal"&gt;isinstance()&lt;/tt&gt; calls and streamlining the command wrappers.&lt;/p&gt;
&lt;p&gt;Anyway, I'm exhausted for some reason, so I guess I'm getting to bed now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-07-31</title><link href="https://mwchase.neocities.org/coding-2022-07-31" rel="alternate"></link><published>2022-07-31T04:00:00-04:00</published><updated>2022-07-31T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-07-31:/coding-2022-07-31</id><summary type="html">&lt;p class="first last"&gt;Not much code work because movie, but I still ratcheted stuff along.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I did a bit more documentation just now, but the other thing I want to work on in tandem, is to set up diagnostic methods on the &lt;tt class="docutils literal"&gt;core.registry.Registry&lt;/tt&gt; class.&lt;/p&gt;
&lt;p&gt;Basically, let's see...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&amp;quot;Does every action have an output?&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;Is every action transitively reachable from a named output?&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Or, more detailedly, &amp;quot;&lt;em&gt;Which actions do not satisfy&lt;/em&gt; etc etc&amp;quot;&lt;/p&gt;
&lt;p&gt;I can put in more work orders to my future self, but I believe those two would feed into the tests I want to write, and would be a good starting point for further improvements.
Best to put in minimal effort to the code itself, until I find specific deficiencies to address.&lt;/p&gt;
&lt;p&gt;Anyway, I wanted to draft that tonight, but it's late, and I should get to this tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Learning Koka 2022-07-30</title><link href="https://mwchase.neocities.org/learning-koka-2022-07-30" rel="alternate"></link><published>2022-07-30T04:00:00-04:00</published><updated>2022-07-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-07-30:/learning-koka-2022-07-30</id><summary type="html">&lt;p class="first last"&gt;If it compiles, it flexes on me.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hey, guess what I remembered I could do!&lt;/p&gt;
&lt;p&gt;Anyway, I messed around with some advice on &amp;quot;first programs to write in any language&amp;quot;.
The second thing it had me do was code up a subtraction game and an AI for it.
It took me a long time to get it to compile, but once it compiled, everything worked perfectly and it beat me.&lt;/p&gt;
&lt;p&gt;My impressions from getting it working were that using &lt;tt class="docutils literal"&gt;var&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;while&lt;/tt&gt; together isn't worth it, and I ended up avoiding &lt;em&gt;both&lt;/em&gt; by just rewriting everything as tail calls.
I think I'm going to need to experiment with &lt;tt class="docutils literal"&gt;var&lt;/tt&gt;, and later &lt;tt class="docutils literal"&gt;while&lt;/tt&gt;, and try to get a handle on when to use them.
Lastly, it seems to be better to write small functions, so they rack up fewer effects and it's easier to see where they're coming from.&lt;/p&gt;
&lt;p&gt;I bet I could also make the code a bit nicer by cutting down on the mutual tail recursion, and coordinating stuff at a higher level, but I'm not going to try to figure that out right now.&lt;/p&gt;
&lt;p&gt;One thing I'm interesting in figuring out is &amp;quot;the right&amp;quot; way to handle mapping objects.
My gut feeling is that, if I try this, I should see how far I can get with association lists, unless I missed something that already does mapping.&lt;/p&gt;
&lt;p&gt;Anyway, I'm wiped out and I'm going to &lt;em&gt;try&lt;/em&gt; to get to bed earlier.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Learning Koka"></category></entry><entry><title>Diary 2022-07-29</title><link href="https://mwchase.neocities.org/diary-2022-07-29" rel="alternate"></link><published>2022-07-29T04:00:00-04:00</published><updated>2022-07-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-07-29:/diary-2022-07-29</id><summary type="html">&lt;p class="first last"&gt;Wanting to put some of my creative energy into writing some code that is probably just absolutely useless.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Writing is going well.
I've gotten to the point where there's a little bit that I feel like I &lt;em&gt;need&lt;/em&gt; to fill in for the current draft, and besides that, it's just as much as I feel like adding on.
Then I'll take a break, because I'm pretty sure I can't just grind away at this constantly.&lt;/p&gt;
&lt;p&gt;Anyway, I mentioned some programming language stuff yesterday.
I've been looking at &lt;a class="reference external" href="https://koka-lang.github.io/koka/doc/index.html"&gt;Koka&lt;/a&gt; recently.
It's an experimental language that is built around the concept of an &amp;quot;effect system&amp;quot;, which is basically a generalization of exceptions, coroutines, output, non-termination...&lt;/p&gt;
&lt;p&gt;It's a pretty ambitious idea, basically, and I'm curious to see what I can do with it; I've got some somewhat ambitious ideas in mind, so I'm trying to figure out a good limited-scope project to start teaching myself how to use it first.
I might try out some of the ideas I had for messing with BQN...
One thing I need to clear up for myself first, is when to be using a linked list, and when to be using a vector.&lt;/p&gt;
&lt;p&gt;Anyway, I had plenty of time to wind down when I started this entry, but I went &lt;em&gt;really slowly&lt;/em&gt;, so I'm going to just stop abruptly.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-07-28</title><link href="https://mwchase.neocities.org/diary-2022-07-28" rel="alternate"></link><published>2022-07-28T04:00:00-04:00</published><updated>2022-07-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-07-28:/diary-2022-07-28</id><summary type="html">&lt;p class="first last"&gt;This feels like how I got sometimes a decade ago, in a bad way.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Writing is still a bit slow.
Partly this is because I'm trying to rewrite things in order, and I got to a tricky bit.&lt;/p&gt;
&lt;p&gt;Partly this is because I was catastrophically tired all day and my ability to focus is effectively random.
Like, I could try to push through this bit of writing.
Oooor I could read the documentation of an experimental programming language.&lt;/p&gt;
&lt;p&gt;Anyway, I'm not going to do any better if I stay up, so this entry is over now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-07-27</title><link href="https://mwchase.neocities.org/diary-2022-07-27" rel="alternate"></link><published>2022-07-27T04:00:00-04:00</published><updated>2022-07-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-07-27:/diary-2022-07-27</id><summary type="html">&lt;p class="first last"&gt;Secret basement level to Maslow's pyramid: teeth no hurty.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got a little writing done today.
Very little.
But some important reorganization happened.&lt;/p&gt;
&lt;p&gt;Two things gave me trouble accomplishing much today.
For one thing, I just had a lot of trouble focusing, and for another, I had a headache; I kind of still have it, in fact.
I can feel parts of my teeth that I'm not used to feeling, and it is doing &lt;em&gt;terrible&lt;/em&gt; things for my mood.&lt;/p&gt;
&lt;p&gt;Hopefully I get to focus better tomorrow and accomplish more things.
I shouldn't dawdle on getting to bed now, so let's wrap this up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2022-07-26</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-07-26" rel="alternate"></link><published>2022-07-26T04:00:00-04:00</published><updated>2022-07-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-07-26:/weekly-roundup-2022-07-26</id><summary type="html">&lt;p class="first last"&gt;Distracting myself from unpleasant events by wondering whether I should tweak the timestamps and day names on my posts...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I got distracted writing stuff that was not the post, and barely wrote the post.&lt;/li&gt;
&lt;li&gt;Thursday: I wrote a bit and made some plans for Friday, which is Saturday in this list because of The Reasons.&lt;/li&gt;
&lt;li&gt;Friday: I had a rough day, and vented about it. Things subsequently got rougher, but at least &lt;em&gt;those specific things I was venting about&lt;/em&gt; are basically done for now.&lt;/li&gt;
&lt;li&gt;Saturday: The Gamera movies continue to be bonkers.&lt;/li&gt;
&lt;li&gt;Sunday: I stared at MOTR's code, and worked out some relatively simple changes needed to make the tests pass. I also messed around with the tooling.&lt;/li&gt;
&lt;li&gt;Monday: I made some progress on documentation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to finish up this last stretch of revisions, then go over everything and make a list of things to revise before this is ready to show to anyone.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-07-25</title><link href="https://mwchase.neocities.org/coding-2022-07-25" rel="alternate"></link><published>2022-07-25T04:00:00-04:00</published><updated>2022-07-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-07-25:/coding-2022-07-25</id><summary type="html">&lt;p class="first last"&gt;Seriously though, how am I supposed to document the yield type of a function, when, because the function's signature is an alias defined in another module, the yield type &lt;em&gt;isn't in scope&lt;/em&gt;?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm adding basic documentation to the code.
I also &lt;em&gt;may&lt;/em&gt; be forking yet more code from tools that other people wrote.
I'm going to have to work on contributing this stuff upstream.&lt;/p&gt;
&lt;p&gt;Like, I've got:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;flake8-html, but I made certain things display in multiple lines somehow, I forget&lt;/li&gt;
&lt;li&gt;towncrier, but it works on Mercurial repositories&lt;/li&gt;
&lt;li&gt;The pylint docparams extension, but it &lt;em&gt;should&lt;/em&gt; properly respect &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;no-docstring-rgx&lt;/span&gt;&lt;/tt&gt;; that one is at least simple enough that I already described it on GitHub&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(In my fork, I also attempted to make it parse the hecked-up docstring style I devised, but that didn't work because of mystery reasons.
I think pylint's docstring parsing logic is maybe collapsing &amp;quot;&amp;quot;&amp;quot;valid&amp;quot;&amp;quot;&amp;quot; inputs to invalid ones.
Like omitting a section break from a Numpy style docstring.)&lt;/p&gt;
&lt;p&gt;Anyway, I've got other stuff to take care of right now, so I'm going to wrap this up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-07-24</title><link href="https://mwchase.neocities.org/coding-2022-07-24" rel="alternate"></link><published>2022-07-24T04:00:00-04:00</published><updated>2022-07-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-07-24:/coding-2022-07-24</id><summary type="html">&lt;p class="first last"&gt;Staring at the code like &amp;quot;I guess it mostly &lt;em&gt;is&lt;/em&gt; that simple?&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I think I've addressed the issues with MOTR enough to make all of the tests pass.
I've also managed to figure out a possible fix for some of the pylint issues I was seeing, but I want someone who knows the code in question to comment on my suggestions, in case I'm totally off-base.
They'll get to it when they get to it.&lt;/p&gt;
&lt;p&gt;For now, I've got a lot of documentation to update.
I think for now, I'll tweak the configuration a little, and start documenting stuff tomorrow, maybe changing stuff tomorrow if the documentation inspires me.
Hopefully restricting those changes to covered code.&lt;/p&gt;
&lt;p&gt;Anyway, right now I need to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2022-07-23</title><link href="https://mwchase.neocities.org/diary-2022-07-23" rel="alternate"></link><published>2022-07-23T04:00:00-04:00</published><updated>2022-07-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-07-23:/diary-2022-07-23</id><summary type="html">&lt;p class="first last"&gt;Imagine fighting a dude and there's a bunch of mice or something trying to give you a pep talk, that'd be so weird.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I executed my plan for tonight nigh-flawlessly.
I'm not feeling too talkative, so I'm going to finish up this post as soon as I can, and then play video games that will probably freak me way out.&lt;/p&gt;
&lt;p&gt;I'm looking at Wikipedia and going, oh wow, I think there's still a few more Shōwa period Gamera movies that MST3K could cover, that's crazy.&lt;/p&gt;
&lt;p&gt;Anyway, going to take it easy for the rest of today.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-07-22</title><link href="https://mwchase.neocities.org/diary-2022-07-22" rel="alternate"></link><published>2022-07-22T04:00:00-04:00</published><updated>2022-07-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-07-22:/diary-2022-07-22</id><summary type="html">&lt;p class="first last"&gt;What does this year want from me? Blood?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Writing...
I would have liked to have gotten further, but if I'm replacing any of the original draft, that's still progress.&lt;/p&gt;
&lt;p&gt;I haven't really been talking about it here, but my personal life has been kind of rough lately.
Nothing that's anyone's fault.
I don't feel like it's been affecting the blog in any direct fashion, but my intuitions as to how a week of posting went have been sort of shaky, so I could be totally wrong.&lt;/p&gt;
&lt;p&gt;I know there's plenty more the world could throw at me, but it feels like I deserve a respite.
Like, world, see this year?
&lt;em&gt;Don't do that again.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I'm in a funk now, and I'm going to try to sleep it off.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-07-21</title><link href="https://mwchase.neocities.org/diary-2022-07-21" rel="alternate"></link><published>2022-07-21T04:00:00-04:00</published><updated>2022-07-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-07-21:/diary-2022-07-21</id><summary type="html">&lt;p class="first last"&gt;This rate of progress is a little frustrating, but I have plans for the weekend...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Closing in on a major milestone with writing, and there's not much more to say about that.
I'll try to finish up the current segment tomorrow, and we'll see how that goes.&lt;/p&gt;
&lt;p&gt;As far as Friday night...
If there weren't any particular plan, I'd be trying to finally make some simple bug fixes to MOTR, but there's going to be an MST3K premiere, so that's going to be the main focus.&lt;/p&gt;
&lt;p&gt;One thought about writing, actually...
I'm planning to take a break from revising stuff soonish, and while I'm doing that, I'm going to think about changes to my various processes.
So that'll be interesting, I guess.&lt;/p&gt;
&lt;p&gt;Anyway, it's late and I shouldn't dawdle.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-07-20</title><link href="https://mwchase.neocities.org/diary-2022-07-20" rel="alternate"></link><published>2022-07-20T04:00:00-04:00</published><updated>2022-07-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-07-20:/diary-2022-07-20</id><summary type="html">&lt;p class="first last"&gt;It's a shame that I used up all of my writing juice, or whatever.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I made some good progress on writing, but I ended up doing it until really late, and legitimately forgetting about this post.&lt;/p&gt;
&lt;p&gt;I wanted to get in some work on MOTR, but I'm trying to keep that at a low priority during the week.&lt;/p&gt;
&lt;p&gt;I can't think of anything else to say, and it's midnight, so I'll try to make things up tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2022-07-19</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-07-19" rel="alternate"></link><published>2022-07-19T04:00:00-04:00</published><updated>2022-07-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-07-19:/weekly-roundup-2022-07-19</id><summary type="html">&lt;p class="first last"&gt;Progress, not all of it exciting.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I did some writing.&lt;/li&gt;
&lt;li&gt;Thursday: I worked through an annoying patch with writing, and planned stuff for MOTR.&lt;/li&gt;
&lt;li&gt;Friday: The MOTR stuff concerned a design bug that turned out to be pretty subtle, so I'm trying to take things slow there.&lt;/li&gt;
&lt;li&gt;Saturday: I couldn't write much because I needed to read, and before I work on the MOTR bug stuff, I want to work on documentation.&lt;/li&gt;
&lt;li&gt;Sunday: I came up with some docstring syntax that Napoleon seems to process just fine, but so horrible that it looks like nobody tells you &lt;em&gt;not&lt;/em&gt; to do it because why would they, but also none of the linters I've tried would accept it because why would they.&lt;/li&gt;
&lt;li&gt;Monday: I set up two different parameterization doc linters, and settled on Pylint's for now because it seems more featureful, though seemingly a little buggy?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to grind through some more writing, and make changes and documentation to MOTR.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-07-18</title><link href="https://mwchase.neocities.org/coding-2022-07-18" rel="alternate"></link><published>2022-07-18T04:00:00-04:00</published><updated>2022-07-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-07-18:/coding-2022-07-18</id><summary type="html">&lt;p class="first last"&gt;I will not fork darglint, I will not fork darglint, I will not fork darglint...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, it turns out that Napoleon will happily parse my messed-up hybrid docstrings, but apparently every checker out there wants me to &amp;quot;use a single style&amp;quot; for some reason, so I'm trying out something that's close enough to numpy style for pylint to accept it.&lt;/p&gt;
&lt;p&gt;Also, the motrfile is running pylint now.
I shoved &lt;em&gt;a lot&lt;/em&gt; of ignores into the rc, because the default checkers for pylint have... problems...
As do the checkers I'm using on purpose, really.
Pylint wasn't my first choice for checking my parameter documentation, but it seems to be doing better than my first choice on most metrics.
I just need them to fix a few bugs for really real, and I can wait, since I have plenty of legitimate warnings to address.&lt;/p&gt;
&lt;p&gt;My basic plan is to address all of the issues relevant to &lt;em&gt;understanding&lt;/em&gt; the code that needs to change to fix the tests, then fix the tests, then fix the remaining legitimate issues, then disable pylint until they get some bug fixes in, maybe comment out some of the disables in the rc while I'm at it.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to try to do some quick writing after I publish this.
No more time for this post...&lt;/p&gt;
&lt;p&gt;Oh also I guess I should add a pylint wrapper?
But the relative ease I had just shoving the new code into the motrfile has me wondering if I should be re-evaluating the design of the highest-level wrappers...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-07-17</title><link href="https://mwchase.neocities.org/coding-2022-07-17" rel="alternate"></link><published>2022-07-17T04:00:00-04:00</published><updated>2022-07-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-07-17:/coding-2022-07-17</id><summary type="html">&lt;p class="first last"&gt;Napoleon is, like, so vital to making me tolerate using Sphinx for docstrings...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I did some work on writing today, and I did some more, but mostly I was working on getting an idea of how to write these docstrings.
Here's where I ended up:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Need to have autodoc, so use &lt;tt class="docutils literal"&gt;sphinx.ext.autodoc&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;Sphinx-style docstrings are painful, so use &lt;tt class="docutils literal"&gt;sphinx.ext.napoleon&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;I think I prefer numpy-style docstrings for most things...&lt;/li&gt;
&lt;li&gt;But I don't want to double-annotate types, so I messed around and discovered that it's possible to &lt;em&gt;mix&lt;/em&gt; docstring styles, to have google-style for &lt;tt class="docutils literal"&gt;Returns&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Yields&lt;/tt&gt; and numpy style for everything else.&lt;/li&gt;
&lt;li&gt;I think &lt;tt class="docutils literal"&gt;autodoc_typehints = &amp;quot;signature&amp;quot;&lt;/tt&gt; in &lt;tt class="docutils literal"&gt;conf.py&lt;/tt&gt; is doing &lt;em&gt;something&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other things I found:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/tox-dev/sphinx-autodoc-typehints"&gt;sphinx_autodoc_typehints&lt;/a&gt; and &lt;a class="reference external" href="https://sphinx-toolbox.readthedocs.io/en/latest/extensions/more_autodoc/typehints.html"&gt;sphinx_toolbox.more_autodoc_typehints&lt;/a&gt; offer similar functionality (I believe one is a fork of the other), but I don't remember if I ran into a solid difference in my limited testing&lt;/li&gt;
&lt;li&gt;I couldn't get &lt;tt class="docutils literal"&gt;TypeVar&lt;/tt&gt;s to consistently do what I wanted, but things might be different in a proper codebase.&lt;/li&gt;
&lt;li&gt;These packages don't seem to put types on &lt;tt class="docutils literal"&gt;Yields&lt;/tt&gt; fields.&lt;/li&gt;
&lt;li&gt;Apparently none of this code supports &lt;tt class="docutils literal"&gt;Receives&lt;/tt&gt;, which is &lt;a class="reference external" href="https://numpydoc.readthedocs.io/en/latest/format.html"&gt;documented in the numpy style guide&lt;/a&gt;, but doesn't seem to exist in autodoc.
So, it doesn't look nice no matter what I do.&lt;/li&gt;
&lt;li&gt;It is, however, possible to add custom fields, so I added these lines to &lt;tt class="docutils literal"&gt;napoleon_custom_sections&lt;/tt&gt; in &lt;tt class="docutils literal"&gt;conf.py&lt;/tt&gt;: &lt;tt class="docutils literal"&gt;(&amp;quot;Receives&amp;quot;, &amp;quot;params_style&amp;quot;)&lt;/tt&gt;, and &lt;tt class="docutils literal"&gt;(&amp;quot;Type Parameters&amp;quot;, &amp;quot;returns_style&amp;quot;)&lt;/tt&gt;.
I figure the &lt;tt class="docutils literal"&gt;Type Parameters&lt;/tt&gt; should go between &lt;tt class="docutils literal"&gt;Extended Summary&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Parameters&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;autodoc just generally doesn't seem to match up with how the styleguides think you should be documenting generators.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With all of this research, now there's just a little more I want to check before I try to document MOTR...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Starting in Python 3.9, I can do stuff like &lt;tt class="docutils literal"&gt;list[int]&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;I believe it should be possible for me to use &lt;tt class="docutils literal"&gt;int | str&lt;/tt&gt; style syntax &lt;em&gt;in annotations&lt;/em&gt;; I may look into bumping MOTR's minimum Python version after the next release.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, all of that gives me stuff to guide my attempts to actually properly document MOTR.
The general idea I have there is to write documentation that's good enough for fixing the design issues I hit, then look into adding a pylint stage to the current motrfile, unless I can find a flake8 plugin for stuff like &amp;quot;documented names match the names in the code&amp;quot;.
Maybe do those in the other order, actually, so I have a checklist to work through.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to take care of some things, and then do a bit more writing.
I don't want the night to get completely away from me again.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2022-07-16</title><link href="https://mwchase.neocities.org/diary-2022-07-16" rel="alternate"></link><published>2022-07-16T04:00:00-04:00</published><updated>2022-07-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-07-16:/diary-2022-07-16</id><summary type="html">&lt;p class="first last"&gt;I think I used all of my focus today on work.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, things were kind of disorganized today, so I'm going to just take this entry easy and plan for tomorrow:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I need to read stuff before I can get back to the writing.&lt;/li&gt;
&lt;li&gt;Before I document more about MOTR, I want to evaluate a few different options for documenting attrs-decorated classes, because I'm not sure what strikes the right balance in terms of generated documentation vs the raw file vs the runtime introspected data.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, I've got some completely unrelated writing that I want to do as soon as I can, so I'm going to wrap this up now and get back to that.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2022-07-15</title><link href="https://mwchase.neocities.org/coding-2022-07-15" rel="alternate"></link><published>2022-07-15T04:00:00-04:00</published><updated>2022-07-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-07-15:/coding-2022-07-15</id><summary type="html">&lt;p class="first last"&gt;I don't think the rabbits were supposed to dig this deep...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Nothing dramatic on writing today, because I've got to do a little research.&lt;/p&gt;
&lt;p&gt;As far as &lt;em&gt;drama&lt;/em&gt; goes...
I got to work on that bug in MOTR, and in solving it, uncovered a much bigger design issue.
Let's see if I can explain it...&lt;/p&gt;
&lt;p&gt;So, &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt; objects are wrappers around a function, and bring in associated metadata that allow the library to &lt;em&gt;basically&lt;/em&gt; construct product iterators, but iterating over a variable twice is basically the same as iterating over it once.
Now, these functions can technically produce anything, but they have affordances around producing the &lt;tt class="docutils literal"&gt;IO&lt;/tt&gt; types that handle coordination between actions in the core.
Basic things they try to support:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&amp;quot;Act like &lt;em&gt;this&lt;/em&gt; variable takes on &lt;em&gt;this&lt;/em&gt; value, for this function&amp;quot;
I didn't run into this when I was hitting bugs, but there's some subtlety here&lt;/li&gt;
&lt;li&gt;&amp;quot;Conceal iteration over a variable, unless the outer function also iterates over it&amp;quot;
This is needed for things like &amp;quot;here are twelve outputs; they must all be used as inputs to the &lt;em&gt;same&lt;/em&gt; action&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;Prevent iterating over any variable that this function doesn't know about&amp;quot;
This is needed to prevent multiple actions from producing the same output&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you read that last one carefully, you might be able to figure out how my initial implementation can, and just now, &lt;em&gt;did&lt;/em&gt; go wrong...&lt;/p&gt;
&lt;p&gt;My initial implementation said &amp;quot;You can iterate over variables that this function doesn't know about.&amp;quot;
But, it's actually totally valid to iterate over &amp;quot;extra&amp;quot; variables, &lt;em&gt;as long as they don't take on more than one value&lt;/em&gt;.
Now, the fields involved are just obscure enough now that I think I should take this opportunity to document them...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;provided_labels&lt;/tt&gt; represents the variables that the wrapped function should vary with respect to&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;required_labels&lt;/tt&gt; represents the variables that something should iterate over; either this function, or something else&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;handled_labels&lt;/tt&gt; represents the variables that the function will gracefully handle iterating over&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;allowed_labels&lt;/tt&gt; represents the variables that it is &lt;em&gt;acceptable&lt;/em&gt; for something to iterate over&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;flexible&lt;/tt&gt; is an auxiliary variable required by the user interface, and not terribly interesting for these purposes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Relationships between these variables:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;handled_labels&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;allowed_labels&lt;/tt&gt; are both supersets of &lt;tt class="docutils literal"&gt;provided_labels&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;required_labels&lt;/tt&gt;.
One of the validators responsible for maintaining this is oddly-named, and I need to investigate it.&lt;/li&gt;
&lt;li&gt;It's permissible to basically &amp;quot;copy&amp;quot; &lt;tt class="docutils literal"&gt;handled_labels&lt;/tt&gt; into &lt;tt class="docutils literal"&gt;allowed_labels&lt;/tt&gt;, to cut down on the acceptable options for iteration.&lt;/li&gt;
&lt;li&gt;It's permissible to &amp;quot;move&amp;quot; everything from &lt;tt class="docutils literal"&gt;provided_labels&lt;/tt&gt; into &lt;tt class="docutils literal"&gt;required_labels&lt;/tt&gt; (roughly speaking), to create a function that &amp;quot;doesn't provide&amp;quot; the variables that it needs something to iterate over.&lt;/li&gt;
&lt;li&gt;It's permissible to add information to &lt;tt class="docutils literal"&gt;flexible&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;It's permissible to cut down on the &lt;tt class="docutils literal"&gt;provided_labels&lt;/tt&gt;, but the logic involved is somewhat elaborate.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The basic things I need to handle are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Instead of &lt;em&gt;not allowing&lt;/em&gt; iteration over variables not in &lt;tt class="docutils literal"&gt;allowed_variables&lt;/tt&gt;, I need to require that those labels take on only one value.&lt;/li&gt;
&lt;li&gt;Something similar needs to happen with the &lt;tt class="docutils literal"&gt;inject_registry&lt;/tt&gt; helper function.
For each key it injects, it needs to make sure that either both values are length one when the key is used in iteration, or that both values are the same when the key is used in iteration.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It's not immediately obvious to me how to do this, because the documentation is so bad right now.
I'm basically going to have to do some documentation and renaming passes in order to make sense of everything.
One code change I'm considering, is to create a custom container type for parameterizable values, but I'm not sure if that's necessary.
Documentation first.&lt;/p&gt;
&lt;p&gt;Well, sleep first, documentation later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2022-07-14</title><link href="https://mwchase.neocities.org/diary-2022-07-14" rel="alternate"></link><published>2022-07-14T04:00:00-04:00</published><updated>2022-07-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-07-14:/diary-2022-07-14</id><summary type="html">&lt;p class="first last"&gt;I wonder if this is what it feels like to spend all that time sanding those knives made of things that no sane person would make a knife out of.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got a bunch of stuff taken care of early-ish today, so I had plenty of time to write.
I got to what seemed like a major milestone back when I was planning these edits, but functionally what it means is, I'll hopefully be done with the current pass in a few days, and then I can review everything and plan &lt;em&gt;more&lt;/em&gt; editing passes.&lt;/p&gt;
&lt;p&gt;Anyway, I'm done with that for tonight, let's see what else...&lt;/p&gt;
&lt;p&gt;I'm going to try to work on MOTR a bit tomorrow, and after I fix the &lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt;-related bugs I identified, I'm going to try to put some code in core to improve the test assertions for the higher-level code.
Basically, I want to be able to guarantee some properties of the dependency graph, and the code to calculate those properties should live with the code that defines the graph.
I feel like those checks should be available to the main program logic somehow, but I'm not sure what the right interface to that is.&lt;/p&gt;
&lt;p&gt;Anyway, I'm tired and I ought to wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-07-13</title><link href="https://mwchase.neocities.org/diary-2022-07-13" rel="alternate"></link><published>2022-07-13T04:00:00-04:00</published><updated>2022-07-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-07-13:/diary-2022-07-13</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Wait, this &lt;em&gt;new&lt;/em&gt; scene only fits with the &lt;em&gt;previous&lt;/em&gt; draft. Bleh.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I ran into some trouble with writing, so I switched gears to some other writing that I can come back to later.&lt;/p&gt;
&lt;p&gt;Besides that, I've been poking at some stuff related to MOTR, but not doing any of the big work there yet.&lt;/p&gt;
&lt;p&gt;I guess I mostly just focused on the kinds of stuff that I don't really blog about, once again.
I'm tired, so I'm going to try to get to bed a little earlier.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2022-07-12</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-07-12" rel="alternate"></link><published>2022-07-12T04:00:00-04:00</published><updated>2022-07-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-07-12:/weekly-roundup-2022-07-12</id><summary type="html">&lt;p class="first last"&gt;Everything I need to do is clear. Now I just need to do it.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: Was chill, though I did have to work through some technical issues.&lt;/li&gt;
&lt;li&gt;Thursday: A little more technical stuff, and it seems to be basically settled at this point.&lt;/li&gt;
&lt;li&gt;Friday: I worked on writing.&lt;/li&gt;
&lt;li&gt;Saturday: I did some writing, and rambled about software metrics that are in this weird space of people at conferences going &amp;quot;Wow! Cool tooling!&amp;quot; and every paper I find on it managing to include a sentence to the effect of &amp;quot;Nobody knows what some of the words required to define this metric actually mean.&amp;quot;&lt;/li&gt;
&lt;li&gt;Sunday: I noted some work I'm going to have to do on MOTR.&lt;/li&gt;
&lt;li&gt;Monday: I prioritized that work.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to make enough progress writing that I feel okay taking a break.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-07-11</title><link href="https://mwchase.neocities.org/coding-2022-07-11" rel="alternate"></link><published>2022-07-11T04:00:00-04:00</published><updated>2022-07-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-07-11:/coding-2022-07-11</id><summary type="html">&lt;p class="first last"&gt;I let this slip today, but I took care of everything else, I think.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Fortunately, I made good progress on most things today.
Unfortunately, coding stuff was not part of &amp;quot;most things&amp;quot;.
Still, I'm used to doing it like this on the weekends...&lt;/p&gt;
&lt;p&gt;Instead of touching the code, I did mess around with software metrics stuff.
The main conclusion I reached was that I should stop messing around with software metrics stuff.&lt;/p&gt;
&lt;p&gt;Reviewing the notes I took yesterday, and making guesses about priority:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Review &lt;tt class="docutils literal"&gt;FlexOut&lt;/tt&gt; and compare usage with &lt;tt class="docutils literal"&gt;LessFlexOut&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;Inline globals that are only used once&lt;/li&gt;
&lt;li&gt;Unify creating the pip args label and the python version adaptor&lt;/li&gt;
&lt;li&gt;Mark low-content flake8 wrapper code for removal, but do not touch it yet&lt;/li&gt;
&lt;li&gt;Prototype a unification of creating &lt;tt class="docutils literal"&gt;Put&lt;/tt&gt; objects and their associated &lt;tt class="docutils literal"&gt;Label&lt;/tt&gt;s, but do not change the code yet; evaluate how the prototype would handle arguments for other wrappers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The first one is the highest priority, because it represents a bug arising from the... &amp;quot;design&amp;quot;.
Everything else is &amp;quot;how can we make it more convenient for library writers to deal with this code?&amp;quot;&lt;/p&gt;
&lt;p&gt;Anyway, I should not hold off on getting to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-07-10</title><link href="https://mwchase.neocities.org/coding-2022-07-10" rel="alternate"></link><published>2022-07-10T04:00:00-04:00</published><updated>2022-07-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-07-10:/coding-2022-07-10</id><summary type="html">&lt;p class="first last"&gt;It's functional, but is it &lt;em&gt;functional&lt;/em&gt;, you know?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I made some nice progress on writing, but I'm used to doing coding entries on the weekend, so let's talk about where I am with MOTR.&lt;/p&gt;
&lt;p&gt;I wrote the first test of the pytest wrapper, which also represents a test of the python wrapper.
Here's what's left to test, in approximate priority order:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;pyinstrument (I looked into some alternatives, and they weren't satisfactory; I may end up filing some bugs later, once I've closed out some issues on my end)&lt;/li&gt;
&lt;li&gt;coverage (including several output formats)&lt;/li&gt;
&lt;li&gt;limit-coverage&lt;/li&gt;
&lt;li&gt;Proper coverage of &amp;quot;build&amp;quot;, which should be renamed to &amp;quot;pyproject_build&amp;quot;, for both clarity and correctness&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;pyinstrument should be really straightforward, the rest, somewhat less so.&lt;/p&gt;
&lt;p&gt;Now that I've done a few rounds of iteration on the existing wrappers, it might also make sense to revisit how I'm laying out these modules.
I'll try to take some quick notes on that now...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The python versions adaptor and the pip arguments label always accompany each other; this didn't use to be true, but I had to do some refactoring that made it true.&lt;/li&gt;
&lt;li&gt;Sometimes the &lt;tt class="docutils literal"&gt;Entry&lt;/tt&gt; alias is used just a little, and sometimes it's used a little more.&lt;/li&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;Program&lt;/tt&gt; subclass does not always accompany the adaptor and label.&lt;/li&gt;
&lt;li&gt;Some of these globals, like &lt;tt class="docutils literal"&gt;COMMAND&lt;/tt&gt;, could be inlined without hurting anything.&lt;/li&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;BASE&lt;/tt&gt; global looks like it should be possible to write a helper for.&lt;/li&gt;
&lt;li&gt;The python wrapper's &lt;tt class="docutils literal"&gt;base()&lt;/tt&gt; function looks like a candidate for writing a helper function, but I'll need to compare it to the other runner wrappers' implementations, so I'll have to write them first.&lt;/li&gt;
&lt;li&gt;The flake8 wrapper has some options that should be replaced with a variadic function of extra dependencies.&lt;/li&gt;
&lt;li&gt;There are some issues with &lt;tt class="docutils literal"&gt;HTML_LABEL&lt;/tt&gt; in the junit2html wrapper that indicate that I need to revisit the new &lt;tt class="docutils literal"&gt;LessFlexOut&lt;/tt&gt; class.&lt;/li&gt;
&lt;li&gt;There are a variety of paired &lt;tt class="docutils literal"&gt;parametric_command.Put&lt;/tt&gt; objects and &lt;tt class="docutils literal"&gt;Label&lt;/tt&gt;s, and I should take another shot at unifying them.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Okay, that's a bunch of work that I can't prioritize right now.
Tomorrow, hopefully.
For now, it is late and I should sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2022-07-09</title><link href="https://mwchase.neocities.org/diary-2022-07-09" rel="alternate"></link><published>2022-07-09T04:00:00-04:00</published><updated>2022-07-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-07-09:/diary-2022-07-09</id><summary type="html">&lt;p class="first last"&gt;It seems that today I was very distracta&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, I got distracted from writing.
With other writing.
On the on hand, it's good practice.
On the other hand, this is just doing a mix of not tackling my existing editing workload, and adding more for later, so that's a little obnoxious.&lt;/p&gt;
&lt;p&gt;What else have I been thinking about...
Well, the more I've thought about Halstead metrics, the more I think to myself &amp;quot;I'm not sure these can produce directly comparable metrics between languages, and maybe each language or language family should have metrics derived from a set of principles&amp;quot; because I'm genuinely not sure how you'd come up with a coherent way of classifying tokens that accounts for all of &amp;quot;pure functional language that doesn't allow you to bind anything to a name&amp;quot;, &amp;quot;tape-based language that also doesn't allow you to bind anything to a name&amp;quot;, and &amp;quot;stack-based language that allows for quoting; like, either quoting somehow turns an operator into an operand, or &lt;em&gt;not&lt;/em&gt; quoting is an operator!&amp;quot;&lt;/p&gt;
&lt;p&gt;I wouldn't think about this so much if I didn't watch people singing the praises of Radon for measuring Python code, and if Radon weren't so... questionable.&lt;/p&gt;
&lt;p&gt;I'm going to try working through some of these on my own code, just for the heck of it.
That's going to take a bit, so I'm going to publish now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-07-08</title><link href="https://mwchase.neocities.org/diary-2022-07-08" rel="alternate"></link><published>2022-07-08T04:00:00-04:00</published><updated>2022-07-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-07-08:/diary-2022-07-08</id><summary type="html">&lt;p class="first last"&gt;Definite progress, once again.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got to some rough bits in writing, so this was a bit of a slow day.
Although, it's a little hard to judge, because I'm tracking net counts, and part of the editing I did was to delete old stuff that I don't need to refer to any more, so I &lt;em&gt;probably&lt;/em&gt; made a little more progress than a naive count would indicate.&lt;/p&gt;
&lt;p&gt;Anyway, maybe like another week or two of working on this, and then I can collate all of the TODOs I left for myself, and then basically do it all again.
Yaaaaay...&lt;/p&gt;
&lt;p&gt;It turns out I can't think of anything else to do in the next few minutes, so I should publish this and get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-07-07</title><link href="https://mwchase.neocities.org/diary-2022-07-07" rel="alternate"></link><published>2022-07-07T04:00:00-04:00</published><updated>2022-07-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-07-07:/diary-2022-07-07</id><summary type="html">&lt;p class="first last"&gt;Progress on several fronts&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Writing went well again.&lt;/p&gt;
&lt;p&gt;After I messed around with Firefox's new download flow, I switched some stuff back how they wanted it, and some stuff how they didn't.
At this point, I'm genuinely not sure if I'm actually using the new flow, but it &lt;em&gt;says&lt;/em&gt; I am, and all of the overrides I have set up are &lt;em&gt;supposed to be supported&lt;/em&gt;, so I think I'm prepared to not be nervous about getting the rug yanked out from under me.&lt;/p&gt;
&lt;p&gt;I'm also pondering some software stuff, but I should really see about finishing up the current, months-long push on MOTR before I focus on working on the tooling.&lt;/p&gt;
&lt;p&gt;Aside from all of that...
I don't know, I should try to be a little more on top of the stuff that I do every day and don't really talk about in these entries?
We'll see.&lt;/p&gt;
&lt;p&gt;Anyway, time to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-07-06</title><link href="https://mwchase.neocities.org/diary-2022-07-06" rel="alternate"></link><published>2022-07-06T04:00:00-04:00</published><updated>2022-07-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-07-06:/diary-2022-07-06</id><summary type="html">&lt;p class="first last"&gt;A good relaxed day.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I had a good day of writing; I &lt;em&gt;probably&lt;/em&gt; won't be able to replicate that on days that I don't have off, but we'll see...&lt;/p&gt;
&lt;p&gt;I updated Firefox, and that seems to have done some weird things to my extensions.
Hopefully, that clears itself up later as more people use them.
The other thing I'm expecting from this update is that they redid the downloads workflow in response to user feedback, so I'm giving that a chance.
I just need to have something to download in order to test it.
I'll figure that out later.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;I poked around a bit, and stuff that I thought wasn't working before, period, now seems to be working, so, um, confused but happy shrug to all of that?
I'll need to use it in anger to see if the download panel bothers me, but I think I've got the rest of the workflow the way I'd like it.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to take care of some other things after I publish this post, and then try to take things easy.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2022-07-05</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-07-05" rel="alternate"></link><published>2022-07-05T04:00:00-04:00</published><updated>2022-07-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-07-05:/weekly-roundup-2022-07-05</id><summary type="html">&lt;p class="first last"&gt;Another satisfying pace of work.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I worked on MOTR and writing.&lt;/li&gt;
&lt;li&gt;Thursday: I did some work on the writing, and figured out one of the bugs in MOTR.&lt;/li&gt;
&lt;li&gt;Friday: I worked on stuff, sort of, but mostly took it easy.&lt;/li&gt;
&lt;li&gt;Saturday: I reviewed some of the high-level wrappers in MOTR.&lt;/li&gt;
&lt;li&gt;Sunday: I did some work on MOTR, and it was kind of a mess, but things came together.&lt;/li&gt;
&lt;li&gt;Monday: I worked on writing, and a bit on MOTR.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to get over humps with the writing and with MOTR.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-07-04</title><link href="https://mwchase.neocities.org/coding-2022-07-04" rel="alternate"></link><published>2022-07-04T04:00:00-04:00</published><updated>2022-07-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-07-04:/coding-2022-07-04</id><summary type="html">&lt;p class="first last"&gt;I should probably work at a lower pace overall, but I just want to get all of this stuff &lt;em&gt;done&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was mostly focused on stuff besides code today, and I made good progress on those things, so that's good overall, but let's see what I can do right now.&lt;/p&gt;
&lt;p&gt;In general, I should be working on writing helper code to inspect MOTR's core dependency graph.
That's going to take some careful thought, though, so what's something I can work on quickly for now?&lt;/p&gt;
&lt;p&gt;Well, the obvious solution is to update the python wrapper so it can handle the pytest wrapper.
I think that basically, all I need to do there is update the &lt;tt class="docutils literal"&gt;BASE&lt;/tt&gt; object to be the correct type.&lt;/p&gt;
&lt;p&gt;All right, that was pretty straightforward.
With a few tweaks as I go, that should have me ready to finish testing the wrappers.&lt;/p&gt;
&lt;p&gt;For now, though, I just want to take a break before I get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-07-03</title><link href="https://mwchase.neocities.org/coding-2022-07-03" rel="alternate"></link><published>2022-07-03T04:00:00-04:00</published><updated>2022-07-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-07-03:/coding-2022-07-03</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;I just need to code more.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I got the code to apparently work.
I'm a little out of it as a result of all of the weird special cases I added to paper over the issues I was finding.
I started documenting the experience &lt;a class="reference external" href="https://im-in.space/&amp;#64;mwchase/108579105298895923"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Basically, I added a bunch of extra wrapper classes to try to more accurately model the behavior I want out of the code.&lt;/p&gt;
&lt;p&gt;Aside from the fact that I can't really describe any of the new code right now as &amp;quot;something I'd like to show off&amp;quot;, the diff from today is so big that I'm not sure I can pick out any part of it as representative.&lt;/p&gt;
&lt;p&gt;In any case, I'm going to publish this, consider some other things I wanted to work on today, and when I get back to it, start thinking about how to make the tests more thorough.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-07-02</title><link href="https://mwchase.neocities.org/coding-2022-07-02" rel="alternate"></link><published>2022-07-02T04:00:00-04:00</published><updated>2022-07-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-07-02:/coding-2022-07-02</id><summary type="html">&lt;p class="first last"&gt;Oh yeah, I only got partway through some of this stuff last time.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was poking at MOTR with new metrics stuff, and it had some recommendations, but making such changes isn't worth it until I've done a round of normal refactoring.
I have a few other things I want to do today, so I'm going to try to get through this entry quickly.&lt;/p&gt;
&lt;p&gt;My basic goal for now is to re-assess the pytest wrapper, and figure out what's going to need to change.&lt;/p&gt;
&lt;p&gt;Comparing against other wrappers, I need, in approximate order:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Program&lt;/tt&gt; subclass&lt;/li&gt;
&lt;li&gt;Python versions &lt;tt class="docutils literal"&gt;ValueAdaptor&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;Pip args &lt;tt class="docutils literal"&gt;Label&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Entry&lt;/tt&gt; alias&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;CommandBuilder&lt;/tt&gt; alias&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;OptionBuilder&lt;/tt&gt; alias&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;COMMAND&lt;/tt&gt; global&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;BASE&lt;/tt&gt; global; things get tricky here, because as part of my paranoia about letting these programs touch the disk willy-nilly, I right now have it try to default to providing &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-p&lt;/span&gt; no:cacheprovider&lt;/tt&gt;; on balance, it probably makes sense to ditch this and move that to the pytest config file&lt;/li&gt;
&lt;li&gt;So, assume that &lt;tt class="docutils literal"&gt;NO_CACHE&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;DEFAULT&lt;/tt&gt; get deleted, and &lt;tt class="docutils literal"&gt;BASE&lt;/tt&gt; gets the same niceties as the other wrappers&lt;/li&gt;
&lt;li&gt;The last thing in the wrapper, then, is the &lt;tt class="docutils literal"&gt;junit_xml&lt;/tt&gt; function, which I now remember I never finished updating the code so that didn't need to be a function.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, there are some fairly mechanical updates to the pytest wrapper, but before I deal with those, I need to:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Disable caching in the pytest config&lt;/li&gt;
&lt;li&gt;Rework &lt;tt class="docutils literal"&gt;motr._api.helpers.reports.accumulator&lt;/tt&gt; to get data from a parameter and also inject additional segments, forcing the file argument to be just a basename; this is technically less flexible, but I don't think it matters&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, I'll try to get to those this weekend, and try to handle other things now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2022-07-01</title><link href="https://mwchase.neocities.org/diary-2022-07-01" rel="alternate"></link><published>2022-07-01T04:00:00-04:00</published><updated>2022-07-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-07-01:/diary-2022-07-01</id><summary type="html">&lt;p class="first last"&gt;This is a new day to be taking things easy, but I'm not inclined to ponder why that should be.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was feeling kind of out of it today, so I didn't do any editing, outlining, or writing, and instead messed around with tightening things up in MOTR.&lt;/p&gt;
&lt;p&gt;Just messing around a bunch with removing &lt;tt class="docutils literal"&gt;typing.Any&lt;/tt&gt;, mostly in favor of &lt;tt class="docutils literal"&gt;object&lt;/tt&gt;.
I think this isn't always possible, but when it is, I might as well.&lt;/p&gt;
&lt;p&gt;Aside from that, I did &lt;em&gt;think&lt;/em&gt; a little about writing, but, eh.&lt;/p&gt;
&lt;p&gt;I'm going to try to get serious about MOTR's test coverage tomorrow.
Once that's done, I can start making some of the improvements I've had in mind.&lt;/p&gt;
&lt;p&gt;Anyway, I don't want to prolong things too much, so I'm done with this entry for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-06-30</title><link href="https://mwchase.neocities.org/diary-2022-06-30" rel="alternate"></link><published>2022-06-30T04:00:00-04:00</published><updated>2022-06-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-06-30:/diary-2022-06-30</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;700 lines?&amp;quot; &amp;quot;Yeah, that's a lot of lines.&amp;quot; &amp;quot;Just what are you even &lt;em&gt;doing&lt;/em&gt; with Trio?&amp;quot; &amp;quot;Plenty.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did the outlining.
I'm going to have to wait a bit to see if I missed anything, but the majority of it should be in a good enough raw form.&lt;/p&gt;
&lt;p&gt;Earlier today, I investigated some long-standing issues with MOTR, but I didn't try to fix them yet.
Basically... &lt;a class="reference external" href="https://builtoncement.com/"&gt;Cement&lt;/a&gt; and &lt;a class="reference external" href="https://trio.readthedocs.io/"&gt;Trio&lt;/a&gt; both try to register a signal handler, and the consequences of Trio not registering its handler is nearly 700 lines worth of traceback on a ctrl-c, and if I stop Cement from registering its handler, then that means I need to add another except block to the main module.
I haven't tried it yet, but this seems like a pretty straightforward tradeoff.&lt;/p&gt;
&lt;p&gt;I'd like to wrap up for now, but it's nice to have made various bits of progress today.&lt;/p&gt;
&lt;p&gt;(This post's summary is a reference that virtually nobody can be expected to get.
Oh well.)&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-06-29</title><link href="https://mwchase.neocities.org/diary-2022-06-29" rel="alternate"></link><published>2022-06-29T04:00:00-04:00</published><updated>2022-06-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-06-29:/diary-2022-06-29</id><summary type="html">&lt;p class="first last"&gt;Just when I thought I understood variance...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got a little caught up making obvious fixes to MOTR, and now it's at the point where I want to step back for a few days, then come back to it and see if it's ready for the pytest wrapper tests.
Some of the code I ended up putting in there feels a little questionable.
Like, hold on, why does mypy allow this?
But whatever.&lt;/p&gt;
&lt;p&gt;I did a small amount of rewriting today.
I think what I want to do in the time I have left tonight, is to rough out the skeleton for this first part.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;All right, good, got that together.
Part of the next thing to do is work on another parallel outline that'll fit into gaps in this one.
This makes sense, but I don't want to explain how.
Anyway, I'm making progress, even if it's not reflected in the metrics I'm messing with recording.
Give it a few days.&lt;/p&gt;
&lt;p&gt;And with that, I'm going to wrap up so I can collapse in bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2022-06-28</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-06-28" rel="alternate"></link><published>2022-06-28T04:00:00-04:00</published><updated>2022-06-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-06-28:/weekly-roundup-2022-06-28</id><summary type="html">&lt;p class="first last"&gt;I'm still incredulous that there are injuries for &amp;quot;lying down too much&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I was in pain.&lt;/li&gt;
&lt;li&gt;Thursday: I continued to be in pain, but I tried to figure out how I'm going to move forward with my projects.&lt;/li&gt;
&lt;li&gt;Friday: I started shifting my focus more towards MOTR.&lt;/li&gt;
&lt;li&gt;Saturday: I took a break from MOTR, and did... stuff. Not particularly polished, but it &amp;quot;works&amp;quot;.&lt;/li&gt;
&lt;li&gt;Sunday: I managed to make a bit of progress on MOTR.&lt;/li&gt;
&lt;li&gt;Monday: In continuing with that progress, I once again ended up wanting to rip out and replace some code.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to make good progress on this stuff, but we'll see how it all goes.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-06-27</title><link href="https://mwchase.neocities.org/coding-2022-06-27" rel="alternate"></link><published>2022-06-27T04:00:00-04:00</published><updated>2022-06-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-06-27:/coding-2022-06-27</id><summary type="html">&lt;p class="first last"&gt;Progress!...?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The high-level layer on top of MOTR is somehow in even worse of a mess than usual right now, because I was putting stuff together, and I realized that there should be a way to make things easier to use, but it's running into some friction.&lt;/p&gt;
&lt;p&gt;Basically, I think I'm once again running into helper functions that are no longer being helpful.
I'm not certain, but I think the way out here is to add some helper methods to the classes that some of this code was wrapping, and expose those classes directly...&lt;/p&gt;
&lt;p&gt;The difficulty I'm going to need to resolve, though, is that, for a runner-type command, we start with the command, add the args, and go, but for non-runner-type commands, we start with the command, &lt;em&gt;and the python version&lt;/em&gt;, so I guess I need a little helper class for that.
I'm getting confused enough thinking about this that I'm going to take a break, and try the following when I get back to it:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Make a minimal helper class for these purposes.&lt;/li&gt;
&lt;li&gt;Replace all uses of the current helper class with the new/existing classes.&lt;/li&gt;
&lt;li&gt;Make a note of what's awkward.&lt;/li&gt;
&lt;li&gt;Address that awkwardness if it's really obvious how, otherwise gather more data, by implementing more wrappers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I let things get late so now I am once again cutting off the entry awkwardly.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-06-26</title><link href="https://mwchase.neocities.org/coding-2022-06-26" rel="alternate"></link><published>2022-06-26T04:00:00-04:00</published><updated>2022-06-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-06-26:/coding-2022-06-26</id><summary type="html">&lt;p class="first last"&gt;Did work that I'm not feeling up to describing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I did some work on MOTR.
The recursive methods are untangled and another one added.
The main thing missing from &lt;tt class="docutils literal"&gt;ParametricCommand&lt;/tt&gt; is the change-up of the type annotations.&lt;/p&gt;
&lt;p&gt;Anyway, I'm a little out of it, so I'm going to cut things off and see if I can get more done.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-06-25</title><link href="https://mwchase.neocities.org/coding-2022-06-25" rel="alternate"></link><published>2022-06-25T04:00:00-04:00</published><updated>2022-06-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-06-25:/coding-2022-06-25</id><summary type="html">&lt;p class="first last"&gt;I &lt;em&gt;seriously&lt;/em&gt; disclaim all warranties on this, in case someone sees this post and somehow gets the idea &amp;quot;yes!&amp;quot; &amp;quot;that!&amp;quot; &amp;quot;that is what I will base my entire homebrew enterprise toolchain around!&amp;quot;. Do not get that idea.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did something else today, instead of working on MOTR.
As exhibit A against myself, I present, the first cell of the newly created Jupyter notebook, &lt;tt class="docutils literal"&gt;crimes.ipynb&lt;/tt&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;base_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt;

&lt;span class="n"&gt;SENTINEL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;inner&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;SENTINEL&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__super&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sup&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__default&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__getattribute__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="fm"&gt;__getattribute__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;_inner__super&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;AttributeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;default&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="fm"&gt;__getattribute__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;_inner__default&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;SENTINEL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="c1"&gt;# Should inject name info&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;base_call&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__get__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;old_super&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="fm"&gt;__getattribute__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;_inner__super&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;new_super&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;old_super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="fm"&gt;__get__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;new_super&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;old_super&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;inner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_super&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BetaMeta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;mro&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__bases__&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BetaMeta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;base_mro&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mro&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;base_mro&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;base_mro&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;base_mro&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Beta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;metaclass&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BetaMeta&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I'm not sure if this always works, but when I tried it with a basic example, it seemed to work.
This code is really brittle.
In particular, I kept on having trouble trying to find a way to not need to do &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;inner(super())&lt;/span&gt;&lt;/tt&gt;, which was pretty annoying.
Various things not working that kind of seemed like they should have.
Oh, well.&lt;/p&gt;
&lt;p&gt;Anyway, the goal of all of that nonsense is to allow for &lt;a class="reference external" href="https://beta.cs.au.dk/"&gt;BETA&lt;/a&gt;-style inheritance.
Is that a good idea?
Well, with all of that code, there's a way to find out.
Once it's cleaned up and gets some proper invocations of the descriptor protocol.&lt;/p&gt;
&lt;p&gt;Anyway, I don't want to ponder whether that's &amp;quot;something anybody should have attempted&amp;quot;, or whatever, so I'm going to publish this and wind down extra-early.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2022-06-24</title><link href="https://mwchase.neocities.org/diary-2022-06-24" rel="alternate"></link><published>2022-06-24T04:00:00-04:00</published><updated>2022-06-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-06-24:/diary-2022-06-24</id><summary type="html">&lt;p class="first last"&gt;Kind of wondering if my rambling about the higher-level abstractions I'm building on top of MOTR sounds, like... real.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm still putting together editing plans based on the feedback I got.
I hope I get to the point where I'm done planning stuff out for a bit.
Then, take a break for at least a few days.
Then start doing the rewrites.
This is supposed to be fun, so I don't want to force myself into the meat of it.&lt;/p&gt;
&lt;p&gt;Anyway, moving on from that for now, I took a look at MOTR's codebase, and it should be no problem to change the report path code.
It means removing a usage of a helper function, but if the helper function isn't being helpful then... don't use it.
Here's about what needs to happen:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Factor the recursive code in &lt;tt class="docutils literal"&gt;ParametricCommand&lt;/tt&gt; into independent methods&lt;/li&gt;
&lt;li&gt;Add a field for representing &amp;quot;segments&amp;quot; of the reports path&lt;/li&gt;
&lt;li&gt;Add that field to the relevant &lt;tt class="docutils literal"&gt;ParametricCommand&lt;/tt&gt; instances, or into the helpers&lt;/li&gt;
&lt;li&gt;Write a recursive method to combine the field&lt;/li&gt;
&lt;li&gt;(It may be possible to write some kind of decorator to abstract out the recursion but that is &lt;em&gt;not a priority right now&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Inject the field into a label that is re-exported by the reports helper module&lt;/li&gt;
&lt;li&gt;Rewrite the reports helper to retrieve the injected label, combine it with an optional argument, and use that as the base parametric for an &lt;tt class="docutils literal"&gt;InputAccumulator&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That's some of the tricky stuff worked out.&lt;/p&gt;
&lt;p&gt;Other things that occurred to me as I looked into this:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;It should be possible to wrap stuff relating to junit into a helper function&lt;/li&gt;
&lt;li&gt;... which has to be applied to a &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt;, so &lt;em&gt;after&lt;/em&gt; &lt;tt class="docutils literal"&gt;ParametricCommand.build()&lt;/tt&gt; is called&lt;/li&gt;
&lt;li&gt;Because the version information propagates &amp;quot;outward&amp;quot; from modules, it should work to convert the module field into a union that either has a module or an adaptor; doing this removes a line of boilerplate from various parts of the API, and might simplify things even more than that suggests&lt;/li&gt;
&lt;li&gt;It may be possible to put all of this into a callable object, such that it's reasonable for a motrfile to have no explicit control flow.
(Users could then choose to add control flow that keys off of environment variables or something.
I'm not going to bother trying to stop these hypothetical users.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All in all, exciting times ahead for MOTR, which is good, since I'd like to feel comfortable focusing on &lt;em&gt;any other python project&lt;/em&gt; at some point.
Anyway, it's late, and I should wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-06-23</title><link href="https://mwchase.neocities.org/diary-2022-06-23" rel="alternate"></link><published>2022-06-23T04:00:00-04:00</published><updated>2022-06-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-06-23:/diary-2022-06-23</id><summary type="html">&lt;p class="first last"&gt;Suffering for my art. Puzzling for my code.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Ugh...
Feedback...
So hard to take...
I'll have another draft together in, like a few months?
Seriously?
That's what it feels like...&lt;/p&gt;
&lt;p&gt;Anyway, I also did some planning for MOTR, and I think there are a few places I need to refactor and then augment, and then I can work on some of the logic required to handle generating paths for reports.
This whole... thing... might be an argument, at least as far as most people are concerned, against trying too hard to generalize something.
Because this has been... a lot.
My basic plan is to break down &lt;tt class="docutils literal"&gt;ParametricCommand._build()&lt;/tt&gt; so its internal structure isn't as fragile to change.
The problem with it right now is that the method is recursive, and the stuff &lt;em&gt;around&lt;/em&gt; the recursion can't be easily rearranged, but this doesn't look obvious to me.
Basically, the function does two things, that are both recursive.
I'd rather split this into two recursive functions that do one thing, and then I can coordinate them in &lt;tt class="docutils literal"&gt;ParametricCommand.build()&lt;/tt&gt;, and also add &lt;em&gt;other&lt;/em&gt; recursive functions that are required for report path generation.&lt;/p&gt;
&lt;p&gt;I also need to figure out how I want to assemble the commands that will take advantage of this functionality.
I have something in mind that seems like it's powerful enough, but it's probably too complicated.&lt;/p&gt;
&lt;p&gt;Anyway, I'm still out of it from all of that feedback, and also trying to deal with hurting myself over the weekend, so I'm going to call it here and try to chill out.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-06-22</title><link href="https://mwchase.neocities.org/diary-2022-06-22" rel="alternate"></link><published>2022-06-22T04:00:00-04:00</published><updated>2022-06-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-06-22:/diary-2022-06-22</id><summary type="html">&lt;p class="first last"&gt;Trying to figure which should-have-been-innocuous thing is messing up my body.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Good news: I got some really helpful editing feedback on my writing.
Bad news: I messed up my knees over the weekend and I can't figure out how to make them not hurt.&lt;/p&gt;
&lt;p&gt;All right, let's see what else is on my mind.
Now that I can look at MOTR and think &amp;quot;this part isn't working how I want it to&amp;quot;, I can work on nailing down requirements.
Sadly, part of this process will involve getting my knees to feel better so I can use my laptop for more than a few minutes at a time.&lt;/p&gt;
&lt;p&gt;All right, I'm not thinking of more to write here by standing here; I'm just annoying myself.
Time to call it.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2022-06-21</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-06-21" rel="alternate"></link><published>2022-06-21T04:00:00-04:00</published><updated>2022-06-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-06-21:/weekly-roundup-2022-06-21</id><summary type="html">&lt;p class="first last"&gt;Mo' MOTR Mo' Problems&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I got sidetracked by the obnoxious behavior of the &amp;quot;enter&amp;quot; key in Jupyter Lab.&lt;/li&gt;
&lt;li&gt;Thursday: I did some writing, and planned to work on MOTR over the weekend.&lt;/li&gt;
&lt;li&gt;Friday: I figured out that the Jupyter stuff isn't worth looking into now.&lt;/li&gt;
&lt;li&gt;Saturday: I poked at MOTR a little.&lt;/li&gt;
&lt;li&gt;Sunday: Travel took a lot out of me, so I made one small improvement to MOTR.&lt;/li&gt;
&lt;li&gt;Monday: I realized that the interface I'm building right now is kind of wrong, and tried to figure out how to fix it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I've got some writing that's nearly ready to go into editing, so I'm going to try to work on that.
I'm also going to look into changing the higher-level concepts in MOTR to see if I can come up with something cleaner.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-06-20</title><link href="https://mwchase.neocities.org/coding-2022-06-20" rel="alternate"></link><published>2022-06-20T04:00:00-04:00</published><updated>2022-06-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-06-20:/coding-2022-06-20</id><summary type="html">&lt;p class="first last"&gt;Surely I'll run out of problems at some point...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I tweaked the code some more today, and updated the prototype for the pytest wrapper.
I think I have the wrong interface there for now, so I'm trying to figure out how to make it better.&lt;/p&gt;
&lt;p&gt;Basically, when pytest runs and creates XML results, those results have to &lt;em&gt;go&lt;/em&gt; somewhere, and currently that's being specified by passing a path explicitly.
To make that work better... there's a concept I had in here; it was called something like &amp;quot;segments&amp;quot;, and it might still be, I don't remember for sure...
Ah-ha, it's the &lt;tt class="docutils literal"&gt;path&lt;/tt&gt; attribute on the &lt;tt class="docutils literal"&gt;python_helpers.PythonCmd&lt;/tt&gt;, which could pass them to the &lt;tt class="docutils literal"&gt;command.Metadata&lt;/tt&gt; in some way that would allow it to inject it into argument...&lt;/p&gt;
&lt;p&gt;One potentially confusing possibility is to rework the &lt;tt class="docutils literal"&gt;installer&lt;/tt&gt; concept to be for any path generated along these lines...&lt;/p&gt;
&lt;p&gt;Okay, this is a bit too much to consider right now.
I'm going to need to take some time to consider how to make this work.&lt;/p&gt;
&lt;p&gt;By the way, to clarify what's wrong with the current system: the ideal here is that the motrfile creates a &lt;em&gt;single&lt;/em&gt; object that can be combined with other &amp;quot;runner&amp;quot; objects, and each combination should put its output in a different directory.
Right now, the mechanism for changing the output directory is buried inside several layers of wrapped objects, so this doesn't work.&lt;/p&gt;
&lt;p&gt;I want to just mess around and let this percolate in my head for a while, so I'm going take things easy for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-06-19</title><link href="https://mwchase.neocities.org/coding-2022-06-19" rel="alternate"></link><published>2022-06-19T04:00:00-04:00</published><updated>2022-06-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-06-19:/coding-2022-06-19</id><summary type="html">&lt;p class="first last"&gt;TRAFFIC&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was traveling today, for longer than I expected, and I'm a little messed up.
So, I'm not up for doing much, and I got just one thing done:
I inlined some private globals that were only used once.
This makes the code a little less cluttered.&lt;/p&gt;
&lt;p&gt;I have various improvements planned, and one of them is to create a helper class that will make it possible to inline more of these variables, and hopefully make the interfaces created with these building blocks a little more regular.&lt;/p&gt;
&lt;p&gt;Anyway, I want to get ready for bed now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-06-18</title><link href="https://mwchase.neocities.org/coding-2022-06-18" rel="alternate"></link><published>2022-06-18T04:00:00-04:00</published><updated>2022-06-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-06-18:/coding-2022-06-18</id><summary type="html">&lt;p class="first last"&gt;A little bit of work...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;After I realized just how out-of-date a version of CodeMirror Jupyter Lab is using, and that there's an active effort to update it, I decided to hold on on writing code for it until they've ironed out the major version jump there.&lt;/p&gt;
&lt;p&gt;I'm feeling a little tired right now, so I'm just going to see what I can get done or planned for MOTR.&lt;/p&gt;
&lt;p&gt;Let's see what happens if I try to combine the python version stuff...
It messed with things a little, but I think it's better this way.
Better keep going...&lt;/p&gt;
&lt;p&gt;Okay, I made those simplifications.
The next logical steps are to rename some of the remaining globals to remove redundant information, and to inline some other globals that are only used once and not meant to be exported.
It might also make sense to write &lt;tt class="docutils literal"&gt;__all__&lt;/tt&gt; lists for these modules for documentation.&lt;/p&gt;
&lt;p&gt;I think the thing to do is write a bunch of my ideas down by hand, and work on them over the next few days if I have time.
Let's see about that...&lt;/p&gt;
&lt;p&gt;Okay, it's written down, and I want to wrap up for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2022-06-17</title><link href="https://mwchase.neocities.org/diary-2022-06-17" rel="alternate"></link><published>2022-06-17T04:00:00-04:00</published><updated>2022-06-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-06-17:/diary-2022-06-17</id><summary type="html">&lt;p class="first last"&gt;Embarrassing but useful discoveries.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I did a bit of writing and editing today, so there's that.&lt;/p&gt;
&lt;p&gt;I am blanking on anything else to say right now.&lt;/p&gt;
&lt;p&gt;Maybe I'd like to do a little more research into my Jupyter/CodeMirror complaints.&lt;/p&gt;
&lt;p&gt;So, according to CodeMirror, I need a custom command to do what I want.
So, that's &amp;quot;adding [a property] to the &lt;tt class="docutils literal"&gt;CodeMirror.commands&lt;/tt&gt; object&amp;quot;.
Specifically, I need to change the &lt;tt class="docutils literal"&gt;newlineAndIndent&lt;/tt&gt; command.&lt;/p&gt;
&lt;p&gt;Before I get too much further, I need to figure out which version of CodeMirror Jupyter Lab is using.
Looks like... &lt;tt class="docutils literal"&gt;~5.61.0&lt;/tt&gt;?
So, I should see what the code is like at version &lt;tt class="docutils literal"&gt;5.61.1&lt;/tt&gt;, probably.&lt;/p&gt;
&lt;p&gt;Anyway, in order to use that information, I need to have access to the relevant CodeMirror object, which seems a bit confusing to me, currently.&lt;/p&gt;
&lt;p&gt;I think I need to write some TypeScript that exports a function; eventually in its own tiny module.
Then, a Jupyter extension that wraps that function by... injecting it into the CodeMirror object associated with cells using the ipython mode?
(For bonus points, figure out how to change the &lt;tt class="docutils literal"&gt;tokenLexer&lt;/tt&gt; function to dedent on &lt;tt class="docutils literal"&gt;...&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;raise&lt;/tt&gt; as well (but perhaps not &lt;tt class="docutils literal"&gt;raise NotImplementedError&lt;/tt&gt;))&lt;/p&gt;
&lt;p&gt;I think I'm understanding this a bit better; the key insight that's bringing lots of things together is that Jupyter appears to be using a version of CodeMirror that's over a year old, which made my bug report, um, incredibly pointless?
Oops.
Sorry.&lt;/p&gt;
&lt;p&gt;Anyway, I'll get back to all of this later; for now, I should get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-06-16</title><link href="https://mwchase.neocities.org/diary-2022-06-16" rel="alternate"></link><published>2022-06-16T04:00:00-04:00</published><updated>2022-06-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-06-16:/diary-2022-06-16</id><summary type="html">&lt;p class="first last"&gt;Things came together today, but it'd be nice if I could get them to come together &lt;em&gt;sooner&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I caught up on a few other things today, and worked on some writing.
The big roadblock right now is, I need to do some editing, but I don't &lt;em&gt;want&lt;/em&gt; to do some editing.
Like, why won't the text spontaneously rewrite itself into a form that makes more sense?
Rude.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to be traveling a bit this weekend, but it shouldn't be as crazy as the last bit of travel.
We'll see how much I can work on MOTR like that.
I think I'll want to focus on writing tests for the pytest wrappers.
I'll see, as I work on those, whether I want to focus on cleaning up the code or covering more use cases.
Like, once I have tests for the other three cases in the motrfile, that &lt;em&gt;should&lt;/em&gt; give me coverage over most of the non-error paths, so I'll get some confidence in its behavior.&lt;/p&gt;
&lt;p&gt;I think sometime, I'd like to look more into claims that additional test coverage isn't really helpful, because I feel like there must be some nuance missing.
Because it just doesn't seem to match up for me.
Is it because I try to be cautious and write tests before using the code when possible, so code issues manifest as test failures rather than debugging sessions?
Maybe.
Maybe it's something else.
But regardless, either my subjective experience is an outlier or doesn't match up with a quantified measurement, or there's some reason that what I'm doing doesn't match up with the circumstances of the studies I've heard about that are supposed to show that increasing test coverage doesn't help.&lt;/p&gt;
&lt;p&gt;Either way, I should get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-06-15</title><link href="https://mwchase.neocities.org/diary-2022-06-15" rel="alternate"></link><published>2022-06-15T04:00:00-04:00</published><updated>2022-06-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-06-15:/diary-2022-06-15</id><summary type="html">&lt;p class="first last"&gt;Requesting help with multiple APIs I don't know, in a language I don't know, to solve a problem... &lt;em&gt;similar&lt;/em&gt; to one that I've solved before.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I don't recall that I did anything in particular today, besides trying to catch up on various tasks.
I think I'm basically caught up at this point, so that feels good.&lt;/p&gt;
&lt;p&gt;I did mess around with code a little, trying to document my untested Unlambda interpreter, and polishing MOTR's tests slightly.
They could do with a bit more polish...
And I may have gotten &lt;em&gt;slightly&lt;/em&gt; sidetracked from writing the interpreter in Jupyter Lab, and encountering behavior that only makes sense to me if the top-most multi-line statement in a cell, if any, is &amp;quot;supposed to&amp;quot; be the last thing in that cell.
I've written up a &lt;a class="reference external" href="https://im-in.space/&amp;#64;mwchase/108479152263134617"&gt;question&lt;/a&gt; that summarizes my current state of knowledge relevant to this.
If anybody knows about &amp;quot;the right way&amp;quot; or &amp;quot;a way&amp;quot; to make CodeMirror behave differently from Jupyter Lab, I'd appreciate the help.&lt;/p&gt;
&lt;p&gt;Okay, it's getting late, and there's a &lt;em&gt;bit&lt;/em&gt; more I'd ideally like to get doe tonight, so I'm cutting this off here.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2022-06-14</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-06-14" rel="alternate"></link><published>2022-06-14T04:00:00-04:00</published><updated>2022-06-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-06-14:/weekly-roundup-2022-06-14</id><summary type="html">&lt;p class="first last"&gt;Looks like whatever part of me that decides what I have the focus to work on is &lt;em&gt;really&lt;/em&gt; stubborn.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I was physically and emotionally tired.&lt;/li&gt;
&lt;li&gt;Thursday: I figured out how to make the debate over &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;0.99999...&lt;/span&gt;&lt;/tt&gt; worse.&lt;/li&gt;
&lt;li&gt;Friday: I didn't have the bandwidth to write a long entry.&lt;/li&gt;
&lt;li&gt;Saturday: I started getting distracted by Unlambda.&lt;/li&gt;
&lt;li&gt;Sunday: I kept getting distracted by Unlambda, but I was able to plan a bit for MOTR.&lt;/li&gt;
&lt;li&gt;Monday: I still got distracted by Unlambda, but I was able to execute some of the plans.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I've got some writing I really want to finish up.
And, of course, I want to make progress on MOTR.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-06-13</title><link href="https://mwchase.neocities.org/coding-2022-06-13" rel="alternate"></link><published>2022-06-13T04:00:00-04:00</published><updated>2022-06-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-06-13:/coding-2022-06-13</id><summary type="html">&lt;p class="first last"&gt;Constantly sabotaged by my fascination with basically useless things.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I... got distracted.&lt;/p&gt;
&lt;p&gt;Point is, I did get things together enough to start working on the report helpers for MOTR.
I've written the code, so if that doesn't just outright break, I'll work on bringing it into the existing wrappers.&lt;/p&gt;
&lt;p&gt;Let's see...
Looks like I got flake8 updated...
And mypy updated...
And... junit2html.&lt;/p&gt;
&lt;p&gt;Okay, good job, me, that cut out a few of the giant block of imports at the top of all of these modules.
It is kind of a drag to start working on a new one of these, and need to bring in like a dozen other modules.&lt;/p&gt;
&lt;p&gt;In any case, it's way too late right now, so I'm out.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-06-12</title><link href="https://mwchase.neocities.org/coding-2022-06-12" rel="alternate"></link><published>2022-06-12T04:00:00-04:00</published><updated>2022-06-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-06-12:/coding-2022-06-12</id><summary type="html">&lt;p class="first last"&gt;I &lt;em&gt;wrote&lt;/em&gt; yesterday's entry on time, I just couldn't &lt;em&gt;post&lt;/em&gt; it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, I &lt;em&gt;slightly&lt;/em&gt; got caught up in updating Unlambda interpreter code.
The biggest issues currently are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Haven't ported the parser and main loop yet&lt;/li&gt;
&lt;li&gt;The implementation of the S combinator &lt;em&gt;looks&lt;/em&gt; wrong, but testing it against one of the old implementations, appears to work&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, let's ignore that for now.&lt;/p&gt;
&lt;p&gt;It's late, so I'm going to see how quickly I can put together something helpful for MOTR.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Currently&lt;/em&gt;, I have the label for the python versions, and the adaptor associated with it.
Now, that can be consolidated into just the adaptor, and the convention is to pull the label off of it.&lt;/p&gt;
&lt;p&gt;Similarly, the command object groups with the label for pip arguments.
That consolidation should wait until I've written tests against the pytest wrapper, to avoid over-specializing.&lt;/p&gt;
&lt;p&gt;For the reports stuff, that needs a new module under the helpers package.
For now, that can also hold the common code for the functions that get used for adaptors.&lt;/p&gt;
&lt;p&gt;Those should all be good to look into tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2022-06-11</title><link href="https://mwchase.neocities.org/diary-2022-06-11" rel="alternate"></link><published>2022-06-11T04:00:00-04:00</published><updated>2022-06-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-06-11:/diary-2022-06-11</id><summary type="html">&lt;p class="first last"&gt;Not sure how many people share my standard of &amp;quot;relaxing&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;First opportunity at me-time: chilling out, which apparently involves trying to relearn how &lt;a class="reference external" href="http://www.madore.org/~david/programs/unlambda/"&gt;Unlambda&lt;/a&gt; works, and trying to hold the whole model in my head.
Didn't go so well, but I had fun.&lt;/p&gt;
&lt;p&gt;To try to get a handle on this stuff, I went searching around for previous attempts I'd made.
I found a few, but I think I was in the middle of stuff with them, so they don't necessarily... make sense...&lt;/p&gt;
&lt;p&gt;Anyway, I'd be interested in coming back to them later, but I don't know if I'll go for them tomorrow.
I'm trying not to plan too far ahead, or very far ahead at all really.
Nonetheless, I hope I manage to scrape together the focus to make some API improvements to MOTR.&lt;/p&gt;
&lt;p&gt;Anyone, nothing like that for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-06-10</title><link href="https://mwchase.neocities.org/diary-2022-06-10" rel="alternate"></link><published>2022-06-10T04:00:00-04:00</published><updated>2022-06-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-06-10:/diary-2022-06-10</id><summary type="html">&lt;p class="first last"&gt;I can't do as much as I'd like to yet, but I can do enough, more or less.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm still really tired from traveling, so it's hard for me to think of an idea for a post.&lt;/p&gt;
&lt;p&gt;I'm generally getting stuff done, even though I'm tired, but I should probably stop pushing it.
I'm going to get some sleep, and try to have some fun me-time over the weekend.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-06-09</title><link href="https://mwchase.neocities.org/diary-2022-06-09" rel="alternate"></link><published>2022-06-09T04:00:00-04:00</published><updated>2022-06-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-06-09:/diary-2022-06-09</id><summary type="html">&lt;p class="first last"&gt;This is not polished, and is absolutely going to make some things worse. :)&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Still super tired and out of it, but something interesting occurred to me earlier today.&lt;/p&gt;
&lt;p&gt;As you may know, there are recurring arguments over whether &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;0.99999...&lt;/span&gt;&lt;/tt&gt; is &amp;quot;really&amp;quot; equal to &lt;tt class="docutils literal"&gt;1&lt;/tt&gt;.
I noticed an interesting perspective to take on this.
In decimal notation, it's not just &lt;tt class="docutils literal"&gt;1&lt;/tt&gt; that has this issue.
There's &lt;tt class="docutils literal"&gt;0.5&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;0.499999...&lt;/span&gt;&lt;/tt&gt;, and &lt;tt class="docutils literal"&gt;0.2&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;0.19999...&lt;/span&gt;&lt;/tt&gt;.
And it extends to any product of powers of one half and one fifth, and any integer.&lt;/p&gt;
&lt;p&gt;But it's different, for example, in ternary.
In ternary, besides &lt;tt class="docutils literal"&gt;1&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;0.222222...&lt;/span&gt;&lt;/tt&gt;, there's any power of &lt;tt class="docutils literal"&gt;0.1&lt;/tt&gt; times an integer.&lt;/p&gt;
&lt;p&gt;But it's different in &lt;em&gt;balanced&lt;/em&gt; ternary.
Suppose we use the digits &lt;tt class="docutils literal"&gt;-&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;0&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;+&lt;/tt&gt;.
Now, the highest balanced ternary number with a &lt;tt class="docutils literal"&gt;0&lt;/tt&gt; in the ones place is &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;0.++++++...&lt;/span&gt;&lt;/tt&gt;, which corresponds to &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;0.11111...&lt;/span&gt;&lt;/tt&gt;, which should be one half.
Flip the digits and add one, and we get that there's another representation of one half: &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;+.--------...&lt;/span&gt;&lt;/tt&gt;.
And one is only &lt;tt class="docutils literal"&gt;+&lt;/tt&gt;.
By switching around the notation, we've ended up with a completely non-overlapping set of problem numbers!
This means that either the &amp;quot;problem&amp;quot; isn't real, or it's happening with literally every rational number, and it's simply obscured by the choice of notation.&lt;/p&gt;
&lt;p&gt;If the &amp;quot;problem&amp;quot; isn't real, then we should understand the multiple representations to form equivalence classes.
Which isn't so strange.
Consider that &lt;tt class="docutils literal"&gt;1/2&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;3/6&lt;/tt&gt; have no digits in common in those representations, yet they're normally treated as the same number.&lt;/p&gt;
&lt;p&gt;In the alternative...
There are infinitely many distinct numbers that are collapsed into a single representation by typical positional notation.
To handle the difference between these distinct numbers, some more precise representation is required to track them.
In other words, if you believe that &lt;tt class="docutils literal"&gt;1 ≠ &lt;span class="pre"&gt;0.99999...&lt;/span&gt;&lt;/tt&gt;, then point notation is literally not good enough for you, and you should be looking for alternatives!&lt;/p&gt;
&lt;p&gt;*mic drop*&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-06-08</title><link href="https://mwchase.neocities.org/diary-2022-06-08" rel="alternate"></link><published>2022-06-08T04:00:00-04:00</published><updated>2022-06-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-06-08:/diary-2022-06-08</id><summary type="html">&lt;p class="first last"&gt;Can I be done freaking out over things for just a little bit?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Ugh, wow.
I'm way out of it now that the weekend is over.
Like, all of that was necessary, but I am emotionally and physically drained right now.&lt;/p&gt;
&lt;p&gt;I want to get back into working on things, but I also want to collapse, and I also think I should work on getting back up to speed with some things that I did a bit less of when I was traveling.
I think the best way to handle that is to just accept that this will be a short entry, and work on those other things after I post this.&lt;/p&gt;
&lt;p&gt;Make sure to let the important people in your life know that you love them.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2022-06-07</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-06-07" rel="alternate"></link><published>2022-06-07T04:00:00-04:00</published><updated>2022-06-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-06-07:/weekly-roundup-2022-06-07</id><summary type="html">&lt;p class="first last"&gt;This was never going to be a standout week, but I'm glad with what I got done.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I had a slightly rough day.&lt;/li&gt;
&lt;li&gt;Thursday: I had a slightly annoying day, but I decided to focus on relaxing, because that's important.&lt;/li&gt;
&lt;li&gt;Friday: I got a little work done on MOTR, and freaked out a bit from other things.&lt;/li&gt;
&lt;li&gt;Saturday: I had a rough day, that's probably going to be comparably rough to things after I publish this entry, but oh well.&lt;/li&gt;
&lt;li&gt;Sunday: I got more tests passing in MOTR, and tried to consider what I need to do to give it a good interface for third-party developers.&lt;/li&gt;
&lt;li&gt;Monday: I made notes about common code in MOTR. The problem with this code is not just that it's repeated, but that it's not really obvious why all of it is there, which makes it hard to write.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to clean things up a bit in MOTR.
And get back to various pieces of writing.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-06-06</title><link href="https://mwchase.neocities.org/coding-2022-06-06" rel="alternate"></link><published>2022-06-06T04:00:00-04:00</published><updated>2022-06-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-06-06:/coding-2022-06-06</id><summary type="html">&lt;p class="first last"&gt;Trying to figure out how much of this I can shove into nice-ish class definitions.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, let's see what kind of common functionality I can pick out of these four-to-six modules...&lt;/p&gt;
&lt;p&gt;Common things include:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;Label&lt;/tt&gt; object for representing pip args&lt;/li&gt;
&lt;li&gt;Specifying which type of entry point for the command&lt;/li&gt;
&lt;li&gt;Putting this information together into a &lt;tt class="docutils literal"&gt;Command&lt;/tt&gt; object&lt;/li&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;Label&lt;/tt&gt; object for representing python versions to install a set of packages under&lt;/li&gt;
&lt;li&gt;Turning that label into a &lt;tt class="docutils literal"&gt;ValueAdaptor&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;Subclassing &lt;tt class="docutils literal"&gt;_program.Program&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;Putting together the &lt;tt class="docutils literal"&gt;Command&lt;/tt&gt;, a helper function, and allowed exit code data into a &lt;tt class="docutils literal"&gt;python_helpers.CommandBuilder&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;Designating the reports prefix&lt;/li&gt;
&lt;li&gt;Designating a directory within a reports prefix&lt;/li&gt;
&lt;li&gt;Labeling that directory&lt;/li&gt;
&lt;li&gt;Creating an output file under the labeled path, using some basically-identical function implementations&lt;/li&gt;
&lt;li&gt;Assembling everything into a &lt;tt class="docutils literal"&gt;Part&lt;/tt&gt; object of some kind&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The remaining bits of unique code are sooooort of hacks around inadequacies in the high-level design.
It should be possible to streamline some of this code by creating helper functions to put together &lt;tt class="docutils literal"&gt;ValueAdaptor&lt;/tt&gt; instances given a starting path.&lt;/p&gt;
&lt;p&gt;It also kind of seems like it would make sense to bundle together the reducer function and initial value arguments to the &lt;tt class="docutils literal"&gt;reduce_parameterization&lt;/tt&gt; helper.
I've also got the urge to break up the &lt;tt class="docutils literal"&gt;parametric.py&lt;/tt&gt; module into several smaller modules, and convert the nested function definitions into classes with &lt;tt class="docutils literal"&gt;__call__&lt;/tt&gt; methods, but I'm not quite sure there's a concrete objective that would be &lt;em&gt;satisfied&lt;/em&gt; by doing that, so I'll hold off on that for now.&lt;/p&gt;
&lt;p&gt;In any case, it's late, and I'm tired, so I'm just going to kind of... end this post now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-06-05</title><link href="https://mwchase.neocities.org/coding-2022-06-05" rel="alternate"></link><published>2022-06-05T04:00:00-04:00</published><updated>2022-06-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-06-05:/coding-2022-06-05</id><summary type="html">&lt;p class="first last"&gt;F in the chat for the inboxes of everyone who ever thought about using Unreal Engine for any purpose whatsoever. This has nothing to do with the post, but hoo boy, was that PR something.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I made a bit more progress on MOTR, partially by doing weird hacks to the code.
I've now got a basic test working for the mypy workflow.
At this point, I could either try to plug some coverage holes by copying this approach with the pytest workflow code I've written, or I could step back and try to figure out which bits of the code I've written should be their own functions, etc.&lt;/p&gt;
&lt;p&gt;For the latter course of action, I've got five-ish modules to review and see if I can make modules like them more pleasant to write.
Making those modules more pleasant is important because...
Okay, so, imagining a hypothetical future where MOTR takes off, I've categorized developers who will do things with MOTR into 4 groups:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Core developers, aka just me for now.&lt;/li&gt;
&lt;li&gt;Extension developers, aka just me for now.&lt;/li&gt;
&lt;li&gt;Developers configuring MOTR to run against a repository, aka just me for now.&lt;/li&gt;
&lt;li&gt;Developers running tests against a repository that uses MOTR, aka just me for now.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;MOTR is right now good enough for the fourth category, and I'm getting there for the third one, but it could be better, for sure.&lt;/p&gt;
&lt;p&gt;These five-ish modules are important to the first two categories because the third category needs high-level representations of automatable tasks to be able to write a concise and clear motrfile.
(Sadly, judging by the tests I've written, I can't expect any improvements in clarity just yet.)
Right now, there are two ways these modules can be improved:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Factor out common code to cut down on boilerplate that the second group has to write.&lt;/li&gt;
&lt;li&gt;Write helper functions to cut down on the freeform nature of the current interface.
Some of the test code is &amp;quot;obvious&amp;quot; conversions from input types, and there's no &amp;quot;static&amp;quot; analysis of whether the generated commands make sense.
I think it should be possible to address these shortcomings together, but I should plan the details carefully.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For now, I'm going to take things easy, and pick back up with planning the boilerplate reduction first.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2022-06-04</title><link href="https://mwchase.neocities.org/diary-2022-06-04" rel="alternate"></link><published>2022-06-04T04:00:00-04:00</published><updated>2022-06-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-06-04:/diary-2022-06-04</id><summary type="html">&lt;p class="first last"&gt;Should be through the worst of things.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I got through the toughest part of the weekend, I think.
I don't think I have it in me to write anything interesting, so I'm going to just publish now and work on relaxing.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-06-03</title><link href="https://mwchase.neocities.org/diary-2022-06-03" rel="alternate"></link><published>2022-06-03T04:00:00-04:00</published><updated>2022-06-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-06-03:/diary-2022-06-03</id><summary type="html">&lt;p class="first last"&gt;Hurting myself by approaching automated systems like &amp;quot;What's the worst thing they could do to me that would still be considered defensible?&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Ugh.
I did my best to have a nice, relaxing day today.
I think I really did.
But a few things were working against me.&lt;/p&gt;
&lt;p&gt;Just now, I had a bunch of tech issues:
The travel website was, I think, gratuitously confusing, and I had trouble getting stuff to print after I got through the website.
That &lt;em&gt;should&lt;/em&gt; be all set, but maybe we will find a &lt;strong&gt;[FUN]&lt;/strong&gt; surprise tomorrow.&lt;/p&gt;
&lt;p&gt;Anyway, that's that taken care, as best I can do.&lt;/p&gt;
&lt;p&gt;I also did a bit more work on MOTR today.
I haven't gotten the new tests passing, but it should be straightforward to finish up.
Emphasis on &lt;em&gt;should&lt;/em&gt;.
Getting as far as I got today involved writing a ~twenty-line helper function and making code changes that I really &lt;em&gt;hope&lt;/em&gt; were justified and principled.&lt;/p&gt;
&lt;p&gt;Oh wow, I think I'm crashing from freaking out over that website.
Stupid neurochemistry.
Okay, yeah, feeling bad; I'd better wrap this up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-06-02</title><link href="https://mwchase.neocities.org/diary-2022-06-02" rel="alternate"></link><published>2022-06-02T04:00:00-04:00</published><updated>2022-06-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-06-02:/diary-2022-06-02</id><summary type="html">&lt;p class="first last"&gt;Attempting, once again, to just relax.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Work went a little rough today.
I figured some things out, and then... technical difficulties.
Completely out of my hands.
Really annoying.&lt;/p&gt;
&lt;p&gt;Anyway, now I'm off, and I'm ready to relax a little, and get ready to travel.&lt;/p&gt;
&lt;p&gt;For now, though, I'm going to revisit some of the writing I was doing earlier, because I found myself really enjoying it, and I want to keep that up.&lt;/p&gt;
&lt;p&gt;At the same time, I should probably try to get plenty of sleep, so I'm going to see about wrapping stuff up soon.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-06-01</title><link href="https://mwchase.neocities.org/diary-2022-06-01" rel="alternate"></link><published>2022-06-01T04:00:00-04:00</published><updated>2022-06-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-06-01:/diary-2022-06-01</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;I know my actions have consequences, but I feel like that consequence didn't have an action.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today I had an okay day, until I suddenly had a very rough day, then I worked on getting it back to okay.
Nothing very bad, just gross and painful.&lt;/p&gt;
&lt;p&gt;Anyway, I poked at MOTR a little because I felt like it, and played some games.
My plan for now is to post this, and get some other writing done.&lt;/p&gt;
&lt;p&gt;I'd best actually do that instead of spacing out for ten more minutes.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2022-05-31</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-05-31" rel="alternate"></link><published>2022-05-31T04:00:00-04:00</published><updated>2022-05-31T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-05-31:/weekly-roundup-2022-05-31</id><summary type="html">&lt;p class="first last"&gt;Another rough week, but I got stuff done.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I wasn't up for doing much, so I didn't do much.&lt;/li&gt;
&lt;li&gt;Thursday: I picked up a random side project from a few years ago, in order to unwind.&lt;/li&gt;
&lt;li&gt;Friday: I continued on with that.&lt;/li&gt;
&lt;li&gt;Saturday: I started working on the code that's needed for the MOTR rework.&lt;/li&gt;
&lt;li&gt;Sunday: I apparently finished the rework. We'll see how it shakes out within the next few weeks.&lt;/li&gt;
&lt;li&gt;Monday: I did some minor cleanups to MOTR's code.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I've got some travel happening, so I'm going to keep on taking things easy.
After next week, I hope I'll be able to ramp back up, but I'll have to take things as they come.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-05-30</title><link href="https://mwchase.neocities.org/coding-2022-05-30" rel="alternate"></link><published>2022-05-30T04:00:00-04:00</published><updated>2022-05-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-05-30:/coding-2022-05-30</id><summary type="html">&lt;p class="first last"&gt;Working on what it feels like I can control.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm feeling kind of bleh, so I'm going to go over what I did today as quickly as I can.&lt;/p&gt;
&lt;p&gt;I didn't think of any major updates to make to the tests, so I just focused on updating the mypy tests.
From that, I now have a todo list of functionality to implement to stop the test from failing immediately.
I'll look into that at some point.
I anticipate this week will be a little hard on me, so I'm going to try to avoid going, like &amp;quot;I'm going to put in this much work&amp;quot;, or &amp;quot;I'll do it by this time&amp;quot;.&lt;/p&gt;
&lt;p&gt;Right now, I just want to feel better, and I think part of that is going to be getting off the laptop for a while.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-05-29</title><link href="https://mwchase.neocities.org/coding-2022-05-29" rel="alternate"></link><published>2022-05-29T04:00:00-04:00</published><updated>2022-05-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-05-29:/coding-2022-05-29</id><summary type="html">&lt;p class="first last"&gt;It does feel kind of good to break down functions to the point where the type signature makes it obvious what they &amp;quot;should&amp;quot; do, then just slap those primitives together.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;And, here we go.
After a bunch of confused swearing and writing more weird helper functions, I've managed to &lt;em&gt;seemingly&lt;/em&gt; update the code and the active tests to use the new logic I planned out.
The proof of this will be in updating the other tests and seeing how they work, but I ended up realizing something as I was working on this:&lt;/p&gt;
&lt;p&gt;These tests are nowhere near thorough enough.
I was only getting failures because I was managing to trigger weird errors.
I need to update these existing tests to actually make assertions about the shape of the output.&lt;/p&gt;
&lt;p&gt;I just improved the tests a little, but I think they need some more work.
I'll look into that tomorrow, and then see about updating the other tests to the new API.
Hopefully, that will prove things out, given that the tests that need to be rewritten, were a major part of the &lt;em&gt;motivation&lt;/em&gt; for the rewrite.&lt;/p&gt;
&lt;p&gt;Anyway, it's late and I'm tired.
Again.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-05-28</title><link href="https://mwchase.neocities.org/coding-2022-05-28" rel="alternate"></link><published>2022-05-28T04:00:00-04:00</published><updated>2022-05-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-05-28:/coding-2022-05-28</id><summary type="html">&lt;p class="first last"&gt;I wish this were the fun kind of code crimes.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right.
I'm a little tired and out of it, but I got started updating MOTR.&lt;/p&gt;
&lt;p&gt;I've got some of the infrastructure required to create the values that will be passed into the new &lt;tt class="docutils literal"&gt;build()&lt;/tt&gt; method.
The major thing I still need to add is something to create a bunch of &lt;tt class="docutils literal"&gt;PathWith[VirtualenvArgs]&lt;/tt&gt;s from a bunch of &lt;tt class="docutils literal"&gt;VirtualenvArgs&lt;/tt&gt;.
I could get elaborate, but I think I'll do what sounds like the least effort to me:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Default the input to just the default interpreter.&lt;/li&gt;
&lt;li&gt;If the default interpreter is passed, don't allow any other interpreters.&lt;/li&gt;
&lt;li&gt;Copy some logic from elsewhere in the code to convert the path data in the interpreter info into a common prefix and different suffixes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm trying to implement that right now, but I'm roughing out the code and it's kind of a mess.
I'm going to publish this post and hack on the code a bit more, but it's not going to get &lt;em&gt;much&lt;/em&gt; cleaner for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2022-05-27</title><link href="https://mwchase.neocities.org/diary-2022-05-27" rel="alternate"></link><published>2022-05-27T04:00:00-04:00</published><updated>2022-05-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-05-27:/diary-2022-05-27</id><summary type="html">&lt;p class="first last"&gt;Still not sure what I'm going to &lt;em&gt;do&lt;/em&gt; with all of that information...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The data entry is done for now.
Just got to keep relaxing, and try to get some satisfying work done over the weekend.&lt;/p&gt;
&lt;p&gt;For now, I can't seem to focus on much, so I'm going to just publish this.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-05-26</title><link href="https://mwchase.neocities.org/diary-2022-05-26" rel="alternate"></link><published>2022-05-26T04:00:00-04:00</published><updated>2022-05-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-05-26:/diary-2022-05-26</id><summary type="html">&lt;p class="first last"&gt;Continuing to do things that, for reasons I don't think I can articulate, I find fulfilling.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've been trying to unwind more, and it seems that today, that meant picking up a data entry project I was working on, a few years ago, apparently.
I don't have a concrete use case in mind for all of this data once it's entered.
Sometimes you just want to enter some data, you know?&lt;/p&gt;
&lt;p&gt;Anyway, I do want to come up with something to do that's, like, adjacent to the information I'm collating, but I'm not going to rush it.&lt;/p&gt;
&lt;p&gt;For now, I'm just going to have to resign myself to recording some mildly interesting metadata and... there is no and.
Just space.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-05-25</title><link href="https://mwchase.neocities.org/diary-2022-05-25" rel="alternate"></link><published>2022-05-25T04:00:00-04:00</published><updated>2022-05-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-05-25:/diary-2022-05-25</id><summary type="html">&lt;p class="first last"&gt;Progress on fixing my ability to focus. Agonizing, slow, progress.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hm...&lt;/p&gt;
&lt;p&gt;On paper, I'm doing okay at taking things easy, but, like... I really want to work on code or whatever...&lt;/p&gt;
&lt;p&gt;But it's too late at night as I write this.
That would not be a good idea.&lt;/p&gt;
&lt;p&gt;Best I can do for now is putter around cleaning up my browser tabs a bit more.&lt;/p&gt;
&lt;p&gt;Okay, that's enough for tonight.
Time to wrap things up and get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2022-05-24</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-05-24" rel="alternate"></link><published>2022-05-24T04:00:00-04:00</published><updated>2022-05-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-05-24:/weekly-roundup-2022-05-24</id><summary type="html">&lt;p class="first last"&gt;The AC is getting looked at on Thursday. Hooray...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I did some planning for sci-fi writing.&lt;/li&gt;
&lt;li&gt;Thursday: I was stressed out about the AC not working. Or, it sort of works, but in a way that's usually not &lt;em&gt;useful&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Friday: I spontaneously wrote a few hundred words complaining about games that I end up playing &lt;em&gt;a lot&lt;/em&gt; when I play them.&lt;/li&gt;
&lt;li&gt;Saturday: ...&lt;/li&gt;
&lt;li&gt;Sunday: I put in a little more work planning out MOTR changes.&lt;/li&gt;
&lt;li&gt;Monday: I &lt;em&gt;think&lt;/em&gt; I figured out all of the high-level aspects of the plan for MOTR.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I think I need to step back from pretty much everything for a little bit.
I think I'm feeling burnt out some.
I'll hopefully be up for working on MOTR, but I've got most of the really hard stuff done there; now it's just a matter of changing bits of code to how they &amp;quot;obviously&amp;quot; should be.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-05-23</title><link href="https://mwchase.neocities.org/coding-2022-05-23" rel="alternate"></link><published>2022-05-23T04:00:00-04:00</published><updated>2022-05-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-05-23:/coding-2022-05-23</id><summary type="html">&lt;p class="first last"&gt;The steps make sense, but there sure are a lot of them.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I basically had &amp;quot;Objective: Survive&amp;quot; for today, and I did that, so, it's time to relax and wait for the air outside to cool off.&lt;/p&gt;
&lt;p&gt;While I wait, let's see if I can take some quick notes on MOTR.
Yesterday, I determined that &lt;tt class="docutils literal"&gt;ParametricCommand.build()&lt;/tt&gt; should take a &lt;tt class="docutils literal"&gt;ValueAdaptor[PathWith[EnvironmentArgs]]&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Now, the flip side of that is that the corresponding &lt;tt class="docutils literal"&gt;Label&lt;/tt&gt; needs to be populated in the &lt;tt class="docutils literal"&gt;Registry&lt;/tt&gt;.
Right now, &lt;tt class="docutils literal"&gt;Registry&lt;/tt&gt; population looks like &lt;tt class="docutils literal"&gt;yield from api.cli.build.build(package_data)&lt;/tt&gt;.
And creating the information that would be stored in the label looks something like &lt;tt class="docutils literal"&gt;py = &lt;span class="pre"&gt;api.cli.flake8._installer.PathWith(pathlib.Path(),&lt;/span&gt; &lt;span class="pre"&gt;api.cli.flake8._pip.VirtualenvArgs())&lt;/span&gt;&lt;/tt&gt;.
Please ignore the encapsulation violations I stuck in there because I don't want to think about that part of the API yet.
To get things up and running, I need a helper function that creates a vector of that kind of data, and to have an idiom for adding that data to the &lt;tt class="docutils literal"&gt;Registry&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Something that occurs to me, looking at this code, is that it might make sense to separate the current &lt;tt class="docutils literal"&gt;changes()&lt;/tt&gt; implementation into a &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Callable[[Sequence[Parametric[None]],&lt;/span&gt; &lt;span class="pre"&gt;Requirements[Registry]],&lt;/span&gt; Requirements[None]]&lt;/tt&gt;, or something like that.
Basically, indicating &amp;quot;It's not expected that instantiating &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt;s be interleaved with building the &lt;tt class="docutils literal"&gt;Registry&lt;/tt&gt;.&amp;quot;
That kind of reorganization is only appropriate after I've written some more tests, and I want to fix up the tests that I have, first.&lt;/p&gt;
&lt;p&gt;Anyway, I think the last piece of the puzzle is the implementation of the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;ValueAdaptor[PathWith[...]]&lt;/span&gt;&lt;/tt&gt;, and that should just be &lt;tt class="docutils literal"&gt;return path_with.path&lt;/tt&gt;.
So, I just need a function to bundle that up with a &lt;tt class="docutils literal"&gt;Label&lt;/tt&gt;, and that should be the whole plan to get this working.&lt;/p&gt;
&lt;p&gt;I can't work on it now, because the air is soup.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-05-22</title><link href="https://mwchase.neocities.org/coding-2022-05-22" rel="alternate"></link><published>2022-05-22T04:00:00-04:00</published><updated>2022-05-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-05-22:/coding-2022-05-22</id><summary type="html">&lt;p class="first last"&gt;Some bits of this look a little suspicious, but it should be fine overall.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Ugh, the temperature is spiking and the AC just sort-of works.
Gosh, who could have predicted this?
Besides me.
A week ago.&lt;/p&gt;
&lt;p&gt;Let me see what I can do in terms of nailing down the changes to MOTR.&lt;/p&gt;
&lt;p&gt;So, &lt;tt class="docutils literal"&gt;ParametricCommand.build()&lt;/tt&gt; must pass a dict in the form &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;{Label():&lt;/span&gt; &lt;span class="pre"&gt;ValueAdaptor()}&lt;/span&gt;&lt;/tt&gt;, where... the &lt;tt class="docutils literal"&gt;Label&lt;/tt&gt; is probably a &lt;tt class="docutils literal"&gt;ParameterLabel[PathWith[EnvironmentArgs]]&lt;/tt&gt;, and the &lt;tt class="docutils literal"&gt;ValueAdaptor&lt;/tt&gt; is a &lt;tt class="docutils literal"&gt;ValueAdaptor[PathWith[EnvironmentArgs]]&lt;/tt&gt;.
&lt;em&gt;I think&lt;/em&gt;.
Now, that dict can be trivially derived from a &lt;tt class="docutils literal"&gt;ValueAdaptor[PathWith[EnvironmentArgs]]&lt;/tt&gt;.
And the &lt;tt class="docutils literal"&gt;ValueAdaptor[PathWith[EnvironmentArgs]]&lt;/tt&gt; can be created by decorating a &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Callable[[PathWith[EnvironmentArgs]],&lt;/span&gt; PathStr]&lt;/tt&gt; with &lt;tt class="docutils literal"&gt;&amp;#64;adaptive(LABEL)&lt;/tt&gt; where &lt;tt class="docutils literal"&gt;LABEL&lt;/tt&gt; is a &lt;tt class="docutils literal"&gt;ParameterLabel[PathWith[EnvironmentArgs]]&lt;/tt&gt;.
Because of the common logic, it probably makes sense to create a factory function that converts labels appropriately.&lt;/p&gt;
&lt;p&gt;Now, at the other end of &lt;tt class="docutils literal"&gt;ParametricCommand.build()&lt;/tt&gt;, I've got a &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Parametric[CommandBuilder[...]]&lt;/span&gt;&lt;/tt&gt;.
That needs to get properly converted, which can be done by mapping a basic parametric extraction over the relevant label and passing that into the &lt;tt class="docutils literal"&gt;requirements&lt;/tt&gt; method.&lt;/p&gt;
&lt;p&gt;I'm going to get some low-hanging fruit before I go too far.&lt;/p&gt;
&lt;p&gt;Got it.
Simple method on &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt; to pull out some redundant code.&lt;/p&gt;
&lt;p&gt;Anyway, let's see...
I think this needs some helper functions to create simple &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt; objects given &lt;tt class="docutils literal"&gt;Label&lt;/tt&gt;s...&lt;/p&gt;
&lt;p&gt;Given those helpers, I can map &lt;tt class="docutils literal"&gt;CommandBuilder.requirements()&lt;/tt&gt; over the &lt;tt class="docutils literal"&gt;Parametrics&lt;/tt&gt;, and lastly, I need to convert the resulting &lt;tt class="docutils literal"&gt;Parametric[Requirements[None]]&lt;/tt&gt; to a &lt;tt class="docutils literal"&gt;Parametric[None]&lt;/tt&gt;, which should be another simple helper function.&lt;/p&gt;
&lt;p&gt;There's still more to sketch out, but it's getting late, so I'm going to quickly put out the helper functions that I'm pretty sure I'll need.&lt;/p&gt;
&lt;p&gt;Okay, that's done.
The next areas to really focus on are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Creating the &lt;tt class="docutils literal"&gt;ValueAdaptor&lt;/tt&gt;s that will be needed for the new interface.&lt;/li&gt;
&lt;li&gt;Figuring out what I need to be adding to the &lt;tt class="docutils literal"&gt;Registry&lt;/tt&gt; objects in the tests.&lt;/li&gt;
&lt;li&gt;Actually updating the interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hopefully, I'll be thinking a bit clearer tomorrow.
We'll see.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2022-05-21</title><link href="https://mwchase.neocities.org/diary-2022-05-21" rel="alternate"></link><published>2022-05-21T04:00:00-04:00</published><updated>2022-05-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-05-21:/diary-2022-05-21</id><summary type="html">&lt;p class="first last"&gt;There is no one available to take your call. Please try again later.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I am in no shape to write tonight.
I need to take things easy.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-05-20</title><link href="https://mwchase.neocities.org/diary-2022-05-20" rel="alternate"></link><published>2022-05-20T04:00:00-04:00</published><updated>2022-05-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-05-20:/diary-2022-05-20</id><summary type="html">&lt;p class="first last"&gt;Apparently I had a lot of words in me.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I kind of spun my wheels a bit today.
There's supposed to be an idea of a plan of a schedule for getting the AC properly set up, so that's as nice as can be, I guess.&lt;/p&gt;
&lt;p&gt;I think I might try sketching out some of the stuff I stuck in the summary two days ago.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://prokopetz.tumblr.com/post/189138745277/it-kind-of-bothers-me-that-has-procedurally"&gt;Relevant background&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now, I read over that, and I think about Nova Drift, Slay the Spire, Solitairica, and Vampire Survivors.&lt;/p&gt;
&lt;p&gt;Technically speaking, that post only half applies to Solitairica, because you don't unlock within-a-run upgrades in Solitairica, so it's &amp;quot;just&amp;quot; really grindy.
Like, come on, I can clear normal mode with a basic deck pretty much at will, apparently.
Just give me the rest of the dang game, please.&lt;/p&gt;
&lt;p&gt;Also, the first half of the post doesn't describe Vampire Survivors, since it actually does have fixed maps, so good on it.
Second half is super applicable, though.&lt;/p&gt;
&lt;p&gt;I'm sort of thinking of this now because my save files for Nova Drift (which I was playing a few months ago) and Solitairica, which I just picked up recently, didn't survive the laptop migration, so I ground things up in Nova Drift, which is a little annoying, and I ground a little in Solitairica, and that's giving me this weird double sensation of &amp;quot;Oh, the flow!&amp;quot; and &amp;quot;Please just let me have all characters, six slots, and all power cards, this is &lt;em&gt;busywork&lt;/em&gt;&amp;quot;.&lt;/p&gt;
&lt;p&gt;Having established that I'm complaining, I'll now think about why these games might be like this.
I think the draw of these games lies in part in the combination of &amp;quot;bite-sized play times&amp;quot; with &amp;quot;long-term progression&amp;quot;.
So, you're not signed up to anything that requires long-term investment or understanding, and you can just knock out a play session, potentially in an afternoon or so, but you're still making progress every time you do.&lt;/p&gt;
&lt;p&gt;So, &lt;em&gt;assuming I'm right about this being the reason for stapling together RPG progression and roguelite runs&lt;/em&gt;, is there a way to do this that I'd prefer?&lt;/p&gt;
&lt;p&gt;Now, &amp;quot;not having the whole game&amp;quot; bothers me from a gameplay perspective, but there's kind of a symbolic issue here: When we upgrade things between runs, what are we playing as?
We get some experience points or make some purchases, and somehow this... changes the options available to the &lt;em&gt;brand new&lt;/em&gt; iteration of the character in the next run?
Like, I'm making persistent progress, but I also have to re-buy all the potions and such that I want each time.
Something that occurred to me as a flavoring possibility for these &amp;quot;per-run&amp;quot; upgrades is tactical modifications to the area the run takes place in.
Like, you can set up traps and trip-wires or whatever, and when you move on to the next area, you don't get back the stuff that you deployed, because you used it.&lt;/p&gt;
&lt;p&gt;Let's see how this idea interacts with the points in the linked post.&lt;/p&gt;
&lt;p&gt;First off, I'm assuming that this is presented as a vaguely RPG-ish with very forgiving death mechanics by roguelike standards, in order to maintain the &amp;quot;bitesized run&amp;quot; concept.
You have save files, each save file has a series of cleared zones, you advance by clearing a zone, which takes no more than a few hours, and if you die, it punts you back to the beginning of the zone.&lt;/p&gt;
&lt;p&gt;&amp;quot;B-but permadeath!&amp;quot;
&amp;quot;There's no way for dying to gum up your meta-progression in these games, so something's clearly off-kilter anyway.&amp;quot;&lt;/p&gt;
&lt;p&gt;Each zone starts with a shop that has a random inventory of tools for helping you clear the zone.
Clearing the zone in certain ways can give you bonuses of some kind.&lt;/p&gt;
&lt;p&gt;So, you've got a save file, the character is advancing in ways gated by the random shop inventory, I don't have strong thoughts about the zones, but it's a better decision to design a bunch of &amp;quot;levels that work&amp;quot; than to try to work out the principles for good level design from nothing and program them into the game, (if I want proc-gen for levels later, it will help to have examples), and the part about optimization vs crazy runs has me thinking of something else...&lt;/p&gt;
&lt;p&gt;Suppose the kinds of items available from the shops were tied to some kind of &amp;quot;chaos meter&amp;quot; like from Mythic, where low chaos made it easier to obtain lower-tier and reliable items, while high chaos made available items &amp;quot;swingier&amp;quot; in various ways.
Then, player conduct could influence the chaos meter up and down, to try and tailor the overall experience to match the play style.
I don't know if this is a good idea, but it's an idea, to be sure.&lt;/p&gt;
&lt;p&gt;Anyway, I'm really tired, so I'm wrapping things up for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-05-19</title><link href="https://mwchase.neocities.org/diary-2022-05-19" rel="alternate"></link><published>2022-05-19T04:00:00-04:00</published><updated>2022-05-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-05-19:/diary-2022-05-19</id><summary type="html">&lt;p class="first last"&gt;Getting some good zingers out of this situation, at least.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Uuuuugh.
Didn't really manage to focus on anything today.
I wrote &lt;em&gt;a little&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I think I was in a funk because I'm having trouble getting building management to acknowledge that, hey, they should probably schedule that yearly maintenance that the AC here seems to need, &lt;em&gt;before&lt;/em&gt; the weather turns completely intolerable this weekend.&lt;/p&gt;
&lt;p&gt;Call me pedantic if you must, but I don't think the AC should be blowing air above room temperature.&lt;/p&gt;
&lt;p&gt;Watch this space to see how angry I am in the third entry after this one.&lt;/p&gt;
&lt;p&gt;Anyway, I let things get late, and the only thing to do now, really, is to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-05-18</title><link href="https://mwchase.neocities.org/diary-2022-05-18" rel="alternate"></link><published>2022-05-18T04:00:00-04:00</published><updated>2022-05-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-05-18:/diary-2022-05-18</id><summary type="html">&lt;p class="first last"&gt;I've got a rant in me for sometime about games that go &amp;quot;Hey, let's have long-term progression like an RPG, but it's more of a checklist to determine what you have access to in otherwise isolated runs, like a roguelite.&amp;quot; I am begging you, pick a lane.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Gaaaaames...
And writing that I won't describe here.&lt;/p&gt;
&lt;p&gt;&amp;quot;Let's see if I can spin up something in fifteen minutes or so.&amp;quot; is the first thing that occurred to me writing that sentence, and also a &lt;em&gt;terrible&lt;/em&gt; idea.&lt;/p&gt;
&lt;p&gt;For now, let's just quick review the writing I'm trying to focus on.
I've got concepts for nine characters currently, but they're not very well-defined beyond skillsets.
I think for each character I'm going to want to work out:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Background, including connections to off-screen characters&lt;/li&gt;
&lt;li&gt;Appearance&lt;/li&gt;
&lt;li&gt;Associated genre, including stories to read for reference.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once that's filled in a bit, I think I should work on outlining.&lt;/p&gt;
&lt;p&gt;For now, though, I'm very tired and I should get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2022-05-17</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-05-17" rel="alternate"></link><published>2022-05-17T04:00:00-04:00</published><updated>2022-05-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-05-17:/weekly-roundup-2022-05-17</id><summary type="html">&lt;p class="first last"&gt;Got caught off-guard by the heat.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I worked on MOTR because I wanted to unwind some.&lt;/li&gt;
&lt;li&gt;Thursday: I made a small amount of progress on writing.&lt;/li&gt;
&lt;li&gt;Friday: VIDYAGAMES and a headache.&lt;/li&gt;
&lt;li&gt;Saturday: I did some planning for working on MOTR, and had a feeling I was missing something. This turned out to be foreshadowing.&lt;/li&gt;
&lt;li&gt;Sunday: I wasn't up for doing much work before I published the post, but I got a bit done afterwards...&lt;/li&gt;
&lt;li&gt;Monday: And, thinking it over, realized that the code needed another minor rewrite, which I started sketching out a plan for.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I want to take some notes about that rewrite, and get more prose writing done.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-05-16</title><link href="https://mwchase.neocities.org/coding-2022-05-16" rel="alternate"></link><published>2022-05-16T04:00:00-04:00</published><updated>2022-05-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-05-16:/coding-2022-05-16</id><summary type="html">&lt;p class="first last"&gt;I'm kind of curious how intensely frustrating this code would be for anyone else to work with. Some of my process here has felt like how, if I'm not being careful when I do math on paper, the work ends up flowing in essentially random directions that only I can follow.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, after the last entry, I drafted out a test using the not-yet-written modules that will be needed.
Some of it will need to be updated to match the interfaces, but first, there's something pretty serious that I need to work on.&lt;/p&gt;
&lt;p&gt;Recently-ish, I was having trouble accounting for the different Python versions that will be used by the various commands.
At the time, I punted on them, by pulling them out of some of the higher-level data structures, and making them a parameter to the &lt;tt class="docutils literal"&gt;map&lt;/tt&gt; method.&lt;/p&gt;
&lt;p&gt;As has been kind of a recurring thing, I'd forgotten part of the design goals.
The choice of interpreter is supposed to be recapitulated by the &lt;tt class="docutils literal"&gt;FlexIn&lt;/tt&gt; object, which means it has to be stored under a &lt;tt class="docutils literal"&gt;ParametricLabel[PathWith[VirtualenvArgs]]&lt;/tt&gt; in the &lt;tt class="docutils literal"&gt;Registry&lt;/tt&gt;.
I didn't work on this earlier today, but let's see if I can put together a quick sketch of what this would entail, in the next fifteen minutes or so.&lt;/p&gt;
&lt;p&gt;Right now, the data is injected like so: &lt;tt class="docutils literal"&gt;lambda command: command.requirements(python)&lt;/tt&gt;.
After the changes, that site is going to look like &lt;tt class="docutils literal"&gt;lambda command: command.requirements()&lt;/tt&gt; (or potentially just passing the unbound method).
An additional line will need to be added to get the relevant data into the registry.&lt;/p&gt;
&lt;p&gt;So, let's have a look at the &lt;tt class="docutils literal"&gt;requirements()&lt;/tt&gt; method...&lt;/p&gt;
&lt;p&gt;Hm.
I'm not seeing a way to dramatically change this part of the code.
I think I need to look into the &lt;tt class="docutils literal"&gt;ParametricCommand&lt;/tt&gt; class.
That's where I &lt;em&gt;thought&lt;/em&gt; this stuff was supposed to live, I think.
That's the level of code that handles injecting information into the &lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt; objects, so let's see...&lt;/p&gt;
&lt;p&gt;One possible way in is a pre-processing step in &lt;tt class="docutils literal"&gt;ParametricCommand.build()&lt;/tt&gt;.
Let's see where that's called from...&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;python_helpers.CommandBuilder.parametric()&lt;/tt&gt;
From an API perspective, this looks like an excellent place to add an argument for this purpose.
Now, it's just a question of figuring out what that argument looks like...&lt;/p&gt;
&lt;p&gt;So, here's what I've got:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;ParametricCommand.build()&lt;/tt&gt; gets some kind of new argument, and takes on responsibilities to code that argument so &lt;tt class="docutils literal"&gt;ParametricCommand._build()&lt;/tt&gt; can use it, and process the result of &lt;tt class="docutils literal"&gt;ParametricCommand._build()&lt;/tt&gt; so that the outer function now directly handles the &lt;tt class="docutils literal"&gt;requirements()&lt;/tt&gt; call.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Parametric.map()&lt;/tt&gt; gets trimmed down and renamed.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;python_helpers.CommandBuilder.parametric()&lt;/tt&gt; gets a new argument.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm not done sketching this out, but I think I'm done for the night.
I want to try and cool off.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-05-15</title><link href="https://mwchase.neocities.org/coding-2022-05-15" rel="alternate"></link><published>2022-05-15T04:00:00-04:00</published><updated>2022-05-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-05-15:/coding-2022-05-15</id><summary type="html">&lt;p class="first last"&gt;The sun is a deadly laser.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm kind of stuck taking things easy until the AC gets set up or the heat breaks.
The heat's going to &lt;em&gt;kind of&lt;/em&gt; do that over some of the next few days, so I should be good as long as the AC is working before next Saturday.&lt;/p&gt;
&lt;p&gt;For now, I've done some of the preparatory re-organization for the Mypy testing.
I think I'd like to post now, and see if I'm up for more work after.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-05-14</title><link href="https://mwchase.neocities.org/coding-2022-05-14" rel="alternate"></link><published>2022-05-14T04:00:00-04:00</published><updated>2022-05-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-05-14:/coding-2022-05-14</id><summary type="html">&lt;p class="first last"&gt;Remembering that &amp;quot;Oh, yeah! I implemented all of that stuff for a &lt;em&gt;reason&lt;/em&gt;.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I did a little work on writing, but not much.
I need the air to be less harsh before I can really focus.&lt;/p&gt;
&lt;p&gt;For now, I want to make plans for testing the Mypy wrapper.&lt;/p&gt;
&lt;p&gt;So, Mypy is the next logical step, because it has xUnit output, so there are additional post-processing steps.
The things that need to be linked up are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Run mypy, create coverage report and xUnit file&lt;/li&gt;
&lt;li&gt;Merge all xUnit files&lt;/li&gt;
&lt;li&gt;Convert merged file to HTML&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Parts of the command line wrapper should include:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The base command&lt;/li&gt;
&lt;li&gt;HTML report output option&lt;/li&gt;
&lt;li&gt;XML report output option&lt;/li&gt;
&lt;li&gt;Source directory (should be same logic as flake8)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Looking over the relevant code, I wonder if the definition of &lt;tt class="docutils literal"&gt;FlexOut&lt;/tt&gt; should be tweaked so it creates its own labels without them being passed in.
That seems reasonable to me.&lt;/p&gt;
&lt;p&gt;Then, we get into the combination.
This needs:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The base command&lt;/li&gt;
&lt;li&gt;A function to convert from a &lt;tt class="docutils literal"&gt;FlexIn&lt;/tt&gt; to an &lt;tt class="docutils literal"&gt;Arg&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;Output option&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then, converting to html:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The base command&lt;/li&gt;
&lt;li&gt;Input option (should take an input path argument)&lt;/li&gt;
&lt;li&gt;Output option&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It'll be interesting to see what weird oversights are lurking in the code, because I think most of this should be straightforward, and that makes me feel like I'm missing something.&lt;/p&gt;
&lt;p&gt;Anyway, I'm not awake for much longer, so I'll wrap this here.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2022-05-13</title><link href="https://mwchase.neocities.org/diary-2022-05-13" rel="alternate"></link><published>2022-05-13T04:00:00-04:00</published><updated>2022-05-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-05-13:/diary-2022-05-13</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Oh well.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Any plans to do anything with my projects today were sacrificed on the twin altars of &amp;quot;My head kind of hurts&amp;quot; and &amp;quot;Just one more game&amp;quot;.&lt;/p&gt;
&lt;p&gt;So, um, this is late, and I'm pushing it out as fast as I can.
Oh well.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-05-12</title><link href="https://mwchase.neocities.org/diary-2022-05-12" rel="alternate"></link><published>2022-05-12T04:00:00-04:00</published><updated>2022-05-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-05-12:/diary-2022-05-12</id><summary type="html">&lt;p class="first last"&gt;I hope these names grow on me. I don't want to get caught up tinkering with them.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I ended up doing other stuff and vegging out today, but I did have time to name all of the characters.
After using the technique of &amp;quot;generate random words and derive puns or references from them&amp;quot; to make names, a whole bunch, I wonder if these names need some tweaking.
But for now, I'm going to forge ahead.&lt;/p&gt;
&lt;p&gt;And by &amp;quot;forge ahead now&amp;quot; I mean &amp;quot;Try to work on sketching out these characters in more detail, &lt;em&gt;tomorrow&lt;/em&gt;&amp;quot;, because I am really tired and I want to lie down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2022-05-11</title><link href="https://mwchase.neocities.org/coding-2022-05-11" rel="alternate"></link><published>2022-05-11T04:00:00-04:00</published><updated>2022-05-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-05-11:/coding-2022-05-11</id><summary type="html">&lt;p class="first last"&gt;Awkward category switch mid-post, oh well.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I had a rough couple of days, so I finished the basics of the planned renames to blow off steam.
This was a little bit of a double-edged sword, because it turns out getting the renames done was &lt;em&gt;a lot&lt;/em&gt; of typing, and I was trying to do it &lt;em&gt;fast&lt;/em&gt;, so my hands feel mildly weird after all of that.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to let that sit and come back to it on the weekend.
I think I'll work on writing tests, unless something else comes up.&lt;/p&gt;
&lt;p&gt;Anyway, thinking about writing.
I'm not in the best shape right now for ~*~creativity~*~, but I can put together some plans, some stuff to fill in.&lt;/p&gt;
&lt;p&gt;For the setting I'm focusing on, one way to sum it up is that a small group of people with very different fields of expertise are gearing up to fight off an alien invasion.
So, I want to come up with a few different areas of expertise.
So far I've got:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&amp;quot;The leader&amp;quot;, who focuses on administration and recruitment, and &lt;em&gt;probably&lt;/em&gt; won't be a viewpoint character.&lt;/li&gt;
&lt;li&gt;&amp;quot;The investigator&amp;quot;, who is there to solve mysteries.
There will be some opportunity for normal crimes mysteries, but I want the focus to be on stuff like &amp;quot;what could have been the purpose of this weird artifact?&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;The technologist&amp;quot;, who does general-purpose repair and development.
The focus there is on &amp;quot;how can we use this new alien thing, or fix this weird problem that showed up in the alien thing that we're already using?&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here are some roles that, on reflection, seem like &lt;em&gt;kind of good ideas&lt;/em&gt;:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Farmer/general life support&lt;/li&gt;
&lt;li&gt;Military experience seems really really important in the context of &lt;em&gt;fighting a war&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Theft/infiltration, maybe?&lt;/li&gt;
&lt;li&gt;Propaganda/persuasion.
This &lt;em&gt;will&lt;/em&gt; come up with the direction I want to take things.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I think I'll call things there for now, and try and flesh this out and see what else I feel like is missing later.&lt;/p&gt;
&lt;p&gt;For now, I want to unwind properly.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2022-05-10</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-05-10" rel="alternate"></link><published>2022-05-10T04:00:00-04:00</published><updated>2022-05-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-05-10:/weekly-roundup-2022-05-10</id><summary type="html">&lt;p class="first last"&gt;I wanted to take some time today to continue the renames, but I had to stare into infinity &lt;em&gt;very quickly&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I made some progress on writing stuff.&lt;/li&gt;
&lt;li&gt;Thursday: I thought about where I want to take this writing, and spitballed some ideas for conlang tooling.&lt;/li&gt;
&lt;li&gt;Friday: I put together some ideas for representing glosses for conlanging, in a form that's easier to edit than writing a giant table manually.&lt;/li&gt;
&lt;li&gt;Saturday: I started to draft out the grammar, using those ideas.&lt;/li&gt;
&lt;li&gt;Sunday: I came up with new and hopefully better names for some, but not all, of the higher-level API concepts in MOTR.&lt;/li&gt;
&lt;li&gt;Monday: I started on the renames.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'll try to get more stuff done with writing.
I don't know how much I'll be up for, because something got me &lt;em&gt;painfully&lt;/em&gt; keyed up today, and I don't know how much I'll be capable of if that keeps up.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-05-09</title><link href="https://mwchase.neocities.org/coding-2022-05-09" rel="alternate"></link><published>2022-05-09T04:00:00-04:00</published><updated>2022-05-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-05-09:/coding-2022-05-09</id><summary type="html">&lt;p class="first last"&gt;Renaming modules is a necessary evil.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;And, traveled again.
I don't know if I'll manage all of the changes that I came up with, but I'd like to get started.&lt;/p&gt;
&lt;p&gt;So...&lt;/p&gt;
&lt;p&gt;I handled the first two I wrote up, but I know that updating &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt; is going to be a really big change.
I think it's better to cut things short for now, and come back to this later when I have more time.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-05-08</title><link href="https://mwchase.neocities.org/coding-2022-05-08" rel="alternate"></link><published>2022-05-08T04:00:00-04:00</published><updated>2022-05-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-05-08:/coding-2022-05-08</id><summary type="html">&lt;p class="first last"&gt;Hindsight is... not quite 20/20, but close enough.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, traveled today, but I still want to try and do the work I had planned for MOTR, which was to...&lt;/p&gt;
&lt;p&gt;Oh no.&lt;/p&gt;
&lt;p&gt;It was to evaluate all of the ill-fitting names in the upper layers of the API and try to come up with better alternatives.&lt;/p&gt;
&lt;p&gt;All right, let's work through these modules alphabetically...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;arguments.py&lt;/tt&gt;: Rename to &lt;tt class="docutils literal"&gt;command_builder.py&lt;/tt&gt;, see how it treats me from there.
Could stick &lt;tt class="docutils literal"&gt;Builder&lt;/tt&gt; on the end?&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;command.py&lt;/tt&gt;: Oof, not really sure.
Also, this module contains one of the &lt;tt class="docutils literal"&gt;*Meta&lt;/tt&gt; classes, which really need something nicer.
I mean, maybe just renaming all of those classes to &lt;tt class="docutils literal"&gt;Metadata&lt;/tt&gt; would help things?&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;dynamic.py&lt;/tt&gt;: Ooooof.
Another &lt;tt class="docutils literal"&gt;*Meta&lt;/tt&gt;, that one should just get whatever treatment the others get.
The bigger puzzle is &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt; itself.
Like, &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt; is a &lt;em&gt;pretty questionable&lt;/em&gt; name for a concept in this context.
What is it?
Well, it combines a bunch of metadata with a function that has a particular signature; and this lets it...
Um...
&lt;tt class="docutils literal"&gt;ThisIsUsefulISwear&lt;/tt&gt;.
Okay, stepping back for a sec.
The &lt;em&gt;point&lt;/em&gt; is to call the function with every valid combination of parameters.
So the various names involved should say &lt;em&gt;something&lt;/em&gt; about parameters.
Let's try and consider &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;Objects&lt;/tt&gt;, and &lt;tt class="docutils literal"&gt;Items&lt;/tt&gt; together, and oof.
Now, whatever &lt;tt class="docutils literal"&gt;Objects&lt;/tt&gt; is, it's agnostic to all of this parameterization &lt;em&gt;stuff&lt;/em&gt;, so it might deserve to get the &lt;tt class="docutils literal"&gt;Registry&lt;/tt&gt; name back.
&lt;tt class="docutils literal"&gt;Items&lt;/tt&gt; can be &lt;tt class="docutils literal"&gt;ParameterRegistry&lt;/tt&gt; if I don't think of something better.
(And &lt;tt class="docutils literal"&gt;ItemLabel&lt;/tt&gt; turns into &lt;tt class="docutils literal"&gt;ParameterLabel&lt;/tt&gt;.)
And &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt; can change to &lt;tt class="docutils literal"&gt;Parametric&lt;/tt&gt;, or something better.
The helper methods should mention &lt;tt class="docutils literal"&gt;parametric&lt;/tt&gt;.
&lt;tt class="docutils literal"&gt;inject_into_parametric&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;map_1_over_parametric&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;map_2_over_parametric&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;NoParameters&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;no_parameters&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;reduce_parameterization&lt;/tt&gt;...&lt;/li&gt;
&lt;li&gt;I can't &lt;em&gt;tell&lt;/em&gt; whether the &lt;tt class="docutils literal"&gt;flex.py&lt;/tt&gt; names are good or not, so let's put a pin in those...&lt;/li&gt;
&lt;li&gt;Something feels off with the &lt;tt class="docutils literal"&gt;input_accumulator.py&lt;/tt&gt; stuff (like that the core type is accumulating specifically into a &lt;tt class="docutils literal"&gt;_cmd.PathStr&lt;/tt&gt;, and using adaptors to make types of other values work with that, but I'm again not sure what to do differently.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;installer.py&lt;/tt&gt; feels like maybe I want to divide it up.
Before I changed the code to make the new tests... work... this module had much fewer classes in it.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;invocation.py&lt;/tt&gt; is confounding because somehow I've written &lt;em&gt;another&lt;/em&gt; command builder, and it doesn't &lt;em&gt;replace&lt;/em&gt; the others, it just builds on them, with an interface that is &amp;quot;nicer&amp;quot; in some sense that I'm not sure how to quantify.
I guess the point is that this bridges the &lt;tt class="docutils literal"&gt;command&lt;/tt&gt; stuff and the &lt;tt class="docutils literal"&gt;dynamic&lt;/tt&gt;/&lt;tt class="docutils literal"&gt;parametric&lt;/tt&gt; stuff, like a kind of... &lt;tt class="docutils literal"&gt;ParametricCommand&lt;/tt&gt;.
That's definitely clearer, in that you can look at it and mentally break it down into the questions of &amp;quot;what does 'parametric' mean?&amp;quot; and &amp;quot;what is a 'command'?&amp;quot;.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;items.py&lt;/tt&gt;: the &amp;quot;Item-to-Parameter&amp;quot; change should handle all of this.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;objects.py&lt;/tt&gt;: the &amp;quot;Objects-to-Registry&amp;quot; change should handle it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Also, for those last two, and maybe some others, I want to roll the &amp;quot;use &lt;tt class="docutils literal"&gt;TypedMapping&lt;/tt&gt;&amp;quot; change out so I don't have to worry about code drifting out of synch.&lt;/p&gt;
&lt;p&gt;So, I'll think this over in the morning or next week, and see what I think.
For now, I really want to wrap things up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2022-05-07</title><link href="https://mwchase.neocities.org/diary-2022-05-07" rel="alternate"></link><published>2022-05-07T04:00:00-04:00</published><updated>2022-05-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-05-07:/diary-2022-05-07</id><summary type="html">&lt;p class="first last"&gt;Situation: I have notes in 5 different places. &amp;quot;I know! I'll copy them all into one unified location!&amp;quot; Situation: I have notes in 6 different places.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't get as much done as I'd like today, but I translated some of my notes on conlanging into the format I was roughing out yesterday.
I think I found some issues with one of the sentences, so I'll need to come back to it.
Probably the course of action that makes the most sense is to consolidate all of my notes into a single repo, making sure to note anything that needs to be reworked.
Before I copy in more glosses, I need to review the things I can do with custom directives, and see if I want to change anything about the processing.&lt;/p&gt;
&lt;p&gt;Anyway, I didn't get much done today because I'm way out of it, so I'm not going to try to drag this out any further.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2022-05-06</title><link href="https://mwchase.neocities.org/coding-2022-05-06" rel="alternate"></link><published>2022-05-06T04:00:00-04:00</published><updated>2022-05-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-05-06:/coding-2022-05-06</id><summary type="html">&lt;p class="first last"&gt;Searching for Minimum Viability.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;For the stuff in the last coding entry, I worked out some stuff with Hatchling.
I'm really not confident I'm planning to use it as intended, but, like, whatever.&lt;/p&gt;
&lt;p&gt;For this entry, I'm not touching that, or MOTR.
Instead, I'm doing a little sketching of stuff for conlanging.
Basically, I'm trying to figure out the right way to support glosses.&lt;/p&gt;
&lt;p&gt;To start with, I'm thinking about Sphinx, and figuring I'll go for something like this:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
:word:`gloss()-SG-gloss(stem)`

.. gloss:: Free translation.

    - `gloss(stem)`
    - `gloss(stem)-AFF`
    - etc
&lt;/pre&gt;
&lt;p&gt;Where the &lt;tt class="docutils literal"&gt;:word:&lt;/tt&gt; role has a parser to convert the given minilanguage into helpful Python objects that then get rendered in various ways, and the &lt;tt class="docutils literal"&gt;.. gloss::&lt;/tt&gt; directive performs further validation.
Specifically, that either all of the roots are filled in, or none of them are.&lt;/p&gt;
&lt;p&gt;With these ideas and simple dummy implementations, I should be able to get started writing up glosses under source control, in a format that doesn't involve overmuch tedious fiddling with control characters, or manually aligning things.&lt;/p&gt;
&lt;p&gt;Anyway, I'm still feeling iffy (it might be the pollen) so I'm going to get to bed now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2022-05-05</title><link href="https://mwchase.neocities.org/diary-2022-05-05" rel="alternate"></link><published>2022-05-05T04:00:00-04:00</published><updated>2022-05-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-05-05:/diary-2022-05-05</id><summary type="html">&lt;p class="first last"&gt;I almost wonder if &amp;quot;too humid&amp;quot; and &amp;quot;not humid enough&amp;quot; &lt;em&gt;overlap&lt;/em&gt;...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I wasn't terribly focused today.
There's something weird and gross in the air; it might just be heat and humidity.&lt;/p&gt;
&lt;p&gt;I took a few more notes for writing.
I'm fired up about this concept now that I want to do some kind of like... goal-directed outlining.
My mental image of how it would be presented is, like, a series of short stories that could, conceptually, be grouped into volumes.
So, I should be able to iterate on process in a somewhat straightforward fashion, once I have the focus to really get into this.&lt;/p&gt;
&lt;p&gt;I also tried to sort things out when it comes to conlanging, and it kind of feels like I've somehow circled around in terms of tooling.
Like &amp;quot;It sure would be nice to have a table format that works well with version control, so I guess that needs to be some kind of text, but I &lt;em&gt;know&lt;/em&gt; I hated laying out these tables in ReStructuredText, so I guess I want to represent them in Python somehow, so I guess I &lt;em&gt;do&lt;/em&gt; need a representation of at least the glosses...&amp;quot;&lt;/p&gt;
&lt;p&gt;I'm fine putting that together at some point, but I want some idea of how I'll get the data back &lt;em&gt;out&lt;/em&gt;.
I'm sort of wondering if there's some way to pull data from a Jupyter notebook into Sphinx...&lt;/p&gt;
&lt;p&gt;Anyway, I'm done for tonight.
I can't be up much longer.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-05-04</title><link href="https://mwchase.neocities.org/diary-2022-05-04" rel="alternate"></link><published>2022-05-04T04:00:00-04:00</published><updated>2022-05-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-05-04:/diary-2022-05-04</id><summary type="html">&lt;p class="first last"&gt;I guess I'm going to have to explain these writing hacks some time.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Let's see about doing some quick writing.
I've got these sci-fi settings I'm interested in.
Let's see about fleshing out my notes a bit more.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Dang, that was quick but effective in moving things in a direction that interests me.&lt;/p&gt;
&lt;p&gt;If the techniques I'm messing with can get me results this quickly, I think that means I should set myself some goals for &amp;quot;what needs to be decided before I start drafting&amp;quot;, and then get to it.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to wrap up for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2022-05-03</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-05-03" rel="alternate"></link><published>2022-05-03T04:00:00-04:00</published><updated>2022-05-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-05-03:/weekly-roundup-2022-05-03</id><summary type="html">&lt;p class="first last"&gt;Not great summaries this time, but whatever.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I had more problems than usual with technology.&lt;/li&gt;
&lt;li&gt;Thursday: I tinkered with code that could potentially help with some stuff I want to try out.&lt;/li&gt;
&lt;li&gt;Friday: I messed around with other code, then worked on story concepts and got those somewhere interesting.&lt;/li&gt;
&lt;li&gt;Saturday: I, um, relaxed.&lt;/li&gt;
&lt;li&gt;Sunday: I cleaned up MOTR's test code a little, and took some notes on how to improve the interfaces.&lt;/li&gt;
&lt;li&gt;Monday: I acted on those notes, and decided on the next thing that needs work: the dang names.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to focus on writing more.&lt;/p&gt;
&lt;p&gt;Also, I was messing with mypycify earlier today, and I'm still having trouble finding a sweetspot of &amp;quot;easy to configure&amp;quot;, &amp;quot;allows using mypyc&amp;quot;, and &amp;quot;can turn mypyc &lt;em&gt;off&lt;/em&gt; to create a pure python wheel&amp;quot;.
I'll try not to focus on that too hard, because I'll probably be most interested in it once MOTR is in better shape.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-05-02</title><link href="https://mwchase.neocities.org/coding-2022-05-02" rel="alternate"></link><published>2022-05-02T04:00:00-04:00</published><updated>2022-05-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-05-02:/coding-2022-05-02</id><summary type="html">&lt;p class="first last"&gt;Maybe I should look into using Hatchling instead.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got a bit distracted earlier today learning about using &lt;a class="reference external" href="https://mypyc.readthedocs.io/en/latest/getting_started.html"&gt;mypycify&lt;/a&gt;.
I managed to get it working with setup.py, but I kind of don't want to deal with setup.py files.
I tried to get it working with &lt;a class="reference external" href="https://github.com/dholth/enscons"&gt;enscons&lt;/a&gt;, but I didn't find anything that seemed to work out of the box, so I'm going to have to learn more about setting stuff up with SCons.
Or suck it up and write a setup.py when I want to mess with mypyc.
Eeeennh.&lt;/p&gt;
&lt;p&gt;Anyway, let's shelve that for now and see about improving my test code over in MOTR.
But first, &lt;a class="reference external" href="https://im-in.space/&amp;#64;mwchase/108229848686430527"&gt;thread&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Okay, just did the easy quick one.
That looks like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@pytest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fixture&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;session&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;make_changes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Create a factory function for making requirements generators.&lt;/span&gt;

&lt;span class="sd"&gt;    The motivation for this was, admittedly, mostly to get rid of a coverage&lt;/span&gt;
&lt;span class="sd"&gt;    miss.&lt;/span&gt;
&lt;span class="sd"&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dynamic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;package_data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;changes&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="n"&gt;objects&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;yield from&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cli&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;package_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;yield from&lt;/span&gt; &lt;span class="n"&gt;dynamic&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;requirements&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;objects&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;changes&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;make&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now for the other one.&lt;/p&gt;
&lt;p&gt;Okay, that's done-ish, but I don't want to copy a snippet to show off, because the changes are spread across three different files.&lt;/p&gt;
&lt;p&gt;Basically, I made a helper class that bundles up a bunch of common operations to reduce the amount of irrelevant details exposed via the API.&lt;/p&gt;
&lt;p&gt;Anyway, the code is more concise, but the bad names are starting to really grate on me, so that's what I want to focus on next.&lt;/p&gt;
&lt;p&gt;For now, I'd better get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-05-01</title><link href="https://mwchase.neocities.org/coding-2022-05-01" rel="alternate"></link><published>2022-05-01T04:00:00-04:00</published><updated>2022-05-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-05-01:/coding-2022-05-01</id><summary type="html">&lt;p class="first last"&gt;Incremental progress, and setting up for future work.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, how did things go today?
Well, I did a bit of work with error cases, then cleaned up some of the parameter id stuff so that the test names aren't excessively long.
Now, I'm looking back at the coverage data.&lt;/p&gt;
&lt;p&gt;It looks like the major avenues I can take are to focus on error cases, or on expected cases.
The issue with the expected cases is that doing that is going to require writing more code to work with the external interface.
(Under the logic that it makes sense to not know how to hit the error cases given reasonable input, but that expected cases should focus on the external interfaces when possible.)
But that means looking at the existing tests and figuring out what kinds of rewrites they need.&lt;/p&gt;
&lt;p&gt;Let's see if I can find anything promising in the error cases to knock out quickly.&lt;/p&gt;
&lt;p&gt;Mmm, there's just so much that would do better given high-level tests, so let's see what shortcomings I can identify in the flake8 tests...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Need to explicitly call &lt;tt class="docutils literal"&gt;pyrsistent.v&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;Need to explicitly retrieve &lt;tt class="docutils literal"&gt;Invocation&lt;/tt&gt; class&lt;/li&gt;
&lt;li&gt;Need to combine &lt;tt class="docutils literal"&gt;flake8.BASE&lt;/tt&gt; with compatible &lt;tt class="docutils literal"&gt;Static[Option]&lt;/tt&gt; objects&lt;/li&gt;
&lt;li&gt;Need to explicitly call &lt;tt class="docutils literal"&gt;invoke()&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If I can write a helper class that addresses those issues, I'll be able to rewrite the flake8 tests to look nicer, and I'll feel comfortable writing tests for, say, mypy, which should shake out a lot of the issues with the tests.
The other issue I can see with the tests could be addressed by writing some helper functions/classes to factor out common test code.&lt;/p&gt;
&lt;p&gt;I'll try to get on these ideas tomorrow.
For now, I want to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2022-04-30</title><link href="https://mwchase.neocities.org/diary-2022-04-30" rel="alternate"></link><published>2022-04-30T04:00:00-04:00</published><updated>2022-04-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-04-30:/diary-2022-04-30</id><summary type="html">&lt;p class="first last"&gt;Extremely relaxed.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I didn't really get much done today.
I was kind of focused on taking things easy, and now I'm really out of it.&lt;/p&gt;
&lt;p&gt;I seriously can't think of anything to say, so I should call this here, such as it is, and assume that I'll be up for much more tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-04-29</title><link href="https://mwchase.neocities.org/diary-2022-04-29" rel="alternate"></link><published>2022-04-29T04:00:00-04:00</published><updated>2022-04-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-04-29:/diary-2022-04-29</id><summary type="html">&lt;p class="first last"&gt;Trying to have agency over how I feel when I wake up in the morning.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Time management is still in an eeeeeh kind of place, but I can work on that right now thus:&lt;/p&gt;
&lt;p&gt;I messed a tiny bit with MOTR today, because I idly ran the tests to get an idea of the behavior (the typing tests seem to be doing some kind of painful things to the overall execution time), and I discovered that, since I last ran them, it seems like Mypy got some new behavior?
Whatever, it was a bunch of quick fixes.&lt;/p&gt;
&lt;p&gt;Anyway, I also made sure to focus a little on writing.
I filled in the general outline I came up with for one of my story concepts, and got it from &amp;quot;making fun of part of the concept of a specific other story&amp;quot; to &amp;quot;other things are going on that set it apart enough that it's not 'obviously just' any particular thing&amp;quot;, at least, not that I know of.&lt;/p&gt;
&lt;p&gt;So, I'm happy with that, and now I want to make sure I have plenty of time to wind down, so I'm going to publish this.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-04-28</title><link href="https://mwchase.neocities.org/diary-2022-04-28" rel="alternate"></link><published>2022-04-28T04:00:00-04:00</published><updated>2022-04-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-04-28:/diary-2022-04-28</id><summary type="html">&lt;p class="first last"&gt;Time management slipping a little. Oh well.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;No writing done today.
I got python/jvm interop working just well enough to convince myself that I should be trying literally anything else when it comes to working on tooling in the short term.&lt;/p&gt;
&lt;p&gt;I've got a limited amount of time, so I think I'll spend it doing outline/background work for some of my story ideas.&lt;/p&gt;
&lt;p&gt;Okay, I've done that.
More to do, but it definitely clarified some choices that I needed clarified.&lt;/p&gt;
&lt;p&gt;I don't want to procrastinate too much on getting to bed, so I'm going to wrap this up as quickly as I can.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-04-27</title><link href="https://mwchase.neocities.org/diary-2022-04-27" rel="alternate"></link><published>2022-04-27T04:00:00-04:00</published><updated>2022-04-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-04-27:/diary-2022-04-27</id><summary type="html">&lt;p class="first last"&gt;This post brought to you in part by reading a bunch of documentation &lt;em&gt;that really could have been clearer&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hahaha, I thought I was done with the work stuff.
Oh well, at least I don't have to look for stuff to do while I'm slogging through this.&lt;/p&gt;
&lt;p&gt;Anyway, I didn't do much today, I don't think, so, status update on stuff I was talking about last time...
Entering this data into a spreadsheet was annoying, because the spreadsheet&lt;/p&gt;
&lt;p&gt;Insisted on treating the cell contents&lt;/p&gt;
&lt;p&gt;As sentences&lt;/p&gt;
&lt;p&gt;Sure.&lt;/p&gt;
&lt;p&gt;And I lost like ten, twenty minutes to write this post because I managed to freeze my laptop opening the relevant options dialog in LibreOffice too many times because it didn't open at first.
And then I had to remember how to restore the file, because neovim doesn't seem to handle it well.
I swear tech usually treats me better.&lt;/p&gt;
&lt;p&gt;Anyway, my experience there inspired me to plan out ways to handle this stuff in code.
I've got some preliminary notes that could be used to handle sound changes myself, but I'd rather come up with some kind of interface around Lexurgy.
I think I'd like to use it as a library, but failing that, I can either generate data for it, or hardcode a lot of the interactions and parse stuff out of the output.&lt;/p&gt;
&lt;p&gt;So, maybe that'll be what I look into at some point: do Python 3/JVM interop options work for this?&lt;/p&gt;
&lt;p&gt;Anyway, it's late and I've got a busy morning tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2022-04-26</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-04-26" rel="alternate"></link><published>2022-04-26T04:00:00-04:00</published><updated>2022-04-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-04-26:/weekly-roundup-2022-04-26</id><summary type="html">&lt;p class="first last"&gt;Stuff is being accomplished that I'm not sure how to summarize.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I futzed around with various writing-related things.&lt;/li&gt;
&lt;li&gt;Thursday: I complained about how work was going.&lt;/li&gt;
&lt;li&gt;Friday: I started planning how to &amp;quot;worse-is-better&amp;quot; my tools for working on conlangs.&lt;/li&gt;
&lt;li&gt;Saturday: I messed around with MOTR, and decided to put in what seemed like the least effort required to get the test to pass while still doing &lt;em&gt;something&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Sunday: That did not feel like the least effort.&lt;/li&gt;
&lt;li&gt;Monday: I wrote up every coverage miss in MOTR's testing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I want to make more progress in either editing, story planning, or conlanging.
In the near term, I need to take a break from MOTR, because those last few days were a lot.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-04-25</title><link href="https://mwchase.neocities.org/coding-2022-04-25" rel="alternate"></link><published>2022-04-25T04:00:00-04:00</published><updated>2022-04-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-04-25:/coding-2022-04-25</id><summary type="html">&lt;p class="first last"&gt;A full accounting of all of the code that is potentially broken.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;No thread again.
I focused on writing up all of the cases missing for coverage, and my notes ended up something like:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Misc:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Missing branch in plugin code&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;pytest.testdir_builder&lt;/tt&gt; (just write a test)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;package.combine_packages&lt;/tt&gt; (empty, and multiple)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;pip.package&lt;/tt&gt; (leading dash)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;pip.python_version_string&lt;/tt&gt; (absolute path, multi-part path, valid input)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;dynamic.inject&lt;/tt&gt; normal and error case&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;dynamic.reduce&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Validators:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;input_accumulator.accumulator&lt;/tt&gt; decorator&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;installer.PathWith&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;not_output&lt;/tt&gt; cases for:&lt;ul&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Output&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;CmdMeta&lt;/tt&gt; with env&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;CmdMeta&lt;/tt&gt; with extra io&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Command&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;dynamic.DynamicMeta&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Methods:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;python_helpers.PythonCmd.add_sub_cmds&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;arguments.Option.with_option&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;arguments.Command.with_module&lt;/tt&gt; success case&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;arguments.Command.with_module&lt;/tt&gt; failure case&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;validators.RejectBecause.__repr__&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;(Corresponding &lt;tt class="docutils literal"&gt;__call__&lt;/tt&gt; should be handled by other cases for now)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;invocation.Argument.build&lt;/tt&gt; (with and without prefix)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;invocation.EnvVar.build&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;invocation.Invocation.invoke&lt;/tt&gt; (module non-&lt;tt class="docutils literal"&gt;None&lt;/tt&gt;, and another with adaptor conflicts)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;flex.ExtraParent.map&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;flex.Argparent.map&lt;/tt&gt; (&lt;tt class="docutils literal"&gt;prefix&lt;/tt&gt; is &lt;tt class="docutils literal"&gt;None&lt;/tt&gt;)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;flex.FlexIn.convert&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;flex.FlexIn.metadata&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;flex.FlexIn.forbid_narrowing&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;flex.FlexOut.convert&lt;/tt&gt; (&lt;tt class="docutils literal"&gt;make_parent&lt;/tt&gt; is &lt;tt class="docutils literal"&gt;None&lt;/tt&gt;)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;flex.FlexOut.metadata&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;flex.FlexOut.forbid_narrowing&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;pip.VirtualenvArgs.setup_environment&lt;/tt&gt; (with python version string)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;pip.PipArgs.arguments&lt;/tt&gt; (with &lt;tt class="docutils literal"&gt;Constraint&lt;/tt&gt;, with &lt;tt class="docutils literal"&gt;Requirement&lt;/tt&gt;)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;command.CmdMeta.resolve_*&lt;/tt&gt; with &lt;tt class="docutils literal"&gt;Module&lt;/tt&gt; arguments and sometimes &lt;tt class="docutils literal"&gt;str&lt;/tt&gt; arguments&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;command.base_cmd&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;build.Build.__call__&lt;/tt&gt; in various configurations&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;dynamic.DynamicMeta.not_accumulable_because&lt;/tt&gt; (used as validator elsewhere)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;dynamic.DynamicMeta.not_flex_out_because&lt;/tt&gt; (used as validator elsewhere)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;dynamic.DynamicMeta.with_flex&lt;/tt&gt; error case&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;dynamic.DynamicMeta.narrow_labels&lt;/tt&gt; normal and error case&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;dynamic.DynamicMeta.combine&lt;/tt&gt; same and different value&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;dynamic.DynamicMeta.iter_labels&lt;/tt&gt; normal and error case&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Decorators:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;python_helpers.requirement_invocation&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;For now, some of this overlaps, but in any case, getting the 8% or so (116 statements) coverage this all represents is clearly going to be A Thing, and I'm going to have to take &lt;em&gt;more&lt;/em&gt; notes to figure out what the tests for these are going to look like, and therefore what kind of tests I should be writing.&lt;/p&gt;
&lt;p&gt;Ugh, I just compared the flake8 tests to the current motrfile.
I really hope the approach I'm pursuing currently pays serious dividends when it comes to invoking pytest, because on the flake8 side of things, it's breaking even at best.
Like, what if the biggest saving here just comes from no longer defining package and builder concepts in the motrfile?
To be clear, that would still be a major win, but I really want to see something more dramatic out of this effort.&lt;/p&gt;
&lt;p&gt;Anyway, it won't do to stress out over this.
I need to relax and take a break from staring at my screen.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-04-24</title><link href="https://mwchase.neocities.org/coding-2022-04-24" rel="alternate"></link><published>2022-04-24T04:00:00-04:00</published><updated>2022-04-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-04-24:/coding-2022-04-24</id><summary type="html">&lt;p class="first last"&gt;So much pain from mixing up &amp;quot;covariant&amp;quot; and &amp;quot;contravariant&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;No thread today.
I ended up banging my head against mypy errors pretty much all day.
On the plus side, I got the tests to pass, though there was a certain level of weakening involved.&lt;/p&gt;
&lt;p&gt;Anyway, I'm a little worn out from all of that, so I don't know if I'll get back into things tomorrow, but here's what needs to happen next:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Finish up flake8 module coverage.&lt;/li&gt;
&lt;li&gt;Catalog remaining coverage misses.&lt;/li&gt;
&lt;li&gt;Figure out what I need to address those misses.&lt;/li&gt;
&lt;li&gt;Prioritize additional tests.&lt;/li&gt;
&lt;li&gt;Write additional tests.&lt;/li&gt;
&lt;li&gt;Once I hit 100% coverage, start cleaning up test code (switch a bunch of parameterization stuff to fixtures, mainly, and look into preparing the layout for limit-coverage).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm feeling a little loopy right now, so I think I'm done for today.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-04-23</title><link href="https://mwchase.neocities.org/coding-2022-04-23" rel="alternate"></link><published>2022-04-23T04:00:00-04:00</published><updated>2022-04-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-04-23:/coding-2022-04-23</id><summary type="html">&lt;p class="first last"&gt;Best to get this off the ground quickly, but not immediately.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I put together &lt;a class="reference external" href="https://im-in.space/&amp;#64;mwchase/108179024355256729"&gt;a quick mastodon thread&lt;/a&gt;, but the work isn't done.&lt;/p&gt;
&lt;p&gt;I spent a little time thinking about how to do things really elegantly and magically, before deciding that that's not worth it now.
So, the plan is to implement as little as possible, and then revisit my decisions once I've got more complex logic that I want to support.&lt;/p&gt;
&lt;p&gt;For now, I'm going to get to bed and try to wake up a bit more refreshed than I have been lately.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2022-04-22</title><link href="https://mwchase.neocities.org/diary-2022-04-22" rel="alternate"></link><published>2022-04-22T04:00:00-04:00</published><updated>2022-04-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-04-22:/diary-2022-04-22</id><summary type="html">&lt;p class="first last"&gt;Thinking about conlanging and preparing to commit workflow crimes.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Close-ish to do done with that work stuff.
Anyway.&lt;/p&gt;
&lt;p&gt;Right now, my focus is kind of ping-ponging back to conlanging, and my feeling on that is, okay, sure, do what feels good.&lt;/p&gt;
&lt;p&gt;Right now, I'm reviewing the kind of stuff I put together for one of my attempts at conlanging, and trying to figure out what kind of tooling I want.
Here's how I'm looking at that:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;For the early work on a language, I don't know what works for me, and I need something that obviously-sort-of-works, so I can temporarily avoid thinking about tooling in order to have content.&lt;/li&gt;
&lt;li&gt;As I get more done, I want to use that as a guideline for refining tooling, but make sure that whatever tooling I come up with is appropriate for the earlier stages of completion.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My basic hunch is that I should be able to get by in the early stages with a mixture of text files and spreadsheets.
The reference grammars I want to put together will look like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;Introduction:
Plain text.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Phonology:
Some tables, some text explanations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Morphology:
Some tables, some text explanations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Derivational morphology:
Some tables, some text explanations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Syntax:
Text, not sure if tables will come up; I'll need to investigate that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Semantic fields and pragmatics:
Text, with maybe some minor tables&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Writing system:
Text, with maybe some minor tables&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Examples:
Maybe some text, focused on tables, and requiring facilities for:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Converting text from a simple-to-type romanization to a more expressive one&lt;/li&gt;
&lt;li&gt;Converting text from a simple-to-type romanization to the native writing system&lt;/li&gt;
&lt;li&gt;Converting text from a simple-to-type romanization to a phonetic representation&lt;/li&gt;
&lt;li&gt;Validating that a gloss is associated with a given root&lt;/li&gt;
&lt;li&gt;Validating that a root is realized correctly?&lt;/li&gt;
&lt;li&gt;Linking a root to the lexicon&lt;/li&gt;
&lt;li&gt;Linking a morphological component to the proper section&lt;/li&gt;
&lt;li&gt;If I wanted to make things very &amp;quot;straightforward&amp;quot; for me, I could try to set this up as &amp;quot;provide the intended root along with the intended gloss notation, and derive the other sections&amp;quot;&lt;/li&gt;
&lt;li&gt;Have a free translation below all of that.&lt;ul&gt;
&lt;li&gt;Could there be facilities for selecting different writing systems?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Lexicon:
Tables, possibly using some of the above facilities.
They should include:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;root&lt;/li&gt;
&lt;li&gt;part of speech&lt;/li&gt;
&lt;li&gt;glosses&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In addition, my ideal wishlist is to track multiple stages of development and somehow maintain derivational links between roots at different points in the history of the language.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm... not sure how much of that can be properly done in Sphinx, like I'm hoping for as an endpoint.
Like, at some point, do the requirements basically force me to be writing a Python file that essentially generates ReST nodes which somehow get awkwardly crowbared in.
I think I wouldn't like that.&lt;/p&gt;
&lt;p&gt;In any case, I'm going to start off with, plain text, plus either a spreadsheet, Python code, Lua code, or maybe try to make the tables in SQLite?
I have to admit I feel some sort of weird interest in the idea of throwing away all formatting concerns and just typing stuff in DB Browser, buuuut some of these tables are going to need merged cells, so I can't use &lt;em&gt;just&lt;/em&gt; SQLite.
(Although, to be fair, the merged cells are for stuff that wouldn't really fit in a relational database &lt;em&gt;anyway&lt;/em&gt;, so...)&lt;/p&gt;
&lt;p&gt;Anyway, it's late, as usual, so I should wrap up and get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-04-21</title><link href="https://mwchase.neocities.org/diary-2022-04-21" rel="alternate"></link><published>2022-04-21T04:00:00-04:00</published><updated>2022-04-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-04-21:/diary-2022-04-21</id><summary type="html">&lt;p class="first last"&gt;Not going to get beaten down, at least not all the way.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Uuuuuuuuuuugh.
Work has given me some tasks that I am entirely capable of grinding through, but they're &lt;em&gt;awful&lt;/em&gt;.
Making progress, but I have to take breaks to rant incoherently.&lt;/p&gt;
&lt;p&gt;I'm going to put some information into my personal project management stuff, and publish this post, and see what else I'm up for.&lt;/p&gt;
&lt;p&gt;Okay, that was quick, let's see if I can do a &lt;em&gt;little&lt;/em&gt; more...&lt;/p&gt;
&lt;p&gt;All right, I did a bit more, and I'm glad I did it, and I am &lt;em&gt;done&lt;/em&gt; now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-04-20</title><link href="https://mwchase.neocities.org/diary-2022-04-20" rel="alternate"></link><published>2022-04-20T04:00:00-04:00</published><updated>2022-04-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-04-20:/diary-2022-04-20</id><summary type="html">&lt;p class="first last"&gt;The editing will continue until morale improves.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Oh boy.
Even the slightest bit of editing is hard work.
I am exhausted just from taking notes on stuff that I'm going to want to change.&lt;/p&gt;
&lt;p&gt;I don't have anything else to note about that work, so, um, other stuff...&lt;/p&gt;
&lt;p&gt;I recently started noting down ideas based around some idle thoughts I had about potential science fiction settings.
I'm going to try to develop them, because I feel like I care about the ideas enough for them to work as a core for my writing experiments.
They're all kind of about putting different twists on established science fiction concepts, and being overall different degrees of serious.&lt;/p&gt;
&lt;p&gt;Anyway, it's getting late and I should get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2022-04-19</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-04-19" rel="alternate"></link><published>2022-04-19T04:00:00-04:00</published><updated>2022-04-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-04-19:/weekly-roundup-2022-04-19</id><summary type="html">&lt;p class="first last"&gt;A rough week, but I managed to redeem it.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I got some unlocks in Vampire Survivors, and it was really frustrating because I insisted on playing out the level once I'd gotten them.&lt;/li&gt;
&lt;li&gt;Thursday: I was feeling rough, but I went back to one writing project after... a while.&lt;/li&gt;
&lt;li&gt;Friday: I was sick, apparently.&lt;/li&gt;
&lt;li&gt;Saturday: I wasn't up for writing, but I did a little planning.&lt;/li&gt;
&lt;li&gt;Sunday: I shook things up with my format for coding posts. We'll see what I think of it.&lt;/li&gt;
&lt;li&gt;Monday: I kept on with the change in format, and refined things a little.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to start working on editing that writing I've been doing, and, on the weekend, I should have some good work on MOTR teed up.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-04-18</title><link href="https://mwchase.neocities.org/coding-2022-04-18" rel="alternate"></link><published>2022-04-18T04:00:00-04:00</published><updated>2022-04-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-04-18:/coding-2022-04-18</id><summary type="html">&lt;p class="first last"&gt;With each passing day, my process for these posts gets slightly better.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, that's &lt;a class="reference external" href="https://im-in.space/&amp;#64;mwchase/108149482599320040"&gt;another mastodon thread&lt;/a&gt; on this.
And here's the code I added and updated tonight.
With this, I should be ready to switch the protocol usages from the old to the new and vet them out, and to update the existing protocol implementations.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;resolve_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;


&lt;span class="nd"&gt;@attr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataclass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frozen&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;attr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;converter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;resolve_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;bin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_io&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pathlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_io&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;bin&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Combinable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;typing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Protocol&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Protocol for classes whose instances can be combined.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;TCombinable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;__other&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;TCombinable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;TCombinable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Combine two instances of the same type.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EnvironmentArgs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;typing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Protocol&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Protocol for setting up an environment.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;setup_environment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;__root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_requirements&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Requirements&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;InstallerArgs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Combinable&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Protocol for installing software in an environment.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_requirements&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Requirements&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;_io&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pathlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;install&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;env_part&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PathWith&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;EnvironmentArgs&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;installer_part&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PathWith&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;InstallerArgs&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_requirements&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Requirements&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;_io&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pathlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt;
    &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;installer_part&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;env_part&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;
    &lt;span class="n"&gt;environment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;yield from&lt;/span&gt; &lt;span class="n"&gt;env_part&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setup_environment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;yield from&lt;/span&gt; &lt;span class="n"&gt;installer_part&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;


&lt;span class="n"&gt;TCombinable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TypeVar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;TCombinable&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bound&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Combinable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="o"&gt;...&lt;/span&gt;


&lt;span class="nd"&gt;@attr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataclass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frozen&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PathWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;typing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Generic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T_co&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
    &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;attr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;validator&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;_path_is_well_behaved&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;T_co&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PathWith&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;TCombinable&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;__other&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PathWith&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;TCombinable&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;PathWith&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;TCombinable&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Combine two PathWith instances with compatible wrapped values.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;PathWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;__other&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__other&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let's lay this out.&lt;/p&gt;
&lt;p&gt;I wrote a simple wrapper around &lt;tt class="docutils literal"&gt;pathlib.Path.resolve&lt;/tt&gt; because mypy complained when I used the method itself as a converter.&lt;/p&gt;
&lt;p&gt;The convert is used by the &lt;tt class="docutils literal"&gt;Environment&lt;/tt&gt; class I added to represent the environment that commands are run from.
It has a fairly obvious method there, to create &lt;tt class="docutils literal"&gt;Input[Path]&lt;/tt&gt; objects from a command name.&lt;/p&gt;
&lt;p&gt;Next up, the protocols.
These &lt;em&gt;could&lt;/em&gt; end up needing to change when I actually implement them, but they're... probably fine.
I might end up coming up with a sensible &lt;tt class="docutils literal"&gt;combine()&lt;/tt&gt; implementation for &lt;tt class="docutils literal"&gt;EnvironmentArgs&lt;/tt&gt; instances, or at least some of them, but I'm just not going to bother for now.&lt;/p&gt;
&lt;p&gt;The idea of these bits is to factor out the unique logic of the different protocol implementations, and stick them together with the general flow of &amp;quot;set up environment, then install stuff in environment&amp;quot;.
There is one insight that I didn't have the perspective to realize before today:&lt;/p&gt;
&lt;p&gt;Just because two parts of the implementation are coupled at the moment, that does not mean that specifying &amp;quot;what one part requires&amp;quot; and &amp;quot;what one part provides&amp;quot; &lt;em&gt;separately&lt;/em&gt; is a duplication.
I'm currently expecting both implementations to specify pip &lt;em&gt;independently&lt;/em&gt;.
This way, if hypothetical implementations that work off of some other installer are created, then putting together mismatched implementations will fail &lt;em&gt;at configuration time&lt;/em&gt;, so the user will get immediate feedback rather than cryptic file-not-found errors.&lt;/p&gt;
&lt;p&gt;Lastly, if the wrapped value in a &lt;tt class="docutils literal"&gt;PathWith&lt;/tt&gt; implements &lt;tt class="docutils literal"&gt;Combinable&lt;/tt&gt;, then so does the &lt;tt class="docutils literal"&gt;PathWith&lt;/tt&gt;.
This will be important later.&lt;/p&gt;
&lt;p&gt;All right then.
I'm excited to see where this leads me, but right now I'm mostly tired.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-04-17</title><link href="https://mwchase.neocities.org/coding-2022-04-17" rel="alternate"></link><published>2022-04-17T04:00:00-04:00</published><updated>2022-04-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-04-17:/coding-2022-04-17</id><summary type="html">&lt;p class="first last"&gt;Writing these posts continues to be a great way to improve the code after I thought I was done.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I'm trying something a bit different, where I had a &lt;a class="reference external" href="https://im-in.space/&amp;#64;mwchase/108144781696953803"&gt;short mastodon thread&lt;/a&gt; that I was writing as I worked on the code, and I'll start off this post with the end result, and talk about it some.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@_validators&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RejectBecause&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_path_is_well_behaved&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Iterator&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_absolute&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;The following path is absolute: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;part&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pardir&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;part&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;The following path includes parent or current directory parts:&amp;quot;&lt;/span&gt;
            &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="nd"&gt;@attr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataclass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frozen&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PathWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;typing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Generic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T_co&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
    &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;attr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;validator&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;_path_is_well_behaved&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;T_co&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;So, first observation: this isn't much code.
This might be from getting used to the different process, but there's also the fact that today was just kind of tiring, even if I did get some good relaxation in.
I'm going to keep this up for now, and hope for better results next weekend.
If that doesn't work out, I'll reconsider things.&lt;/p&gt;
&lt;p&gt;So, that out of the way, the next question to ask is, what &lt;em&gt;is&lt;/em&gt; most of this?&lt;/p&gt;
&lt;p&gt;From the top:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;_validators&lt;/tt&gt; module is a local helper file I wrote to streamline writing validators for &lt;a class="reference external" href="https://www.attrs.org"&gt;attrs&lt;/a&gt;.
The &lt;tt class="docutils literal"&gt;RejectBecause&lt;/tt&gt; class is a decorator that wraps a function that checks a value for reasons &lt;em&gt;not&lt;/em&gt; to use it in the validated field.
I'm still feeling things out with naming conventions around it.
In another module, I've got it used in the &lt;tt class="docutils literal"&gt;attr.field()&lt;/tt&gt; argument instead of as a decorator, so the functions are named by what they return.
Here, it's being used as a decorator, so I named the function after the overall logic of the validator.&lt;/li&gt;
&lt;li&gt;The &lt;em&gt;particular&lt;/em&gt; function here, &lt;tt class="docutils literal"&gt;_path_is_well_behaved&lt;/tt&gt;, performs a few checks regarding the paths being associated with values.
The first check is that the path is relative; in fact, it might be relative to an &lt;em&gt;unknown starting point&lt;/em&gt;, which is why I didn't use &lt;tt class="docutils literal"&gt;Path.resolve()&lt;/tt&gt; anywhere in this.
The second check makes sure there are no parts of the path that are parent separators.
This is not robust in the face of symlinks, and frankly, I don't care.&lt;/li&gt;
&lt;li&gt;Lastly, &lt;tt class="docutils literal"&gt;PathWith[T_co]&lt;/tt&gt; is going to be one of the building blocks of my replacement system for building up environment information.
This is a little involved, so let's break out of the bullets.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Currently, the &lt;tt class="docutils literal"&gt;Installer&lt;/tt&gt; protocol only has one implementation, which uses virtualenv and pip together.
This class bundles together &amp;quot;what arguments get passed to pip&amp;quot; and &amp;quot;what arguments get passed to virtualenv&amp;quot;, which turns out to be the wrong thing to do, at least for how I'm using the &lt;tt class="docutils literal"&gt;Installer&lt;/tt&gt; protocol.
The problem is, nothing in this system allows for &lt;em&gt;multiple&lt;/em&gt; Python versions to be selected, which is a pretty major feature.
My goal is to pull things out into a protocol for setting up the environment, and a protocol for installing stuff in the environment.
(I've thought so much about trying to make this idea generic in the type of installer, but I've just confused myself, so I need a simplified prototype I can tweak.)
These protocols would not be concerned with the question of &amp;quot;where is this done on the file system&amp;quot;?
Instead, instance of each would be put in a &lt;tt class="docutils literal"&gt;PathWith[T_co]&lt;/tt&gt;, and helper functions would be written to process that concrete code, independent of how any of the protocol implementations would work; they would simply receive the calculated environment path.&lt;/p&gt;
&lt;p&gt;So, when I pick this back up, I can write those protocols, then the helper functions to consume them, then implement the protocols, then sub the new protocols in, and chase type errors until mypy thinks it should all work.
If I find myself messing with typed mappings, I will take that excuse to start using that helper class in earnest.&lt;/p&gt;
&lt;p&gt;For now, though, I just want to publish this entry and cap off the thread.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2022-04-16</title><link href="https://mwchase.neocities.org/diary-2022-04-16" rel="alternate"></link><published>2022-04-16T04:00:00-04:00</published><updated>2022-04-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-04-16:/diary-2022-04-16</id><summary type="html">&lt;p class="first last"&gt;Being a bundle of nerves doesn't help me do &lt;em&gt;anything&lt;/em&gt;, &lt;em&gt;body&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I wasn't obviously sick today, but I do seem to have ended up keyed up, and not really up for doing much.&lt;/p&gt;
&lt;p&gt;I can't really predict how much I'll be up for this weekend, and I'm not going to hold myself to anything, besides that I want to make some progress in Satisfactory, and progress in Vampire Survivors is fine too.&lt;/p&gt;
&lt;p&gt;I'll try to work on MOTR over the next few days, but I've been thinking of shaking up the format of my code posts a little.
Basically, I'd be live-blogging my process on my Mastodon (linked somewhere in the footer), and posting summaries to the blog when I'm done for the night.
Maybe I'll try that the next time I'm up for coding.&lt;/p&gt;
&lt;p&gt;In any case, for now, I just need to take things easy and wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-04-15</title><link href="https://mwchase.neocities.org/diary-2022-04-15" rel="alternate"></link><published>2022-04-15T04:00:00-04:00</published><updated>2022-04-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-04-15:/diary-2022-04-15</id><summary type="html">&lt;p class="first last"&gt;Uuuuuugh...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Oh hey, looks like I got some kind of sickness today.
I really want to do stuff, but I'm not sure how much stuff I'm actually capable of doing.&lt;/p&gt;
&lt;p&gt;I think it makes the most sense for me to just do a short entry and see what I'm up for after it publishes.
It feels like if I did anything else, there's a high probability that I'd just sit around trying to think about what to do, and end up publishing &amp;quot;Uh, nothing, I guess&amp;quot;.&lt;/p&gt;
&lt;p&gt;I don't know when the situation will change.
I'll see what I'm up for in the coming days, but right now my expectations are calibrated at &amp;quot;maybe I'll be up for doing more, like, next week&amp;quot;.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-04-14</title><link href="https://mwchase.neocities.org/diary-2022-04-14" rel="alternate"></link><published>2022-04-14T04:00:00-04:00</published><updated>2022-04-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-04-14:/diary-2022-04-14</id><summary type="html">&lt;p class="first last"&gt;Some things take time.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Switching from the treadmill to walking outside has been... a little rough on me.
One possible factor for why I've been kind of out of things in the past few days.&lt;/p&gt;
&lt;p&gt;I'm making some serious progress on the writing I think I mentioned earlier.
At this rate, I should soon be ready to verify that the rough draft is complete, then start marking it up so I know which bits still need work.&lt;/p&gt;
&lt;p&gt;I'm not going to go into too much detail about this project.
I'll just note that it just goes to show that, sometimes you just need a break from something, and you can come back to it refreshed.
Now, ideally, I wouldn't have taken &lt;em&gt;over six years&lt;/em&gt; on this project so far, but, um, oh well.&lt;/p&gt;
&lt;p&gt;Just got to take things one day at a time.
And this day is nearly over.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-04-13</title><link href="https://mwchase.neocities.org/diary-2022-04-13" rel="alternate"></link><published>2022-04-13T04:00:00-04:00</published><updated>2022-04-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-04-13:/diary-2022-04-13</id><summary type="html">&lt;p class="first last"&gt;I'm pretty sure they couldn't even &lt;em&gt;hurt&lt;/em&gt; me, they were just &lt;em&gt;really annoying&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Oh boy.
I feel like the new Vampire Survivors update &lt;em&gt;hurt&lt;/em&gt; me.
I'll look into finishing up the achievements later.&lt;/p&gt;
&lt;p&gt;Anyway, I've got a bit of writing that I'd like to make some progress on, so I'm going to try to work on that for the next ten minutes or so.&lt;/p&gt;
&lt;p&gt;All right, I made some good progress there, and I'd like to keep it up for a bit.
I'm calling this entry now, because I don't really know what to say besides &amp;quot;Wow, I hated some of those one-off enemies in Vampire Survivors&amp;quot;.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2022-04-12</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-04-12" rel="alternate"></link><published>2022-04-12T04:00:00-04:00</published><updated>2022-04-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-04-12:/weekly-roundup-2022-04-12</id><summary type="html">&lt;p class="first last"&gt;Feels like I'm on the fifth or so 80% of this project...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I took things somewhat easy, apparently. I don't really remember.&lt;/li&gt;
&lt;li&gt;Thursday: I did some writing. *shrug*&lt;/li&gt;
&lt;li&gt;Friday: I beat a game and did some more writing.&lt;/li&gt;
&lt;li&gt;Saturday: I souped up MOTR's typing plugin.&lt;/li&gt;
&lt;li&gt;Sunday: I ran into a problem testing MOTR that is really just a problem with generally &lt;em&gt;using&lt;/em&gt; the new code, so I've got to rethink stuff.&lt;/li&gt;
&lt;li&gt;Monday: I continued to rethink stuff.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try and work on some writing, and take notes on the MOTR redesign.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-04-11</title><link href="https://mwchase.neocities.org/coding-2022-04-11" rel="alternate"></link><published>2022-04-11T04:00:00-04:00</published><updated>2022-04-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-04-11:/coding-2022-04-11</id><summary type="html">&lt;p class="first last"&gt;Re-litigating the same bit of logic over and over...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;After considering my options from last night, I want to break apart the &lt;tt class="docutils literal"&gt;Installer&lt;/tt&gt; protocol.
I was trying to do this all in my head for some reason, and the problem I was running into there was, I wasn't sure what to call the protocols and instances that would get spun out from that.
So, let's try and think things through a bit.&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;python version&lt;/em&gt; is consumed by &lt;tt class="docutils literal"&gt;virtualenv&lt;/tt&gt;.
The &lt;em&gt;packages&lt;/em&gt; are consumed by &lt;tt class="docutils literal"&gt;pip&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;The path to &lt;tt class="docutils literal"&gt;pip&lt;/tt&gt; doesn't exist until &lt;tt class="docutils literal"&gt;virtualenv&lt;/tt&gt; runs.&lt;/p&gt;
&lt;p&gt;In the event that I support other kinds of environment/installers, it's possible that there could be a scenario like &amp;quot;here is a &lt;tt class="docutils literal"&gt;conda&lt;/tt&gt; env that needs both &lt;tt class="docutils literal"&gt;conda&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;pip&lt;/tt&gt; run against it, or something&amp;quot;.
All the same, the means of locking in the packages is predicated on &lt;em&gt;having an executable&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;So, the constant information is which packages are installed and which scripts we expect to get as a result.&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;environments&lt;/em&gt; can be thought of as providing scripts to the &lt;em&gt;installer args&lt;/em&gt;.
So, I think, to implement that, the &lt;tt class="docutils literal"&gt;Environment&lt;/tt&gt; protocol needs to provide some kind of callback-ish method that takes an &lt;tt class="docutils literal"&gt;InstallerArgs&lt;/tt&gt; class and returns the corresponding path to the executable, modulo that it would actually return a &lt;tt class="docutils literal"&gt;Requirements[Input[Path]]&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;I'm going to try writing that down for later, because I want to wrap things up early-ish.&lt;/p&gt;
&lt;p&gt;Hm, writing things down, I think those initial ideas about the interface aren't quite right.
I'll have to take some time to refine them.&lt;/p&gt;
&lt;p&gt;Well, I'm not ready to go yet, but I'm confident things will go more easily once I get past this.
We'll see if that confidence is warranted.
Anyway, I'm done for tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-04-10</title><link href="https://mwchase.neocities.org/coding-2022-04-10" rel="alternate"></link><published>2022-04-10T04:00:00-04:00</published><updated>2022-04-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-04-10:/coding-2022-04-10</id><summary type="html">&lt;p class="first last"&gt;Unexpected complications.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I suppose if I'd been &lt;em&gt;expecting&lt;/em&gt; this issue, I would have &lt;em&gt;accounted for it&lt;/em&gt;.
Unless I've forgotten something, the current code is missing the ability to pass multiple—or indeed, any—Python versions into the &lt;tt class="docutils literal"&gt;Pip&lt;/tt&gt; installer object, so it's not capable of actually generating the requirements.&lt;/p&gt;
&lt;p&gt;Right now, I have two basic ideas for how to deal with this.
One is to hack additional &lt;tt class="docutils literal"&gt;Pip&lt;/tt&gt; objects into the code flow, so one object contains the requirements, and the other contains the version information.
The other is to separate out the relevant field on the &lt;tt class="docutils literal"&gt;Pip&lt;/tt&gt; class into a separate class, and make that class be an argument to &lt;tt class="docutils literal"&gt;Pip.resolve()&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;The former object is worth it if I want a bunch of flexibility.
The latter option is worth it if I think I don't &lt;em&gt;need&lt;/em&gt; all that flexibility.
I don't want to choose just yet, hopefully tomorrow, so for now I'm going to try to develop the pros and cons a bit more.&lt;/p&gt;
&lt;p&gt;The first question is, how strongly would I be committing with either choice?
My feeling is the latter option puts the code into a simpler shape.&lt;/p&gt;
&lt;p&gt;In the former case, there'd be more flexibility in terms of ways to inject the version information, but I don't see what that flexibility would help with, and it would mean two different ways to inject the information, with different overall capabilities.
That sounds to me like some kind of trap for the unwary.&lt;/p&gt;
&lt;p&gt;So, unless I change my mind, the plan for tomorrow is to rework the code and provide one interface for specifying versions.&lt;/p&gt;
&lt;p&gt;For now, I'd like to wrap up a little earlier than I have been lately.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-04-09</title><link href="https://mwchase.neocities.org/coding-2022-04-09" rel="alternate"></link><published>2022-04-09T04:00:00-04:00</published><updated>2022-04-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-04-09:/coding-2022-04-09</id><summary type="html">&lt;p class="first last"&gt;Coding isn't about &amp;quot;Why?&amp;quot;, it's about &amp;quot;Why not?&amp;quot;!&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, so, I've been tweaking MOTR's typing plugin a bit, and I think I know &lt;em&gt;generally&lt;/em&gt; how to make some improvements, but not yet how to handle the exact details.
I'll work on the other tests tomorrow, hopefully.&lt;/p&gt;
&lt;p&gt;For now, let's get some plans together for the plugin.&lt;/p&gt;
&lt;p&gt;First off, here's what I'm trying to solve:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;get()&lt;/tt&gt; method defines two overloads.
One with no default, and one with a default.&lt;/li&gt;
&lt;li&gt;The existing plugin code, which focuses on rewriting the &lt;em&gt;signature&lt;/em&gt;, can handle the first case, but not the second.&lt;/li&gt;
&lt;li&gt;This manifests as a &lt;tt class="docutils literal"&gt;Union[V, T]&lt;/tt&gt; getting treated everywhere as &lt;tt class="docutils literal"&gt;V&lt;/tt&gt;, which is unhelpfully restrictive.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Various ways of reworking the existing signature rewrite code have done nothing to change this, but at least they didn't break the other cases.&lt;/p&gt;
&lt;p&gt;I've come to the conclusion that I need to make the following changes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;At signature rewrite time, convert the default and return types to &lt;tt class="docutils literal"&gt;Any&lt;/tt&gt;.
I could just change the code, but I think leaving the code as-is will be easier to understand.
At minimum, the default type needs to be changed.&lt;/li&gt;
&lt;li&gt;Add a method rewrite hook that, when the default argument is present, constructs a union type manually to be the return type.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let's see what happens when I try...&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;All right, I've generated an &lt;tt class="docutils literal"&gt;Any&lt;/tt&gt;, now let's see about the return value.&lt;/p&gt;
&lt;p&gt;I found a function called &lt;tt class="docutils literal"&gt;make_simplified_union&lt;/tt&gt; that seems to do exactly what I want, so it looks like I'm in business.
Some of mypy's internals kind of confuse me, so I'm probably doing something wrong, but I've gotten the tests to pass.&lt;/p&gt;
&lt;p&gt;Speaking of tests, I really should get to work on the flake8 wrapper tests tomorrow.
For now though, I've spaced out enough while finishing this.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2022-04-08</title><link href="https://mwchase.neocities.org/diary-2022-04-08" rel="alternate"></link><published>2022-04-08T04:00:00-04:00</published><updated>2022-04-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-04-08:/diary-2022-04-08</id><summary type="html">&lt;p class="first last"&gt;Games, and some not-game stuff.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Brain is not fried.
I managed to work on stuff at a good pace, but it's mostly not stuff I blog about.&lt;/p&gt;
&lt;p&gt;In fact, mostly it was Patrick's Parabox and Vampire Survivors.&lt;/p&gt;
&lt;p&gt;Right now, I've beaten Patrick's Parabox and gotten all of the current achievements and unlocks in Vampire Survivors.
I was checking out some custom levels in Patrick's Parabox, and I don't know what to make of them.
One of them, I managed to beat it while avoiding engaging with like half the level, including the gimmick that inspired it.
The other, I'm going to tentatively believe the author's claim that it &lt;em&gt;is&lt;/em&gt; beatable.
I'm also going to consider changing the color palette to something that lets me &lt;em&gt;actually see the level&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I pondering stuff I could do for custom levels, and I have some ideas that I'm going to jot down.
Now that I've written stuff down, I'm not totally sure where to go next.
I'm going to need to think about it some more.&lt;/p&gt;
&lt;p&gt;Also, I did a bit more writing experiment stuff.
This definitely works, but it's really hard to maintain my focus.
I'm thinking about other directions I could approach things from.&lt;/p&gt;
&lt;p&gt;Anyway, it's late, and I don't want to delay anything too much longer.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-04-07</title><link href="https://mwchase.neocities.org/diary-2022-04-07" rel="alternate"></link><published>2022-04-07T04:00:00-04:00</published><updated>2022-04-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-04-07:/diary-2022-04-07</id><summary type="html">&lt;p class="first last"&gt;*Extreme thinking*&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I managed to fry my brain a little today, entirely my fault, so I once again don't really have much to talk about.&lt;/p&gt;
&lt;p&gt;Just now did a bit more writing.
I feel like maybe what I'm experimenting with needs a bit more of a hook, or I need to work better to communicate the hook to... myself?&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to publish early and doodle some stuff for coding in BQN.
Hopefully, I'll be all set to get to bed whenever.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-04-06</title><link href="https://mwchase.neocities.org/diary-2022-04-06" rel="alternate"></link><published>2022-04-06T04:00:00-04:00</published><updated>2022-04-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-04-06:/diary-2022-04-06</id><summary type="html">&lt;p class="first last"&gt;I thought about stuff a bunch, I guess.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I don't remember what I did today that's worth writing about.
I... played Vampire Survivors?
I've got one achievement left before I'm caught back up, and it's kind of a doozy so far.
I'll probably go for it again tomorrow.&lt;/p&gt;
&lt;p&gt;Anyway, other stuff...
I was messing with other games...
I didn't get writing done.
I should maybe try to get back into scheduling my days a little more thoroughly.&lt;/p&gt;
&lt;p&gt;Anyway, nothing happening for the rest of the night, so I'm going to wrap up for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2022-04-05</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-04-05" rel="alternate"></link><published>2022-04-05T04:00:00-04:00</published><updated>2022-04-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-04-05:/weekly-roundup-2022-04-05</id><summary type="html">&lt;p class="first last"&gt;A bit stressful at times, but overall this felt like a good week.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I had a rough day that was productive in ways that I didn't find interesting.&lt;/li&gt;
&lt;li&gt;Thursday: Patrick's Parabox.&lt;/li&gt;
&lt;li&gt;Friday: As above, and also notes several levels removed from Missable Mysteries.&lt;/li&gt;
&lt;li&gt;Saturday: As above, and some venting.&lt;/li&gt;
&lt;li&gt;Sunday: Games, and a small amount of work on planning for MOTR.&lt;/li&gt;
&lt;li&gt;Monday: I improved and debugged MOTR's tests.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try and get into writing more, for a bit.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-04-04</title><link href="https://mwchase.neocities.org/coding-2022-04-04" rel="alternate"></link><published>2022-04-04T04:00:00-04:00</published><updated>2022-04-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-04-04:/coding-2022-04-04</id><summary type="html">&lt;p class="first last"&gt;I'm thankful that I got everything figured out.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right!
I've got negative tests written for the typing plugin for MOTR, so I should be ready to integrate the new protocol at any time.&lt;/p&gt;
&lt;p&gt;As such, I'm comfortable putting that to the side until I manage to actually increase the test coverage some.
It's hovering a bit above 80% right now.&lt;/p&gt;
&lt;p&gt;Since I've got the tests written, and also I fixed up some of the other tests so that they're more consistent and, like, more correct, I'm done for today and I'm thinking about how I want to handle things in the week to come.
(I may also want to tweak some of those tests to be a little less awkwardly written, now that they actually test what they're supposed to.)&lt;/p&gt;
&lt;p&gt;I think it would make the most sense to return to some of the writing experiments I was doing yesterday.
If I'm up for it during the week, I can return to taking notes on The Document, but I think I need to detox from that a bit more.
Best to get back into higher volumes of writing, then devote time on the weekends to getting MOTR closer to ready for a release.&lt;/p&gt;
&lt;p&gt;For now, I'm going to wrap things up for tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2022-04-03</title><link href="https://mwchase.neocities.org/diary-2022-04-03" rel="alternate"></link><published>2022-04-03T04:00:00-04:00</published><updated>2022-04-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-04-03:/diary-2022-04-03</id><summary type="html">&lt;p class="first last"&gt;Once again, I ended up taking things easy without really consciously deciding to.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Ended up doing a little writing today, and playing a bunch of games.
It would have been cool if I'd worked on MOTR, but I guess I needed to decompress a bit.&lt;/p&gt;
&lt;p&gt;Now that I've brought it up, let me see if I can figure out what to focus on tomorrow, if I'm up for MOTR.&lt;/p&gt;
&lt;p&gt;Right, the two areas to look into are writing negative type tests, and writing tests around the command-line wrappers.&lt;/p&gt;
&lt;p&gt;I'm going to just write that stuff down so I can refer to it in the morning.&lt;/p&gt;
&lt;p&gt;I don't think I have anything else to say tonight, so I'm going to make sure I get this published as soon as I can.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-04-02</title><link href="https://mwchase.neocities.org/diary-2022-04-02" rel="alternate"></link><published>2022-04-02T04:00:00-04:00</published><updated>2022-04-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-04-02:/diary-2022-04-02</id><summary type="html">&lt;p class="first last"&gt;A good portion of the notes is just confused swearing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I think I should try to take a break from Patrick's Parabox.
I've beaten the main campaign and a few of the bonus puzzles.
The appendices are &lt;em&gt;extremely&lt;/em&gt; confusing.&lt;/p&gt;
&lt;p&gt;Anyway, I've got some more notes on The Document.
This is &lt;em&gt;so bad&lt;/em&gt;, y'all.
This book is edited so ineptly, I wish I could have seen the editing process play out.
Would have been good for a laugh.&lt;/p&gt;
&lt;p&gt;Things The Document is not edited for:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Clarity&lt;/li&gt;
&lt;li&gt;Factual accuracy&lt;/li&gt;
&lt;li&gt;Spelling&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, I think taking these notes is a decent fallback when I don't manage other writing or coding, but The Document is really hard to read.
Mentally and emotionally.&lt;/p&gt;
&lt;p&gt;Here's to getting some work done on MOTR or with BQN tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-04-01</title><link href="https://mwchase.neocities.org/diary-2022-04-01" rel="alternate"></link><published>2022-04-01T04:00:00-04:00</published><updated>2022-04-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-04-01:/diary-2022-04-01</id><summary type="html">&lt;p class="first last"&gt;I'm getting pretty far in this game.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So...
Patrick's Parabox.&lt;/p&gt;
&lt;p&gt;I also took some more notes on The Document for Missable Mysteries.
Most of the notes were venting, owing to the fact that The Document's author embarked on a roller-coaster misunderstanding of chemistry, nuclear physics, electricity, linguistics, and probably some other stuff that I blocked out, in the space of a few pages.
This is dire stuff, and I'm going to have to push through to get to equally dire stuff that will give me lesson ideas.&lt;/p&gt;
&lt;p&gt;(One reason I'm not naming The Document is that I don't want to let the identity of the author distract from the author's misunderstandings.
The other main reason is that the title &lt;em&gt;technically&lt;/em&gt; uses notation that doesn't exist in unicode.)&lt;/p&gt;
&lt;p&gt;Anyway, it's late, so I should publish this and get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-03-31</title><link href="https://mwchase.neocities.org/diary-2022-03-31" rel="alternate"></link><published>2022-03-31T04:00:00-04:00</published><updated>2022-03-31T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-03-31:/diary-2022-03-31</id><summary type="html">&lt;p class="first last"&gt;In-depth work canceled on account of video games.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't get much done today, because, um, Patrick's Parabox.&lt;/p&gt;
&lt;p&gt;As such, I'm just going to publish this entry and do a little note-taking for long-term plans on Missable Mysteries.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-03-30</title><link href="https://mwchase.neocities.org/diary-2022-03-30" rel="alternate"></link><published>2022-03-30T04:00:00-04:00</published><updated>2022-03-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-03-30:/diary-2022-03-30</id><summary type="html">&lt;p class="first last"&gt;Let's see what I'm going to do... later...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, okay, let's see...&lt;/p&gt;
&lt;p&gt;I did a bunch of things that I had to do today, which left, not as much time for things that I want to do.&lt;/p&gt;
&lt;p&gt;Something I did, which was potentially just &amp;quot;sitting wrong&amp;quot;, has given me a headache, so I think I'll just try to take things easy for now and pick things back up tomorrow.&lt;/p&gt;
&lt;p&gt;It should probably be some kind of writing that I do starting tomorrow, but I'm not sure what I want to go for specifically.
I think maybe I need to wait to even consider which to prioritize.&lt;/p&gt;
&lt;p&gt;For now, I'm wiped out.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2022-03-29</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-03-29" rel="alternate"></link><published>2022-03-29T04:00:00-04:00</published><updated>2022-03-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-03-29:/weekly-roundup-2022-03-29</id><summary type="html">&lt;p class="first last"&gt;Going from sensible to... not...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I decided to devote more time to working on MOTR. I took an inventory of the flake8 packages I'm using, and tried to move flags into config for a more reliable experience.&lt;/li&gt;
&lt;li&gt;Thursday: I thought I was ready to write tests, until I realized that there isn't a good interface to access all of this code from outside of MOTR.&lt;/li&gt;
&lt;li&gt;Friday: I took a break from MOTR to mess around with BQN.&lt;/li&gt;
&lt;li&gt;Saturday: I messed a little more with BQN, and took an inventory of some of MOTR's code to see which modules I want to move around.&lt;/li&gt;
&lt;li&gt;Sunday: I reorganized and exposed all of the command-line wrappers for MOTR, including the ones I haven't written yet, which is most of them.&lt;/li&gt;
&lt;li&gt;Monday: I put together type testing as part of an effort to actually use the &amp;quot;registry&amp;quot; code I wrote for the higher-level interface, because that code is the only non-trivial module that my tests don't exercise at all. After writing some tests, I concluded that the plugin code required to make this all work is sufficiently weird that this is a sign that I'm pushing Mypy too far and I should back off, which is a decision that I definitely held to today.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to see about having a good balance between MOTR and not-MOTR, but no promises.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-03-28</title><link href="https://mwchase.neocities.org/coding-2022-03-28" rel="alternate"></link><published>2022-03-28T04:00:00-04:00</published><updated>2022-03-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-03-28:/coding-2022-03-28</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Cons: Not as flexible. Pros: Actually works with my project.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, I looked into setting up pytest to test my Mypy plugin.
I knew of two pytest plugins that are meant for that.
Here is a quick rundown:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/typeddjango/pytest-mypy-plugins"&gt;pytest-mypy-plugins&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;Pros:&lt;ul&gt;
&lt;li&gt;Flexible&lt;/li&gt;
&lt;li&gt;Extensible&lt;/li&gt;
&lt;li&gt;Expressive&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Cons:&lt;ul&gt;
&lt;li&gt;It turns out I don't like embedding Python in YAML&lt;/li&gt;
&lt;li&gt;Many fiddly levers that might result in something bad happening if you have the wrong combination of settings.&lt;/li&gt;
&lt;li&gt;I never figured out how to get it to work under MOTR, and I don't remember if I got it working with virtualenvs without forking it, and I definitely did fork it&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/davidfritzsche/pytest-mypy-testing"&gt;pytest-mypy-testing&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;Pros:&lt;ul&gt;
&lt;li&gt;Runs with minimal configuration, both outside of and under MOTR&lt;/li&gt;
&lt;li&gt;Test sources are just Python&lt;/li&gt;
&lt;li&gt;I checked to see if it handles all of the issues that pytest-mypy-plugins expected me to coordinate myself, and from inspecting the source, it looks like the answer is yes&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Cons:&lt;ul&gt;
&lt;li&gt;Can't handle some of the more advanced cases that pytest-mypy-plugins does.
For what it's worth, I have not needed this yet.&lt;/li&gt;
&lt;li&gt;Lines can get really long, and if you run black on the file, it will probably break the tests, so, that's not ideal.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I just made that last point a little less bad by reading a bit more of the documentation.&lt;/p&gt;
&lt;p&gt;Anyway, all of this testing is revealing that I'm pushing Mypy far enough past what's &amp;quot;supposed to&amp;quot; work, that for now, I should focus on tests based on my target motrfile layout.&lt;/p&gt;
&lt;p&gt;So, I'm going to have to take a bit of a break to clear my head, and then I should absolutely be writing those tests.
Until then...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-03-27</title><link href="https://mwchase.neocities.org/coding-2022-03-27" rel="alternate"></link><published>2022-03-27T04:00:00-04:00</published><updated>2022-03-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-03-27:/coding-2022-03-27</id><summary type="html">&lt;p class="first last"&gt;Sculpting the code into a more pleasing form&lt;/p&gt;
</summary><content type="html">&lt;p&gt;This pace feels a little frustrating, but whatever.
Before I can write tests, I need to expose the modules through the public interface to MOTR, and I want the way I expose them to make sense.&lt;/p&gt;
&lt;p&gt;The idea I currently have in mind is to expose the contents of the &lt;tt class="docutils literal"&gt;motr._api.cli&lt;/tt&gt; package under &lt;tt class="docutils literal"&gt;motr.api.cli&lt;/tt&gt;, but doing that means making sure that all of the contents of &lt;tt class="docutils literal"&gt;motr._api.cli&lt;/tt&gt; make sense to export.
So, let's take a look at that.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;cli.coverage&lt;/tt&gt; contains modules for each coverage subcommand.
I think I want &lt;tt class="docutils literal"&gt;cli.coverage&lt;/tt&gt; to contain helper functions, and this be called something like &lt;tt class="docutils literal"&gt;cli.coverage_commands&lt;/tt&gt;; it can re-export the modules as well for convenience.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;cli.junitparser&lt;/tt&gt; contains modules for the only junitparser subcommand.
I'll probably do something similar to coverage, above.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;cli.build&lt;/tt&gt; is needed to build the wheels that will be tested.
I seem to have not hooked this up to anything, but it's going to be needed in order to set up the constraints files that will power everything.
I'm not sure if it's necessary to expose it to the API, but I might as well.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;flake8&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;junit2html&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;limit_coverage&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;mypy&lt;/tt&gt; are all straightforward and should stay as-is.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;cli.pip&lt;/tt&gt;, while it does wrap a command-line utility, does so in a more restricted way because it's part of the basis of the other wrappers.
It should be moved to &lt;tt class="docutils literal"&gt;motr._api.installers.pip&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;pyinstrument&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;pytest&lt;/tt&gt; should stay as-is.
As should &lt;tt class="docutils literal"&gt;python&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;cli.python_helpers&lt;/tt&gt; should be moved to something like &lt;tt class="docutils literal"&gt;motr._api.helpers.python_helpers&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;cli.types&lt;/tt&gt; should be moved to &lt;tt class="docutils literal"&gt;motr._api.cli_types.not_output&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let's see about making these changes...&lt;/p&gt;
&lt;p&gt;Well, before I touched anything, I discovered that &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;flake8-html&lt;/span&gt;&lt;/tt&gt;, or at least my fork, got broken.
On further investigation, it's my fork.
Let's see about fixing this up...&lt;/p&gt;
&lt;p&gt;It was a little unfortunate that &amp;quot;flake8 crashed because of your hacked-up plugin&amp;quot; apparently has the same exit code as &amp;quot;the code had issues&amp;quot;.
But that was a pretty straightforward fix, thanks upstream.&lt;/p&gt;
&lt;p&gt;Okay, let's actually start rearranging this...&lt;/p&gt;
&lt;p&gt;Okay, done moving the files.
Let's see how many Mypy errors this gives me.
Huh.
Only 8.&lt;/p&gt;
&lt;p&gt;I addressed those and some other issues, then worked on exporting the CLI interfaces.
There were... some issues, but it looks like the situation is improving...&lt;/p&gt;
&lt;p&gt;Anyway, with all of that, I've got much better coverage numbers now.
Still not ready, but the only file only non-executed lines in it...&lt;/p&gt;
&lt;p&gt;Is my experimental generic protocol for replacing the registries.&lt;/p&gt;
&lt;p&gt;Oh boy.&lt;/p&gt;
&lt;p&gt;I really don't want to throw that away, so I guess I'm going to have to write mypy tests for that so I can qualify it enough to feel safe using it in the rest of the app.&lt;/p&gt;
&lt;p&gt;It's getting late, so I'm going to publish this post now, and work on adding mypy tests the next time I pick this code up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-03-26</title><link href="https://mwchase.neocities.org/coding-2022-03-26" rel="alternate"></link><published>2022-03-26T04:00:00-04:00</published><updated>2022-03-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-03-26:/coding-2022-03-26</id><summary type="html">&lt;p class="first last"&gt;Figuring out how much I've been over-complicating this.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, so I spent a good portion of today tinkering with BQN programs, but I want to make some progress on MOTR.
Let's see about cataloging the commands and arguments, and if there are any that I want to rewrite into config options.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;pytest&lt;/tt&gt;&lt;ul&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-p&lt;/span&gt; no:cacheprovider&lt;/tt&gt;; I think this should stay as an argument generated from within MOTR.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--junitxml&lt;/span&gt;&lt;/tt&gt;; this can't work in config, so that's all set...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;junitparser merge&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;junit2html&lt;/tt&gt; basically work out of the box, so they're all set once I actually write the modules.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;flake8&lt;/tt&gt; now just has the related &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--format=html&lt;/span&gt;&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--htmldir&lt;/span&gt;&lt;/tt&gt; flags, and I don't have any idea how to make them into config, so they're all set.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;mypy&lt;/tt&gt; has &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--html-report&lt;/span&gt;&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--junit-xml&lt;/span&gt;&lt;/tt&gt;, which both need special support.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;coverage&lt;/tt&gt;&lt;ul&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;erase&lt;/tt&gt; looks all set.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;run&lt;/tt&gt; probably needs configuration to be &lt;em&gt;generated&lt;/em&gt;, and needs the output to be directed somehow.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;combine&lt;/tt&gt; doesn't need much.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;html&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;xml&lt;/tt&gt; need to specify their outputs, but I bet some of the stuff I'm passing on the command line currently could live in a config file.
Let's say I'm... pretty sure that &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--fail-under&lt;/span&gt;&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--show-contexts&lt;/span&gt;&lt;/tt&gt; can be moved to the config, and it would work fine.
But MOTR does need support for &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-d&lt;/span&gt;&lt;/tt&gt;/&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--directory&lt;/span&gt;&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-o&lt;/span&gt;&lt;/tt&gt;.
(I might look into supporting JSON and LCOV output, since they don't look like that much extra effort. I only really bothered to think about XML output because I was messing with SonarQube earlier... this... week... I think...)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;pyinstrument&lt;/tt&gt; has &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--renderer&lt;/span&gt; html&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--outfile&lt;/span&gt;&lt;/tt&gt;, which work together, and need to be handled by MOTR.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, this should work out to not all that much work, once I have a flow for actually doing any of this.&lt;/p&gt;
&lt;p&gt;Anyway, it's getting late, so I'm going to publish and try to figure out BQN some more, then get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-03-25</title><link href="https://mwchase.neocities.org/coding-2022-03-25" rel="alternate"></link><published>2022-03-25T04:00:00-04:00</published><updated>2022-03-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-03-25:/coding-2022-03-25</id><summary type="html">&lt;p class="first last"&gt;Maybe I already talked about this? Whatever, it's still cursed yet intriguing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, this is awkward.
I just spent quite a bit of time working on something that is definitely coding, but is also definitely &lt;em&gt;not&lt;/em&gt; MOTR.&lt;/p&gt;
&lt;p&gt;I was messing around in &lt;a class="reference external" href="https://mlochbaum.github.io/BQN/index.html"&gt;BQN&lt;/a&gt;, which I might have mentioned before, and I might have said something like &amp;quot;I forget exactly how I heard about this language&amp;quot;.
Regardless of whether I said it, it remains true.&lt;/p&gt;
&lt;p&gt;Anyway, I decided to come up with extremely over-engineered solutions to coding challenges, and it's... kind of slow going.
Lots of &amp;quot;Okay, but how does &lt;cite&gt;(∨`⌾⌽0⊸≠)⊸/&lt;/cite&gt; &lt;em&gt;accomplish what it does&lt;/em&gt;?&amp;quot; and &amp;quot;There must be some way to simplify &lt;cite&gt;{Strip 𝕨 𝔽○((𝕨 MaxLen 𝕩)⊸↑) 𝕩}&lt;/cite&gt;, aside from the functions I can inline.&amp;quot;&lt;/p&gt;
&lt;p&gt;I'm sure I'll get somewhere with this, especially if I, like, ask for help at some point, but in the near term, I want to focus more on building up my understanding of basic concept, and in the nearer term I want to get to bed because it is &lt;em&gt;late&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-03-24</title><link href="https://mwchase.neocities.org/coding-2022-03-24" rel="alternate"></link><published>2022-03-24T04:00:00-04:00</published><updated>2022-03-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-03-24:/coding-2022-03-24</id><summary type="html">&lt;p class="first last"&gt;Okay, I'm ready to wait again.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I might take a break from this tomorrow, but here's where I am right now:&lt;/p&gt;
&lt;p&gt;I wrote a kind of janky helper function for creating static requirement data.
Part of the jankiness is from making it generic, so it currently takes a weird bunch of arguments.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Anyway.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I really should write tests to see what I'm now missing, and the first thing I realized I was missing is...&lt;/p&gt;
&lt;p&gt;A good way to actually &lt;em&gt;import&lt;/em&gt; these modules from outside of MOTR.
I don't want to have the tests just reach inside, so that means I need to think about reorganizing these modules a little so they make a bit more sense.&lt;/p&gt;
&lt;p&gt;To accomplish this, I need to take some time to trace out the requirements and workflow for implementing parts of the motrfile logic using the new code, and that should help me figure out how to group things.&lt;/p&gt;
&lt;p&gt;For the moment, I just want to space out for a bit.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-03-23</title><link href="https://mwchase.neocities.org/coding-2022-03-23" rel="alternate"></link><published>2022-03-23T04:00:00-04:00</published><updated>2022-03-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-03-23:/coding-2022-03-23</id><summary type="html">&lt;p class="first last"&gt;So close...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Screw waiting for things.&lt;/p&gt;
&lt;p&gt;I think I've got nearly everything I need for wrapping command lines, so let's &lt;em&gt;go&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I'm starting with flake8.
For reference, here's the general command again:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;flake8 &lt;span class="pre"&gt;--format=html&lt;/span&gt; &lt;span class="pre"&gt;--htmldir&lt;/span&gt; &amp;lt;generated path&amp;gt; &lt;span class="pre"&gt;--isort-show-traceback&lt;/span&gt; &amp;lt;path to &lt;span class="pre"&gt;root&amp;gt;/src&lt;/span&gt; &amp;lt;path to &lt;span class="pre"&gt;root&amp;gt;/tests&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;And it has requirements like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;flake8&lt;/li&gt;
&lt;li&gt;flake8-black&lt;/li&gt;
&lt;li&gt;flake8-comprehensions&lt;/li&gt;
&lt;li&gt;flake8-docstrings&lt;/li&gt;
&lt;li&gt;flake8-html &amp;#64; &amp;lt;a bunch of nonsense&amp;gt;&lt;/li&gt;
&lt;li&gt;flake8-isort&lt;/li&gt;
&lt;li&gt;flake8-pytest-style&lt;/li&gt;
&lt;li&gt;flake8-rst&lt;/li&gt;
&lt;li&gt;flake8-rst-docstrings&lt;/li&gt;
&lt;li&gt;flake8-type-checking&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The majority of these plugins don't require anything except to be installed.
If we divide those up, with the ones that need special handling first...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;flake8-html&lt;/li&gt;
&lt;li&gt;flake8-isort&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And, everything else:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;flake8-black&lt;/li&gt;
&lt;li&gt;flake8-comprehensions&lt;/li&gt;
&lt;li&gt;flake8-docstrings&lt;/li&gt;
&lt;li&gt;flake8-pytest-style&lt;/li&gt;
&lt;li&gt;flake8-rst&lt;/li&gt;
&lt;li&gt;flake8-rst-docstrings&lt;/li&gt;
&lt;li&gt;flake8-type-checking&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I bet I could convert that one command-line flag for flake8-isort into a bit of flake8 config, which would give me a bunch of things that merely need to be installed.
I don't have a strong sense for what would be better for people who aren't me, but moving stuff from the command line into the config files certainly makes things easier &lt;em&gt;within&lt;/em&gt; a repository.&lt;/p&gt;
&lt;p&gt;(Source: I couldn't figure out why I was getting weird errors from running mypy directly instead of through MOTR, until I figured out that I could convert some static environment variable stuff I was doing into a config line.)&lt;/p&gt;
&lt;p&gt;With that in mind, all I really need to code is handling for flake8-html, and everything else should probably get some kind of generic something.&lt;/p&gt;
&lt;p&gt;This does raise the question, is there anything else in the motrfile I can do this to?&lt;/p&gt;
&lt;p&gt;So, pytest has output stuff which needs to integrate with the higher-level abstractions, and some stuff that might or might not be needed in the automated case, but definitely isn't needed if you're invoking it manually, so, eh.&lt;/p&gt;
&lt;p&gt;Looks like coverage has some stuff in the HTML output that it probably makes more sense to live in config.&lt;/p&gt;
&lt;p&gt;Oh no, I just remembered that I think some of the coverage configs need to be generated on a per-command basis.
Hm, that's going to be workable, but also confusing.
Or maybe I can put it all together at once in some way...&lt;/p&gt;
&lt;p&gt;In any case, the immediate goal is to figure out how to best collect together this kind of &amp;quot;just install a package&amp;quot; stuff that's so common.
It's getting late, so let's just see about some quick plans:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Create a helper function in &lt;tt class="docutils literal"&gt;flake8.py&lt;/tt&gt; for now, until I figure out the right way to generalize it.
Unless...
Something like &lt;tt class="docutils literal"&gt;Command.install_plugin()&lt;/tt&gt;...
Or some kind of nice wrapper around &lt;tt class="docutils literal"&gt;Label[Pip]&lt;/tt&gt;...&lt;/li&gt;
&lt;li&gt;Start working on the tests, focusing on building up the test data first.&lt;/li&gt;
&lt;li&gt;Remove unneeded lines from &lt;tt class="docutils literal"&gt;flake8.py&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;For the actual tests, focus on validating the registry generated from the test data.&lt;/li&gt;
&lt;li&gt;Fill things in until I have full coverage and the ability to handle all of the cases that the current motrfile does, plus some low-effort nice-to-haves.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, I'll have time later to think about this.
For now, I'm getting pretty tired.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2022-03-22</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-03-22" rel="alternate"></link><published>2022-03-22T04:00:00-04:00</published><updated>2022-03-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-03-22:/weekly-roundup-2022-03-22</id><summary type="html">&lt;p class="first last"&gt;Getting ready to be extremely distracted&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I messed around a bit with writing, and it went well.&lt;/li&gt;
&lt;li&gt;Thursday: I messed around a bit more with writing, and it didn't go as well as I would have liked.&lt;/li&gt;
&lt;li&gt;Friday: I thought a bit about why I got stuck. I'm not sure I really got anywhere with that.&lt;/li&gt;
&lt;li&gt;Saturday: I made some changes to MOTR's code that I now realize were premature.&lt;/li&gt;
&lt;li&gt;Sunday: I made some progress towards getting MOTR usable, and also got distracted a bit by writing code to reduce boilerplate, and, um, mypy plugins to make it believe that that code was acceptable. That last bit is... probably not done.&lt;/li&gt;
&lt;li&gt;Monday: I got the urge to add more flake8 plugins, so I did.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I ought to get back to one of the various projects I'm &amp;quot;juggling&amp;quot;.
(They are all on the floor.)
But, earlier today, I realized that there's some redundancy in my new MOTR code that I can factor out, and I'm itching to get those improvements in.&lt;/p&gt;
&lt;p&gt;I'll see if I can get that out of my system until the weekend, after I publish this.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-03-21</title><link href="https://mwchase.neocities.org/coding-2022-03-21" rel="alternate"></link><published>2022-03-21T04:00:00-04:00</published><updated>2022-03-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-03-21:/coding-2022-03-21</id><summary type="html">&lt;p class="first last"&gt;Picking a random metric to improve on.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today, I messed around with the new registry protocol a bit, and then stepped back from that.&lt;/p&gt;
&lt;p&gt;Rather than continuing on with the command-line wrappers, I ended up adding some flake8 plugins and doing bits of cleanup.&lt;/p&gt;
&lt;p&gt;Well then, next weekend, let's see about finishing up flake8, pytest, the python wrapper, then mypy, pyinstrument, and lastly coverage.&lt;/p&gt;
&lt;p&gt;I can't say how long that will all take.&lt;/p&gt;
&lt;p&gt;The basic arc I want to take is to get the commands all wrapped, get the motrfile &lt;em&gt;finally&lt;/em&gt; simplified, more-or-less freeze the code, get coverage back up to full, and then look into improvements like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Renaming things&lt;/li&gt;
&lt;li&gt;Documenting things&lt;/li&gt;
&lt;li&gt;Setting up mypy tests so I'm comfortable subbing in the registry protocol without worrying that it'll crash mypy.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Although, I might also just switch to another hobby project for a bit in honor of my multi-month attempt at delayed gratification.&lt;/p&gt;
&lt;p&gt;Speaking of delays, this post is late, and I should wrap up ten minutes ago.
In service of that—&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-03-20</title><link href="https://mwchase.neocities.org/coding-2022-03-20" rel="alternate"></link><published>2022-03-20T04:00:00-04:00</published><updated>2022-03-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-03-20:/coding-2022-03-20</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Here are all of the reasons this doesn't work.&amp;quot; &amp;quot;So, those are all of the things I need to change to make it work? :)&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Earlier today I did the minimal required rewrite for the &lt;tt class="docutils literal"&gt;FlexOut&lt;/tt&gt; class, and just now I wrote the &lt;tt class="docutils literal"&gt;inject()&lt;/tt&gt; helper for &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt;s.&lt;/p&gt;
&lt;p&gt;In between that, I got distracted trying to make mypy do things that it's not supposed to do.&lt;/p&gt;
&lt;p&gt;So, &lt;em&gt;ideally&lt;/em&gt;, I &amp;quot;should&amp;quot; be working on building up the CLI wrappers, but I really want to see if I can get the plugin I wrote into a state where the class it operates on can function as a base class for the four classes worth of boilerplate that it's supposed to replace.&lt;/p&gt;
&lt;p&gt;I don't feel like resolving to do things one way or the other right now.
Tomorrow, I'll do whatever I feel like.
Maybe some writing as well?&lt;/p&gt;
&lt;p&gt;I don't want to think about it too hard, because it's late right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-03-19</title><link href="https://mwchase.neocities.org/coding-2022-03-19" rel="alternate"></link><published>2022-03-19T04:00:00-04:00</published><updated>2022-03-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-03-19:/coding-2022-03-19</id><summary type="html">&lt;p class="first last"&gt;Quick fix&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I didn't give myself much time to code today, but I at least want to plan stuff out.
So, here's planning for supporting module calls.&lt;/p&gt;
&lt;p&gt;The existing code determines a path to an executable.
The code I need to add doesn't produce a specific path, not exactly.
All the same, a path seems like the easiest choice, even if it's not precisely correct in all circumstances.&lt;/p&gt;
&lt;p&gt;This is going to look messy.&lt;/p&gt;
&lt;p&gt;Messier.&lt;/p&gt;
&lt;p&gt;Basically, I need to add a scan over the &lt;em&gt;arguments&lt;/em&gt; to the resolution logic for the &lt;em&gt;extra_io&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Oh, wow, that is messy.
Let's see what MOTR thinks of its code...&lt;/p&gt;
&lt;p&gt;Not so happy with it...&lt;/p&gt;
&lt;p&gt;I've fixed some of the issues, so I just want to check that I'm narrowing it down.
Okay...
I've made some changes that should cascade out to fix this...&lt;/p&gt;
&lt;p&gt;And, bam, that seems to be cleared up, and also the code makes a little more sense at the higher levels of abstraction.
The interface is kind of wonky, but it's... fine?&lt;/p&gt;
&lt;p&gt;Anyway, moving on for now, the other thing I need is to figure out how to fix up the &lt;tt class="docutils literal"&gt;FlexOut&lt;/tt&gt; class.&lt;/p&gt;
&lt;p&gt;Okay, not happening in the next five minutes.
I'll try to work things out later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2022-03-18</title><link href="https://mwchase.neocities.org/diary-2022-03-18" rel="alternate"></link><published>2022-03-18T04:00:00-04:00</published><updated>2022-03-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-03-18:/diary-2022-03-18</id><summary type="html">&lt;p class="first last"&gt;I got extremely engrossed with color schemes, and I'm not sure I'm done with that yet.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hmm.&lt;/p&gt;
&lt;p&gt;I didn't make it so far today.
Mostly I got distracted tweaking system settings to try to make things look vaguely more consistent with... something.&lt;/p&gt;
&lt;p&gt;When it came down to fleshing out the character arc I was messing with yesterday, I just kind of got stuck on the fact that I don't have strong feelings about how I want it to end.
That's important, because how it ends influences what happens in the middle, and probably how the beginning gets presented.&lt;/p&gt;
&lt;p&gt;It seems like I need to have some level of emotional investment before I feel like it's worth going into more detail.
If this is correct, it won't be a problem when it comes to stuff that I want to write for a reason beyond practice.&lt;/p&gt;
&lt;p&gt;In any case, I'm not getting any further for the rest of today, so I'll just have to take things easy for now, and tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-03-17</title><link href="https://mwchase.neocities.org/diary-2022-03-17" rel="alternate"></link><published>2022-03-17T04:00:00-04:00</published><updated>2022-03-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-03-17:/diary-2022-03-17</id><summary type="html">&lt;p class="first last"&gt;Not quite as productive experiments&lt;/p&gt;
</summary><content type="html">&lt;p&gt;After the luck I had with using randomness in writing yesterday, I tried it in a more structured context, with a list of questions I'd gotten from writing advice, on compelling character arcs.
Unfortunately...&lt;/p&gt;
&lt;p&gt;I did fine on coming up with a sketch of a character, but when it came to the last question, which was basically &amp;quot;Why should the audience care about the character's struggles&amp;quot;, I choked.
I'm not up for rethinking this in detail right now, but my gut feeling from this is that I need to approach the question differently somehow.&lt;/p&gt;
&lt;p&gt;Like, I think I did this well enough with the worldbuilding poem thing.
Maybe the question could be something like &amp;quot;What is at stake that the audience could relate to?&amp;quot;
This isn't a restatement of what the character's trying to accomplish, more, like, how do the conflicts relate to the character's humanity, I guess.&lt;/p&gt;
&lt;p&gt;I tried approaching it from another angle, and I didn't have much luck.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Actually, by complaining about it here, I gave myself some ideas for how to move forward, and I've got enough now to mess around with.&lt;/p&gt;
&lt;p&gt;For the moment, I want to take care of some other things, like getting ready for bed, but I think I'll be able to pick this up tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-03-16</title><link href="https://mwchase.neocities.org/diary-2022-03-16" rel="alternate"></link><published>2022-03-16T04:00:00-04:00</published><updated>2022-03-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-03-16:/diary-2022-03-16</id><summary type="html">&lt;p class="first last"&gt;Productive experiments&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Shifted gears again as far as writing goes.
I just did a quick experiment with writing, and using a random word generator whenever I wasn't sure of something.
After messing around so much with AI dungeon, it felt great.
Still got to have some unpredictability, but I only had to write things so I could understand them, and I could plunge ahead without the focus suddenly jerking off in unexpected directions.&lt;/p&gt;
&lt;p&gt;This first one, I did without an outline of any kind, so I'm not exactly sure what's going on, but I suspect I could use this to work within or fill in a high-level outline.&lt;/p&gt;
&lt;p&gt;Since my issue writing the Fiasco solo was momentum, I suspect this could help me out in some way.
I want to investigate how this works for me a bit more, first.
So, I'd like to try writing and filling in outlines a few different ways, before trying out converting the structure of Fiasco into an outline, and then filling it in more-or-less in order.&lt;/p&gt;
&lt;p&gt;For now, though, I'll just be glad that I've got a technique for writing stuff that I can't predict ahead of time, that &lt;em&gt;doesn't&lt;/em&gt; unpredictably take over twenty minutes to proceed, or get messed up by obscure techniques like &amp;quot;extremely common metaphors&amp;quot;.
Anyway, it's late, so I'll get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2022-03-15</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-03-15" rel="alternate"></link><published>2022-03-15T04:00:00-04:00</published><updated>2022-03-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-03-15:/weekly-roundup-2022-03-15</id><summary type="html">&lt;p class="first last"&gt;A week of important discoveries.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I looked at screen-writing software, and thought of some changes that I'd like to see made. Then I thought about stuff I want to change with other software I'm using.&lt;/li&gt;
&lt;li&gt;Thursday: I read about basic screenwriting stuff.&lt;/li&gt;
&lt;li&gt;Friday: I read more about screenwriting, and decided that I don't want to use screenwriting formats for the initial draft of my Fiasco stuff, but we'll see what I want to do when, later.&lt;/li&gt;
&lt;li&gt;Saturday: I started picking things back up with MOTR.&lt;/li&gt;
&lt;li&gt;Sunday: I started trying to put the MOTR code into practice, and encountered a shortcoming in the code, made harder to grasp by &lt;em&gt;just how much&lt;/em&gt; the code does.&lt;/li&gt;
&lt;li&gt;Monday: I dealt with &lt;em&gt;just how much&lt;/em&gt; by reviewing the full stack of code, back from &amp;quot;synthesize the data required to describe actions MOTR can take&amp;quot;, and found two major things: a bug that &lt;em&gt;will&lt;/em&gt; break my code if I don't fix it, and the plausible location for a fix to that shortcoming I found.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to take things easy or write until the weekend, then get to work on MOTR.
I think once I get another release of MOTR done, I'll reconsider how I'm distributing my work through the week.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-03-14</title><link href="https://mwchase.neocities.org/coding-2022-03-14" rel="alternate"></link><published>2022-03-14T04:00:00-04:00</published><updated>2022-03-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-03-14:/coding-2022-03-14</id><summary type="html">&lt;p class="first last"&gt;Start back over with how everything works, and look for the gaps.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;It's a little earlier in the day, and I'm having trouble concentrating on what I want to concentrate on, so I'm going to try to lay out what MOTR does and see if I can find a better way, or if it actually does just all work.&lt;/p&gt;
&lt;p&gt;(By the way, some of this stuff is slated to be potentially renamed.
I'm going to go with the names currently in the code for now.)&lt;/p&gt;
&lt;p&gt;So, let's start near the end.
The end goal of running the motrfile is the creation of an object of type &lt;tt class="docutils literal"&gt;motr.core.registry.Registry&lt;/tt&gt;.
The registry contains several mappings:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;From &lt;tt class="docutils literal"&gt;motr.core.runner.RuntimeAction&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;motr.core.registry._ActionData&lt;/tt&gt;, which tracks a set of &lt;tt class="docutils literal"&gt;motr.core.target.Target&lt;/tt&gt; objects that have to be satisfied according to the parameters of the registry, before the key action can be executed.&lt;/li&gt;
&lt;li&gt;From &lt;tt class="docutils literal"&gt;motr.core.target.Target&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;motr.core.runner.RuntimeAction&lt;/tt&gt;.
This indicates the action that must be executed to satisfy the target.&lt;/li&gt;
&lt;li&gt;From &lt;tt class="docutils literal"&gt;motr.core.target_name.TargetName&lt;/tt&gt; to a set of &lt;tt class="docutils literal"&gt;motr.core.target.Target&lt;/tt&gt;.
Every target name is user-selectable at execution time using the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-t&lt;/span&gt;&lt;/tt&gt; argument.&lt;/li&gt;
&lt;li&gt;And a set of &lt;tt class="docutils literal"&gt;motr.core.target_name.TargetName&lt;/tt&gt; objects that should &lt;em&gt;not&lt;/em&gt; be selected by default.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These fields are not modified directly.
Instead, the class defines a &lt;tt class="docutils literal"&gt;require()&lt;/tt&gt; method that takes an argument that is an instance of one of the types in the &lt;tt class="docutils literal"&gt;Requirement&lt;/tt&gt; union:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Action&lt;/tt&gt; adds a runtime action to the registry.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;ActionInput&lt;/tt&gt; adds a precondition to an action.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;ActionOutput&lt;/tt&gt; adds a result to an action.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;TargetName&lt;/tt&gt; associates a name to a target.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;SkippedName&lt;/tt&gt; marks a name as not selected by default.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are some undocumented requirements about ordering in order to avoid cycles, but one of the really important parts of this is that it should be the case that, if &lt;tt class="docutils literal"&gt;new_registry == old_registry.require(requirement)&lt;/tt&gt; (without any error), then &lt;tt class="docutils literal"&gt;new_registry == new_registry.require(requirement)&lt;/tt&gt;.
This allows me to play kind of fast and loose with requirements at the higher layers.&lt;/p&gt;
&lt;p&gt;The next type that matters is &lt;tt class="docutils literal"&gt;motr._api.requirements.requirements.Requirements&lt;/tt&gt;, which is just an alias for &lt;tt class="docutils literal"&gt;typing.Generator[motr.core.registry.Registry, None, T_co]&lt;/tt&gt;, where &lt;tt class="docutils literal"&gt;T_co&lt;/tt&gt; is just &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;typing.TypeVar(&amp;quot;T_co&amp;quot;,&lt;/span&gt; covariant=True)&lt;/tt&gt;.
This type is used as a return type all over the high levels of code.&lt;/p&gt;
&lt;p&gt;The &lt;tt class="docutils literal"&gt;motr._api.requirements&lt;/tt&gt; package also has some modules that provide helpful wrappers around the &lt;tt class="docutils literal"&gt;Requirement&lt;/tt&gt; classes, in the form of tiny helper functions that coordinate the creation of instances of those classes.
I'm going to skip over them unless I realize that they're somehow important.&lt;/p&gt;
&lt;p&gt;The next level up is the modules under &lt;tt class="docutils literal"&gt;motr._api.actions&lt;/tt&gt;.
One of these modules, &lt;tt class="docutils literal"&gt;io&lt;/tt&gt;, defines more of the types used all over the place in the higher levels.
Basically, wrappers around generic values, but marking them to be either an input or output of their associated action.
The other modules are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;cmd&lt;/tt&gt;, which defines a &lt;tt class="docutils literal"&gt;Cmd&lt;/tt&gt; class that is a runtime action to execute a command, and a &lt;tt class="docutils literal"&gt;cmd_&lt;/tt&gt; function that handles constructing a &lt;tt class="docutils literal"&gt;Cmd&lt;/tt&gt; instance and putting out all of its associated requirements.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;mkdir&lt;/tt&gt;, which defines a &lt;tt class="docutils literal"&gt;Mkdir&lt;/tt&gt; class that is a runtime action to create a directory, a &lt;tt class="docutils literal"&gt;mkdir()&lt;/tt&gt; function to wrap constructing a &lt;tt class="docutils literal"&gt;Mkdir&lt;/tt&gt; instance and putting out the associated requirements, and a &lt;tt class="docutils literal"&gt;make_parent()&lt;/tt&gt; function that does the same, but with the &lt;em&gt;parent&lt;/em&gt; of whichever path it is passed.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;write_bytes&lt;/tt&gt;, which defines a &lt;tt class="docutils literal"&gt;WriteBytes&lt;/tt&gt; class that is a runtime action to write a sequence of bytes to a path.
The bytes are constant with respect to the registry.
There's also a &lt;tt class="docutils literal"&gt;write_bytes()&lt;/tt&gt; function that wraps constructing a &lt;tt class="docutils literal"&gt;WriteBytes&lt;/tt&gt; instance and putting out the associated requirements.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then, there's the &lt;tt class="docutils literal"&gt;motr._api.build&lt;/tt&gt; module, which just defines a function to convert a &lt;tt class="docutils literal"&gt;Requirements&lt;/tt&gt; object into a &lt;tt class="docutils literal"&gt;Registry&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;I believe this is the point after which I ended up building a whole lot of &lt;em&gt;stuff&lt;/em&gt; that isn't actually used yet.&lt;/p&gt;
&lt;p&gt;I don't remember what order any of this is in, let's see...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cli/*.py&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cli_types/*.py&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;package.py&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The next place to look is into &lt;tt class="docutils literal"&gt;cli_types&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;The easy ones:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;entry&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;program&lt;/tt&gt;: define marker types for coordinating the combination of command line snippets.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;label&lt;/tt&gt;: defines a type that can be used as the key to a mapping, in a way that provides type information about the value to Mypy, depending on the mapping.- &lt;tt class="docutils literal"&gt;objects&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;items&lt;/tt&gt;: mappings that use &lt;tt class="docutils literal"&gt;Label&lt;/tt&gt;s as keys.
&lt;tt class="docutils literal"&gt;objects.Objects&lt;/tt&gt; maps &lt;tt class="docutils literal"&gt;Label[T]&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;T&lt;/tt&gt;, and &lt;tt class="docutils literal"&gt;items.Items&lt;/tt&gt; maps &lt;tt class="docutils literal"&gt;Label[PVector[T]]&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;T&lt;/tt&gt;.
&lt;tt class="docutils literal"&gt;items&lt;/tt&gt; also defines some helper functions.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;installer&lt;/tt&gt; defines a protocol.
Classes that implement this protocol provide a means of combining with other objects of the same class, and of converting a command name to an absolute path to that command, in a dynamically created environment based on the data within the class.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then things start getting a little more elaborate.
I'm gong to try to focus on the stuff that probably won't need to change, if I &lt;em&gt;do&lt;/em&gt; need to change something.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;dynamic&lt;/tt&gt; defines the &lt;tt class="docutils literal"&gt;Dynamic[T_co]&lt;/tt&gt; class, which is a wrapper around a &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;typing.Callable[[Objects,&lt;/span&gt; Items], Requirements[T_co]]&lt;/tt&gt;.
It also defines a bunch of helper functions and classes.
Basically, what all of this is &lt;em&gt;for&lt;/em&gt; is to have facilities for combining &lt;tt class="docutils literal"&gt;Dynmic&lt;/tt&gt; objects, with the end goal being that it matches up with the input type to a function that I haven't mentioned here yet.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here are the remaining modules:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;command&lt;/tt&gt; defines a &lt;tt class="docutils literal"&gt;Command&lt;/tt&gt; class that bundles a command name and the label of an installer, to indicate &amp;quot;this command, in the associated environment&amp;quot;.
It also defines a &lt;tt class="docutils literal"&gt;CmdMeta&lt;/tt&gt; class, that represents a fragment of a command-line invocation, along with the metadata required to properly call the &lt;tt class="docutils literal"&gt;cmd_&lt;/tt&gt; helper.
&lt;strong&gt;IMPORTANT NOTE:&lt;/strong&gt; This module does not handle module-type commands properly.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;arguments&lt;/tt&gt; defines &lt;tt class="docutils literal"&gt;Command&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt; classes, which are wrappers around &lt;tt class="docutils literal"&gt;CmdMeta&lt;/tt&gt; objects.
The &lt;tt class="docutils literal"&gt;Command&lt;/tt&gt; class also adds more of the metadata required by &lt;tt class="docutils literal"&gt;cmd_&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;input_accumulator&lt;/tt&gt; defines a pair of related classes: &lt;tt class="docutils literal"&gt;InputAccumulator&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;ValueAdaptor&lt;/tt&gt;.
These classes work together to build up a &lt;tt class="docutils literal"&gt;Dynamic[Input[motr._api.actions.cmd.PathStr]]&lt;/tt&gt;, where &lt;tt class="docutils literal"&gt;PathStr&lt;/tt&gt; is a helper alias.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;flex&lt;/tt&gt; defines a protocol and classes that implement it.
The protocol is concerned with transforming some kind of &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt; into &amp;quot;the right&amp;quot; form for requiring or providing data.
&lt;strong&gt;IMPORTANT NOTE:&lt;/strong&gt; The &lt;tt class="docutils literal"&gt;FlexOut&lt;/tt&gt; class seems like the likeliest candidate for implementing the behavior I was looking for yesterday.
There may need to be other changes to fully support it; I'll go into my reasoning below.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;invocation&lt;/tt&gt; defines the &lt;tt class="docutils literal"&gt;Invocation&lt;/tt&gt; class and a bunch of helper classes.
The &lt;tt class="docutils literal"&gt;Invocation&lt;/tt&gt; class is basically the dynamic version of the &lt;tt class="docutils literal"&gt;arguments.Command&lt;/tt&gt; class.
It's meant to be the, like, ultimate form of all of this in terms of fully generic code.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, what I'm basically looking for to handle the changes is to have a single &lt;tt class="docutils literal"&gt;Invocation&lt;/tt&gt; object that can have &lt;em&gt;something&lt;/em&gt; passed to its &lt;tt class="docutils literal"&gt;invoke()&lt;/tt&gt; method that results in regular changes to the paths and names of some of the outputs it defines.
I think that looks like...&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;invoke&lt;/tt&gt; takes an &lt;tt class="docutils literal"&gt;Objects&lt;/tt&gt; argument that gets somehow injected into the &lt;tt class="docutils literal"&gt;Dynamic[_arguments.Command]&lt;/tt&gt; that it returns.
(Another possibility is that &lt;tt class="docutils literal"&gt;Invocation&lt;/tt&gt; objects have an &lt;tt class="docutils literal"&gt;Objects&lt;/tt&gt; mapping on them...)
Meanwhile, &lt;tt class="docutils literal"&gt;FlexOut&lt;/tt&gt; should be somehow incorporating the values from the injected &lt;tt class="docutils literal"&gt;Objects&lt;/tt&gt; into the generated paths and the output names.&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;FlexOut&lt;/tt&gt; makes sense as a target than the slightly-lower-level modules, because the lower-level modules don't use &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt;s, and those are the most straightforward candidates for changing the data around like this.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to need some time to consider some of this, so I'm going to wrap up for now, and try to deal with the clocks changing.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-03-13</title><link href="https://mwchase.neocities.org/coding-2022-03-13" rel="alternate"></link><published>2022-03-13T05:00:00-04:00</published><updated>2022-03-13T05:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-03-13:/coding-2022-03-13</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Well, this seems like a minor detail. ... OH NO.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I worked on a few things today.
A little bit of Fiasco writing.
I tried getting the first scene done.
I'm not sure if it's any good.
I think I'm really feeling the fact that I have the energy of only one person here.&lt;/p&gt;
&lt;p&gt;Anyway, I did some random cleanup on MOTR, and tried to revamp the color schemes on all of the reports.
I'm not sure how well I did, because the flake8-html styling is both elaborate and a little weird.
We'll see what I think when I start working seriously on this again.&lt;/p&gt;
&lt;p&gt;To get ready for that, let's consider the basic kinds of interface I want to build for these modules:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Constructing invocations that don't need a module.
For these, it should work to define a function that takes &lt;tt class="docutils literal"&gt;Part&lt;/tt&gt;s, and may allow passing a different command.
For handling &amp;quot;different commands&amp;quot;, my gut reaction is to put the command in a &amp;quot;reified partial&amp;quot;, so there's an update method and a normal call.&lt;/li&gt;
&lt;li&gt;Constructing invocations that need a module.
These need to pass data &lt;em&gt;into&lt;/em&gt; the module constructor.&lt;/li&gt;
&lt;li&gt;Module constructors.
These should just need a string argument to handle data paths and target names.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I think the cohesive approach to this is a builder object.
And if we can use the &lt;tt class="docutils literal"&gt;Invocation&lt;/tt&gt; itself...
The main obstacle there is that it doesn't quite fit with the structure of the &lt;tt class="docutils literal"&gt;Invocation&lt;/tt&gt; object, but I think that might be a problem with the &lt;tt class="docutils literal"&gt;Invocation&lt;/tt&gt; object.&lt;/p&gt;
&lt;p&gt;I'm confusing myself trying to work this out in my head, so I'm going to try to step back for a moment.
For dealing with these modules, I want to accumulate metadata that will properly identify the paths relevant to the specific &lt;tt class="docutils literal"&gt;Invocation&lt;/tt&gt;.
And this was &lt;em&gt;supposed&lt;/em&gt; to be a solved problem.
It's the &lt;tt class="docutils literal"&gt;path_segments&lt;/tt&gt; field on the &lt;tt class="docutils literal"&gt;Pip&lt;/tt&gt; object.
So, to work with this, I need to make sure that the &lt;em&gt;outer&lt;/em&gt; command has access to the &lt;em&gt;inner&lt;/em&gt; command's label.&lt;/p&gt;
&lt;p&gt;Side note, I just noticed that the way I'm setting up the pytest wrapper looks wrong.
It needs a &lt;tt class="docutils literal"&gt;Command&lt;/tt&gt; class that makes the &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; an &lt;tt class="docutils literal"&gt;extra&lt;/tt&gt; and just resolves to a string.&lt;/p&gt;
&lt;p&gt;Now, back to the issue of handling &lt;tt class="docutils literal"&gt;Label&lt;/tt&gt;s and moving them between different wrappers...
I hope I'm missing something, because this is making my head hurt.
The nature of the &lt;tt class="docutils literal"&gt;Label&lt;/tt&gt;s being used has to be specific to the operation being performed.&lt;/p&gt;
&lt;p&gt;I should explain a little about the &lt;tt class="docutils literal"&gt;Label&lt;/tt&gt;s.
I'm using them for various purposes at this high level, but the purpose in this context is to track information about the different virtual environments in play.
I'm trying to plan for having multiple virtual environments in play because I think that's required to type check Python 2 code with mypy.
But then, we have a situation where an &lt;tt class="docutils literal"&gt;Invocation&lt;/tt&gt; can have &lt;em&gt;2&lt;/em&gt; &lt;tt class="docutils literal"&gt;Label&lt;/tt&gt;s associated with it.&lt;/p&gt;
&lt;p&gt;Okay, here's a thought.
Stop thinking about the &lt;tt class="docutils literal"&gt;Label&lt;/tt&gt;s, because I just remembered that the &lt;em&gt;parametric&lt;/em&gt; aspect of this is handled by the &lt;tt class="docutils literal"&gt;Objects&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Items&lt;/tt&gt; objects, as well as the &lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt; objects.
If the design of all of this sounds like a horrible rats' nest, that's&lt;/p&gt;
&lt;p&gt;probably accurate.&lt;/p&gt;
&lt;p&gt;Except I'm not sure if anything is handling the specific case I'm thinking of...
The parameter-ish thing I want to inject is &amp;quot;what is running this module&amp;quot;.
I really hope I took care of this somehow.
So, what would &amp;quot;taking care of this&amp;quot; look like?&lt;/p&gt;
&lt;p&gt;The current motrfile hardcodes a lot in this area, and I'm starting to think I just genuinely overlooked the issue here.
For now, let's assume I did, and try to lay out a solution.&lt;/p&gt;
&lt;p&gt;Well, the motrfile requires a path to be passed to the &lt;tt class="docutils literal"&gt;run_pytest&lt;/tt&gt; helper.
How far can I get by taking a similar approach?
The direct translation of this would be having a &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Callable[[str],&lt;/span&gt; Invocation&lt;/tt&gt;, but the &lt;em&gt;motrfile calls it directly&lt;/em&gt;.
This works, but I feel like there should be a more elegant solution.
I think part of such a solution would look something like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Track some kind of &amp;quot;output context&amp;quot; on &lt;tt class="docutils literal"&gt;Invocation&lt;/tt&gt;s.&lt;/li&gt;
&lt;li&gt;Provide facilities at a lower level to pull this context into the output generation.&lt;/li&gt;
&lt;li&gt;Possibly rewrite the &lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt; interface to route it through there?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If I'm routing this data through the &lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt;es, then the obvious question is if there's some way for the &lt;tt class="docutils literal"&gt;FlexOutput&lt;/tt&gt; to inject it into other parts of itself.&lt;/p&gt;
&lt;p&gt;I've been going in circles, and I'm tiring myself out.
I'm starting to think that my only hope of getting this all to make sense is a comprehensive review of the architecture.
And I'm not up for that right now, so for the moment, I am done.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-03-12</title><link href="https://mwchase.neocities.org/coding-2022-03-12" rel="alternate"></link><published>2022-03-12T05:00:00-05:00</published><updated>2022-03-12T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-03-12:/coding-2022-03-12</id><summary type="html">&lt;p class="first last"&gt;Hooray, it mostly worked!&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Am I up for working on MOTR right now?
I don't know, but I want to try.
I'll get to writing tomorrow.&lt;/p&gt;
&lt;p&gt;Anyway, the first step to updating the existing wrapper modules is to update the types.&lt;/p&gt;
&lt;p&gt;But before I do that, I want to try and remember how different Python versions are supposed to work.&lt;/p&gt;
&lt;p&gt;So, Python version is set on the &lt;tt class="docutils literal"&gt;Pip&lt;/tt&gt; class, which implements the &lt;tt class="docutils literal"&gt;Installer&lt;/tt&gt; protocol.
So, to figure out what's up, I need to search for usages of that protocol.
It's just used in command.py, to...
Handle stuff related to &lt;tt class="docutils literal"&gt;CmdMeta.installer_registry&lt;/tt&gt;.
So, what's populating that?
python_helpers.py
And, looking at that, I'm not sure whether I'm &lt;em&gt;populating&lt;/em&gt; the version field yet, but I can worry about that later, because the important thing is how these functions interact, and I've confirmed that I have the capability to specify the versions the way I want.&lt;/p&gt;
&lt;p&gt;Anyway, let's see...&lt;/p&gt;
&lt;p&gt;I've got these &lt;tt class="docutils literal"&gt;_arguments.Option[]&lt;/tt&gt; types that need to be changed around to be wrapped in &lt;tt class="docutils literal"&gt;_invocation.Static[]&lt;/tt&gt;.
Let's see about that...&lt;/p&gt;
&lt;p&gt;Okay, that's done, so the next to look at is turning my sketches from last time into actual code.&lt;/p&gt;
&lt;p&gt;And, it worked until it didn't.
Something was weird with the new decorator, but I dealt with it by removing some code paths I didn't need.
I should probably do that with the other decorators, because I really didn't need some of the utility code I wrote.&lt;/p&gt;
&lt;p&gt;At this point, there are a few things I can look into, but it's pretty late and I think I'm done for the night.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2022-03-11</title><link href="https://mwchase.neocities.org/diary-2022-03-11" rel="alternate"></link><published>2022-03-11T05:00:00-05:00</published><updated>2022-03-11T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-03-11:/diary-2022-03-11</id><summary type="html">&lt;p class="first last"&gt;Trying to make some decisions, now that I have a slightly better understanding.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm taking some preliminary notes on screenplay formatting and getting conventions to fit within the fountain file format.
In general, the combination of fountain's relaxed formatting and the vim plugin I installed, should make it possible for me to write sensible screenplays without excessive effort, if I go that route.&lt;/p&gt;
&lt;p&gt;While the formatting won't be a big issue (barring issues converting from fountain to other formats), I think I've decided that, for the Fiasco idea, I don't want to &lt;em&gt;start&lt;/em&gt; by drafting in script form.&lt;/p&gt;
&lt;p&gt;My initial thought is to draft it in the form of a metaphorical chat log between the characters.
This should allow me to start of preserving the feel of the game mechanics, which I think fits in with my general idea of &amp;quot;Do things in the typical case, then move away as I get a better grasp on things&amp;quot;.&lt;/p&gt;
&lt;p&gt;Anyway, things are wrapping up over here, so I'm going to get ready for bed now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-03-10</title><link href="https://mwchase.neocities.org/diary-2022-03-10" rel="alternate"></link><published>2022-03-10T05:00:00-05:00</published><updated>2022-03-10T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-03-10:/diary-2022-03-10</id><summary type="html">&lt;p class="first last"&gt;Treading water.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay.
Work has felt kind of rough this week, so I'm trying to take things easy right now.
Still reading about screenplays to get some sense of whether that's the format I want for solo Fiasco stuff.
The book I'm reading, I guess I don't have to read it in strict order to get the information I currently want, but for the moment, I'm going to take it as it is.&lt;/p&gt;
&lt;p&gt;Actually, I just checked the table of contents, and I'll &lt;em&gt;probably&lt;/em&gt; skip ahead soon.&lt;/p&gt;
&lt;p&gt;Anyway, for now, I've got to focus on myself, rather than forcing myself to do anything.
I can't think of anything else to add to this entry, so it's done.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-03-09</title><link href="https://mwchase.neocities.org/diary-2022-03-09" rel="alternate"></link><published>2022-03-09T05:00:00-05:00</published><updated>2022-03-09T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-03-09:/diary-2022-03-09</id><summary type="html">&lt;p class="first last"&gt;Must... not... shave... yak...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Oh boy.
I kind of poked around at more tech stuff, and ended up proposing—not committing to anything, just proposing!—a pretty major overhaul to a fork of an open-source project, just so I wouldn't have to open a GUI window sometimes.&lt;/p&gt;
&lt;p&gt;On balance, I think I'm going to want something along those lines long-term, but I should hold off on doing such work for as long as I can.
I've taken notes on some alternatives for now, and I should definitely make do with them until things get much further along than I currently anticipate them getting.&lt;/p&gt;
&lt;p&gt;All that said, I should try to focus on learning more about screenwriting, just for my own edification.&lt;/p&gt;
&lt;p&gt;Thinking for a sec about other projects I'd like to work more on...
flake8-html and junit2html, I think.
I don't remember what I concluded the last time I looked into them, but I think it makes more sense to fork their code and mess with it, than to write a style for Stylus like I did for Mypy's coverage output just now.&lt;/p&gt;
&lt;p&gt;But really, I should put down the text editors for now.
I should also get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2022-03-08</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-03-08" rel="alternate"></link><published>2022-03-08T05:00:00-05:00</published><updated>2022-03-08T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-03-08:/weekly-roundup-2022-03-08</id><summary type="html">&lt;p class="first last"&gt;Pivoting a bit, then moving back...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I messed around with some other other stuff I can do with programming, until I satisfied most of my curiosity.&lt;/li&gt;
&lt;li&gt;Thursday: I realized I'd been doing something wrong, so I went back to playing with graphviz, until I satisfied myself that the diagrams I was trying to build were probably more trouble than they were worth.&lt;/li&gt;
&lt;li&gt;Friday: I explained what the motivation for the diagrams was: helper code for tracking a solo game of Fiasco.&lt;/li&gt;
&lt;li&gt;Saturday: I took things easy. Watched a movie and played Vampire Survivors.&lt;/li&gt;
&lt;li&gt;Sunday: I did some work for MOTR that I'd previously written up.&lt;/li&gt;
&lt;li&gt;Monday: I did a little work on MOTR, and sketched stuff out for later.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to decide how I want to write up the Fiasco stuff.
I'm pretty experienced with prose, but when I was thinking about this, I got the urge to learn about screenplay formatting.
I'm not sure if I want to make &amp;quot;doing it&amp;quot; contingent on &amp;quot;doing it as a screenplay&amp;quot;, but I'd like to learn the basics before I decide one way or the other.
I spent today working on getting a plausible-sounding software toolchain together, so I'm going to try to step back from that for now and focus again on the stuff that goes into that pipeline.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-03-07</title><link href="https://mwchase.neocities.org/coding-2022-03-07" rel="alternate"></link><published>2022-03-07T05:00:00-05:00</published><updated>2022-03-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-03-07:/coding-2022-03-07</id><summary type="html">&lt;p class="first last"&gt;Rechecking my work, and forging ahead on some basic progress.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Oh boy, it has been a long time since I went over some of this stuff.
This is for MOTR, and I'm starting with the flake8 wrapper.
Going from the top, we have:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Program&lt;/tt&gt; subclass&lt;/li&gt;
&lt;li&gt;flake8 &lt;tt class="docutils literal"&gt;Label&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Command&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt; aliases&lt;/li&gt;
&lt;li&gt;The necessary &lt;tt class="docutils literal"&gt;Command&lt;/tt&gt; instance&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Option&lt;/tt&gt; instance, which &lt;em&gt;should&lt;/em&gt; just need to be wrapped in an &lt;tt class="docutils literal"&gt;invocation.Static&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&amp;quot;&lt;tt class="docutils literal"&gt;builder&lt;/tt&gt;&amp;quot; functions, which need a little more work&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both of the definitions share a &lt;tt class="docutils literal"&gt;Label&lt;/tt&gt;, which needs to get reworked into a &lt;tt class="docutils literal"&gt;ValueAdaptor&lt;/tt&gt;.
Let's see if I can sketch that out.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@adaptor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PACKAGE_LABEL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;package&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;python_package&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PythonPackage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;PathStr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;python_package&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That is... probably going to come in useful for other modules.&lt;/p&gt;
&lt;p&gt;Anyway, to use it &lt;em&gt;here&lt;/em&gt;, I'm going to need something like...&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@adaptive_dynamic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;package&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;srcdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Objects&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Requirements&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Option&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="k"&gt;yield from&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;package&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;PACKAGE_LABEL&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;NotImplementedError&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;basic_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ROOT_LABEL&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;src&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@adaptive_dynamic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;package&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;testdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Objects&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Requirements&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Option&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="k"&gt;yield from&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;basic_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ROOT_LABEL&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;PACKAGE_LABEL&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;tests&amp;quot;&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This works out to no &lt;em&gt;code changes&lt;/em&gt; within the functions, I just need to change the decorator on them, and for that, I first need to write the new decorator.&lt;/p&gt;
&lt;p&gt;Let me see if I can bang that out quickly.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;All right, I'm not really sure about &amp;quot;quickly&amp;quot;, but it's out.&lt;/p&gt;
&lt;p&gt;And I'm tired.&lt;/p&gt;
&lt;p&gt;I'm going to get to bed to try to avoid feeling even lousier.
Hopefully, this entry should provide a solid groundwork for when I get back to this.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-03-06</title><link href="https://mwchase.neocities.org/coding-2022-03-06" rel="alternate"></link><published>2022-03-06T05:00:00-05:00</published><updated>2022-03-06T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-03-06:/coding-2022-03-06</id><summary type="html">&lt;p class="first last"&gt;Just didn't feel like having a long entry tonight, or even a medium-length one.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I did a little writing, but I also did a little work on MOTR.
The extra... flexibility... for &lt;tt class="docutils literal"&gt;FlexOut&lt;/tt&gt; is coded up and typechecks.
The next thing to do is get back on revising the existing command line wrappers, and writing new ones.
It had better work out this time.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to end this quickly tonight, and see what I'm up for after it publishes.
I hope to get into those rewrites tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2022-03-05</title><link href="https://mwchase.neocities.org/diary-2022-03-05" rel="alternate"></link><published>2022-03-05T05:00:00-05:00</published><updated>2022-03-05T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-03-05:/diary-2022-03-05</id><summary type="html">&lt;p class="first last"&gt;I said &amp;quot;Dairy Farm&amp;quot; the first time. Like, &amp;quot;Oh boy, the DPS on those Holsteins is no joke&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I'm wiped out, but it's fine, but I'm not up for much of a post tonight.&lt;/p&gt;
&lt;p&gt;We watched the livestream of the new MST3K episode, and that movie was &lt;em&gt;complete nonsense&lt;/em&gt;.
At one point I was like &amp;quot;Wait, we're watching Jonah and the bots, watch Santo, watch something else.&amp;quot;
It was super Brechtian, is what I'm saying.&lt;/p&gt;
&lt;p&gt;Anything else I want to talk about right now?
Hm...&lt;/p&gt;
&lt;p&gt;Oh yeah, I can talk about playing Vampire Survivors.
I've got all the normal unlocks as of v0.3.0c, although I haven't bought any curse, because the Dairy Plant is scary enough without curse.
(Like, maybe I could be convinced to up the curse for the previous levels, but in the Dairy Plant it feels like I have to fight to get to the half hour mark.)&lt;/p&gt;
&lt;p&gt;I'm still not psyched up to cheese the reaper fight.
I've got the walkthrough all lined up, and it's just, like, it sounds &lt;em&gt;really&lt;/em&gt; frustrating.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to publish this and zone out doing Fiasco-related data entry for later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-03-04</title><link href="https://mwchase.neocities.org/diary-2022-03-04" rel="alternate"></link><published>2022-03-04T05:00:00-05:00</published><updated>2022-03-04T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-03-04:/diary-2022-03-04</id><summary type="html">&lt;p class="first last"&gt;Hopefully, the name of the system won't end up being descriptive.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I wasn't really coordinated today, so I'm going to talk a bit about what I'm planning to write while I take a break from worldbuilding.&lt;/p&gt;
&lt;p&gt;Basically, I saw more discussion about &lt;a class="reference external" href="https://bullypulpitgames.com/games/fiasco/"&gt;Fiasco&lt;/a&gt; recently, and saying that it worked better as a writing aid than as a game.
It's been a while since I played it, but that idea basically makes sense to me; the &amp;quot;game mechanics&amp;quot; aspect of it didn't quite gel for me.
Like, I couldn't quite see the right way into the magic circle, or something.&lt;/p&gt;
&lt;p&gt;Point is, that discussion got me to revisit it, and put stuff together to try to learn it as a writing tool, as a change of pace.&lt;/p&gt;
&lt;p&gt;I'm using the classic rules because I haven't heard anything about the updated version that makes me go &amp;quot;Yes, I need this&amp;quot;, and I have heard about some changes that make it less convenient for some of the stuff I want to try than the classic rules, so, there we go.&lt;/p&gt;
&lt;p&gt;I'm trying to ease myself into some of the more advanced playsets, so I'm starting with a really basic one and no extra rules.
One double-edged aspect of not having any other players is, I don't need to schedule this around anything, but at the same time, &lt;em&gt;I don't have obligations to anyone else to actually do this on any kind of time frame&lt;/em&gt;.
Hopefully, I'll manage to pick up the pace a bit in the next day or so.&lt;/p&gt;
&lt;p&gt;Anyway, I spent too long trying to write this, so I'd better get going.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2022-03-03</title><link href="https://mwchase.neocities.org/coding-2022-03-03" rel="alternate"></link><published>2022-03-03T05:00:00-05:00</published><updated>2022-03-03T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-03-03:/coding-2022-03-03</id><summary type="html">&lt;p class="first last"&gt;Backtracking, then backing off.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;It turns out graphviz works a lot better for &amp;quot;lay stuff out in a shape&amp;quot; when I switch the engine to &amp;quot;neato&amp;quot;.
I'm having trouble getting the lengths to fully work in all of the cases I want to cover, but I can fake it by throwing some random mathematical operations at it.&lt;/p&gt;
&lt;p&gt;I'm going to step back from trying to get the shapes &amp;quot;exactly right&amp;quot;, and consider what I need to add to get the rendering right.&lt;/p&gt;
&lt;p&gt;What I'm basically doing here is creating a polygon, where the graphviz nodes correspond to the vertices, and to the midpoints of the edges.
(And some other nodes that just exist to try to control the layout.)
In my proof-of-concept code, they just have generated names/labels, but want to be dropping in nodes with custom labels that may end up pulling in other nodes connected to them.&lt;/p&gt;
&lt;p&gt;Okay, as I think about that, I think I might want to try harder to express the positions of this stuff in absolute terms, and with the aid of piles of trig...&lt;/p&gt;
&lt;p&gt;As I see it, the problem of layout boils down to:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Determine the convex hull of each component&lt;/li&gt;
&lt;li&gt;Generate a set of points based on the required graph structure&lt;/li&gt;
&lt;li&gt;Generate the Voronoi diagram of the point set&lt;/li&gt;
&lt;li&gt;Place the anchor point of each component on its corresponding point, and scale the distances between points until the convex hull is entirely within the corresponding region of the Voronoi diagram&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All right, I think this, like, should work, but I've put enough effort into this that I'm now willing to try simpler solutions that don't have as much pizzazz.&lt;/p&gt;
&lt;p&gt;Okay, I started working on that, and I need to put in more effort, but I'll be fine with a barebones representation for now.&lt;/p&gt;
&lt;p&gt;It's getting late,so I'll get back to writing tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-03-02</title><link href="https://mwchase.neocities.org/coding-2022-03-02" rel="alternate"></link><published>2022-03-02T05:00:00-05:00</published><updated>2022-03-02T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-03-02:/coding-2022-03-02</id><summary type="html">&lt;p class="first last"&gt;And now for something completely different.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Instead of working more on MOTR, I'm looking into a few things.
One is messing with messing with DBus, with an eye towards getting global menu support for applications that I might write in the future.
This might end up not being useful directly, depending on the GUI toolkits I favor, but DBus seems powerful enough that I'll probably manage to find &lt;em&gt;something&lt;/em&gt; to do with it at some point.&lt;/p&gt;
&lt;p&gt;I'm also trying to put together some code to help with some writing exercises I want to try.
Rather than automating the bookkeeping, like with some of my other projects, my goal here is solely to have some way to nicely collect and lay out data as I enter it in.
My first thought was &amp;quot;Oh, I'll do it in graphviz&amp;quot;, and my initial experiments suggest that that will not work, so I'm thinking about writing code to lay out SVGs, because the major issue I ran into was that the nodes just kind of go where they feel like, and I couldn't get any sense of how to do something like say &amp;quot;space out these nodes along a circle, and these other nodes along a bigger circle&amp;quot;.&lt;/p&gt;
&lt;p&gt;Anyway, I spent quite a while messing with those things and making embarrassing mistakes, so it's late now, but I'll get back into it tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2022-03-01</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-03-01" rel="alternate"></link><published>2022-03-01T05:00:00-05:00</published><updated>2022-03-01T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-03-01:/weekly-roundup-2022-03-01</id><summary type="html">&lt;p class="first last"&gt;Wow, that's February gone.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The weekly backup is taking longer than I was hoping, so we'll see what happens if I write and upload this entry while it's going...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I snarked about the way my laptop works, and made a little progress worldbuilding.&lt;/li&gt;
&lt;li&gt;Thursday: I amended the previous snark with information that, in my opinion, just made things worse. I decided to cut the current worldbuilding draft short.&lt;/li&gt;
&lt;li&gt;Friday: I wrote some utility stuff for MOTR, and made some notes for later, in case I need to make certain fields more powerful.&lt;/li&gt;
&lt;li&gt;Saturday: I made some improvements to my design for part of MOTR, and planned what to work on next.&lt;/li&gt;
&lt;li&gt;Sunday: I did some cleanup, which I didn't really describe, and some planning, which I did.&lt;/li&gt;
&lt;li&gt;Monday: Now that the &lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt; classes are almost done, I started checking over the code that would use them, to make sure they can handle everything they need to. As it happens, they can't quite, so I've got a small amount of work left to do.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to shift gears a bit, but I'm not committing to &lt;em&gt;how&lt;/em&gt;, yet.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-02-28</title><link href="https://mwchase.neocities.org/coding-2022-02-28" rel="alternate"></link><published>2022-02-28T05:00:00-05:00</published><updated>2022-02-28T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-02-28:/coding-2022-02-28</id><summary type="html">&lt;p class="first last"&gt;It needs a bit of work, but probably not too much.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Earlier today, I tried to make the &lt;tt class="docutils literal"&gt;DynamicMeta&lt;/tt&gt; class more robust.
We'll see how that works out for me.&lt;/p&gt;
&lt;p&gt;Anyway, now I need to refresh my memory about what the command-line wrapper modules do, and what they should do, and figure out how to get between those states.&lt;/p&gt;
&lt;p&gt;So, what I think I want is to have a very abstract interface, where the modules are ultimately defining functions that produce &lt;tt class="docutils literal"&gt;Dynamic[Command[Script, Any]]&lt;/tt&gt; objects.
(They can also have functions that produce intermediate values like &lt;tt class="docutils literal"&gt;Invocation[Module, Any]&lt;/tt&gt;.)&lt;/p&gt;
&lt;p&gt;Basically, given a &lt;tt class="docutils literal"&gt;Dynamic[Command[Script, Any]]&lt;/tt&gt;, which potentially includes other &lt;tt class="docutils literal"&gt;Dynamic[Command[Script, Any]]&lt;/tt&gt; objects, that can be fed into a utility function that I should &lt;em&gt;probably&lt;/em&gt; move into &lt;tt class="docutils literal"&gt;invocation.py&lt;/tt&gt;, that should be all we need to set up the argument to &lt;tt class="docutils literal"&gt;api.build()&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Let's take a look at &lt;tt class="docutils literal"&gt;flake8.py&lt;/tt&gt;.
It has:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;A &lt;tt class="docutils literal"&gt;Program&lt;/tt&gt; subclass&lt;/li&gt;
&lt;li&gt;A &lt;tt class="docutils literal"&gt;Label[Pip]&lt;/tt&gt; for installing and running flake8&lt;/li&gt;
&lt;li&gt;A &lt;tt class="docutils literal"&gt;Command&lt;/tt&gt; alias&lt;/li&gt;
&lt;li&gt;An &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt; alias&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Command&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt; definitions&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Dynamic[Option]&lt;/tt&gt; objects&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Under the &lt;tt class="docutils literal"&gt;Invocation&lt;/tt&gt; paradigms, those last two need their &lt;tt class="docutils literal"&gt;labels&lt;/tt&gt; arguments broken out into a &lt;tt class="docutils literal"&gt;ValueAdaptor&lt;/tt&gt;, and to be converted into &lt;tt class="docutils literal"&gt;AdaptiveDynamic&lt;/tt&gt; instances.
It requires an interesting collection of &lt;tt class="docutils literal"&gt;Part&lt;/tt&gt;s to handle the HTML output, so I might need to mess around with that a bit.
Basically, it's a situation where there's an &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; &lt;tt class="docutils literal"&gt;Arg&lt;/tt&gt; that needs to be created, and it'll have a predictable child as an &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; &lt;tt class="docutils literal"&gt;Extra&lt;/tt&gt;.
What this says to me is that I should consider reworking &lt;tt class="docutils literal"&gt;FlexOut&lt;/tt&gt;.
Currently, when &lt;tt class="docutils literal"&gt;FlexOut&lt;/tt&gt; has &lt;tt class="docutils literal"&gt;make_parent = True&lt;/tt&gt;, it adds the parent to &lt;tt class="docutils literal"&gt;extra_io&lt;/tt&gt;.
So...&lt;/p&gt;
&lt;p&gt;Would it work to convert this to some kind of callback that turns the parent input into a &lt;tt class="docutils literal"&gt;CmdMeta&lt;/tt&gt;?
Since there are some... issues potentially, with creating arbitrary &lt;tt class="docutils literal"&gt;CmdMeta&lt;/tt&gt; objects, then my feeling is that I want to create some form of union of classes that implement the callbacks.
I'm going to write this down for now, rather than mess with the code more.&lt;/p&gt;
&lt;p&gt;There is more to evaluate in the other wrappers, but I'd like to wind down for now, so I'm done for tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-02-27</title><link href="https://mwchase.neocities.org/coding-2022-02-27" rel="alternate"></link><published>2022-02-27T05:00:00-05:00</published><updated>2022-02-27T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-02-27:/coding-2022-02-27</id><summary type="html">&lt;p class="first last"&gt;Intensive refactor.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I spent a lot of today cleaning stuff up.
It's... not quite done yet, unfortunately, but I need a bit of a break.
My plan now is:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Finish updating the &lt;tt class="docutils literal"&gt;DynamicMetadata&lt;/tt&gt; class&lt;/li&gt;
&lt;li&gt;Review the existing wrapper code&lt;/li&gt;
&lt;li&gt;Update the wrappers&lt;/li&gt;
&lt;li&gt;Write new wrappers&lt;/li&gt;
&lt;li&gt;Review the overall code base in terms of names and organization&lt;/li&gt;
&lt;li&gt;Consider reorganizing the tests, and possibly including &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;limit-coverage&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;Write new tests to get the coverage up to full&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For now, I'm going to take things easy again, and see what I'm up for working on tomorrow.
For now, I don't know, take things easy one way or another.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-02-26</title><link href="https://mwchase.neocities.org/coding-2022-02-26" rel="alternate"></link><published>2022-02-26T05:00:00-05:00</published><updated>2022-02-26T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-02-26:/coding-2022-02-26</id><summary type="html">&lt;p class="first last"&gt;Satisfying, but hard-to-describe, progress.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't put in much time on MOTR tonight, but I made some really nice progress on the &lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt; classes by reworking the Protocol to expose what was formerly a convenience method, and move the logic specific to the &amp;quot;old&amp;quot; methods into the wrapper classes.
With this, the &lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt; classes are complete, and my priorities now are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Remove the &lt;tt class="docutils literal"&gt;flex&lt;/tt&gt; functions&lt;/li&gt;
&lt;li&gt;Update stuff related to the &lt;tt class="docutils literal"&gt;DynamicMeta&lt;/tt&gt; class&lt;/li&gt;
&lt;li&gt;Update some names&lt;/li&gt;
&lt;li&gt;Implement functionality required by the motrfile&lt;/li&gt;
&lt;li&gt;Maybe I missed something?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, I'm going to get ready for bed now and be glad that I finished this up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-02-25</title><link href="https://mwchase.neocities.org/coding-2022-02-25" rel="alternate"></link><published>2022-02-25T05:00:00-05:00</published><updated>2022-02-25T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-02-25:/coding-2022-02-25</id><summary type="html">&lt;p class="first last"&gt;I need this, okay?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I had a miserable day at work today, all inflicted by technology, so to wind down, I hacked a bit on MOTR, which I can at least reliably &lt;em&gt;understand&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The specific thing I worked on today was a helper class for writing validators for use on &lt;a class="reference external" href="https://www.attrs.org/en/stable/"&gt;attrs&lt;/a&gt; classes.
This was inspired by noticing that some of the &lt;tt class="docutils literal"&gt;flex&lt;/tt&gt; functions have validation logic, that I haven't replicated on the &lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt; classes yet.
Some of the stuff I thought of didn't exist in the code before, but basically makes sense.&lt;/p&gt;
&lt;p&gt;One unfortunate thing that occurred to me as I worked on this is that there's some functionality that I'm not quite sure how to support.
In light of that, I'm going to pare it back until I have a need for it.&lt;/p&gt;
&lt;p&gt;The feature in question was dynamically naming the output produced by a &lt;tt class="docutils literal"&gt;FlexOut&lt;/tt&gt;.
Thinking about this, I came up with a plan for supporting this, but it's so fiddly that I'm not going to try without a reason.
Basically, instead of storing the names directly as a &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt;...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Add a type variable to &lt;tt class="docutils literal"&gt;InputAccumulator&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;ValueAdaptor&lt;/tt&gt;, so I can control the type produced by the &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;If that works, give &lt;tt class="docutils literal"&gt;FlexOut&lt;/tt&gt; an &lt;tt class="docutils literal"&gt;InputAccumulator[Sequence[str]]&lt;/tt&gt;; if that doesn't work out, give it a sequence of &lt;tt class="docutils literal"&gt;InputAccumulator&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;In either case, also give it a sequence of &lt;tt class="docutils literal"&gt;ValueAdaptor&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;When implementing a method from the &lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt; interface, filter out any &lt;tt class="docutils literal"&gt;ValueAdaptor&lt;/tt&gt; instances that don't correspond to what was passed in, and &lt;em&gt;then&lt;/em&gt; perform the accumulation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This sounds like a solid idea, but I don't really want to try it until I've determined that there's a need.&lt;/p&gt;
&lt;p&gt;Anyway, I'm done for tonight, and I'm going to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Worldbuilding — Korín, Sorín, and Arín 2022-02-24</title><link href="https://mwchase.neocities.org/worldbuilding-ksa-2022-02-24" rel="alternate"></link><published>2022-02-24T05:00:00-05:00</published><updated>2022-02-24T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-02-24:/worldbuilding-ksa-2022-02-24</id><summary type="html">&lt;p class="first last"&gt;Just felt kind of bad and gross today, so I cut things short.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Minor thing I missed yesterday: the fact that I'm using SDDM instead of LightDM was apparently somehow relevant.
I...&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Why&lt;/em&gt;?
&lt;em&gt;Why computers&lt;/em&gt;?&lt;/p&gt;
&lt;p&gt;Nevertheless...&lt;/p&gt;
&lt;p&gt;I thought about this, and I decided that I'm done for now.
I mean, for all that this is not as long as it could be, it's still rather overdetailed already.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to take care of some other stuff, and try to take it easy for a bit.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Worldbuilding — Korín, Sorín, and Arín"></category></entry><entry><title>Worldbuilding — Korín, Sorín, and Arín 2022-02-23</title><link href="https://mwchase.neocities.org/worldbuilding-ksa-2022-02-23" rel="alternate"></link><published>2022-02-23T05:00:00-05:00</published><updated>2022-02-23T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-02-23:/worldbuilding-ksa-2022-02-23</id><summary type="html">&lt;p class="first last"&gt;The point of the &amp;quot;*checks notes*&amp;quot; is to communicate incredulity.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Before I start writing up stuff for worldbuilding, I want to say that my laptop seems to be working fine now, without any of the rough edges introduced by previous workarounds, and I want to thank the &lt;a class="reference external" href="https://github.com/fish-shell/fish-shell/issues/8741#issuecomment-1047820309"&gt;fish devs&lt;/a&gt; for&lt;/p&gt;
&lt;p&gt;*checks notes*&lt;/p&gt;
&lt;p&gt;providing a snippet to copy into &lt;tt class="docutils literal"&gt;config.fish&lt;/tt&gt;, which prevents&lt;/p&gt;
&lt;p&gt;*checks notes*&lt;/p&gt;
&lt;p&gt;snapd from clobbering&lt;/p&gt;
&lt;p&gt;*checks notes*&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;$XDG_DATA_DIRS&lt;/tt&gt;, which resolves the&lt;/p&gt;
&lt;p&gt;*checks notes*&lt;/p&gt;
&lt;p&gt;segfault in&lt;/p&gt;
&lt;p&gt;*checks notes*&lt;/p&gt;
&lt;p&gt;ksplashqml, which prevented&lt;/p&gt;
&lt;p&gt;*checks notes*&lt;/p&gt;
&lt;p&gt;Plasma from starting up properly.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Computers!&lt;/p&gt;
&lt;p&gt;Anyway, let's see what I can pick off when it comes to worldbuilding.&lt;/p&gt;
&lt;p&gt;I did a little work, so, let's see what's still needed...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Notes on magic;
Started filling stuff in;
Unfortunately, a lot of this was in my head, so I'll need to work out some of the details from scratch.&lt;/li&gt;
&lt;li&gt;Notes on how to play the different subspecies
...
I forget what I meant by this.
Oops.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When I started working on this draft, I had some ideas about, like an overarching sensible organization.
It looks like I'm going to have to accept that the layout of information is going to be, for now, slapdash and inscrutable.&lt;/p&gt;
&lt;p&gt;Anyway, in light of that second bullet, I should be done with the current draft once I flesh out magical techniques a bit more.&lt;/p&gt;
&lt;p&gt;It's late, and I'm nearly done.
I'd best take a break now, and leave the rest for the next few days.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Worldbuilding — Korín, Sorín, and Arín"></category></entry><entry><title>Weekly Roundup 2022-02-22</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-02-22" rel="alternate"></link><published>2022-02-22T05:00:00-05:00</published><updated>2022-02-22T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-02-22:/weekly-roundup-2022-02-22</id><summary type="html">&lt;p class="first last"&gt;Speaking as someone who currently has these problems, they sound extremely fake.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I added onto the worldbuilding draft.&lt;/li&gt;
&lt;li&gt;Thursday: I continued to add onto the worldbuilding draft.&lt;/li&gt;
&lt;li&gt;Friday: I added a bit more onto the worldbuilding draft.&lt;/li&gt;
&lt;li&gt;Saturday: I mentioned The Weird Growth On My Arm That We Only Know What It Isn't.&lt;/li&gt;
&lt;li&gt;Sunday: My laptop ushered in another important milestone towards the Year of Linux on the Desktop, by having the desktop login code segfault because I was using &lt;a class="reference external" href="https://fishshell.com/"&gt;fish&lt;/a&gt; as my shell instead of &lt;a class="reference external" href="https://www.gnu.org/software/bash/"&gt;bash&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Monday: I figured that out, and got some work done on MOTR.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to work on whatever.
I probably &lt;em&gt;should&lt;/em&gt; take a break from MOTR until the weekend, but I made some good breakthroughs once I got my laptop working again, and it looks like a straight shot to getting this stuff implemented.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-02-21</title><link href="https://mwchase.neocities.org/coding-2022-02-21" rel="alternate"></link><published>2022-02-21T05:00:00-05:00</published><updated>2022-02-21T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-02-21:/coding-2022-02-21</id><summary type="html">&lt;p class="first last"&gt;Laptop situation upgraded from &amp;quot;borderline nonfunctional&amp;quot; to &amp;quot;somewhat uncanny&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;My laptop is still broken in weird ways, but it's now mostly working, thanks to some tips on a workaround that I got from Launchpad.
There's supposed to be a bug report, but there's so much going on that I'm kind of not sure how to isolate a single bug out of everything that I'm seeing.&lt;/p&gt;
&lt;p&gt;Anyway, I did a little work fixing bugs in unused code paths in MOTR yesterday, but let's see what I can do in terms of filling in the stubs I wrote.&lt;/p&gt;
&lt;p&gt;First up is the &lt;tt class="docutils literal"&gt;as_arg&lt;/tt&gt; method for &lt;tt class="docutils literal"&gt;FlexIn&lt;/tt&gt;.
This has to convert a &lt;tt class="docutils literal"&gt;Dynamic[Input[PathStr]]&lt;/tt&gt; into a &lt;tt class="docutils literal"&gt;Dynamic[CmdMeta]&lt;/tt&gt;.
The outermost layer of this is accomplished with the &lt;tt class="docutils literal"&gt;dynamic.reduce&lt;/tt&gt; function, which takes a reducer function, a &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt; object to provide a template for the arguments to the reducer, a set of &lt;tt class="docutils literal"&gt;Key&lt;/tt&gt; objects to iterate over, and an initial value.
For this method, the values break down as follows:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The initial value is the empty &lt;tt class="docutils literal"&gt;CmdMeta&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;The keys are the argument to the method; the types involved may need to change somewhere.&lt;/li&gt;
&lt;li&gt;If the prefix value is &lt;tt class="docutils literal"&gt;None&lt;/tt&gt;, then the template is just the result of mapping the &lt;tt class="docutils literal"&gt;FlexIn&lt;/tt&gt;'s wrapped value into a &lt;tt class="docutils literal"&gt;CmdMeta&lt;/tt&gt;, which is easy.
If the prefix is not &lt;tt class="docutils literal"&gt;None&lt;/tt&gt;, then it's as above, but mapping the prefix and the wrapped value.&lt;/li&gt;
&lt;li&gt;The reducer is &lt;tt class="docutils literal"&gt;CmdMeta.combine&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Well, let's see what kind of problems this gives me.&lt;/p&gt;
&lt;p&gt;Not too bad.
All of the problems were misunderstandings on my end, that I cleared up quickly.&lt;/p&gt;
&lt;p&gt;Anyway, there are five more methods to cover...
Next up, in terms of ease versus utility, I can either take a look at the &lt;tt class="docutils literal"&gt;as_extra&lt;/tt&gt; method for &lt;tt class="docutils literal"&gt;FlexIn&lt;/tt&gt;, or the &lt;tt class="docutils literal"&gt;as_arg&lt;/tt&gt; method for &lt;tt class="docutils literal"&gt;FlexOut&lt;/tt&gt;, then do the other one of those, then &lt;tt class="docutils literal"&gt;as_extra&lt;/tt&gt; for &lt;tt class="docutils literal"&gt;FlexOut&lt;/tt&gt;.
After that, I can do the &lt;tt class="docutils literal"&gt;as_env_var&lt;/tt&gt; methods for completeness, but I don't think I need those right now.&lt;/p&gt;
&lt;p&gt;For now, I'm going to take a little break from the code, and take a look at it with fresh eyes later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2022-02-20</title><link href="https://mwchase.neocities.org/diary-2022-02-20" rel="alternate"></link><published>2022-02-20T05:00:00-05:00</published><updated>2022-02-20T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-02-20:/diary-2022-02-20</id><summary type="html">&lt;p class="first last"&gt;My laptop is full of mysteries, and aargh...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Early entry today because my laptop is freaking out in ways I don't understand, and I'm just glad I've gotten enough working to post this.&lt;/p&gt;
&lt;p&gt;Unless I get some kind of epiphany on how to fix this, my weekend is shot.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-02-19</title><link href="https://mwchase.neocities.org/diary-2022-02-19" rel="alternate"></link><published>2022-02-19T05:00:00-05:00</published><updated>2022-02-19T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-02-19:/diary-2022-02-19</id><summary type="html">&lt;p class="first last"&gt;The human body is full of mysteries, but I'd rather not deal with this one.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I tried to take things easy today, since I've been kind of wiped out these last few days.&lt;/p&gt;
&lt;p&gt;One thing that's been ongoing for the past few weeks is, I've been keeping tabs on a Mysterious Growth on my arm.
It's been poked and scanned, and it's not totally clear what it is, but it's shrunk considerably since it suddenly showed up, so I'm not really worried, just kind of... annoyed that we only seem to know what it &lt;em&gt;isn't&lt;/em&gt;.
The plan is to see if it goes away in a few months, or does something surprising before then.&lt;/p&gt;
&lt;p&gt;I waited a bit to see if I'd come up with something else to say, and, I guess not.
I should get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Worldbuilding — Korín, Sorín, and Arín 2022-02-18</title><link href="https://mwchase.neocities.org/worldbuilding-ksa-2022-02-18" rel="alternate"></link><published>2022-02-18T05:00:00-05:00</published><updated>2022-02-18T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-02-18:/worldbuilding-ksa-2022-02-18</id><summary type="html">&lt;p class="first last"&gt;My rate of progress makes sense in light of the fact that I'm &lt;em&gt;really&lt;/em&gt; sleepy.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did a little work, so, let's see what's still needed...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Notes on magic;
Started filling stuff in;
I put in some general notes on all magic, and now I need to fill in a bunch of specifics.&lt;/li&gt;
&lt;li&gt;Notes on technology&lt;/li&gt;
&lt;li&gt;Military history stuff&lt;/li&gt;
&lt;li&gt;Notes on how to play the different subspecies&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I recognize that I'm only picking off a few bullets at a time, but, counterpoint, I'm really tired, and I'm glad to get anything done right now.&lt;/p&gt;
&lt;p&gt;I guess I'm not going to finish with this this week, unless maybe I do some work on it during the day over the weekend.&lt;/p&gt;
&lt;p&gt;Anyway, I want to take things easy now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Worldbuilding — Korín, Sorín, and Arín"></category></entry><entry><title>Worldbuilding — Korín, Sorín, and Arín 2022-02-17</title><link href="https://mwchase.neocities.org/worldbuilding-ksa-2022-02-17" rel="alternate"></link><published>2022-02-17T05:00:00-05:00</published><updated>2022-02-17T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-02-17:/worldbuilding-ksa-2022-02-17</id><summary type="html">&lt;p class="first last"&gt;Getting the easy bits copied and transcribed.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's see about that list.
Got a bit done before I started on this entry, so now what remains is...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Notes on magic;
Added a partial outline&lt;/li&gt;
&lt;li&gt;Additional notes on dragons (including legendary figures)&lt;/li&gt;
&lt;li&gt;Notes on technology&lt;/li&gt;
&lt;li&gt;Military history stuff&lt;/li&gt;
&lt;li&gt;Notes on how to play the different subspecies&lt;/li&gt;
&lt;li&gt;Some flavor derived from what the dragons in this setting sound like.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm going to call things here.
It was a quick bit of work, but it's progress, and I was tired all day, so I'm not going to push things.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Worldbuilding — Korín, Sorín, and Arín"></category></entry><entry><title>Worldbuilding — Korín, Sorín, and Arín 2022-02-16</title><link href="https://mwchase.neocities.org/worldbuilding-ksa-2022-02-16" rel="alternate"></link><published>2022-02-16T05:00:00-05:00</published><updated>2022-02-16T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-02-16:/worldbuilding-ksa-2022-02-16</id><summary type="html">&lt;p class="first last"&gt;There are a lot of list items, but most of this stuff is pretty short in the notes, and will end up pretty short in the rough draft.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Let's see what remains in the notes and my head.&lt;/p&gt;
&lt;p&gt;In my head, there are some ideas about the usage of the magic system.
Basically, different disciplines that apply to different kinds of magic.
Also, some details about how specific bits of the magic system might &amp;quot;really work&amp;quot;.&lt;/p&gt;
&lt;p&gt;In the notes, I've got...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Details about some cultures' languages; I'll &lt;em&gt;probably&lt;/em&gt; leave these out of the first draft.&lt;/li&gt;
&lt;li&gt;Some sections that I'd mixed up where they went to, so I just now fixed that up.&lt;/li&gt;
&lt;li&gt;A geographical feature where nobody &lt;em&gt;lives&lt;/em&gt;, so it doesn't really fit in with discussing settlements.&lt;/li&gt;
&lt;li&gt;Notes on technology.&lt;/li&gt;
&lt;li&gt;Military history that might not be valid any more.&lt;/li&gt;
&lt;li&gt;Some literary history that I definitely need to fit in.
It's stuff about the dragons in the setting.&lt;/li&gt;
&lt;li&gt;A discussion of some of the more mysterious locations.&lt;/li&gt;
&lt;li&gt;Notes on which subspecies &amp;quot;make sense&amp;quot; for player characters if using this as an RPG sourcebook.
I'll need to reconsider these on general principle.&lt;/li&gt;
&lt;li&gt;Some key notes about subspecies characteristics that people might assume incorrect things about.&lt;/li&gt;
&lt;li&gt;A few minor details.&lt;/li&gt;
&lt;li&gt;Some flavor derived from what the dragons in this setting sound like.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Okay, that's good to work with.
I don't want to think too hard about how to organize all this, but I do want to think &lt;em&gt;some&lt;/em&gt;, before I start putting this all together.&lt;/p&gt;
&lt;p&gt;Anyway, that feels like a good place to call it.
Tomorrow, I'll work on the geographic stuff first, then, I don't know, outline some stuff by hand.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Worldbuilding — Korín, Sorín, and Arín"></category></entry><entry><title>Weekly Roundup 2022-02-15</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-02-15" rel="alternate"></link><published>2022-02-15T05:00:00-05:00</published><updated>2022-02-15T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-02-15:/weekly-roundup-2022-02-15</id><summary type="html">&lt;p class="first last"&gt;Good forward progress, once again.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I wrote a bit more worldbuilding information, and learned that I'm &lt;em&gt;still&lt;/em&gt; not used to rough drafts being... rough.&lt;/li&gt;
&lt;li&gt;Thursday: I reminded myself of one of the motivations for the worldbuilding project, which is to come up with stuff that makes me go &amp;quot;that's cool&amp;quot;.&lt;/li&gt;
&lt;li&gt;Friday: I made more progress transcribing stuff.&lt;/li&gt;
&lt;li&gt;Saturday: I finished with the first pass on the worldbuilding draft, and decided to take a break from it for a few days.&lt;/li&gt;
&lt;li&gt;Sunday: I started putting my notes on MOTR into practice again.&lt;/li&gt;
&lt;li&gt;Monday: I made a few minor tweaks to the code.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to get back to the worldbuilding stuff during the week, and maybe work on MOTR on the weekend.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-02-14</title><link href="https://mwchase.neocities.org/coding-2022-02-14" rel="alternate"></link><published>2022-02-14T05:00:00-05:00</published><updated>2022-02-14T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-02-14:/coding-2022-02-14</id><summary type="html">&lt;p class="first last"&gt;Tantalizingly close, but I don't want to push myself right now.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's see.
I don't know how much more code I'm up for touching tonight, but I made some improvements earlier today by noticing that some layers in the new code were redundant, and stripping them out.&lt;/p&gt;
&lt;p&gt;At this point, the API should be mostly done when I reimplement the &lt;tt class="docutils literal"&gt;flex&lt;/tt&gt; functions as methods on the &lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt; classes, and then start using the &lt;tt class="docutils literal"&gt;Invocation&lt;/tt&gt; class to implement specific programs.&lt;/p&gt;
&lt;p&gt;I think for now, I'm just going to put in explanatory comments for me to act on later.&lt;/p&gt;
&lt;p&gt;For now, I'm going to look for a way to relax, because I'm kind of wound up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-02-13</title><link href="https://mwchase.neocities.org/coding-2022-02-13" rel="alternate"></link><published>2022-02-13T05:00:00-05:00</published><updated>2022-02-13T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-02-13:/coding-2022-02-13</id><summary type="html">&lt;p class="first last"&gt;Kind of a weird &lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I want to get back to work on MOTR, but I'm feeling a little fidgety and jittery.
Here's what I've got...&lt;/p&gt;
&lt;p&gt;The &lt;tt class="docutils literal"&gt;Part&lt;/tt&gt; alias in &lt;tt class="docutils literal"&gt;invocation.py&lt;/tt&gt; currently uses &lt;tt class="docutils literal"&gt;_input_accumulator.InputAccumulator&lt;/tt&gt; directly.&lt;/p&gt;
&lt;p&gt;This needs to be changed to a &lt;tt class="docutils literal"&gt;Union[Argument, EnvVar, Extra]&lt;/tt&gt;, where those classes need to be written.
These wrap classes that implement the &lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt; protocol.&lt;/p&gt;
&lt;p&gt;So, let's start by building up the higher-level interfaces...&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt; protocol and consumer types, done.
Now to just hook it up at the high level.
And...
Hm.
There are issues.
I think they can be addressed... like... this...
Okay, that partly works...
And I've figured out the rest.&lt;/p&gt;
&lt;p&gt;The code is pretty gnarly, so I'm going to have to revisit how I implement this later.&lt;/p&gt;
&lt;p&gt;I got on this early, so I'm going to take a break for a bit and get back to this later.
I think the next thing I want to do when I come back, is move some of this code I just added to its own module.&lt;/p&gt;
&lt;p&gt;Okay, I'm doing that, and I'm going to call it a night once I get flake8 passing.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Worldbuilding — Korín, Sorín, and Arín 2022-02-12</title><link href="https://mwchase.neocities.org/worldbuilding-ksa-2022-02-12" rel="alternate"></link><published>2022-02-12T05:00:00-05:00</published><updated>2022-02-12T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-02-12:/worldbuilding-ksa-2022-02-12</id><summary type="html">&lt;p class="first last"&gt;Hopefully just another week or so before I finish the current draft.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, after a bit more work, I'm basically done with my first pass over my worldbuilding notes.
I'd like to take a bit of a break from this, but I should be able to finish things up pretty quickly once I've taken that break.&lt;/p&gt;
&lt;p&gt;I'd like to have something else to say here but... I guess I don't?&lt;/p&gt;
&lt;p&gt;Thinking about things I could talk about...
It might make sense to discuss the tools I'm using, to see if they click for anyone else to use in their own projects.&lt;/p&gt;
&lt;p&gt;But, I don't have my thoughts in order for that right now, and I'd rather just kick back and take things easy for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Worldbuilding — Korín, Sorín, and Arín"></category></entry><entry><title>Worldbuilding — Korín, Sorín, and Arín 2022-02-11</title><link href="https://mwchase.neocities.org/worldbuilding-ksa-2022-02-11" rel="alternate"></link><published>2022-02-11T05:00:00-05:00</published><updated>2022-02-11T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-02-11:/worldbuilding-ksa-2022-02-11</id><summary type="html">&lt;p class="first last"&gt;It happened again.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;At this point, I seem to be about halfway through the other notes file.
And I &lt;em&gt;know&lt;/em&gt; some of that isn't going into the current draft.
So, the draft should be ready in a few days.&lt;/p&gt;
&lt;p&gt;I still don't want to go into detail, but it continues to feel good to revisit the ideas I had and go &amp;quot;Oh yeah! I did all of this because I thought it was cool!&amp;quot;&lt;/p&gt;
&lt;p&gt;(Worry not, I'm not going for &amp;quot;It's cool so it doesn't matter that it doesn't make sense&amp;quot;.
I'm going for &amp;quot;It's cool &lt;em&gt;because&lt;/em&gt; it makes sense, despite being so outlandish&amp;quot;.
With, admittedly, a bit of &amp;quot;Well, this part is clearly magic, because it doesn't make physical sense&amp;quot;.
The way I see it, I should strive for realism in people's responses to a situation, and in the behavior of the world around them, I should strive for &lt;em&gt;consistency&lt;/em&gt;.)&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to wrap things up for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Worldbuilding — Korín, Sorín, and Arín"></category></entry><entry><title>Worldbuilding — Korín, Sorín, and Arín 2022-02-10</title><link href="https://mwchase.neocities.org/worldbuilding-ksa-2022-02-10" rel="alternate"></link><published>2022-02-10T05:00:00-05:00</published><updated>2022-02-10T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-02-10:/worldbuilding-ksa-2022-02-10</id><summary type="html">&lt;p class="first last"&gt;Another one of those &amp;quot;too much work to write about the work&amp;quot; nights.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, it's super late, so I'm going to make this super short.&lt;/p&gt;
&lt;p&gt;I have two main notes files (that I remember...), and I've transcribed most of one of them.
In reading over it, I reminded myself of some of the things that got me excited about this setting in the first place, so that was nice.&lt;/p&gt;
&lt;p&gt;Anyway, good progress, more work to be done, best chance of doing it if I get to sleep soon, shouldn't dawdle!&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Worldbuilding — Korín, Sorín, and Arín"></category></entry><entry><title>Worldbuilding — Korín, Sorín, and Arín 2022-02-09</title><link href="https://mwchase.neocities.org/worldbuilding-ksa-2022-02-09" rel="alternate"></link><published>2022-02-09T05:00:00-05:00</published><updated>2022-02-09T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-02-09:/worldbuilding-ksa-2022-02-09</id><summary type="html">&lt;p class="first last"&gt;Just looking at my own brain and going &amp;quot;This isn't fair!&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got a few more pages drafted, and it appears that &lt;em&gt;every single writing project&lt;/em&gt; is going to require me to re-learn to put in my rough draft without worrying about quality.&lt;/p&gt;
&lt;p&gt;I'm just going to have to settle for scrawling stuff out and not worrying for now about &amp;quot;Is this in a sensible order?&amp;quot; or &amp;quot;Can anyone else understand this?&amp;quot;.&lt;/p&gt;
&lt;p&gt;I feel like I should apologize for the fact that, even though I have this blockage everywhere else, I &lt;em&gt;don't&lt;/em&gt; have it for Three Dollar Quill.
I don't know.&lt;/p&gt;
&lt;p&gt;Anyway, I'll settle for making a bit of progress a day, then getting everything together and trying to wrangle it into shape.&lt;/p&gt;
&lt;p&gt;There isn't really much else to say.
I wanted to do the thing some.
I did the thing some.
Objective attained.&lt;/p&gt;
&lt;p&gt;I'm going to play Vampire Survivors or something.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Worldbuilding — Korín, Sorín, and Arín"></category></entry><entry><title>Weekly Roundup 2022-02-08</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-02-08" rel="alternate"></link><published>2022-02-08T05:00:00-05:00</published><updated>2022-02-08T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-02-08:/weekly-roundup-2022-02-08</id><summary type="html">&lt;p class="first last"&gt;Hopefully, this all translates into progress.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I took some notes for the math writing that I'm totally working on...&lt;/li&gt;
&lt;li&gt;Thursday: I found the worldbuilding notes that I want to rework into the reference document.&lt;/li&gt;
&lt;li&gt;Friday: I worked on... stuff... and mostly took things easy.&lt;/li&gt;
&lt;li&gt;Saturday: I did some planning for MOTR that's going to be necessary to keep things from grinding to even more of a halt.&lt;/li&gt;
&lt;li&gt;Sunday: I did some prototyping based on the planning.&lt;/li&gt;
&lt;li&gt;Monday: I iterated on the prototyping.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to plan for taking it easy.
Some things have come up that make it so I'm even less able to be confident about hitting any kind of pace or goal.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-02-07</title><link href="https://mwchase.neocities.org/coding-2022-02-07" rel="alternate"></link><published>2022-02-07T05:00:00-05:00</published><updated>2022-02-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-02-07:/coding-2022-02-07</id><summary type="html">&lt;p class="first last"&gt;Either so close, or so far...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I spent some time tweaking the prototype.
Right now, it's at a point where I can kind of see how it'll come together, but I think I need some time to leave it be, and revisit it to see if it all makes sense later.&lt;/p&gt;
&lt;p&gt;I'm not up for thinking or writing about too much else today, so I'm going to have this be a short entry, and wind down early-ish.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-02-06</title><link href="https://mwchase.neocities.org/coding-2022-02-06" rel="alternate"></link><published>2022-02-06T05:00:00-05:00</published><updated>2022-02-06T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-02-06:/coding-2022-02-06</id><summary type="html">&lt;p class="first last"&gt;Let's see what I'm missing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I've decided that if I want to get anywhere with the &lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt; concept, I need to do some prototyping.&lt;/p&gt;
&lt;p&gt;So, let's see what I've got...&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;__future__&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;annotations&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;typing&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;attr&lt;/span&gt;

&lt;span class="n"&gt;T_co&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TypeVar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;T_co&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;covariant&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@attr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataclass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frozen&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FlexIn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;typing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Generic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T_co&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Dynamic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T_co&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;as_arg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;FlexIn&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;PathStr&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Requirements&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;as_env_var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;FlexIn&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;PathStr&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Requirements&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;as_extra&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;FlexIn&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Target&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Requirements&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt;

&lt;span class="nd"&gt;@attr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataclass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frozen&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FlexOut&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;typing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Generic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T_co&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Dynamic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;PathStr&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
    &lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;PathStr&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;T_co&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;dynamic_output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Dynamic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;typing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sequence&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
    &lt;span class="n"&gt;target_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;FlexIn&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T_co&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
    &lt;span class="n"&gt;make_parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;as_arg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;FlexOut&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;PathStr&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Requirements&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;as_env_var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;FlexOut&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;PathStr&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Requirements&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;as_extra&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;FlexOut&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Target&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Requirements&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt;

&lt;span class="n"&gt;FlexType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Union&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;FlexIn&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T_co&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;FlexOut&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T_co&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;

&lt;span class="n"&gt;Flex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FlexIn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FlexOut&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This should be the basic outline of the &lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt; types, although it does need some work to nail down many of the details.&lt;/p&gt;
&lt;p&gt;I did give this a few iterations just now, so this should illustrate most of the issues I need to deal with.&lt;/p&gt;
&lt;p&gt;For now, I'm glad to have thought some of this through, and I'll look into putting this together with some of my notes.
If I can nail down the right type for the &lt;tt class="docutils literal"&gt;keys&lt;/tt&gt; arguments, I should be able to prove out these interfaces by replacing the existing stuff with them.&lt;/p&gt;
&lt;p&gt;Right now, I want to rest.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-02-05</title><link href="https://mwchase.neocities.org/coding-2022-02-05" rel="alternate"></link><published>2022-02-05T05:00:00-05:00</published><updated>2022-02-05T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-02-05:/coding-2022-02-05</id><summary type="html">&lt;p class="first last"&gt;Trying to get this to make sense...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;In some (entirely predictable) circumstances, I'm not up for serious work right now, but some stuff is occurring to me about MOTR.&lt;/p&gt;
&lt;p&gt;I was talking earlier about creating &lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt; types to rearrange the overall flow of the &lt;tt class="docutils literal"&gt;Invocation&lt;/tt&gt; processing.
Well, here's something from earlier that I just remembered.
While arguments and environment variables can be handled somewhat reasonably, &amp;quot;extra&amp;quot; inputs and outputs are just different enough that I think that I need to parameterize the &lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt; types.&lt;/p&gt;
&lt;p&gt;But, if I go down that road, I'm going to need to be really careful.&lt;/p&gt;
&lt;p&gt;Because, let's see...&lt;/p&gt;
&lt;p&gt;The whole reason that &amp;quot;extra&amp;quot; inputs and outputs &lt;em&gt;need&lt;/em&gt; this additional flexibility is that the coverage flow needs to support deletes.&lt;/p&gt;
&lt;p&gt;Now, think this through...&lt;/p&gt;
&lt;p&gt;The &lt;tt class="docutils literal"&gt;coverage erase&lt;/tt&gt; command needs to be invoked together with the &lt;tt class="docutils literal"&gt;coverage run&lt;/tt&gt; commands so they get the exact same set of flex arguments.
I forget what order I thought things should go in, but this kind of seem like maybe the output-focused &lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt; objects need an adaptor function to handle their type parameter, while the input versions can just use the parameter directly.&lt;/p&gt;
&lt;p&gt;I think that's about as much design work as I can handle for tonight, so I'm going to wrap up and take the rest of the night easy.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2022-02-04</title><link href="https://mwchase.neocities.org/diary-2022-02-04" rel="alternate"></link><published>2022-02-04T05:00:00-05:00</published><updated>2022-02-04T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-02-04:/diary-2022-02-04</id><summary type="html">&lt;p class="first last"&gt;Okay, so I might have played &lt;em&gt;a lot&lt;/em&gt; of Vampire Survivors.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm still waiting on feedback on the worldbuilding stuff, and I ended up mostly taking today easy, which, frankly, is fine with me.
I did spend some time on a project that I don't remember if I've described, but I wouldn't mind describing it, at some later point when it's more fleshed out.&lt;/p&gt;
&lt;p&gt;Tomorrow afternoon, I should have more of a chance to work on stuff like worldbuilding or pinning down MOTR's design.&lt;/p&gt;
&lt;p&gt;For now, I really want and need to get to sleep so I can get something like a proper night's rest.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Worldbuilding — Korín, Sorín, and Arín 2022-02-03</title><link href="https://mwchase.neocities.org/worldbuilding-ksa-2022-02-03" rel="alternate"></link><published>2022-02-03T05:00:00-05:00</published><updated>2022-02-03T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-02-03:/worldbuilding-ksa-2022-02-03</id><summary type="html">&lt;p class="first last"&gt;Getting ready for a serious expansion.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I spent most of today doing other stuff, but I did take the time to, like, remind myself where my worldbuilding notes are, so I can start giving them a proper writeup.&lt;/p&gt;
&lt;p&gt;Before that, I wanted to make sure that the format I have from a really early draft of the worldbuilding document is, like, good, so I gave it to my wife to have a look.&lt;/p&gt;
&lt;p&gt;There's not enough to any of this to show off yet, but I think I'd like to try to get a draft published somewhere by the end of the year.&lt;/p&gt;
&lt;p&gt;Instead of thinking about that further, I'm going to wrap things up for now and get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Worldbuilding — Korín, Sorín, and Arín"></category></entry><entry><title>Diary 2022-02-02</title><link href="https://mwchase.neocities.org/diary-2022-02-02" rel="alternate"></link><published>2022-02-02T05:00:00-05:00</published><updated>2022-02-02T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-02-02:/diary-2022-02-02</id><summary type="html">&lt;p class="first last"&gt;Just, so many layers to some of this...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I ended up mostly focusing on notes for Missable Mysteries.
Some of these are not so much &amp;quot;notes&amp;quot; as &amp;quot;venting&amp;quot;, but I decided that it's best to get all of my thoughts down, and sort through them later.&lt;/p&gt;
&lt;p&gt;I really don't want to talk more about what exactly I'm taking notes &lt;em&gt;on&lt;/em&gt;, because I worry that the nature of &amp;quot;the document&amp;quot; would distract from my educational aims.&lt;/p&gt;
&lt;p&gt;Anyway, I left things too late to write more, but at least I made some progress on what I was actually working on.
I should wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2022-02-01</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-02-01" rel="alternate"></link><published>2022-02-01T05:00:00-05:00</published><updated>2022-02-01T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-02-01:/weekly-roundup-2022-02-01</id><summary type="html">&lt;p class="first last"&gt;Progress and setbacks&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I outlined what I expect the worldbuilding poem to convey.&lt;/li&gt;
&lt;li&gt;Thursday: I started revising the rest of the worldbuilding document, and ran into some tooling issues.&lt;/li&gt;
&lt;li&gt;Friday: I realized that solving those tooling issues won't be straightforward, and outlined some other tasks to work on later.&lt;/li&gt;
&lt;li&gt;Saturday: I fixed the tooling issues with the worldbuilding document, thereby opening the way to &lt;em&gt;so many&lt;/em&gt; fun diversions in the future.&lt;/li&gt;
&lt;li&gt;Sunday: I got back into MOTR, and began to run into... problems.&lt;/li&gt;
&lt;li&gt;Monday: I tried to work out the proper solution to my issues, and I realized it's just not happening without an actual effort at design, because the correct way to accomplish this level of abstraction that I want, has too many moving pieces under the hood to fit in my head right now.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to work on worldbuilding, and take some notes that will eventually feed into an actual plan for Missable Mysteries.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-01-31</title><link href="https://mwchase.neocities.org/coding-2022-01-31" rel="alternate"></link><published>2022-01-31T05:00:00-05:00</published><updated>2022-01-31T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-01-31:/coding-2022-01-31</id><summary type="html">&lt;p class="first last"&gt;Don't worry, I don't understand any of this at this point.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right.
The flake8-black maintainers stepped up pretty quickly, so everything was working right by sometime this morning.
Thanks for that.&lt;/p&gt;
&lt;p&gt;I wrote a basic evolution method, and set it up to be used.
There are a more to go.
I think for now, I'll focus on the ones without tricky issues.&lt;/p&gt;
&lt;p&gt;And, that didn't fully work, because the logic for combining &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt; metadata is annoyingly fiddly.
(A lowlight of this effort was realizing that I'd forgotten that I'd implemented some required logic, because it was in a function with a name that &lt;em&gt;did not indicate&lt;/em&gt; that it should be there.)&lt;/p&gt;
&lt;p&gt;Before I touch any more of this, I'm going to go over the &lt;tt class="docutils literal"&gt;flex&lt;/tt&gt; concept, carefully.&lt;/p&gt;
&lt;p&gt;The basic idea is that a given invocation will have some values that vary, not based on the base structure of the invocation, but based on values passed into the function that constructs the invocation.
To produce the required variation, the caller needs to provide a mapping from registry values to something that can fit in a path.
Let's call one of these sites of caller-parameterized variation &lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt; objects.
A given invocation can have many &lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt; objects, and what they do is take a set of keys and associated functions, and pass that data into each &lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt; object.&lt;/p&gt;
&lt;p&gt;This promises to get even more confusing, because this isn't the order that the current code does things, but maybe it &lt;em&gt;should&lt;/em&gt; do them in this order.&lt;/p&gt;
&lt;p&gt;Anyway, I've got a scenario I'm trying to work out that's confusing me.
There are two broadly different &amp;quot;modes&amp;quot; of carrying out the &lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt; operation, based on whether the goal is to produce an &amp;quot;input&amp;quot; or an &amp;quot;output&amp;quot; to the invocation.
At the invocation level, &lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt;es are introduced in &amp;quot;output&amp;quot; mode, and reused in &amp;quot;input&amp;quot; mode.
The result of this is that there could be a &lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt; that got several keys associated with it in &amp;quot;output&amp;quot; mode, and then, when it's used in &amp;quot;input&amp;quot; mode, the object it produces must not provide any keys that aren't required by outputs from the invocation.
The only way I see right now to make this vaguely tractable is to require that all outputs are specified using &lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt; objects, which ought to be fine in this context.&lt;/p&gt;
&lt;p&gt;So, what do we know about this situation?
Well, &amp;quot;output&amp;quot; mode &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt;s require that no associated &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt;s provide a key that is not known to them, which means that the keys available for &lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt; operations must be a superset of all keys provided by any part of the invocation.
And &lt;em&gt;that&lt;/em&gt; means that when we carry out a &lt;tt class="docutils literal"&gt;Flex&lt;/tt&gt; in input mode, we want the resulting &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt; to provide the intersection of its keys and the provided keys.&lt;/p&gt;
&lt;p&gt;Stepping away from this code for a bit and then coming back gave me the perspective I needed to properly understand it.
I now properly understand that this code is a confusing monster.&lt;/p&gt;
&lt;p&gt;I'm going to try to chip away at this code for a while, but I think I need to accept that, for a while, this could very well end up being something where I put in a lot of effort to get back a little progress.&lt;/p&gt;
&lt;p&gt;Anyway, I don't want to drag this out any more, so I'm going to wrap this up and ponder my decisions.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-01-30</title><link href="https://mwchase.neocities.org/coding-2022-01-30" rel="alternate"></link><published>2022-01-30T05:00:00-05:00</published><updated>2022-01-30T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-01-30:/coding-2022-01-30</id><summary type="html">&lt;p class="first last"&gt;There was a lint error in every file, but it wasn't my fault.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's see what we've got here.
How am I creating these new metadata objects currently?&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Given a set of keys the metadata produces, create a metadata with no restrictions on other keys, and no registry data.&lt;/li&gt;
&lt;li&gt;Given an existing metadata, do one of the following actions:&lt;ul&gt;
&lt;li&gt;Narrow the keys that it provides&lt;/li&gt;
&lt;li&gt;Impose restrictions on which other keys can be present&lt;/li&gt;
&lt;li&gt;Add an entry to the registry&lt;/li&gt;
&lt;li&gt;Convert the metadata into one which restricts which keys can be present&lt;/li&gt;
&lt;li&gt;Combine the characteristics of two metadatas&lt;/li&gt;
&lt;li&gt;Provide additional keys&lt;/li&gt;
&lt;li&gt;(After I've had a chance to fix things up) Converting a metadata that provides keys into one that requires keys&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Having thought some about the &amp;quot;restriction&amp;quot; concept, I think it's compatible with keeping the &lt;tt class="docutils literal"&gt;maximal&lt;/tt&gt; flag, and can be computed as &lt;tt class="docutils literal"&gt;None&lt;/tt&gt; if the flag is &lt;tt class="docutils literal"&gt;False&lt;/tt&gt;, and as the union of the requirements and provisions if it's &lt;tt class="docutils literal"&gt;True&lt;/tt&gt;.
Then, instead of calculating the new restricted values in the case of a union, the only thing to check is whether the calculated sets are equal if they're both non-None.&lt;/p&gt;
&lt;p&gt;So, that gives me a few methods to add.
Let's see how that goes...&lt;/p&gt;
&lt;p&gt;Okay, the new constructors went through.
I had to pin back the version of Black, because flake8-black can't handle the new version of Black.
That should be cleared up soon.&lt;/p&gt;
&lt;p&gt;Anyway, the next step is to write and wire in the evolution methods.
I want to take a bit more time to review the notes I took for them.
I think I'll wrap this up now, and poke at the worldbuilding document a little.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-01-29</title><link href="https://mwchase.neocities.org/coding-2022-01-29" rel="alternate"></link><published>2022-01-29T05:00:00-05:00</published><updated>2022-01-29T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-01-29:/coding-2022-01-29</id><summary type="html">&lt;p class="first last"&gt;A nice variety of things done.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, here's where I've gotten so far: after doing a bunch of things that were, with the help of internet searches, relatively obvious, I've managed to get ALE to pass the correct information to rstcheck.
So, I'll be good to use custom directives in the worldbuilding.
I'm glad that's over with.&lt;/p&gt;
&lt;p&gt;Anyway, it's the weekend, so let's do a little MOTR work.
It's &lt;em&gt;somewhat&lt;/em&gt; late already, so I'm going to set myself a pretty modest goal for tonight: create the new class to hold the metadata for &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt;, so I can then convert the explicit manipulations of that metadata into method calls.
It's simple to start with: create the class, add the indirection, then fix Mypy errors until it's good to go.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, I've made the changes required to get it to pass static checks.
I won't really be able to trust it until I've got full coverage, though.&lt;/p&gt;
&lt;p&gt;The next step is to catalog the usage of the new type, and see about writing methods.
I don't think I'm up for that right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-01-28</title><link href="https://mwchase.neocities.org/coding-2022-01-28" rel="alternate"></link><published>2022-01-28T05:00:00-05:00</published><updated>2022-01-28T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-01-28:/coding-2022-01-28</id><summary type="html">&lt;p class="first last"&gt;I suppose it's a good idea to see just how much I have to work on...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The stuff I was talking about coding for the sake of the worldbuilding book/site yesterday?
It turns out that it's not as easy as I thought, because apparently nothing is allowed to be easy?&lt;/p&gt;
&lt;p&gt;Basically, I wanted to improve &lt;a class="reference external" href="https://github.com/dense-analysis/ale"&gt;ALE&lt;/a&gt;'s support of &lt;a class="reference external" href="https://github.com/myint/rstcheck"&gt;rstcheck&lt;/a&gt; so I can have rstcheck pick up on the config file and have proper checking of files that use custom directives.
Per a comment on a &lt;a class="reference external" href="https://github.com/dense-analysis/ale/pull/2411"&gt;previous PR&lt;/a&gt; attempting to add similar functionality, all I need to do is conditionally pass the relevant command-line argument when the version of rstcheck is &lt;a class="reference external" href="https://github.com/myint/rstcheck#next-version"&gt;greater than, um...&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/myint/rstcheck/commit/3f92957478422df87bd730abde66f089cc1ee19b"&gt;UM...&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So, this is a problem.&lt;/p&gt;
&lt;p&gt;I think the path of least resistance is to fork rstcheck, cut a local release, and point the checkout of ALE that neovim uses to my fork.
I don't want to do that right now, so I'm just going to pause to take stock, and prioritize the various things I can work on.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Work on my draft for Missable Mysteries&lt;/li&gt;
&lt;li&gt;Work on my outlines for worldbuilding&lt;/li&gt;
&lt;li&gt;Work on my outlines for Missable Mysteries&lt;/li&gt;
&lt;li&gt;Rejigger how I'm setting up rstcheck and ALE&lt;ul&gt;
&lt;li&gt;Cut new release of rstcheck&lt;ul&gt;
&lt;li&gt;Support passing &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--config&lt;/span&gt;&lt;/tt&gt; option from ALE to rstcheck&lt;ul&gt;
&lt;li&gt;Work on my draft for worldbuilding&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Verify my outline of how &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt; should work in MOTR.&lt;ul&gt;
&lt;li&gt;Make the changes&lt;ul&gt;
&lt;li&gt;Update &lt;tt class="docutils literal"&gt;Invocation&lt;/tt&gt;&lt;ul&gt;
&lt;li&gt;Write user-facing code&lt;ul&gt;
&lt;li&gt;Write tests&lt;ul&gt;
&lt;li&gt;Cut a new version&lt;ul&gt;
&lt;li&gt;Confirm that &lt;tt class="docutils literal"&gt;Invocation&lt;/tt&gt; actually simplifies writing motrfiles.&lt;ul&gt;
&lt;li&gt;Release a new version, and try it out with my other projects.&lt;ul&gt;
&lt;li&gt;Work on other personal coding projects.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is a somewhat intimidating tower of tasks, but just start peeling stuff off the bottom, I guess.
For now, I'm going to take things easy.
I'll see what I'm up for in the next few days.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Worldbuilding — Korín, Sorín, and Arín 2022-01-27</title><link href="https://mwchase.neocities.org/worldbuilding-ksa-2022-01-27" rel="alternate"></link><published>2022-01-27T05:00:00-05:00</published><updated>2022-01-27T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-01-27:/worldbuilding-ksa-2022-01-27</id><summary type="html">&lt;p class="first last"&gt;Moving along.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm going to try to take some quick notes on where to take the setting document for &lt;em&gt;Korín, Sorín, and Arín&lt;/em&gt; next.
So, the introductory poem provides a very, very brief peek at the kind of stuff that happens in the setting.
I don't have any kind of narrative &lt;em&gt;arc&lt;/em&gt; planned out for the sweep of history in the setting, so I'd like to emphasize the roleplaying angle.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;All right, I updated the draft.
Before I move on into the actual meat of the documentation, I have some tooling updates I need to do.
Don't worry, I &lt;em&gt;think&lt;/em&gt; it'll be simple.&lt;/p&gt;
&lt;p&gt;I just don't know exactly when I'll be up for it, since I've got some stuff happening right now that's a bit stressful.
Hopefully it'll all be cleared up soon.&lt;/p&gt;
&lt;p&gt;For now, I'm going to take things easy.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Worldbuilding — Korín, Sorín, and Arín"></category></entry><entry><title>Worldbuilding — Korín, Sorín, and Arín 2022-01-26</title><link href="https://mwchase.neocities.org/worldbuilding-ksa-2022-01-26" rel="alternate"></link><published>2022-01-26T05:00:00-05:00</published><updated>2022-01-26T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-01-26:/worldbuilding-ksa-2022-01-26</id><summary type="html">&lt;p class="first last"&gt;Getting my bearings.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I took another look at the poem draft, and there certainly are still issues, including a few that I introduced in the last editing pass, but you know what?
I'd rather move on for now.&lt;/p&gt;
&lt;p&gt;Move on from the frustration of agonizing over word choices, to the frustration of trying to figure out how to follow up on this.&lt;/p&gt;
&lt;p&gt;To start with, let's see what I established in this poem.
I know there are some ideas I have that I didn't convey, and I'm honestly not concerned about conveying in the poem, but I should make sure I have a good sense of what &lt;em&gt;is&lt;/em&gt; being conveyed.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The speaker's metaphor of time is based on upwind vs downwind, with upwind in the past.&lt;/li&gt;
&lt;li&gt;Some places in the setting have stone castles, which is apparently somewhat distinctive.&lt;/li&gt;
&lt;li&gt;The rulers of those castles did something bad, which violated the social expectations placed on them.&lt;/li&gt;
&lt;li&gt;But (just?) one of them refrained out of principle.&lt;/li&gt;
&lt;li&gt;It is reasonable to speak of magic that is specific to humans, so their must be some other source of magic.&lt;/li&gt;
&lt;li&gt;Human magic affects life in some way, healing, hurting, and taking or giving life.&lt;/li&gt;
&lt;li&gt;The land had two princes.
The younger prince is the one that refused to engage in this abuse of magic, and the older prince became a vampire, presumably because of said abuses.&lt;/li&gt;
&lt;li&gt;The younger prince is not the only resident of the land to rebel against the royal family.
He joins some kind of organization that trains him in terms of magic and combat.&lt;/li&gt;
&lt;li&gt;The society is polytheistic.&lt;/li&gt;
&lt;li&gt;The different gods have simple descriptive epithets.
(Side note: I avoided naming them in the poem, because I didn't want the rhyme scheme to determine the names.)&lt;/li&gt;
&lt;li&gt;The different gods have different priorities.&lt;/li&gt;
&lt;li&gt;It is expected that both princes would have prayed to the same gods, and come up with their own justifications for why they should receive those gods' favor.
(I'm assuming here that the narrator of the poem can't &amp;quot;really know&amp;quot; what the older prince was doing for most of the poem, so the older prince's prayers say more about social expectations than what &amp;quot;actually happened&amp;quot;.)&lt;/li&gt;
&lt;li&gt;The God of the Crown is concerned with the aesthetics of government.
The God of Life and Death is concerned with the cycles of life, and whether a particular killing is &amp;quot;just&amp;quot;.
The God of Leadership is concerned with the quality of government.&lt;/li&gt;
&lt;li&gt;It's possible to directly invoke the power of the gods, using talismans that can be affixed with pins.
One function of talismans is to disable a vampire.&lt;/li&gt;
&lt;li&gt;There is a moon.&lt;/li&gt;
&lt;li&gt;Both brothers have some command over the wind.
Perhaps this is related to the distinction between different types of magic.
(I feel like I'm cheating and using setting knowledge with this one, so I tried to hedge a bit.)&lt;/li&gt;
&lt;li&gt;Vampires in this setting have stiff joints and super strength.&lt;/li&gt;
&lt;li&gt;Vampires in this setting normally cannot access happy memories from before they were turned.&lt;/li&gt;
&lt;li&gt;But it is possible to overcome this.&lt;/li&gt;
&lt;li&gt;Vampire bodies can move without their heads.&lt;/li&gt;
&lt;li&gt;Powerful vampires have some form of mental link with their minions, with varied effects when the link is broken.&lt;/li&gt;
&lt;li&gt;There is a town directly outside of the castle walls, so presumably, the castle functions as an administrative center.&lt;/li&gt;
&lt;li&gt;There is a sun.&lt;/li&gt;
&lt;li&gt;The sky has some form of upper liquid surface.&lt;/li&gt;
&lt;li&gt;The sun has something to do with dragons.&lt;/li&gt;
&lt;li&gt;(Some) dragons are aligned with the &amp;quot;heavens&amp;quot;, and apparently specific gods.&lt;/li&gt;
&lt;li&gt;It is customary, at least in some cultures, for most people to avert their eyes from a visiting dragon.&lt;/li&gt;
&lt;li&gt;... Though they will peek.&lt;/li&gt;
&lt;li&gt;Dragons can be tasked with enforcing the will of the gods.&lt;/li&gt;
&lt;li&gt;Dragons speak a language that is comprehensible to mortals.&lt;/li&gt;
&lt;li&gt;The younger prince forms the basis of a quasi-mythical group of vigilantes tasked with protecting people from exploitation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I've sent out the draft to a few people, so we'll see what kind of feedback I get on how much of that, beyond the &lt;em&gt;very&lt;/em&gt; obvious, was clear.&lt;/p&gt;
&lt;p&gt;(I mean, some items on that list, I expect other people not to list because they're obscure, and other things, I expect other people not to list because they're obvious, so the stuff in between is probably the most interesting.)&lt;/p&gt;
&lt;p&gt;Anyway, this was a use of my time, and I'm not going to stress myself out about doing significantly more in the next hour.
Hopefully less time than that.
I don't actually want to be on my laptop until midnight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Worldbuilding — Korín, Sorín, and Arín"></category></entry><entry><title>Weekly Roundup 2022-01-25</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-01-25" rel="alternate"></link><published>2022-01-25T05:00:00-05:00</published><updated>2022-01-25T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-01-25:/weekly-roundup-2022-01-25</id><summary type="html">&lt;p class="first last"&gt;Once again, I would have liked to get a bit more done, but this looks good, overall.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I managed to edit poetry. It wasn't pleasant, but at least the draft is much better now.&lt;/li&gt;
&lt;li&gt;Thursday: I made a little progress on my series of math education posts.&lt;/li&gt;
&lt;li&gt;Friday: I had a headache, so I couldn't do much of anything.&lt;/li&gt;
&lt;li&gt;Saturday: I tried to explain the somewhat disorganized state of the card prototype I mentioned earlier.&lt;/li&gt;
&lt;li&gt;Sunday: I started getting myself back up to speed with MOTR.&lt;/li&gt;
&lt;li&gt;Monday: I noticed that there were serious issues in the layer of MOTR that I'm trying to build on top of, so I started planning what I'd need to rectify them.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to focus on my writing for a bit, but it's clear that I'm going to need to do some careful planning to salvage my work on MOTR.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-01-24</title><link href="https://mwchase.neocities.org/coding-2022-01-24" rel="alternate"></link><published>2022-01-24T05:00:00-05:00</published><updated>2022-01-24T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-01-24:/coding-2022-01-24</id><summary type="html">&lt;p class="first last"&gt;Oh dear, I have jumped some guns.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I'm not up for much right now.
I'm just going to sketch stuff out according to what I was thinking about as I worked yesterday.&lt;/p&gt;
&lt;p&gt;So, the &lt;tt class="docutils literal"&gt;flex&lt;/tt&gt; methods conceptually exist in a matrix which I have only partially filled in.
There are three parts of a &lt;tt class="docutils literal"&gt;Command&lt;/tt&gt; that can accommodate an &lt;tt class="docutils literal"&gt;IO&lt;/tt&gt; type.
There are arguments, environment variables, and values &lt;em&gt;based&lt;/em&gt; on arguments and environment variables, but not explicitly passed.&lt;/p&gt;
&lt;p&gt;So, between those two axes, let's see what behaviors need to be considered.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;All &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; values need to depend on a non-strict superset of the keys required by the rest of the command.
If this condition is violated, then two different commands will contend for the same output.&lt;/li&gt;
&lt;li&gt;All &lt;tt class="docutils literal"&gt;extra&lt;/tt&gt; values need to depend on a non-strict superset of the keys required by the rest of the command.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Actually, oh no.
This is some kind of variance thing.
&lt;tt class="docutils literal"&gt;extra&lt;/tt&gt; values require a flipped treatment from &lt;tt class="docutils literal"&gt;arg&lt;/tt&gt; values, because adding &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; values to a command is problematic, but adding &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; values is...
Okay, so, it needs to be a superset, but it shouldn't really break anything except for some mental models in the event that it's a strict superset.
A strict superset should probably generate a warning, however, because I'm pretty sure it violates some convenient simplifications that &lt;em&gt;usually&lt;/em&gt; hold.&lt;/p&gt;
&lt;p&gt;So, really what has to happen for &lt;tt class="docutils literal"&gt;extra&lt;/tt&gt; &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; values (and this is &lt;em&gt;not&lt;/em&gt; implemented yet), is that every associated key must be used by an &lt;tt class="docutils literal"&gt;arg&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;env&lt;/tt&gt; value.
Like, &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt; values have to track two sets of keys, say &amp;quot;provided&amp;quot; and &amp;quot;required&amp;quot;.
&amp;quot;Provided&amp;quot; plays the role of the current key set, but what's different is that not all new keys go in there.
The instantiation logic now needs a validation step, that checks whether all &amp;quot;required&amp;quot; keys are &amp;quot;provided&amp;quot;.
This should be accomplished via a private variable and a public wrapper, so that combinator logic can bypass the validation.&lt;/p&gt;
&lt;p&gt;Thinking about adding all of this metadata, I'm a little tempted to factor out the metadata into its own class and writing methods to implement the field manipulation.
The latter part is definitely a good idea.
I'm not sure about the former.&lt;/p&gt;
&lt;p&gt;Anyway, the existing logic is at its best when it comes to the &lt;tt class="docutils literal"&gt;arg&lt;/tt&gt;s.
Considering the case of environment variables, maybe the thing to do for now is to require that, if they're used, they get passed all of the keys they use.&lt;/p&gt;
&lt;p&gt;I think to make this work, I need additional fields or wrappers for &lt;tt class="docutils literal"&gt;Invocation&lt;/tt&gt;, but I'm not sure what the best implementation is.
Now that I have this new perspective, I'm going to need to take some time to plan things out.&lt;/p&gt;
&lt;p&gt;I'm feeling wiped out right now, so I'm not going to draw this out.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-01-23</title><link href="https://mwchase.neocities.org/coding-2022-01-23" rel="alternate"></link><published>2022-01-23T05:00:00-05:00</published><updated>2022-01-23T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-01-23:/coding-2022-01-23</id><summary type="html">&lt;p class="first last"&gt;I should not be allowed to cite the principle of least astonishment.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did mess a little with the card code, but that is in serious need of modularization.
Putting that aside, I finally got back to MOTR, and I, sadly but understandably, didn't get right back up to speed immediately.&lt;/p&gt;
&lt;p&gt;I wrote some helper aliases for defining decorators, and they, kind of helped, I guess.&lt;/p&gt;
&lt;p&gt;I don't remember &lt;em&gt;exactly&lt;/em&gt; what came next, so I'm going with my best guess, which is that I should be filling in these blocks that end in &lt;tt class="docutils literal"&gt;raise NotImplementedError&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;These blocks are there to handle two of the possible types that a value of the &lt;tt class="docutils literal"&gt;Part&lt;/tt&gt; union can take.
I've handled &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Static[...]&lt;/span&gt;&lt;/tt&gt;, so what remains is &lt;tt class="docutils literal"&gt;InputAccumulator&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;AdaptiveDynamic&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;It's been three weeks, so I kind of don't remember how this stuff, like, &lt;em&gt;works&lt;/em&gt;.
Let's see...
&lt;tt class="docutils literal"&gt;AdaptiveDynamic&lt;/tt&gt; assembles any number of &lt;tt class="docutils literal"&gt;ValueAdaptor&lt;/tt&gt; instances, which are already loaded into the &lt;tt class="docutils literal"&gt;adaptors&lt;/tt&gt; accumulator parameter, so I don't need to worry about that bit.
The intended result of each of these blocks is that a value of type &lt;tt class="docutils literal"&gt;Dynamic[Option]&lt;/tt&gt; is stored in the &lt;tt class="docutils literal"&gt;option_dynamic&lt;/tt&gt; variable.
All it makes sense to do with the &lt;tt class="docutils literal"&gt;AdaptiveDynamic&lt;/tt&gt; is to replicate the &lt;tt class="docutils literal"&gt;builder&lt;/tt&gt; decorator as a method.&lt;/p&gt;
&lt;p&gt;Okay, I did all that, and there are &lt;em&gt;no tests&lt;/em&gt;, so let's just hope that actually made sense.
Let's see if I can put together something plausible-sounding for the other block.
That's going to be an &lt;tt class="docutils literal"&gt;InputAccumulator&lt;/tt&gt; that gets built up by the adaptors, and then converted via the &lt;tt class="docutils literal"&gt;flex&lt;/tt&gt; functions, which... hm.
I forget if I had plans for environment variable handling, but I'm not seeing anything obvious for it, so I think I need to step back and consider whether I'm representing all of the data that needs to be represented.&lt;/p&gt;
&lt;p&gt;I've got some other things I want to take care of tonight, so I'm going to call things here, and get a better handle on this code later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-01-22</title><link href="https://mwchase.neocities.org/coding-2022-01-22" rel="alternate"></link><published>2022-01-22T05:00:00-05:00</published><updated>2022-01-22T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-01-22:/coding-2022-01-22</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Quick&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I'm feeling better, but I mostly took things easy today.
As such, rather than dive into anything really heavy, I'm going to dash off a quick summary/critique of the card prototype I was working on earlier.&lt;/p&gt;
&lt;p&gt;Let's start with the basic goal of what it represents, and what I want to do differently, or additionally.&lt;/p&gt;
&lt;p&gt;So, right now, it represents basic playing cards that can be put into a deck, and it handles rank-suit combinations, named cards, duplicates of cards, and duplicates of ranks and suits.&lt;/p&gt;
&lt;p&gt;One thing that could be interesting to add is cards that have a name and metadata.
I'd like to evaluate what's in there currently before adding that in.&lt;/p&gt;
&lt;p&gt;So, the basic concepts are &lt;tt class="docutils literal"&gt;Card&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;Rank&lt;/tt&gt;, and &lt;tt class="docutils literal"&gt;Suit&lt;/tt&gt;.
They all expose the capability to generate distinct duplicates of themselves, using the &lt;tt class="docutils literal"&gt;SuccCard&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;SuccRank&lt;/tt&gt;, and &lt;tt class="docutils literal"&gt;SuccSuit&lt;/tt&gt; classes, which are created using the &lt;tt class="docutils literal"&gt;Succ[T]&lt;/tt&gt; mixin.
Currently, this is mostly done with concrete classes.
I tried to come up with a Protocol-based alternative as a thought experiment, but it ended up kind of awkward.
The basic requirement is that the output of the &lt;tt class="docutils literal"&gt;succ&lt;/tt&gt; method on &lt;tt class="docutils literal"&gt;Card&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;Rank&lt;/tt&gt;, and &lt;tt class="docutils literal"&gt;Suit&lt;/tt&gt; needs to match the type of the class in question.
Since I'm not currently doing &lt;tt class="docutils literal"&gt;isinstance&lt;/tt&gt; checks using these classes, I could get a less awkward set of static types, in exchange for some much stranger runtime types, by using a &lt;tt class="docutils literal"&gt;cast&lt;/tt&gt;, but it's better to get a handle on what operations I expect to be able to do on these types first.&lt;/p&gt;
&lt;p&gt;Anyway, right now the static behavior of the system is pretty locked-down via some type variables: &lt;tt class="docutils literal"&gt;TSucc&lt;/tt&gt; is one of the three basic classes, and &lt;tt class="docutils literal"&gt;TPart&lt;/tt&gt; is just &lt;tt class="docutils literal"&gt;Rank&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;Suit&lt;/tt&gt;.
These variables are invariant right now.&lt;/p&gt;
&lt;p&gt;Then, there are some types that I haven't really named well.
&lt;tt class="docutils literal"&gt;Base[T]&lt;/tt&gt; is a mixin that &lt;em&gt;essentially&lt;/em&gt; indicates &amp;quot;instances of this type are not a duplicate of another card&amp;quot;, and &lt;tt class="docutils literal"&gt;Primitive[T]&lt;/tt&gt; is an extension of &lt;tt class="docutils literal"&gt;Base[T]&lt;/tt&gt; that indicates &amp;quot;instances of this type are not defined in terms of other &lt;tt class="docutils literal"&gt;Base&lt;/tt&gt; types, but use only more primitive types&amp;quot;.
These types feel kind of awkward to use and reason about, and I think they need some work to make the code that uses them intuitive, which it really isn't right now.
Right now, the only class that is &lt;tt class="docutils literal"&gt;Base[T]&lt;/tt&gt; and not &lt;tt class="docutils literal"&gt;Primitive[T]&lt;/tt&gt; is &lt;tt class="docutils literal"&gt;RankSuitCard&lt;/tt&gt;, which is a cad defined by its rank and suit.&lt;/p&gt;
&lt;p&gt;(Maybe make the base classes abstract and put the method implementations in the mixins, and inherit the marker classes into the mixins.
This makes sense currently, because in leaf classes, &lt;tt class="docutils literal"&gt;Named&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Primitive&lt;/tt&gt; are one-to-one.)&lt;/p&gt;
&lt;p&gt;Moving right along, then I've got a helper class, a protocol that provides generic slicing support for a container class, given an implementation of just integer-based indexing.
The first implementation of this, because I decided to do type-based checking for empty sequences, is &lt;tt class="docutils literal"&gt;Empty[T]&lt;/tt&gt;.
Thinking about this in retrospect, it would simplify the code by &lt;em&gt;a lot&lt;/em&gt; if I reworked it to allow most sequences to be empty.
It wouldn't eliminate special cases, but various things would be simplified.
The one concern is the weird number of ways something could be empty.
It might make the most sense to simply remove some of the union types I'm using currently, but I'm not sure.&lt;/p&gt;
&lt;p&gt;Anyway, next up are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Individual[T]&lt;/tt&gt;, which is a length-1 container for a &lt;tt class="docutils literal"&gt;Primitive[T]&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Duplicated[TSucc]&lt;/tt&gt;, which stores at least 2 &amp;quot;copies&amp;quot; of a &lt;tt class="docutils literal"&gt;Base[TSucc]&lt;/tt&gt;, according to its &lt;tt class="docutils literal"&gt;copies&lt;/tt&gt; field.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Composite[TPart]&lt;/tt&gt;, which stores non-composite sequences of &lt;tt class="docutils literal"&gt;TPart&lt;/tt&gt;.
This is indicated with a union rather than some kind of marker.
I think I'd rather do it via a marker, but I'm not sure how practical it would be.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then things get into specifically sequences of &lt;tt class="docutils literal"&gt;Card&lt;/tt&gt;s with:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;RankSuitCards&lt;/tt&gt;, which combines non-empty sequences of &lt;tt class="docutils literal"&gt;Rank&lt;/tt&gt;s and &lt;tt class="docutils literal"&gt;Card&lt;/tt&gt;s into a matrix of &lt;tt class="docutils literal"&gt;RankSuitCard&lt;/tt&gt;s.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;DuplicateDeck&lt;/tt&gt;, which stores at least 2 &amp;quot;copies&amp;quot; of basic sequences of &lt;tt class="docutils literal"&gt;Card&lt;/tt&gt;s.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;CompositeDeck&lt;/tt&gt;, which stores at least 2 simpler decks, although I see that I haven't set up the &amp;quot;at least 2&amp;quot; validator on this class.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Finally, there are a bunch of helper functions after this, and I'm going to hold off on summarizing them for two reasons:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;It's late&lt;/li&gt;
&lt;li&gt;Their names are somehow even worse than the classes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Though I will note that many of them probably could, and maybe should, be methods on the classes.&lt;/p&gt;
&lt;p&gt;I'm going to cut things off here before I blink and it's ten minutes later, since I know that can happen to me this late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2022-01-21</title><link href="https://mwchase.neocities.org/diary-2022-01-21" rel="alternate"></link><published>2022-01-21T05:00:00-05:00</published><updated>2022-01-21T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-01-21:/diary-2022-01-21</id><summary type="html">&lt;p class="first last"&gt;Ow.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't get to do much today, because I was really tired, and I ended up with a bad headache.
I'm going to take the rest of the night as easy as I can instead of trying to &amp;quot;push through&amp;quot; this, because I know it's not worth it.&lt;/p&gt;
&lt;p&gt;I'm going to publish this and get off my laptop.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2022-01-20</title><link href="https://mwchase.neocities.org/diary-2022-01-20" rel="alternate"></link><published>2022-01-20T05:00:00-05:00</published><updated>2022-01-20T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-01-20:/diary-2022-01-20</id><summary type="html">&lt;p class="first last"&gt;Yay, progress!&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Since I'm taking a break from touching the worldbuilding/poetry, I figured I'd get back to drafting my SoME followup post.
Given the amount of editing I needed to make the first post somewhat coherent, I know intellectually that I should just focus on putting together a rough sketch of the post's structure and fill it in, but gosh, it is hard to feel good about going &amp;quot;yeah, I'll just write something that I know is probably bad here, so I can fix it later&amp;quot;.&lt;/p&gt;
&lt;p&gt;I don't want to go into too much detail on any of it right now.
The most I feel like saying is that I'm trying to take some parts of the post a bit quicker than I did the first one, and we'll see if that holds up in editing.&lt;/p&gt;
&lt;p&gt;I was focused on that, so it's now really late and I want to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Worldbuilding — Korín, Sorín, and Arín 2022-01-19</title><link href="https://mwchase.neocities.org/worldbuilding-ksa-2022-01-19" rel="alternate"></link><published>2022-01-19T05:00:00-05:00</published><updated>2022-01-19T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-01-19:/worldbuilding-ksa-2022-01-19</id><summary type="html">&lt;p class="first last"&gt;Apparently, sometimes I can't count?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Haha, I did it!
I edited the poem instead of messing with code.&lt;/p&gt;
&lt;p&gt;I &lt;em&gt;hate&lt;/em&gt; this.&lt;/p&gt;
&lt;p&gt;Revising poetry or prose is like, you stare at something for weeks, and then you look at it again, and find major issues that you entirely failed to notice.
Meanwhile, write some tests for code, and the behavior covered by those tests cannot regress unnoticed.&lt;/p&gt;
&lt;p&gt;But anyway, I've addressed most of the glaring issues, so now I just need to wait a bit, and do it all.
over.
again.
yay.&lt;/p&gt;
&lt;p&gt;Anyway, I'm done for now, so I can get away with not thinking about this any more until some time tomorrow.
I need to do &lt;em&gt;something&lt;/em&gt; to take my mind off this, but I'm not sure right now what that &amp;quot;something&amp;quot; could be.&lt;/p&gt;
&lt;p&gt;I guess that's the first thing I'll do after I publish this: think of something to take my mind off of it for now.
Nothing more to talk about, so I'm going to publish and get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Worldbuilding — Korín, Sorín, and Arín"></category></entry><entry><title>Weekly Roundup 2022-01-18</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-01-18" rel="alternate"></link><published>2022-01-18T05:00:00-05:00</published><updated>2022-01-18T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-01-18:/weekly-roundup-2022-01-18</id><summary type="html">&lt;p class="first last"&gt;This was some kind of a break, but I need a bit more of a break.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I planned out how to generate actual parses with the Earley parser code I've written.&lt;/li&gt;
&lt;li&gt;Thursday: I did some more work on the parser, and frankly I didn't write it up well enough to jog my memory.&lt;/li&gt;
&lt;li&gt;Friday: I finally generated a parse, after fixing a bunch of bugs of varying degrees of weirdness.&lt;/li&gt;
&lt;li&gt;Saturday: I took it easy for a bit.&lt;/li&gt;
&lt;li&gt;Sunday: I got the Earley parser working well enough that I expect to be able to come back to it.&lt;/li&gt;
&lt;li&gt;Monday: I worked on some other, less algorithmically-intensive code, and rehashed my motivations for working on MOTR.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to focus on prose or poetry for a bit.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-01-17</title><link href="https://mwchase.neocities.org/coding-2022-01-17" rel="alternate"></link><published>2022-01-17T05:00:00-05:00</published><updated>2022-01-17T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-01-17:/coding-2022-01-17</id><summary type="html">&lt;p class="first last"&gt;I &lt;em&gt;must&lt;/em&gt; take a break...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I didn't touch the Earley parser, so, um, &amp;quot;success&amp;quot;.
Instead, I pulled up some old prototype code from I don't remember exactly how long ago, and tried to polish it up.
In this case, the code was for representing card decks.
The plan is to incorporate this into one of my other projects, but I haven't done that yet, preferring to go through a few prototype phases.&lt;/p&gt;
&lt;p&gt;So, after I posted the last entry, I basically pulled up the most recent prototype, and started retyping and adapting it in Jupyter.
Replacing old questionable decisions with new questionable decisions, that kind of thing.&lt;/p&gt;
&lt;p&gt;Earlier today, I was able to set it up to represent a basic 52-card deck, and I also got some hanafuda decks in there, albeit missing lots of details.
I regard this as pretty promising, because it proved out the following features:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Representing a very regular matrix of rank and suit&lt;/li&gt;
&lt;li&gt;Representing extra one-off cards&lt;/li&gt;
&lt;li&gt;Representing distinct &amp;quot;copies&amp;quot; of a card&lt;/li&gt;
&lt;li&gt;Representing &amp;quot;copies&amp;quot; of a rank or suit (the hanafuda kasu are currently represented via duplicates of the kasu rank, rather than duplicates of the combination of rank and suit; assuming this distinction makes sense, I don't know if it's relevant, and if so, whether I should be implementing it this way, or, like, the opposite way; my hope is that details of ordering are more relevant than the precise semantics that I use to handle the duplication)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At this point, there are two major things to work on:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Making sure the code is correct&lt;/li&gt;
&lt;li&gt;Representing more decks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Honestly, as I think about planning this, everything comes back around to MOTR.
I want to do things like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Cut a new MOTR release&lt;/li&gt;
&lt;li&gt;Pick my other Python projects back up using MOTR&lt;/li&gt;
&lt;li&gt;Pull this code into it, taking advantage of modules to keep it from being, like, super long&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Everything comes back to this project, for a simple reason: I see MOTR as my chance to turn my task runner code into a more compact, maintainable format than what I have currently.
I assume tox has changed a bunch since I last tried to write a config file, but my experiences working with other people's parameterized tox files have kind of soured me on that idea.
I much prefer Nox, but I never did figure out how to track dependencies between sessions, and I want to try to take advantage of concurrent execution.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;tox has concurrent execution, but its dependency tracking is designed differently from MOTR, and I prefer MOTR's design, obviously, because why would I design something that I don't want?&lt;/li&gt;
&lt;li&gt;I don't know if Nox has any kind of inter-session dependencies planned or implemented, but I do remember seeing an issue asking for concurrent execution get bogged down in how to reconcile &amp;quot;execute things in parallel&amp;quot; with &amp;quot;real-time command output&amp;quot;&lt;/li&gt;
&lt;li&gt;MOTR discards the latter, at least for now, in exchange for focusing on producing viewable artifacts, principally HTML, so I can look over them afterwards&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thinking about working on this, I think the right tack to take is to focus on other stuff like the poetry until next weekend, and then get back into this.
We'll see if I can hold myself to that.
Anyway, it's late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-01-16</title><link href="https://mwchase.neocities.org/coding-2022-01-16" rel="alternate"></link><published>2022-01-16T05:00:00-05:00</published><updated>2022-01-16T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-01-16:/coding-2022-01-16</id><summary type="html">&lt;p class="first last"&gt;Will I finally put this stuff down for more than a day or so? (Hopefully, yes.)&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I wasn't really sure to call this &amp;quot;coding&amp;quot;, because I just did a little more work on the Earley parser, or &amp;quot;worldbuilding&amp;quot; because I revised the poem earlier today.&lt;/p&gt;
&lt;p&gt;So.
I revised the poem a little.
I was just focusing on some meter and scansion issues near the beginning, so I haven't confronted the big issues near the end, where I just kind of gave up on stuff like &amp;quot;sounding good&amp;quot;.
Not much more to say there, but I did put in some work.&lt;/p&gt;
&lt;p&gt;On the Earley parser, I hacked together nullable infinite loop detection in a way that makes sense to me.
(&amp;quot;If a rule's RHS doesn't contain any of the symbols that &lt;em&gt;could&lt;/em&gt; participate in an infinite loop, then it definitely doesn't participate in an infinite loop, so it can be removed from the set.
Repeat this process until the set is empty, or the process reaches a fixed point.&amp;quot;)
All of this code has no tests, so I'm now going to back-burner it for real, until I...
Until I get MOTR into a workable state.
So, I guess the next thing I'll work on in terms of coding is either...
MOTR again, or something else that I can scribble into a Jupyter lab session.&lt;/p&gt;
&lt;p&gt;I'll sleep on that, and call this entry early.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2022-01-15</title><link href="https://mwchase.neocities.org/diary-2022-01-15" rel="alternate"></link><published>2022-01-15T05:00:00-05:00</published><updated>2022-01-15T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-01-15:/diary-2022-01-15</id><summary type="html">&lt;p class="first last"&gt;I need to work on taking it easy.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I just want to relax.
Not consider trying to devise some kind of metric for limiting parse depths so I can guarantee that every parse matching a pathological grammar is hit at some point.
(It would probably be worth more right now to focus on reworking the parser representation so you can have identical rules with different actions, which would do &lt;em&gt;deeply obnoxious&lt;/em&gt; things to the parse generator.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ANYWAY&lt;/strong&gt;, I'm spacing out and not sure what I'm doing, and I don't even have an excuse as such, this time.&lt;/p&gt;
&lt;p&gt;Let's think about this weekend.
I want to get back to doing some editing.&lt;/p&gt;
&lt;p&gt;Maybe play some games.
Ideally, work on getting more rest.&lt;/p&gt;
&lt;p&gt;Actually, I think I'll work on a puzzle thing while this entry publishes, finish things up for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2022-01-14</title><link href="https://mwchase.neocities.org/coding-2022-01-14" rel="alternate"></link><published>2022-01-14T05:00:00-05:00</published><updated>2022-01-14T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-01-14:/coding-2022-01-14</id><summary type="html">&lt;p class="first last"&gt;I bet there are still bugs.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The good news is, I managed to construct a successful parse.
The not-as-good news is, I had to fix some bugs before it went through.
The worse news is, while almost all of the bugs made sense in retrospect, I think I'm going to need to do a close reading of the entire tutorial to understand where I went wrong with the final bug.&lt;/p&gt;
&lt;p&gt;Easy stuff:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&amp;quot;Oh, I forgot to include the token value when I do a scan.&amp;quot;
This is totally my fault, since it's a failure to fulfill a requirement &lt;em&gt;that I came up with&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&amp;quot;I missed the final predict/complete step.&amp;quot;
This is a bit more interesting, because it reveals something that I glossed over about Earley parsers: in a successful parse, there will be one more state set than there are tokens, because the state sets border the tokens on either side.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And now that I say that, I understand what went wrong with the last bug.
This is a doozy, so let's see whether I can explain it.&lt;/p&gt;
&lt;p&gt;All right, so my parse generators rely on several recursive functions.
The function that I broke takes an item and an &amp;quot;end index&amp;quot; to a state set, and, looking in the range between the end index, and the item's &amp;quot;start index&amp;quot;, yields all possible sub-divisions of that range into the symbols required by the rule.
This function calls itself recursively for one of two reasons:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;If the item has a non-&lt;tt class="docutils literal"&gt;None&lt;/tt&gt; value as its last node, then that value corresponds to a terminal symbol, so the node is skipped over: the node is discarded, and the end index is decremented so we check the previous state set.&lt;/li&gt;
&lt;li&gt;Otherwise, the code checks all items at the end index, to see if it can find a completed item that matches the non-terminal symbol required by the item's rule at this point.
If it does, then we can get the rest of the division by... discarding the node and choosing an appropriate value for the end index.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And that last bit is where I tripped up.
I forgot that the state set indices go &lt;em&gt;between&lt;/em&gt; tokens, so I tried to &amp;quot;skip over&amp;quot; an index, because the last token used by one symbol is the token before the first token used by the next symbol.
This doesn't work, because &amp;quot;the ending of one symbol&amp;quot; and &amp;quot;the beginning of the next symbol&amp;quot; correspond to &lt;em&gt;the same&lt;/em&gt; state set index.
So I tried to &amp;quot;compensate&amp;quot; for something when I should have left well enough alone.&lt;/p&gt;
&lt;p&gt;Next up, now that I sort of understand things, I see that I absolutely did not account for empty rules.
(I first verified this experimentally.)
So, before I can properly move on, I'll want to fix that.&lt;/p&gt;
&lt;p&gt;Let's see what fixing that looks like.&lt;/p&gt;
&lt;p&gt;Well, first off, I need a constructor helper for &lt;tt class="docutils literal"&gt;Parser&lt;/tt&gt; objects.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;I got distracted and did the fix.
This basically consisted of implementing the algorithm that Jeffrey Kegler provided for detecting nullable symbols, undoing some premature optimizations I had done that interfered with actually using the data on nullability, fixing a code divergence because apparently that happens nearly immediately after I copy and paste some code less than ten lines down from its origin, and pondering whether I have it right, because the fixed code has &lt;em&gt;more&lt;/em&gt; items in its state set than the code from the tutorial.&lt;/p&gt;
&lt;p&gt;I &lt;em&gt;think&lt;/em&gt; this is okay, because if I'm understanding things correctly, the tutorial is showing an intermediate stage of parsing.
I could be totally wrong, though.&lt;/p&gt;
&lt;p&gt;Hm, interesting question that just occurred to me: is my current parse generation code able to properly handle nullable sequences that can go arbitrarily deep?
I'm skeptical, so maybe just don't do that.&lt;/p&gt;
&lt;p&gt;I think it might actually act really pathological.
But it's getting late, and I don't want to think about that too hard.&lt;/p&gt;
&lt;p&gt;Since I've gotten a successful parse, maybe I should move on for now, and come back to this code later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-01-13</title><link href="https://mwchase.neocities.org/coding-2022-01-13" rel="alternate"></link><published>2022-01-13T05:00:00-05:00</published><updated>2022-01-13T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-01-13:/coding-2022-01-13</id><summary type="html">&lt;p class="first last"&gt;I really appreciate how easy the code is once you understand the concepts behind it. It's too bad this stuff started off so intimidating to me.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got a late start again today, but I have managed to put together a rough draft of the parser code from the past few days' notes.
I'll test it later.
Testing it requires some decisions about how to represent the AST nodes that I don't want to make so close to midnight.&lt;/p&gt;
&lt;p&gt;Once I have a successful run with the tutorial's example parser, I'll put this on the back burner for a bit, then come back to it soon-ish and start working on cleaning up the code.
Maybe make a post just to talk about it.&lt;/p&gt;
&lt;p&gt;Anyway, I don't want to risk thinking of &amp;quot;just one more thing&amp;quot; to write for half and hour, so I'm cutting things off here.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-01-12</title><link href="https://mwchase.neocities.org/coding-2022-01-12" rel="alternate"></link><published>2022-01-12T05:00:00-05:00</published><updated>2022-01-12T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-01-12:/coding-2022-01-12</id><summary type="html">&lt;p class="first last"&gt;Maybe I should come up with a mascot character, like how Amos has cool bear.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm going to try to diversify what I work on and blog about, but not today.&lt;/p&gt;
&lt;p&gt;All right, let's plan out some of the stuff I was talking about last time.
Iterating over parses.
Because any found sub-tree is guaranteed to produce at least one valid sub-parse, I think I want to work by iterating over all possible top-level divisions of sub-trees (to look for the values that work), and then take the product of the parses of those sub-trees.&lt;/p&gt;
&lt;p&gt;So this looks like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&amp;quot;I have a generator that yields valid parse trees of the given type, with the given start and end indices&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;What's it look like inside?&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;Well, it iterates over all items where the rule's LHS matches the type...&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;Uh-huh&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;For each matching rule, it passes that item to a generator that finds all valid divisions of the item's range...&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;Uh-huh&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;Then, it takes the product of the parse iterators over the items in the divisions.&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;So...&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;So, there's a top-level &lt;tt class="docutils literal"&gt;parses&lt;/tt&gt; function that iterates over all successful items in the last set.
It then delegates to a &lt;tt class="docutils literal"&gt;parses_for_item&lt;/tt&gt; function that takes an item and an end index and generates all parses satisfying those constraints.
This function relies on a &lt;tt class="docutils literal"&gt;divisions_for_item&lt;/tt&gt; function to get the information.
Ultimately, &lt;tt class="docutils literal"&gt;parses_for_item&lt;/tt&gt; is recursive, because it needs to slot successful parses into the divisions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm not sure whether I'd rather accomplish that by making a bunch of these have the same return types, or by confining the recursion to the &lt;tt class="docutils literal"&gt;parses_for_item&lt;/tt&gt; function.
I was originally thinking the former, but I'd like to try the latter.
Later.&lt;/p&gt;
&lt;p&gt;It's late and I'm tired.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2022-01-11</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-01-11" rel="alternate"></link><published>2022-01-11T05:00:00-05:00</published><updated>2022-01-11T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-01-11:/weekly-roundup-2022-01-11</id><summary type="html">&lt;p class="first last"&gt;It's nice to work on something with a slightly more defined end goal.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I started messing with Earley parsers, just trying to get a handle on how they work.&lt;/li&gt;
&lt;li&gt;Thursday: I had some ideas about trying to simplify the presentation of the loops involved, but I didn't have the code in a state where I could actually do it at that point. (It may be possible now.)&lt;/li&gt;
&lt;li&gt;Friday: I took a step back, wrote up the state of the code at the time, and wrote some helpful functions.&lt;/li&gt;
&lt;li&gt;Saturday: I just kind of relaxed.&lt;/li&gt;
&lt;li&gt;Sunday: I started to better understand the tutorial's explanation of how everything fit together, and I started cleaning up the code.&lt;/li&gt;
&lt;li&gt;Monday: I wrote up my major divergences from the tutorial code, and tried to restate the tutorial so I understood it better, with no expectation that this will make things clearer to anyone else.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I might change focus again.
It'd be nice to get the Earley parser to a state where it can do approximately what the tutorial's parser does by the end.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-01-10</title><link href="https://mwchase.neocities.org/coding-2022-01-10" rel="alternate"></link><published>2022-01-10T05:00:00-05:00</published><updated>2022-01-10T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-01-10:/coding-2022-01-10</id><summary type="html">&lt;p class="first last"&gt;ершы　шы　аштую&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The linux side of things works a little better now.
In this context, &amp;quot;a little better&amp;quot; somehow means &amp;quot;my laptop now has an input mode that has Cyrillic letters and fullwidth spaces&amp;quot;.&lt;/p&gt;
&lt;p&gt;But anyway.
We handled some stuff today that took up part of the afternoon, and now I want to see if I can get a handle on taking the recognizer and getting it to produce parse trees.&lt;/p&gt;
&lt;p&gt;Let's see how that looks.&lt;/p&gt;
&lt;p&gt;My initial thought is to have it work like &amp;quot;given an index that defaults to -1, generate all valid trees that end at that index&amp;quot;.
(I'm using Python indexing, so that's how that means what I want it to.)
First some context: instead of storing an index for the dot in the items, I'm storing a tuple of &lt;tt class="docutils literal"&gt;Optional[Token]&lt;/tt&gt;s, which I'm calling nodes.
The &lt;tt class="docutils literal"&gt;Forest&lt;/tt&gt; objects that I'm writing this for store a reference to the type of the topmost node, so things start out as follows:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;In the &lt;em&gt;last&lt;/em&gt; index, find all &lt;em&gt;completed&lt;/em&gt; items that start at index &lt;em&gt;0&lt;/em&gt; and have a rule with a left-hand-side of the &lt;em&gt;root node type&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;This is a degenerate case at the top level, but if the item has no nodes associated with it, then it's an empty rule that matched an empty token stream.
Call the rule's function with no arguments, and yield the result.
At the top level, there is no more work to do.
(Assuming that rules can't be identical except for their associated function, which I'm not trying to enforce, but is... probably reasonable?
This might suggest a tiered mapping structure for storing rules in the parser object.)&lt;/li&gt;
&lt;li&gt;If the node corresponding to the symbol before the dot is a token, then the item was generated by a scan, and the thing to look at is the previous index, for that rule, but with the last node discarded.
Technically, we shouldn't really need to &lt;em&gt;look&lt;/em&gt;, per se.
There's only one possible value of the predecessor to a scanned item, and we know it exists in the previous set, so we don't actually have to find it.
I'll think through the precise implications of this later.&lt;/li&gt;
&lt;li&gt;So, the meat of all of this is dealing with a non-terminal symbol before the dot.
To look for a non-terminal symbol at a given index, you have to look for all &lt;em&gt;completed&lt;/em&gt; items &lt;em&gt;in that index&lt;/em&gt;, with a left-hand-side matching &lt;em&gt;that symbol&lt;/em&gt;, and a start index &lt;em&gt;greater than the parent's start index&lt;/em&gt;.
Each such item will produce at least one valid internal parse (unless I'm extremely mistaken), and all such parses will relate identically to the broader parses, if any.
Essentially, it's a product between &amp;quot;recursing the algorithm in smaller bounds&amp;quot; and &amp;quot;the rest&amp;quot;, where &amp;quot;the rest&amp;quot; is &amp;quot;whatever item has the sub-parse fitting into it, discard that node and look for the resulting item at the start index of the sub tree&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I think this is about what the tutorial was saying, and I've tried to reword it for my own comprehension, but I'm not sure the result is helpful for anyone else.
It's basically notes, a little less refined than a rough draft.
If anyone is following along with this and trying to understand this for themselves, I would highly recommend taking your own notes along these lines, in whatever way and format makes the most sense to you.
Not least because I haven't yet vetted this stuff, so there's a chance some aspect of it is simply wrong.&lt;/p&gt;
&lt;p&gt;Anyway, I should get this published and get to bed ASAP.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-01-09</title><link href="https://mwchase.neocities.org/coding-2022-01-09" rel="alternate"></link><published>2022-01-09T05:00:00-05:00</published><updated>2022-01-09T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-01-09:/coding-2022-01-09</id><summary type="html">&lt;p class="first last"&gt;Roughing stuff in.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, I tried a few things today, and they mostly worked.
I don't feel like going into more detail.&lt;/p&gt;
&lt;p&gt;Anyway, let's see what I can do as far as making some progress or plans on the Earley parser.&lt;/p&gt;
&lt;p&gt;So, in my understanding of things, the initial state should include some states.
To expand on these states:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;We perform any possible completions until no more completions are possible&lt;/li&gt;
&lt;li&gt;We perform any possible predictions, doing newly-allowed completions as needed, until no new predictions are possible&lt;/li&gt;
&lt;li&gt;Once only scans are possible, we scan into the next state&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A completion looks like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Given an item that has no symbol after the dot&lt;ul&gt;
&lt;li&gt;Find any items in the set indexed by the item's &lt;tt class="docutils literal"&gt;start_index&lt;/tt&gt; that have the item's left-hand-side after the dot.&lt;/li&gt;
&lt;li&gt;Place the advanced versions of those items in the current set&lt;/li&gt;
&lt;li&gt;This may require an optimization to avoid quadratic behavior on some grammars.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A prediction looks like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Given an item that has a non-terminal symbol after the dot&lt;ul&gt;
&lt;li&gt;Add all rules that produce that symbol to the current set&lt;/li&gt;
&lt;li&gt;Mark any &lt;em&gt;newly added&lt;/em&gt; rules for processing&lt;/li&gt;
&lt;li&gt;If the newly added rules are eligible for completion, recursively carry out completions until they're done&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A scan looks like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Given an item that has a terminal symbol after the dot&lt;ul&gt;
&lt;li&gt;If the terminal symbol matches the current token&lt;/li&gt;
&lt;li&gt;Add the current item to the next set, advanced by one&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If we maintain multiple stacks/deques/sets/whatever/maybe dicts that we &lt;tt class="docutils literal"&gt;popitem&lt;/tt&gt; from, and clear them before the scan step, then we can have a uniform setup of &amp;quot;here is a set and sets to process, add it to both, and to the correct set to process if it's new&amp;quot;.
If I do it like that, then the full prediction step looks like &amp;quot;predict one, complete again&amp;quot;.&lt;/p&gt;
&lt;p&gt;I should note at this point that it's very likely that I'll have very different ideas about how this should be done once I've prototyped this, because I only sort of understand the documentation that I'm reading.&lt;/p&gt;
&lt;p&gt;For now, I'm going to write the helper for this as a nested function inside the method.&lt;/p&gt;
&lt;p&gt;Several rewrites and fill-ins later, I have a prototype that is almost certainly not quite correct, and not enough time in the night to feel like testing.&lt;/p&gt;
&lt;p&gt;Basically, the core of the logic looks... fine, but I have some assertions after the outer loop that are only sometimes valid, and can probably be expected to not be valid most of of the time.
From writing this out, I fixed up the assertions, and now I need some new ones to make sure the data is actually usable.&lt;/p&gt;
&lt;p&gt;A few more tweaks later, and I'm about done for the night.&lt;/p&gt;
&lt;p&gt;I elected to return a frozen version of the state set from the parse method, so that &amp;quot;find the correct parses&amp;quot; is decoupled from &amp;quot;produce the state set&amp;quot;.
I'll work on producing the parses next, and come back to optimizing the parse method once I've proved that anything works.&lt;/p&gt;
&lt;p&gt;For now, I should wrap up and take the remainder of the night as easy as I can, which is not as easy as last night.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2022-01-08</title><link href="https://mwchase.neocities.org/diary-2022-01-08" rel="alternate"></link><published>2022-01-08T05:00:00-05:00</published><updated>2022-01-08T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-01-08:/diary-2022-01-08</id><summary type="html">&lt;p class="first last"&gt;I can't be up and going all the time, but I hope to be able to move a little faster tomorrow than I am right now.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm not really back up to speed from vacation, so this week was a little rough on me.
As such, I'm taking it easy right now.&lt;/p&gt;
&lt;p&gt;What's going on in my life...
Um, tomorrow, I'm planning to change up my grooming routine some.
I'll probably write about that after I try it.&lt;/p&gt;
&lt;p&gt;Aside from that... I dunno, it's not like I'm doing anything particularly different.
All that's really happening is, with the state of the pandemic, I'm going to need to coop myself up &lt;em&gt;even more&lt;/em&gt;, I guess.
That's not going to be pleasant, but when has any of this been pleasant?&lt;/p&gt;
&lt;p&gt;I'm going to call this here and stop trying to write.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2022-01-07</title><link href="https://mwchase.neocities.org/coding-2022-01-07" rel="alternate"></link><published>2022-01-07T05:00:00-05:00</published><updated>2022-01-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-01-07:/coding-2022-01-07</id><summary type="html">&lt;p class="first last"&gt;I can't get away with just winging it. How many times will I learn this lesson?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, my conclusion from thinking about trying to implement Earley parsing differently, is that I really should get a basic working implementation together.
Prototype based on a design, before messing with the design.
So, let's take this closely.
First off, I've got some code that is &lt;em&gt;very&lt;/em&gt; loosely based on Spark, so let's take stock of that.&lt;/p&gt;
&lt;p&gt;Classes for:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Token matcher&lt;/li&gt;
&lt;li&gt;Scanner to produce tokens&lt;/li&gt;
&lt;li&gt;First pass at a &amp;quot;Rule&amp;quot; object for the parser, which is really weird from a typing perspective, because it reflects on the annotations of the parser action, which means that it has to be covariant in both the arguments and the return value of the function, which I assume &lt;em&gt;actually supporting&lt;/em&gt; would involve writing a Mypy plugin for.
(Also, I think the way I'm setting this up my be a design misstep on my part, but I'd like to see it through and focus on the algorithm, which shouldn't be affected by the bit I'm not sure about.)&lt;/li&gt;
&lt;li&gt;Earley item class&lt;/li&gt;
&lt;li&gt;The beginning of a Parser class, which currently has the bare minimum of data required, with no optimizations, and just enough code for the &lt;tt class="docutils literal"&gt;parse&lt;/tt&gt; method to be syntactically invalid because I'm not sure how to write the loops.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, let's take the tutorial slowly.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&amp;quot;A &lt;em&gt;grammar&lt;/em&gt; is a set of &lt;em&gt;rules&lt;/em&gt;.&amp;quot;
Check.&lt;/li&gt;
&lt;li&gt;&amp;quot;non-terminal symbols [...] and &lt;em&gt;terminal symbols&lt;/em&gt;&amp;quot;
I should write a method to distinguish terminal and non-terminal symbols according to the... somewhat questionable way I'm representing symbols.&lt;/li&gt;
&lt;li&gt;Earley items...
There are some obvious convenience methods to add to what I have.&lt;/li&gt;
&lt;li&gt;State sets...
I'm going to need to think carefully about what actions to take on state sets, because I want to make sure I can work with them semi-efficiently.
So, I've got &amp;quot;a container of &lt;tt class="docutils literal"&gt;Item&lt;/tt&gt; objects&amp;quot;, and it may be the case that a set would be better than a list, so I'll make that change.
All right, initialization is done, I think.
I have no idea how it relates to the corresponding-ish code in Spark, but whatever.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Okay, I think I've written what I need for the outer loop, and some helpful stuff for the inner loop.
Let's compare the effects of prediction, scanning, and completion.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Scanning adds an advanced item to the next set (If a rule's next symbol is terminal)&lt;/li&gt;
&lt;li&gt;Prediction adds a new item to the current set (If a rule's next symbol is non-terminal)&lt;/li&gt;
&lt;li&gt;Completion adds an advanced item to the current set (If a rule is completed, and therefore has no next symbol)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thinking about how these relate, prediction is the only process which adds a new starting index.
I'm not sure if that is relevant to anything.&lt;/p&gt;
&lt;p&gt;My big concern with these is, according to the open letter I linked yesterday, the different types of operation can be strictly sequenced, but I don't understand how that's possible.
Let's set aside scans, since those have much easier behavior: you can just iterate through one set, and perform all scans, into the next set.&lt;/p&gt;
&lt;p&gt;So, doing completions and then predictions works if we know that prediction will never add a completed set.
If we allow empty rules, then it &lt;em&gt;currently appears to me&lt;/em&gt; that the easiest way to guarantee that prediction doesn't add completed rules would be to essentially run any possible completions &amp;quot;in-line&amp;quot; as part of prediction.&lt;/p&gt;
&lt;p&gt;It's getting late, so I'm going to take &amp;quot;I thought about this and wrote some helper functions&amp;quot; as a win, and get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-01-06</title><link href="https://mwchase.neocities.org/coding-2022-01-06" rel="alternate"></link><published>2022-01-06T05:00:00-05:00</published><updated>2022-01-06T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-01-06:/coding-2022-01-06</id><summary type="html">&lt;p class="first last"&gt;It's really hard for me to visualize a lot of this. Intuitions about convergence/divergence flipping back and forth like a Necker cube.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm going to sketch out some thoughts on implementing an Earley parser.
The tutorial I'm reading is talking in terms of loops, but I'm trying to think about this in terms of reducing a stream of tokens.
I'm &lt;em&gt;pretty sure&lt;/em&gt; this will work, and it means I can punt on figuring out the outer loop for a bit.&lt;/p&gt;
&lt;p&gt;Here's the basic idea: I have a series of rules, and that's bundled up in an object that defines a method like &amp;quot;given a state and a token, return a new state&amp;quot;.
Then I can just generate the initial state, &lt;tt class="docutils literal"&gt;functools.reduce&lt;/tt&gt;, and bam, done.
... Probably.&lt;/p&gt;
&lt;p&gt;So, because this is an Earley parser, the state is going to be something like &amp;quot;a list of state sets&amp;quot;, where a state set is &amp;quot;a set of Earley items&amp;quot;, where an Earley item is &amp;quot;a rule, the index of when it started in the state, and partial completion data&amp;quot;.
For a &lt;em&gt;recogniser&lt;/em&gt;, the completion data is just how far you've read, but if you want to parse, I assume it needs to accumulate the previously-parsed items instead.
I should... probably read further in the tutorial, I think.&lt;/p&gt;
&lt;p&gt;All right, I read over it, and here's where my understanding is:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Loup is talking, at least at first, about extracting the parse data from the information gathered by the recognizer.&lt;/li&gt;
&lt;li&gt;What I had in mind would have been very inefficient, because it would have essentially performed eager evaluations that wouldn't succeed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, basically, I want to say:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Given a state, can we extract a valid parse tree from it?&lt;/li&gt;
&lt;li&gt;Given a parse tree, we can materialize an AST (which would presumably include information like text positions, or anything else helpful), but this means that we can't carry out the actions until we have a parse tree, which means my ideas about discarding the token stream as we process it &lt;em&gt;do not work&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Like, it's possible to write the code to consume a stream, but that's only worth it if it makes the code easier to understand, because it doesn't do anything memory-wise.
I mean, I guess it would allow early termination if the token stream is bad and it results in an empty state set.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ooh, I've got an idea that could be really good or really weird.
Suppose we have some kind of stream-recording data structure, so we can then make our functions operate on streams.
If we organize the generation of items according to &lt;a class="reference external" href="https://github.com/jeffreykegler/kollos/blob/master/notes/misc/leo2.md"&gt;Jeffrey Kegler's open letter&lt;/a&gt; (scans, completions, predictions), then &lt;em&gt;I think&lt;/em&gt; it should be possible to say &amp;quot;okay, we can view a set as consuming one iterable and producing two, by taking an initial iterator from the previous set and expanding on it, and also producing an iterator of scans for the next set&amp;quot;.
By interleaving the order of iteration, it &amp;quot;should&amp;quot; be possible to make sure that all possible parses are reached, even if some rules recurse indefinitely (which, why would you do that, but whatever).
(Although, if there's an indefinitely recursive rule and a syntax error, then this idea would presumably keep on trying the same stream of nullable rules in the hope that that will somehow repair the parse downstream...
So it's almost like, indefinitely recursive rules should trigger once-ish for the initial parse pass, and then they can kind of do whatever when it comes time to perform actions on a tree.)&lt;/p&gt;
&lt;p&gt;In any case, I'm going to need to do a bunch of sketching of this stuff on paper, because these concepts don't all fit in my head.&lt;/p&gt;
&lt;p&gt;And, I've got some other stuff I want to take care of right now, so I'm going to wrap this up here.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-01-05</title><link href="https://mwchase.neocities.org/coding-2022-01-05" rel="alternate"></link><published>2022-01-05T05:00:00-05:00</published><updated>2022-01-05T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-01-05:/coding-2022-01-05</id><summary type="html">&lt;p class="first last"&gt;I don't have anything in mind to do with this, but at least it's got a smaller scope than the last project I had like that.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, so.
I'm still coding, but I &lt;em&gt;am&lt;/em&gt; taking a break from MOTR.&lt;/p&gt;
&lt;p&gt;Basically, I recently read a &lt;a class="reference external" href="https://tratt.net/laurie/blog/entries/text_is_dead_they_say.html"&gt;blog post about parsing&lt;/a&gt;, and it inspired me to look into Earley parsers some more.&lt;/p&gt;
&lt;p&gt;I'm right now trying to roll one on my own, based on &lt;a class="reference external" href="https://loup-vaillant.fr/tutorials/earley-parsing/"&gt;a tutorial&lt;/a&gt; and some 20-year-old Python code which I am just trying to get the broad strokes of, since it's targeting Python 1.5 and has hand-optimized stuff that... I don't actually know if that optimization is backed up with profiling.&lt;/p&gt;
&lt;p&gt;So, I'm trying to get the broad strokes and put together something using modern Python, which is shockingly different from, Python so old I never personally used it.&lt;/p&gt;
&lt;p&gt;In any case, it's late and I'm tired, so I'm going to have to wrap things up now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2022-01-04</title><link href="https://mwchase.neocities.org/weekly-roundup-2022-01-04" rel="alternate"></link><published>2022-01-04T05:00:00-05:00</published><updated>2022-01-04T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-01-04:/weekly-roundup-2022-01-04</id><summary type="html">&lt;p class="first last"&gt;This neither sounds nor felt like much of an accomplishment.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I started re-simplifying the &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt; class in MOTR.&lt;/li&gt;
&lt;li&gt;Thursday: I planned out some of the changes I needed to make to the functions, formerly methods.&lt;/li&gt;
&lt;li&gt;Friday: I did some more work, and some more planning.&lt;/li&gt;
&lt;li&gt;Saturday: A bit more work...&lt;/li&gt;
&lt;li&gt;Sunday: A stub class or two...&lt;/li&gt;
&lt;li&gt;Monday: I tried to fill in the classes, and Mypy quasi-accidentally pointed out a bug to me.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I want to take some kind of break from MOTR.
Either as subtle as switching back to planning and writeups instead of writing code, or &lt;em&gt;actually working on something different&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;(I just remembered I was thinking of redoing my weekly... schedule is too strong a word... rhythm? This year. Um... eh. I'll see how I feel once I've had some more sleep.)&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2022-01-03</title><link href="https://mwchase.neocities.org/coding-2022-01-03" rel="alternate"></link><published>2022-01-03T05:00:00-05:00</published><updated>2022-01-03T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-01-03:/coding-2022-01-03</id><summary type="html">&lt;p class="first last"&gt;It's nice when the tools don't have a super-obvious bug.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I'm sort of rested up.
I'm going to try to get code stuff done a little early today.
Let's see...&lt;/p&gt;
&lt;p&gt;The obvious place for me to prove out this design is in the method that will convert an &lt;tt class="docutils literal"&gt;Invocation&lt;/tt&gt; to a &lt;tt class="docutils literal"&gt;Dynamic[Command]&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;I'm sketching out the rough details, avoiding the really gnarly parts, but the gnarly parts are coming to me.
I hit a condition that looks extremely like a bug in Mypy to me.
Like, it replaced a concrete type with a type variable.
I don't know why it gave up that information.&lt;/p&gt;
&lt;p&gt;Wait, wait, wait, no I just wrote the code wrong.
Let's see, if I fix the code the, yep, there it goes, passes just fine.&lt;/p&gt;
&lt;p&gt;It turns out Mypy doesn't run on the code you &lt;em&gt;thought&lt;/em&gt; you wrote.&lt;/p&gt;
&lt;p&gt;Anyway, looks like one of the next things I want to cover is redoing some of the type signatures for those functions I was rewriting and moving around.&lt;/p&gt;
&lt;p&gt;To be honest, I'm not feeling like pushing things late, so I'm just going to take things easy and call it now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-01-02</title><link href="https://mwchase.neocities.org/coding-2022-01-02" rel="alternate"></link><published>2022-01-02T05:00:00-05:00</published><updated>2022-01-02T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-01-02:/coding-2022-01-02</id><summary type="html">&lt;p class="first last"&gt;Incremental progress.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Did some more travel today, so I can take things easy tomorrow.&lt;/p&gt;
&lt;p&gt;I got started on this late, so it's going to be another quick set of thoughts today.&lt;/p&gt;
&lt;p&gt;The missing alternative for &lt;tt class="docutils literal"&gt;Part&lt;/tt&gt; needs to be a combination of a &lt;tt class="docutils literal"&gt;DynamicFunc[Option[TProgram]]&lt;/tt&gt; and a vector of &lt;tt class="docutils literal"&gt;ValueAdaptor&lt;/tt&gt;s.
It should use some of the code that's currently in the &lt;tt class="docutils literal"&gt;builder&lt;/tt&gt; decorator, which I'll want to phase out ASAP.&lt;/p&gt;
&lt;p&gt;Let's see about writing that class quickly.&lt;/p&gt;
&lt;p&gt;Wrote the class, wired it in, no decorators or methods yet...&lt;/p&gt;
&lt;p&gt;And, Mypy complained.&lt;/p&gt;
&lt;p&gt;Let's fix this quick, and get to bed.
Okay, hopefully fixed...&lt;/p&gt;
&lt;p&gt;And, actually fixed.
I'll work on decorator stuff tomorrow, unless I think of something that needs to happen before that.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2022-01-01</title><link href="https://mwchase.neocities.org/coding-2022-01-01" rel="alternate"></link><published>2022-01-01T05:00:00-05:00</published><updated>2022-01-01T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2022-01-01:/coding-2022-01-01</id><summary type="html">&lt;p class="first last"&gt;Quick update for the new year.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was once again messing around with stuff today, so I didn't have much time to touch the code, wasn't really thinking about it clearly.&lt;/p&gt;
&lt;p&gt;I started working on the new module, and I didn't get it far enough to work on the next steps.&lt;/p&gt;
&lt;p&gt;What I have to start with:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;A class for representing constant values.&lt;/li&gt;
&lt;li&gt;A union alias, not fully filled in, to represent the things that can be used in the invocations, which is what I'm calling this last abstraction.&lt;/li&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;Invocation&lt;/tt&gt; class, which hopefully will bring together everything I need.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It's the new year for me now, so I'll wrap this up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-12-31</title><link href="https://mwchase.neocities.org/coding-2021-12-31" rel="alternate"></link><published>2021-12-31T05:00:00-05:00</published><updated>2021-12-31T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-12-31:/coding-2021-12-31</id><summary type="html">&lt;p class="first last"&gt;They're not all horrible weird one-liners, but it's close enough.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I've managed to squeeze all the enjoyment that I can get out of rewriting this &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt; code, which I'm sure is more enjoyment than most people could get.
It's not totally the way I'd like it, but it's close enough.
Let's see what I need to do next:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Pull the functions into a new module to avoid import cycles when I update the return types.&lt;/li&gt;
&lt;li&gt;Write the code for hopefully the last general abstraction.&lt;/li&gt;
&lt;li&gt;Write types to simplify writing decorators, because I have to rewrite an existing decorator &lt;em&gt;anyway&lt;/em&gt;, because it should be using the code from the previous step.&lt;/li&gt;
&lt;li&gt;Rewrite that decorator.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At this point, the typing errors should force everything into using the last abstraction, and I can make sure the ergonomics look reasonable, and then &lt;em&gt;finally write some tests for this stuff&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;At the moment, I need to take some time to cool off.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-12-30</title><link href="https://mwchase.neocities.org/coding-2021-12-30" rel="alternate"></link><published>2021-12-30T05:00:00-05:00</published><updated>2021-12-30T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-12-30:/coding-2021-12-30</id><summary type="html">&lt;p class="first last"&gt;Video games...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I bashed at the code some more today, and gradually got different parts of it more similar to each other.
At this point, to go with the &lt;tt class="docutils literal"&gt;map&lt;/tt&gt;-style functions I've written, I need a custom &lt;tt class="docutils literal"&gt;reduce&lt;/tt&gt;-style function.&lt;/p&gt;
&lt;p&gt;Here's what it needs to take:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Reducing callable (in this case, &lt;tt class="docutils literal"&gt;Option.with_option&lt;/tt&gt;)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt; value&lt;/li&gt;
&lt;li&gt;Keys to iterate over&lt;/li&gt;
&lt;li&gt;Initial value&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The resulting &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt; should have an &lt;tt class="docutils literal"&gt;instantiate&lt;/tt&gt; defined by the function, a &lt;tt class="docutils literal"&gt;keys&lt;/tt&gt; equal to the argument, and the &lt;tt class="docutils literal"&gt;maximal&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;flexible&lt;/tt&gt; values carried over from the &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt; argument.&lt;/p&gt;
&lt;p&gt;Before I do that, I want to figure out some way to cut down on the size of the last big nested function.&lt;/p&gt;
&lt;p&gt;I need to take some time to think about this (and play videogames).&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-12-29</title><link href="https://mwchase.neocities.org/coding-2021-12-29" rel="alternate"></link><published>2021-12-29T05:00:00-05:00</published><updated>2021-12-29T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-12-29:/coding-2021-12-29</id><summary type="html">&lt;p class="first last"&gt;Staring at my code like &amp;quot;Why's it broken &lt;em&gt;now&lt;/em&gt;?&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right.
I was playing video games most of the day, so I didn't touch MOTR, but gosh dang it, I want to, so let's see what I can do about the to-do list I wrote last time.&lt;/p&gt;
&lt;p&gt;I was able to convert the methods into functions by dedenting the &lt;tt class="docutils literal"&gt;def&lt;/tt&gt; line and running &lt;tt class="docutils literal"&gt;black&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Next, I need a helper that acts as a &lt;tt class="docutils literal"&gt;DynamicFunc[CmdMeta]&lt;/tt&gt;, given a &lt;tt class="docutils literal"&gt;Dynamic[T]&lt;/tt&gt; and a &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Callable[[T],&lt;/span&gt; CmdMeta]&lt;/tt&gt;.
This is the core logic of &lt;tt class="docutils literal"&gt;map_1_dynamic&lt;/tt&gt;, so I'll factor that out, then factor it out for the &lt;tt class="docutils literal"&gt;flex&lt;/tt&gt; functions.&lt;/p&gt;
&lt;p&gt;I'm working on shrinking down the insides of those functions so they're easier to reason about, but it looks like I added some typos in the latest refactor attempt, so I'm going to just fix those and publish.&lt;/p&gt;
&lt;p&gt;I'll try to get a bit further tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2021-12-28</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-12-28" rel="alternate"></link><published>2021-12-28T05:00:00-05:00</published><updated>2021-12-28T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-12-28:/weekly-roundup-2021-12-28</id><summary type="html">&lt;p class="first last"&gt;Work work work, crash, but not because of working...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I changed &lt;tt class="docutils literal"&gt;Builder&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt;, and moved it to a new module.&lt;/li&gt;
&lt;li&gt;Thursday: I revisited my notes/plans from last week, and made sure I understood how to proceed with them.&lt;/li&gt;
&lt;li&gt;Friday: I started implementing stuff from those plans.&lt;/li&gt;
&lt;li&gt;Saturday: I wrote some helper functions, and planned ahead a bit more.&lt;/li&gt;
&lt;li&gt;Sunday: I did some more detailed planning.&lt;/li&gt;
&lt;li&gt;Monday: I tired myself out, so I didn't really do anything there.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to execute some of the plans I the night before last.
At the same time, earlier today, I got back to work on Missable Mysteries, and I definitely want to continue on with that.
I think I need to start sketching out the diagrams for the post, and then I'll have a better sense of how to proceed with it.
Anyway, I'll worry more about the details tomorrow.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Diary 2021-12-27</title><link href="https://mwchase.neocities.org/diary-2021-12-27" rel="alternate"></link><published>2021-12-27T05:00:00-05:00</published><updated>2021-12-27T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-12-27:/diary-2021-12-27</id><summary type="html">&lt;p class="first last"&gt;I'm too tired right now to think about moving ever again.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay.
We were traveling and visiting people for part of today, so I didn't get a chance to mess with code.&lt;/p&gt;
&lt;p&gt;I can't think of anything else to write about right now.
We're going to be spending the week recovering from the holidays, I guess.&lt;/p&gt;
&lt;p&gt;Something seems a little off about &amp;quot;Oh, we don't have work, let's make sure we're &lt;em&gt;even more&lt;/em&gt; exhausted.&amp;quot; but whatever.&lt;/p&gt;
&lt;p&gt;I'm not wringing any more thoughts out of my brain tonight, so I'm not going to try any more.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2021-12-26</title><link href="https://mwchase.neocities.org/coding-2021-12-26" rel="alternate"></link><published>2021-12-26T05:00:00-05:00</published><updated>2021-12-26T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-12-26:/coding-2021-12-26</id><summary type="html">&lt;p class="first last"&gt;Please, let this be the last abstraction. Oh please oh please oh please.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;This was a good Christmas.
But also, I am utterly wiped out.
Let's see what I'm up for.&lt;/p&gt;
&lt;p&gt;I was telling my wife about the current state of the project, and I compared it to writing a story in which you're just constantly introducing new shadowy figures which were secretly behind everything all along, including the &lt;em&gt;previous&lt;/em&gt; shadowy figures.
There's at least a bit more purpose to these abstractions, but it's tiring all the same.&lt;/p&gt;
&lt;p&gt;In any case, regardless of whether this layer is the last one, let's get it over with.&lt;/p&gt;
&lt;p&gt;The top-level container starts with a &lt;tt class="docutils literal"&gt;Command&lt;/tt&gt; (probably in the &amp;quot;installer plus string&amp;quot; sense), is followed by any number of type-coordinated &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt;-producing objects, and has an optional &amp;quot;module&amp;quot; argument which can contain another instance of the overall value, but with any program type.&lt;/p&gt;
&lt;p&gt;There are three or four basic possibilities for &amp;quot;&lt;tt class="docutils literal"&gt;Option&lt;/tt&gt;-producing objects&amp;quot;:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Constant string sequences / environment variables, possibly accompanied by installer requirements.
These must contain no &lt;tt class="docutils literal"&gt;IO&lt;/tt&gt; objects.&lt;/li&gt;
&lt;li&gt;Combinations of &lt;tt class="docutils literal"&gt;ValueAdaptor&lt;/tt&gt; objects with &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt; &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt;s that don't involve &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; objects.&lt;/li&gt;
&lt;li&gt;Flexible &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt; objects that create restricted &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt;s that involve &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; objects.&lt;/li&gt;
&lt;li&gt;The &amp;quot;or four&amp;quot; comes from, ideally the same flexible &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt;s that create the restricted options can be used to create the &lt;tt class="docutils literal"&gt;ValueAdaptor&lt;/tt&gt; + &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt; things, when they're being used for input.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is going to require a few things.
One is that the &lt;tt class="docutils literal"&gt;builder&lt;/tt&gt; decorators get completely overhauled to create the &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt;-less &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt;s + &lt;tt class="docutils literal"&gt;ValueAdaptor&lt;/tt&gt; objects.
The other is that the &lt;tt class="docutils literal"&gt;flex&lt;/tt&gt; methods need to be split up into pairs that have different output types, because now the &amp;quot;&lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; &lt;tt class="docutils literal"&gt;flex&lt;/tt&gt;&amp;quot; gets invoked implicitly, but the &amp;quot;&lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; &lt;tt class="docutils literal"&gt;flex&lt;/tt&gt;&amp;quot; is invoked more differently and has a different overall purpose.&lt;/p&gt;
&lt;p&gt;Here's how I want to lay the groundwork for this:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Pull the &lt;tt class="docutils literal"&gt;flex&lt;/tt&gt; methods out into functions.&lt;/li&gt;
&lt;li&gt;Factor out common logic into helper functions.&lt;/li&gt;
&lt;li&gt;See if any of those helper functions should be converted back into methods.&lt;/li&gt;
&lt;li&gt;Split out the input and output code paths, so I end up with four public top-level functions.&lt;/li&gt;
&lt;li&gt;Consider moving most of these functions to their own module.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At this point, I can work on the new types and functions, and updating the existing decorators.
At that point, I may put together the basic type helpers I had in mind for helping with the decorators, since I'm going to be messing with the decorators again, and it would be nice to apply a mild level of Don't-Repeat-Yourself to the type annotations.&lt;/p&gt;
&lt;p&gt;Anyway, I'm really tired, as previously established, so I'm going to publish this, reflect on these ideas, and ponder some incredibly cursed programming ideas I've been thinking about.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-12-25</title><link href="https://mwchase.neocities.org/coding-2021-12-25" rel="alternate"></link><published>2021-12-25T05:00:00-05:00</published><updated>2021-12-25T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-12-25:/coding-2021-12-25</id><summary type="html">&lt;p class="first last"&gt;Could this actually be the last layer of abstraction?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Earlier today, I wrote some decorators to make it easier to create &lt;tt class="docutils literal"&gt;InputAccumulator&lt;/tt&gt;s and &lt;tt class="docutils literal"&gt;ValueAdaptor&lt;/tt&gt;s.
Typing them was a bit obnoxious, and I was tempted to put together some helper types, but I decided against it for now.&lt;/p&gt;
&lt;p&gt;Right now, I need to check over how this code could be used, and see if I need more helpers.
I'm feeling a little out of it at this point, unfortunately, so I'm just going to take a few notes.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Currently, I have separate &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt;s for the &lt;tt class="docutils literal"&gt;src&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;tests&lt;/tt&gt; directories for &lt;tt class="docutils literal"&gt;flake8&lt;/tt&gt;.
For now, I should merge them into one.&lt;/li&gt;
&lt;li&gt;I'm missing the class to combine a &lt;tt class="docutils literal"&gt;ValueAdaptor&lt;/tt&gt; with the &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt; using the keys...
Actually, since these &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt;s could &lt;em&gt;theoretically&lt;/em&gt; use multiple keys, I guess what I want is to replace the current decorator invocations with something that takes &lt;tt class="docutils literal"&gt;ValueAdaptor&lt;/tt&gt;s...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note to my future self: this isn't redundant with the &lt;tt class="docutils literal"&gt;path_segments&lt;/tt&gt; concept, because that controls the virtual environment path, and it's possible to reuse virtual environments for different commands.
Okay?
Okay.
Good.&lt;/p&gt;
&lt;p&gt;Anyway, I guess the ultimate form of this is something that looks sort of like the &lt;tt class="docutils literal"&gt;Command&lt;/tt&gt; interface, but augmented with &lt;tt class="docutils literal"&gt;InputAccumulator&lt;/tt&gt;s and &lt;tt class="docutils literal"&gt;ValueAdaptor&lt;/tt&gt;s.
I'm imagining something that takes one &lt;tt class="docutils literal"&gt;Command&lt;/tt&gt; argument, some number of possibly value-adapting &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt; &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt;s of the same &lt;tt class="docutils literal"&gt;Program&lt;/tt&gt; type, and also possibly some &lt;tt class="docutils literal"&gt;InputAccumulator&lt;/tt&gt;s, as well as an optional keyword argument to invoke a module with the same general types.
I really hope this is the last level of abstraction I end up layering on top of all of this, but I guess we'll see!&lt;/p&gt;
&lt;p&gt;Anyway, I'll try to put this all into practice next week.
Handling:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;New argument types&lt;/li&gt;
&lt;li&gt;Accumulating off the &lt;tt class="docutils literal"&gt;ValueAdaptor&lt;/tt&gt; data&lt;/li&gt;
&lt;li&gt;Making sure I'm right about the order this all happens in, because I think I can generate the final &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt; for a command without instantiating it, and thereby extract a flex input to convert to an output from a previous command.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(So, setting up coverage looks like &amp;quot;generate command with no deletion dependencies, extract the coverage output, convert it to a deletion input, then pass that output version to the erase and the input version back to the original command to create the true final version&amp;quot;.
Eugh.)&lt;/p&gt;
&lt;p&gt;Good luck with whatever you're working on.
I'm certainly going to need it to get through this.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-12-24</title><link href="https://mwchase.neocities.org/coding-2021-12-24" rel="alternate"></link><published>2021-12-24T05:00:00-05:00</published><updated>2021-12-24T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-12-24:/coding-2021-12-24</id><summary type="html">&lt;p class="first last"&gt;It seems to be all set, but I'm not sure I trust it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I've put together a rough draft of the accumulator and adaptor stuff.
It was a bit annoying to get the necessary actions together.
I ended up with nested functions like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;instantiate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;_objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Objects&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;_items&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Items&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_requirements&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Requirements&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="n"&gt;_io&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;_cmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PathStr&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="k"&gt;yield from&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dynamic&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instantiate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;path_str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accumulator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;adaptor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;adaptor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;adaptor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;path_str&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Except a little less skinny, because I reformatted that to try to fit in the code box.&lt;/p&gt;
&lt;p&gt;There is a ridiculous amount of stuff going on there.
The whole function conforms to the &lt;tt class="docutils literal"&gt;DynamicFunc[Input[PathStr]]&lt;/tt&gt; interface, and relies on the wrapped value being a &lt;tt class="docutils literal"&gt;Dynamic[Input[PathStr]]&lt;/tt&gt;, so it can produce the actual value, and then use &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt;'s &lt;tt class="docutils literal"&gt;map&lt;/tt&gt; method to adapt the &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt;'s wrapped value with a partial call of the &lt;tt class="docutils literal"&gt;accumulator&lt;/tt&gt; field function, with the dynamic value corresponding to the adaptor's key, adapted by the adaptor.&lt;/p&gt;
&lt;p&gt;This is all to say that this code had better work, after all the trouble I went through writing it.&lt;/p&gt;
&lt;p&gt;I'm not going to try to use this code just yet, but I should get on that in the next few days.&lt;/p&gt;
&lt;p&gt;I'm going to wrap up now before I stay up too late again.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-12-23</title><link href="https://mwchase.neocities.org/coding-2021-12-23" rel="alternate"></link><published>2021-12-23T05:00:00-05:00</published><updated>2021-12-23T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-12-23:/coding-2021-12-23</id><summary type="html">&lt;p class="first last"&gt;I traveled and procrastinated today, but I wanted to get &lt;em&gt;something&lt;/em&gt; done.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Just going to sum some things up quickly...
Slightly bad/annoying news on the &amp;quot;wrapper types for dealing with &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt; &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt;&amp;quot; front.&lt;/p&gt;
&lt;p&gt;I added a new type into the mix, to handle &lt;tt class="docutils literal"&gt;Token&lt;/tt&gt; targets that are added as &lt;tt class="docutils literal"&gt;extra_io&lt;/tt&gt;.
(Noting how they're added is mainly relevant because &lt;tt class="docutils literal"&gt;Token&lt;/tt&gt; instances can't be passed on the command line.)
This is a problem, among other reasons, because &lt;tt class="docutils literal"&gt;Token&lt;/tt&gt; is one of the few classes that I specifically intend for other libraries to be free to subclass.
That means I'm going to need to nail down exactly what the code needs to be able to do, and define that as an abstract function on the &lt;tt class="docutils literal"&gt;Token&lt;/tt&gt; class.&lt;/p&gt;
&lt;p&gt;So, let's review my previous sketches in light of the new reality.
There may be multiple &lt;tt class="docutils literal"&gt;InputAccumulator[T]&lt;/tt&gt; classes or there may not, doesn't matter.
The new value of &lt;tt class="docutils literal"&gt;T&lt;/tt&gt; that needs to be accounted for is &lt;tt class="docutils literal"&gt;Token&lt;/tt&gt;.
(The only subclass of &lt;tt class="docutils literal"&gt;Token&lt;/tt&gt; currently is &lt;tt class="docutils literal"&gt;Deleted&lt;/tt&gt;, which wraps a ... string?
I don't remember why I wanted to use a string instead of &lt;tt class="docutils literal"&gt;pathlib.Path&lt;/tt&gt;.)
Either way, we need some way to define a function that accumulates information into a &lt;tt class="docutils literal"&gt;Token&lt;/tt&gt;.
My inclination is to have something similar to &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt;'s &lt;tt class="docutils literal"&gt;map&lt;/tt&gt; method.
Make &lt;tt class="docutils literal"&gt;Token&lt;/tt&gt; parametric on the wrapped type and put the type information in the method signature.&lt;/p&gt;
&lt;p&gt;Here's another wrinkle...
In my use case for this, the &lt;tt class="docutils literal"&gt;Deleted&lt;/tt&gt; instances have to match up one-to-one with some paths generated elsewhere in the function...&lt;/p&gt;
&lt;p&gt;So do I want this to go like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Fully generate the paths, extract the final &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt; at some point, and map &lt;tt class="docutils literal"&gt;deleted&lt;/tt&gt; over its contents, and re-flex the result?&lt;/li&gt;
&lt;li&gt;OR generate the data twice and keep it in sync with itself?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'd been worried there was some reason I couldn't do the first option, but it looks like I was wrong.
This is nice, because I means I don't actually have to do any of the stuff I was pondering earlier: I can do all of the hard stuff exactly once, then write a tiny trivial map function over &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt; in order to convert the inner type.&lt;/p&gt;
&lt;p&gt;It's getting late, so I can't stretch this out too much further, but I'll try to nail things down more tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-12-22</title><link href="https://mwchase.neocities.org/coding-2021-12-22" rel="alternate"></link><published>2021-12-22T05:00:00-05:00</published><updated>2021-12-22T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-12-22:/coding-2021-12-22</id><summary type="html">&lt;p class="first last"&gt;Kind of tempted to see if I could code golf this with HKTs, but I'd rather work on adding functionality.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I have a new name for &lt;tt class="docutils literal"&gt;Builder&lt;/tt&gt;.
I'm going to try calling it &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Okay, as I started copying things over, I realized that I'm missing a &lt;tt class="docutils literal"&gt;flex&lt;/tt&gt;-style method for handling implicit prerequisites and outcomes, stuff that doesn't directly show up on the command line.
I know I need that to make Coverage work properly, so I've got to get that in at some point.
Hopefully, get this big weird convoluted method written right next to the other big weird convoluted method will give me some inspiration to factor out common logic.
One aspect of this that's somewhat unfortunate is, I'm going to have to switch from storing &amp;quot;dynamic flexible&amp;quot; instances in a simple map to another registry-style mapping.
That'll be the fourth one, unless I just...
I think I can safely shove this in an &lt;tt class="docutils literal"&gt;Objects&lt;/tt&gt;, I just need to parameterize it aggressively.
Wait, no, that doesn't work.
I legitimately need a whole new registry type.
UUUUUUGH.&lt;/p&gt;
&lt;p&gt;Well, I did it, and I got everything moved over.
At this point, the &lt;tt class="docutils literal"&gt;types&lt;/tt&gt; module contains no &lt;tt class="docutils literal"&gt;class&lt;/tt&gt; statements, which is... interesting.&lt;/p&gt;
&lt;p&gt;Anyway, that was a marathon session, it felt like, and I think the new &lt;tt class="docutils literal"&gt;dynamic&lt;/tt&gt; module is somehow &lt;em&gt;longer&lt;/em&gt; than &lt;tt class="docutils literal"&gt;types&lt;/tt&gt; was yesterday?
I'm not going to dwell on that too much.&lt;/p&gt;
&lt;p&gt;I think, in light of the enhancements I made to the &lt;tt class="docutils literal"&gt;Dynamic&lt;/tt&gt; class, I want to take a break from this refactor, and work on writing the classes I was sketching out last week.&lt;/p&gt;
&lt;p&gt;For now, I want to decompress from all of the coding I just did.
Time to take things easy.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2021-12-21</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-12-21" rel="alternate"></link><published>2021-12-21T05:00:00-05:00</published><updated>2021-12-21T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-12-21:/weekly-roundup-2021-12-21</id><summary type="html">&lt;p class="first last"&gt;Having experienced pain, I would not recommend it.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I did some work sketching out the types to generate the flexible builders for MOTR.&lt;/li&gt;
&lt;li&gt;Thursday: Oh, the pain.&lt;/li&gt;
&lt;li&gt;Friday: I made a plan for breaking up some of the modules in MOTR.&lt;/li&gt;
&lt;li&gt;Saturday: I got rid of some weird prototype code, and started splitting things up.&lt;/li&gt;
&lt;li&gt;Sunday: I did some more splitting-up, then revisiting the sketch work I did for Wednesday on Tuesday.&lt;/li&gt;
&lt;li&gt;Monday: I split out some more code, and fixed some bugs that I feel like mypy let me down a little by not catching.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to be taking a break from work, and hopefully making some good progress on all of my hobby stuff, like MOTR.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2021-12-20</title><link href="https://mwchase.neocities.org/coding-2021-12-20" rel="alternate"></link><published>2021-12-20T05:00:00-05:00</published><updated>2021-12-20T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-12-20:/coding-2021-12-20</id><summary type="html">&lt;p class="first last"&gt;I think I need to write tests of my types, which is... a pain, probably.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hoo boy.
I pulled out the stuff related to &lt;tt class="docutils literal"&gt;Command&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; into two modules.
This helped me by getting them into separate files, and I could rename &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; to also be &lt;tt class="docutils literal"&gt;Command&lt;/tt&gt;.
This is a bit awkward, but it's all right for now.
At least it's possible, with the classes living in separate modules.&lt;/p&gt;
&lt;p&gt;One thing I discovered from investigating the &lt;tt class="docutils literal"&gt;CmdMeta&lt;/tt&gt; class and related functions, was that I'd gotten some of the method signatures wrong, in a way that I'd have expected mypy to catch, but I guess there were too many &lt;tt class="docutils literal"&gt;Any&lt;/tt&gt;s in there.
We'll see if this works better once I've actually run some of this code.&lt;/p&gt;
&lt;p&gt;If I want more substantial posts from these rewrites, I should probably write them as I work on the code.
As it is, I'm trying to remember what exactly I did, and I'm like &amp;quot;Man, that was like ten hours ago, that's &lt;em&gt;ancient history&lt;/em&gt;.&amp;quot;&lt;/p&gt;
&lt;p&gt;Anyway, I'll be able to work on stuff more intensely in a few days.
I don't know if I actually will, but I'll be &lt;em&gt;able&lt;/em&gt; to.&lt;/p&gt;
&lt;p&gt;Anyway, I'm not going to push myself any further tonight, so I'm done for now.
In any case, &lt;em&gt;soon&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-12-19</title><link href="https://mwchase.neocities.org/coding-2021-12-19" rel="alternate"></link><published>2021-12-19T05:00:00-05:00</published><updated>2021-12-19T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-12-19:/coding-2021-12-19</id><summary type="html">&lt;p class="first last"&gt;I'm not sure how interesting any of this is. Oh well.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay.
I did some more work on breaking up MOTR modules.
I don't remember if there was anything of note.&lt;/p&gt;
&lt;p&gt;I've got more work to do there, but I should make sure I'm ready to add more required functionality, once that's done.&lt;/p&gt;
&lt;p&gt;So, that'd be the pair of types that generate &lt;tt class="docutils literal"&gt;Builder[Input[PathStr]]&lt;/tt&gt; objects, and invoking its &lt;tt class="docutils literal"&gt;flex&lt;/tt&gt; method with a specified prefix, all contributed keys, and predetermined output data that includes output names and whether to create the parent directory, as well as the index to store the base Builder on (not yet implemented).&lt;/p&gt;
&lt;p&gt;Anyway, that's important when I get to split out &lt;tt class="docutils literal"&gt;Builder&lt;/tt&gt;.
Before that, I've got to work with the aliases at the beginning of the &lt;tt class="docutils literal"&gt;types&lt;/tt&gt; module.
There's some duplication of aliases between &lt;tt class="docutils literal"&gt;motr._api.cli.types&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;motr._api.actions.cmd&lt;/tt&gt;, and some of them should be defined partially within &lt;tt class="docutils literal"&gt;motr._api.actions.io&lt;/tt&gt;.
Let's see what I can do there.&lt;/p&gt;
&lt;p&gt;Okay, I'm still not seeing much to talk about here, but there's more work to do, so I'm going to publish and then mess around a bit more.&lt;/p&gt;
&lt;p&gt;Maybe I'll have something more definite to talk about tomorrow.
Frankly, I'm not going to worry too much.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-12-18</title><link href="https://mwchase.neocities.org/coding-2021-12-18" rel="alternate"></link><published>2021-12-18T05:00:00-05:00</published><updated>2021-12-18T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-12-18:/coding-2021-12-18</id><summary type="html">&lt;p class="first last"&gt;Really appreciating having modules that are closer to, like, a screen in size, rather than being $LONG lines long.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Wish me luck, I'm going to try to clean up the code a little.
Basically, since a lot of this code isn't hooked up to anything, I'm safe to mess around with it without having to consider what it'll mean for the project's own motrfile.
I'm switching over to the subclassing-based solution, so let's see what the necessary changes look like.&lt;/p&gt;
&lt;p&gt;The system that I'm replacing was using &lt;tt class="docutils literal"&gt;Literal&lt;/tt&gt; types to represent different programs.
Which is mostly fine, but it has a bunch of minor shortcomings, and it also looks really strange.
The basic point of all of this was to use these literals as marker types.
But repurposing literal types for this was awkward and inflexible.
To my mind, I'm not really running the usual risks of a subclassing-based interface, if the classes only really do anything at the type level, so they never actually get instantiated.&lt;/p&gt;
&lt;p&gt;Anyway, that was all pretty simple.
My next issue is splitting up the &lt;tt class="docutils literal"&gt;types&lt;/tt&gt; module.
The problem there is where to put them.
As long as the &lt;tt class="docutils literal"&gt;cli&lt;/tt&gt; package is mostly a bundle of related things, I'd rather it not be a bundle of &lt;em&gt;two kinds&lt;/em&gt; of things.
For now, and this doesn't seem like an objectively great solution as I type this, but I haven't thought of the better one yet, I'm going to split off these new modules into a &lt;tt class="docutils literal"&gt;cli_types&lt;/tt&gt; package.
Let's see how that works out for me.&lt;/p&gt;
&lt;p&gt;First I'm going to add the package and just make sure the bare package doesn't somehow break anything.
Now, let's see what it takes to split out the &lt;tt class="docutils literal"&gt;Key&lt;/tt&gt; code into its own module.
While I was working on this, I noticed something that I think I like more as a way to handle some of the functionality, so I made that change at the same time because, like, whatever.&lt;/p&gt;
&lt;p&gt;Okay, I went and pulled that functionality out into its own module.
Next up is...
Let's try the Registry classes.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;I now realize that the distinction between &amp;quot;Objects&amp;quot; and &amp;quot;Items&amp;quot; is... obscure at best.
I'm not totally sure what to do about that.
I'm just going to leave it as-is for now and sleep on it for a bit.
Anyway, let's finish up this migration.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;I'm not focusing super-well right now, so this is going a little slow.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;All right, it's late, but I've successfully pulled out two modules.
It turns out they were pretty small, so I didn't really cut down on the main &lt;tt class="docutils literal"&gt;types&lt;/tt&gt; module yet, but in time...&lt;/p&gt;
&lt;p&gt;Anyway, there's no way I'm getting anything else done tonight, so I'm calling it here.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-12-17</title><link href="https://mwchase.neocities.org/coding-2021-12-17" rel="alternate"></link><published>2021-12-17T05:00:00-05:00</published><updated>2021-12-17T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-12-17:/coding-2021-12-17</id><summary type="html">&lt;p class="first last"&gt;Preparing to break some modules up.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I'm still tired, but I'm not &lt;em&gt;in pain&lt;/em&gt; any more.
I want to get something code-related done.
One thing that I've been doing with MOTR, is focusing on new functionality to make writing the motrfile easier.
But before I start prototyping that stuff, it might be worth trying to clean up some of the new modules I'm writing.
Most of the code I've written is in the &lt;tt class="docutils literal"&gt;motr._api.cli.types&lt;/tt&gt; module, which is the largest module in the package by statement count, and over twice as large as the next-largest module.
Let's see if I can find any points of division.&lt;/p&gt;
&lt;p&gt;First, let's see what's in there.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Imports.&lt;/li&gt;
&lt;li&gt;TypeVar and alias definitions.
Some are completely generic, others are specific to the &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; API, and have some weird decisions.
Some of this code should maybe be replaced with an API that's based on subclassing.
Which is weird for me to say, but I have good reasons for this very particular case.
Some of these aliases seem like they mainly serve to confuse me, and I should try to cut down on them.&lt;/li&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;Installer&lt;/tt&gt; protocol and supporting types.&lt;/li&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;Key&lt;/tt&gt; class and supporting aliases and functions.&lt;/li&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;Command&lt;/tt&gt; class, which brings together the previous two classes.
And a bunch of aliases that I wonder if there's some more elegant way to deal with.
And helper functions that convert between those aliases as needed.&lt;/li&gt;
&lt;li&gt;The Registry Protocols (which are used by the helper functions).
These Protocols are kind of obnoxious, for two reasons.
For one, they're all very similar and it feels like I'd be able to consolidate them with HKTs.
For another, once I add enough methods, &lt;tt class="docutils literal"&gt;PMap&lt;/tt&gt;s stop satisfying them, but it's weirdly tricky to nail down why.
Like, maybe there are sets of three methods, where I can have any two, but if I add all three, it stops type-checking???
I do not understand what is going on.
Anyway, there's also a helper method for one kind of Registry in particular.&lt;/li&gt;
&lt;li&gt;Next we get to &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; API stuff.
Starting with &lt;tt class="docutils literal"&gt;CmdMeta&lt;/tt&gt;, which has methods that call some of the helper functions above, and those functions should probably just be inlined into these methods, which could maybe be properties.
Then, we've got the &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt; classes.&lt;/li&gt;
&lt;li&gt;Next up the &lt;tt class="docutils literal"&gt;Builder&lt;/tt&gt; classes.
&lt;tt class="docutils literal"&gt;Builder&lt;/tt&gt; has some methods that I suspect could be rewritten into some kind of &lt;tt class="docutils literal"&gt;map&lt;/tt&gt; method, and one that I'm not sure what to do about, the &lt;tt class="docutils literal"&gt;flex&lt;/tt&gt; method, which is big and complicated, and could probably be simplified &lt;em&gt;somehow&lt;/em&gt;.
(Like, maybe I can factor things out so it's got a &lt;tt class="docutils literal"&gt;map&lt;/tt&gt; style method on one side, and a callable on the other.)&lt;/li&gt;
&lt;li&gt;Random helper functions and classes that synthesize the preceding stuff in various manners.
Including one helper that works with nothing but basic registries.&lt;/li&gt;
&lt;li&gt;Finally, the helper function that synthesizes stuff from the whole rest of the module into a useful bridge between its high-level representation, and the rest of MOTR's not-quite-as-high-level representation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thinking over this, here's a division that I'd like to try making:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Installer&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;InstallerRegistry&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;combine&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Key&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;new_key&lt;/tt&gt;, and &lt;tt class="docutils literal"&gt;IterableKeys&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Command&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;CmdMeta&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;base_cmd&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;ObjectRegistry&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;ItemRegistry&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;item_registries&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;static_option&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Builder&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Nullary&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;static_builder&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;OutputData&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;builder&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;builder_requirements&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That should properly divide things up so I'm not constantly spelunking in a 600-line file.
I'll try and look into this later, when I have a bit more energy.
For now, I'll see about getting some energy back.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2021-12-16</title><link href="https://mwchase.neocities.org/diary-2021-12-16" rel="alternate"></link><published>2021-12-16T05:00:00-05:00</published><updated>2021-12-16T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-12-16:/diary-2021-12-16</id><summary type="html">&lt;p class="first last"&gt;The details are too disgusting.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I really wanted to get work done on something tonight, but I &lt;em&gt;also&lt;/em&gt; wanted to not be in excruciating pain, so I guess I'm just getting disappointed a lot tonight.&lt;/p&gt;
&lt;p&gt;I can't really focus, and I've done all I can for now, so I don't think there's anything for me to do but wait.
I'm not going to try to accomplish anything else now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2021-12-15</title><link href="https://mwchase.neocities.org/coding-2021-12-15" rel="alternate"></link><published>2021-12-15T05:00:00-05:00</published><updated>2021-12-15T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-12-15:/coding-2021-12-15</id><summary type="html">&lt;p class="first last"&gt;Carefully nailing down responsibility to avoid requiring some of the objects to basically be magic.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I'm still focused on MOTR, so I might as well think about it carefully.
Right now, I'm concerned with synthesizing &lt;tt class="docutils literal"&gt;Builder[Input[PathStr]]&lt;/tt&gt; objects.
This can be more-or-less broken into several distinct parts:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;An initial &lt;tt class="docutils literal"&gt;Builder[Input[T]]&lt;/tt&gt;, where the type variable has some reasonable bounds.&lt;/li&gt;
&lt;li&gt;A &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Callable[[U,&lt;/span&gt; T], T]&lt;/tt&gt; that builds up the wrapped value; &lt;tt class="docutils literal"&gt;T&lt;/tt&gt; can unify with &lt;tt class="docutils literal"&gt;U&lt;/tt&gt;, but this isn't required.&lt;/li&gt;
&lt;li&gt;For key of type &lt;tt class="docutils literal"&gt;Key[PVector[K]]&lt;/tt&gt;, a &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Callable[[K],&lt;/span&gt; U]&lt;/tt&gt; to convert the values from the &lt;tt class="docutils literal"&gt;ItemRegistry&lt;/tt&gt; into the proper form.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This should coalesce into a few specific objects:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;InputAccumulator[T, U]&lt;/tt&gt; wraps a &lt;tt class="docutils literal"&gt;Builder[Input[T]]&lt;/tt&gt; and a &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Callable[[U,&lt;/span&gt; T], T]&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;ValueAdaptor[K, U]&lt;/tt&gt; wraps a &lt;tt class="docutils literal"&gt;Key[PVector[K]]&lt;/tt&gt; and a &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Callable[[K],&lt;/span&gt; U]&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;tt class="docutils literal"&gt;InputAccumulator[T, U]&lt;/tt&gt; has an evolution method that takes a &lt;tt class="docutils literal"&gt;ValueAdaptor[K, U]&lt;/tt&gt;.
Once all values are accumulated, the wrapped &lt;tt class="docutils literal"&gt;Builder[Input[T]]&lt;/tt&gt; can be extracted and converted into a higher-level &lt;tt class="docutils literal"&gt;Builder&lt;/tt&gt; via its &lt;tt class="docutils literal"&gt;flex&lt;/tt&gt; method (name subject to change), and then that builder can be concatenated onto the main command.&lt;/p&gt;
&lt;p&gt;Now, this doesn't all &lt;em&gt;quite&lt;/em&gt; work, because I'm not sure that it makes sense for every &lt;tt class="docutils literal"&gt;InputAccumulator[T, U]&lt;/tt&gt; in a given context to have the &lt;em&gt;same&lt;/em&gt; &lt;tt class="docutils literal"&gt;U&lt;/tt&gt;, so it's almost like, it should actually be a &lt;tt class="docutils literal"&gt;ValueAdaptor[K]&lt;/tt&gt; with a &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Callable[[K,&lt;/span&gt; &lt;span class="pre"&gt;Type[U]],&lt;/span&gt; U]&lt;/tt&gt;, and &lt;tt class="docutils literal"&gt;InputAccumulator[T]&lt;/tt&gt; has a &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Callable[[ValueAdaptor[Any],&lt;/span&gt; T], T]&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Now, this is all pretty flexible-looking, but I think I want the possible types in play to be pretty heavily restricted.
Like, how far can I get if &lt;tt class="docutils literal"&gt;T&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;U&lt;/tt&gt; have to be either &lt;tt class="docutils literal"&gt;str&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;PathLike[str]&lt;/tt&gt;?&lt;/p&gt;
&lt;p&gt;I'll have to think for a while to see if that would somehow break something, but it seems solid right now.&lt;/p&gt;
&lt;p&gt;Now, moving on from that for a moment, to consider how the &lt;tt class="docutils literal"&gt;ValueAdaptor[K]&lt;/tt&gt;s show up.
Now, the &lt;tt class="docutils literal"&gt;InputAccumulator[T]&lt;/tt&gt; objects are ultimately used to create an &lt;tt class="docutils literal"&gt;Output[T]&lt;/tt&gt; object, which sounds pretty bad, but honestly I've got bigger fish to fry for a while.
The point is, accumulating these axes of &lt;em&gt;output&lt;/em&gt; variation makes the most sense if there's associated &lt;em&gt;input&lt;/em&gt; variation, otherwise it's just duplicating stuff for no reason.
So, the &lt;tt class="docutils literal"&gt;ValueAdaptor[K]&lt;/tt&gt; object needs to be part of some larger object that creates non-output variation in some way.&lt;/p&gt;
&lt;p&gt;Basically, it just needs non-output Fragment or Option Builders.&lt;/p&gt;
&lt;p&gt;I think the best course of action at this point is to wait a few days, and see if this all still makes sense.
For now, I want to take things easy.&lt;/p&gt;
&lt;p&gt;(Late addition: the &lt;tt class="docutils literal"&gt;InputAccumulator[T]&lt;/tt&gt;, being meant for output mode, should include some of the arguments to the &lt;tt class="docutils literal"&gt;flex&lt;/tt&gt; method.)&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2021-12-14</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-12-14" rel="alternate"></link><published>2021-12-14T05:00:00-05:00</published><updated>2021-12-14T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-12-14:/weekly-roundup-2021-12-14</id><summary type="html">&lt;p class="first last"&gt;smiley face (unhinged)&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I did a quick pass over the names in the MOTR project to see which ones were okay, and started coming up with alternatives for some of the rest.&lt;/li&gt;
&lt;li&gt;Thursday: I looked over one of the other modules that needs new names.&lt;/li&gt;
&lt;li&gt;Friday: I took a break from coding to think about stuff that I could be coding.&lt;/li&gt;
&lt;li&gt;Saturday: I focused on some of the new modules I'm writing for MOTR, and tried to draft out ideas for reducing the boilerplate code in them.&lt;/li&gt;
&lt;li&gt;Sunday: I converted the draft code from the previous night into a much slicker class-based interface, and gave the modules much nicer indentation as a result.&lt;/li&gt;
&lt;li&gt;Monday: One of the classes I'd written was just kind of weird and I couldn't think of a good name for it, so I deleted it :)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to have to take it easy somehow, but I kind of don't want to.
We'll see how that tension works itself out.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2021-12-13</title><link href="https://mwchase.neocities.org/coding-2021-12-13" rel="alternate"></link><published>2021-12-13T05:00:00-05:00</published><updated>2021-12-13T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-12-13:/coding-2021-12-13</id><summary type="html">&lt;p class="first last"&gt;Resolving &amp;quot;I don't know what to name this class&amp;quot; by deleting the class.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I gave this some though, and I think I see the way forward to fixing the functionality of &lt;tt class="docutils literal"&gt;MetaBuilder&lt;/tt&gt;, if not the name.&lt;/p&gt;
&lt;p&gt;Currently, &lt;tt class="docutils literal"&gt;MetaBuilder&lt;/tt&gt; is kind of split between a &lt;tt class="docutils literal"&gt;Protocol&lt;/tt&gt; class and a decorator that returns a function that conforms to that &lt;tt class="docutils literal"&gt;Protocol&lt;/tt&gt;.
I kind of want to get rid of the weird indirection that results from &amp;quot;here is a protocol, and here is the only lexical part of the source code concerned with implementing it&amp;quot;, but I'm not sure if that's strictly necessary.
Regardless, the first thing I want to do is, convert the &lt;tt class="docutils literal"&gt;Protocol&lt;/tt&gt; to a dataclass that wraps a &lt;tt class="docutils literal"&gt;Builder[InputPathStr]&lt;/tt&gt;, and inline the nested function definition from the decorator into the &lt;tt class="docutils literal"&gt;__call__&lt;/tt&gt; method.
I probably shouldn't mess with that any further until I have tests for it, except to set up a mapping to hold the &lt;tt class="docutils literal"&gt;MetaBuilder&lt;/tt&gt; data, and populate that either unconditionally, or only in the &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; case.
At that point, I can consider questions like &amp;quot;what should the code that consumes this look like&amp;quot; and &amp;quot;what kind of interface do I need to actually generate the &lt;tt class="docutils literal"&gt;MetaBuilder&lt;/tt&gt; instances from pytest, coverage, etc?&lt;/p&gt;
&lt;p&gt;Hm, one thing that occurs to me as a further step is to convert all of this to a method on &lt;tt class="docutils literal"&gt;Builder[Input[PathStr]]&lt;/tt&gt;, which removes the need to name a separate class.
This idea feels nicer to me, because now the question is &amp;quot;how do I synthesize a &lt;tt class="docutils literal"&gt;Builder[Input[PathStr]]&lt;/tt&gt; with the desired properties?&amp;quot; which is somewhat more meaningful than &amp;quot;how do I synthesize a &lt;tt class="docutils literal"&gt;MetaBuilder&lt;/tt&gt; with the desired properties?&amp;quot;&lt;/p&gt;
&lt;p&gt;Let's see how much of a pain it is to do the conversion...&lt;/p&gt;
&lt;p&gt;Okay, that wasn't too bad.
I still need to reconsider the inside of the function, which is a terrible mess of nested definitions, but now the broader organization is more sensible.&lt;/p&gt;
&lt;p&gt;Important TODO: expose &lt;tt class="docutils literal"&gt;self&lt;/tt&gt; in some way in the output case.&lt;/p&gt;
&lt;p&gt;Now, to think a little about how this all works in the downstream interfaces.
There are basically two kinds of thing that have to be properly combined:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The full range of parameters&lt;/li&gt;
&lt;li&gt;The different kinds of output&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Basically, we need the commands to track all of their relevant keys, and translate them into string values.
The resulting strings then must be fed into a function that produces a &lt;tt class="docutils literal"&gt;Builder[Input[PathStr]]&lt;/tt&gt; from the key values.&lt;/p&gt;
&lt;p&gt;This is going to be awkward, because I &lt;em&gt;know&lt;/em&gt; I'll want to pass in stuff like &lt;tt class="docutils literal"&gt;PythonPackage&lt;/tt&gt;, so it's like I guess I need to pass in a callback or something to handle the conversions.
This sounds like a job for &amp;quot;sleeping before I try to code any of this&amp;quot;.&lt;/p&gt;
&lt;p&gt;It's a little early now, but I have to get up early tomorrow and deal with a whole bunch of... just... stuff, so it makes sense to try to wrap up now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-12-12</title><link href="https://mwchase.neocities.org/coding-2021-12-12" rel="alternate"></link><published>2021-12-12T05:00:00-05:00</published><updated>2021-12-12T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-12-12:/coding-2021-12-12</id><summary type="html">&lt;p class="first last"&gt;Let's see how this is all going to work. I certainly don't know yet.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, after thinking over those ideas from last night, I came up with an even better one.
The invocations are quite compact, but they should be flexible if I need to mess around.&lt;/p&gt;
&lt;p&gt;Looking over the &lt;tt class="docutils literal"&gt;flake8.py&lt;/tt&gt; file, I see that I want a similar helper setup for options.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;And, done.&lt;/p&gt;
&lt;p&gt;Okay, that was, basically speaking, all a fun distraction from the more pressing issue of &amp;quot;how do I hook up the junit output from various commands into junitparser and junit2html?&amp;quot;.
From an interface perspective, I think I want a helper function that can be invoked &lt;em&gt;from&lt;/em&gt; the program-specific helpers to generate the options.
Except, no, I'm not sure if that works?
Because I can't properly emit the generated requirements until after all of the underlying commands have been built.
So, it's like I need some kind of wrapper around the program-specific command builder that can somehow introspect it to extract the relevant data.&lt;/p&gt;
&lt;p&gt;I'm not figuring this out tonight, because this is going to get messy really fast.
I might think something different in the morning, but right now, the way I'm thinking about this is, this is going to look like &amp;quot;integrate the ideas currently known as &lt;tt class="docutils literal"&gt;MetaBuilder&lt;/tt&gt; more tightly into the &lt;tt class="docutils literal"&gt;Builder&lt;/tt&gt; interface&amp;quot;.
Basically, some kind of Registry-type field that has a &lt;tt class="docutils literal"&gt;MetaBuilder&lt;/tt&gt; under a field like &lt;tt class="docutils literal"&gt;JUNIT_XML&lt;/tt&gt;.
(Although, since the types are all the same, I shouldn't need to use the &amp;quot;Registry&amp;quot; stuff that I have currently.)&lt;/p&gt;
&lt;p&gt;It might not be necessary to track this on the &lt;tt class="docutils literal"&gt;Builder&lt;/tt&gt; if I can put together the correct interface for constructing and using this stuff.
I have some notes on this that I don't want to look over right now, but I'm going to need them.&lt;/p&gt;
&lt;p&gt;For now, I'd better get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-12-11</title><link href="https://mwchase.neocities.org/coding-2021-12-11" rel="alternate"></link><published>2021-12-11T05:00:00-05:00</published><updated>2021-12-11T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-12-11:/coding-2021-12-11</id><summary type="html">&lt;p class="first last"&gt;The &amp;quot;Will I Understand This Code In The Morning?&amp;quot; Challenge&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I failed at getting more rest last night, so, we'll see what happens tonight.
I'm not feeling super confident, but I'd like to try to get a bit done.
So, let's see what I think about one thing I'd noticed, which is the heavy amount of boilerplate for the base command stuff.
What I want to see is, how much variety is there in the definitions of the base commands?&lt;/p&gt;
&lt;p&gt;So, I'm going to try to sketch out what I want from the helper functions for cutting down on the boilerplate.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# pytest:&lt;/span&gt;
&lt;span class="n"&gt;BASE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Fragment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_types&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fragment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;my_helper_func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;pytest&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;installer_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;PYTEST_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;requirements&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;pytest&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;path_segments&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;pytest&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;allowed_codes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;frozenset&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# flake8:&lt;/span&gt;
&lt;span class="n"&gt;BASE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Fragment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_types&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fragment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;my_helper_func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;flake8&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;installer_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;FLAKE8_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;requirements&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;flake8&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;path_segments&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;check&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;allowed_codes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;frozenset&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Now let&amp;#39;s try some I haven&amp;#39;t attempted.&lt;/span&gt;

&lt;span class="c1"&gt;# junit2html:&lt;/span&gt;
&lt;span class="n"&gt;BASE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Fragment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_types&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fragment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;my_helper_func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;junit2hml&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;installer_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;JUNIT2HTML_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;requirements&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;junit2html&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;path_segments&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;junit2html&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# limit_coverage:&lt;/span&gt;
&lt;span class="n"&gt;BASE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Fragment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_types&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fragment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;my_helper_func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;limit-coverage&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;installer_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;LIMIT_COVERAGE_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;requirements&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;limit-coverage&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;path_segments&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;limit-coverage&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# mypy:&lt;/span&gt;
&lt;span class="n"&gt;BASE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Fragment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_types&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fragment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;my_helper_func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;mypy&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;installer_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;MYPY_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;requirements&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mypy&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;path_segments&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mypy&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;allowed_codes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;frozenset&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# pyinstrument:&lt;/span&gt;
&lt;span class="n"&gt;BASE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Fragment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_types&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fragment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;my_helper_func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;pyinstrument&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;installer_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;PYINSTRUMENT_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;requirements&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;pyinstrument&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;path_segments&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;profile&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# junitparser merge:&lt;/span&gt;
&lt;span class="n"&gt;BASE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Fragment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_types&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fragment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;my_helper_func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;junitparser&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;merge&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;installer_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;JUNITPARSER_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;requirements&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;junitparser&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;path_segments&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;junitparser&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# coverage:&lt;/span&gt;
&lt;span class="n"&gt;BASE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Fragment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_types&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fragment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;my_helper_func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;coverage&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;erase&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;installer_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;COVERAGE_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;requirements&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;coverage&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;path_segments&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;coverage&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;base&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# ...&lt;/span&gt;

&lt;span class="n"&gt;BASE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Fragment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_types&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fragment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;my_helper_func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;coverage&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;html&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;installer_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;COVERAGE_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;requirements&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;coverage&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;path_segments&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;coverage&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;base&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;allowed_codes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;frozenset&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;base&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;installer_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Installer&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;module_fragment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Fragment&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Module&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TProgram&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="c1"&gt;# Probably something about MetaBuilders?&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Fragment&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Script&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TProgram&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_types&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fragment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;my_helper_func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;coverage&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;run&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;installer_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;installer_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;requirements&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;coverage&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="n"&gt;path_segments&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;coverage&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;with_module&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;module_fragment&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;So, there are a few observations here.
One is that the command, the requirement, and the path segment for the environment are &lt;em&gt;usually&lt;/em&gt; the same, and most of the remainder of the cases &lt;em&gt;could&lt;/em&gt; have them all be the same if I were so inclined.
This all implies to me that I could make the helper just fill in those values and change the arguments to &amp;quot;iterables of additional values&amp;quot;.
I'm not confident that I'm using it right for &lt;tt class="docutils literal"&gt;coverage run&lt;/tt&gt;, but that's the weirdest command out of these, and if I need to do something differently, the underlying code is, like, right there.&lt;/p&gt;
&lt;p&gt;So, maybe the helper looks like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;my_helper_func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;subcommands&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;installer_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Installer&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;requirements&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Iterable&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="n"&gt;path_segments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Iterable&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;CmdMeta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;base_cmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;installer_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;subcommands&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;installer_registry&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;INSTALLER_REGISTRY&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;installer_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;Pip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="nb"&gt;frozenset&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
                    &lt;span class="n"&gt;package&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                        &lt;span class="n"&gt;package&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;requirement&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;requirement&lt;/span&gt;
                        &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;requirements&lt;/span&gt;
                    &lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="p"&gt;]),&lt;/span&gt;
                &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;path_segments&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I'll have to sleep on this and see what I think.
Maybe have my original version of the idea, and then this version as a wrapper that &lt;em&gt;just&lt;/em&gt; replicates the argument around.&lt;/p&gt;
&lt;p&gt;But, I'm pretty tired right now, so I don't want to try to evaluate it at the moment.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2021-12-10</title><link href="https://mwchase.neocities.org/diary-2021-12-10" rel="alternate"></link><published>2021-12-10T05:00:00-05:00</published><updated>2021-12-10T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-12-10:/diary-2021-12-10</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;The overall process really encourages contemplation and —&amp;quot; &amp;quot;Do thing fast!&amp;quot; &amp;quot;But&amp;quot; &amp;quot;Do. Thing. Fast.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Seems like I needed a break today, so I took one.
Ish.&lt;/p&gt;
&lt;p&gt;I don't really have a sense of how much effort I put into anything, and I think I've not been getting enough sleep recently, so I'm going to cut myself off a bit early tonight.&lt;/p&gt;
&lt;p&gt;That doesn't need to happen quite yet though, so I'm going to mess around a bit.
One thing I've been wanting to investigate for writing is random oracles, and I could use stuff like &lt;a class="reference external" href="https://www.patreon.com/nekoewen/posts"&gt;Ewen Cluney's oracles and tables&lt;/a&gt; for genre-specific stuff, or I could look into traditional systems and just apply them to fictional characters and situations.
This is partly inspired by playing around with ai-dungeon-type stuff, which has a few issues:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;One is that the particular version I'm using is plagued by weird usability issues, and at some point I'm going to have to just read all of the code and reimplement it in a way that supports stuff like &amp;quot;fixing typos earlier in the line without deleting up to that point&amp;quot;.
(I'm &lt;em&gt;really curious&lt;/em&gt; about how that's broken...)&lt;/li&gt;
&lt;li&gt;Another is that I don't always &lt;em&gt;want&lt;/em&gt; to give it license to respond every few sentences, but it gets really glitchy if I dump a lot of text into it at once.
I could work around this by splitting things up and using &lt;tt class="docutils literal"&gt;/alter&lt;/tt&gt;, but that's a ridiculous workflow, not least because I'm having it generate text that I intend to overwrite.&lt;/li&gt;
&lt;li&gt;Lastly, there's the swinginess between &amp;quot;Oh, that was a clever response&amp;quot; and &amp;quot;This response demonstrates a willful contempt for knowledge about what I just wrote, human relationships, polite conversation, saliency, grammar, and the locally euclidean nature of space-time&amp;quot;, and sometimes it just seems to get &lt;em&gt;stuck&lt;/em&gt; in the latter.
I'd like to try &lt;em&gt;committing&lt;/em&gt; to interpreting vague results, rather than scrutinizing a result to determine whether it needs reinterpretation, or if it's so bad that it needs to be thrown out and retried.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, I'm going to post this soon, and start messing with programming based divination for extreme efficiency.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2021-12-09</title><link href="https://mwchase.neocities.org/coding-2021-12-09" rel="alternate"></link><published>2021-12-09T05:00:00-05:00</published><updated>2021-12-09T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-12-09:/coding-2021-12-09</id><summary type="html">&lt;p class="first last"&gt;This is mostly more straightforward.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Yesterday I looked at &lt;tt class="docutils literal"&gt;core/runner.py&lt;/tt&gt;.
The natural next place to look is &lt;tt class="docutils literal"&gt;core/registry.py&lt;/tt&gt;.
So let's crack that open.&lt;/p&gt;
&lt;p&gt;First off, we've got &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt;, which should be &lt;tt class="docutils literal"&gt;Task&lt;/tt&gt;.
Next, &lt;tt class="docutils literal"&gt;ActionInput&lt;/tt&gt;, which should be &lt;tt class="docutils literal"&gt;TaskPrerequisite&lt;/tt&gt;.
Then, &lt;tt class="docutils literal"&gt;ActionOutput&lt;/tt&gt;, which should be &lt;tt class="docutils literal"&gt;TaskOutcome&lt;/tt&gt;.
Then, &lt;tt class="docutils literal"&gt;TargetName&lt;/tt&gt;, which should be &lt;tt class="docutils literal"&gt;OutcomeName&lt;/tt&gt;.
Then, &lt;tt class="docutils literal"&gt;SkippedName&lt;/tt&gt;, which is fine.&lt;/p&gt;
&lt;p&gt;Those all get unioned into &lt;tt class="docutils literal"&gt;Requirement&lt;/tt&gt;.
Let's put a pin in that one.&lt;/p&gt;
&lt;p&gt;There's &lt;tt class="docutils literal"&gt;_ActionData&lt;/tt&gt;, which should be &lt;tt class="docutils literal"&gt;_TaskData&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Finally, there's &lt;tt class="docutils literal"&gt;Registry&lt;/tt&gt;, which, put a pin in that, but let's look at the methods.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;inputs&lt;/tt&gt; -&amp;gt; &lt;tt class="docutils literal"&gt;prerequisites&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;prerequisites_of_action&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;chosen_targets&lt;/tt&gt; -&amp;gt; &lt;tt class="docutils literal"&gt;named_outcomes&lt;/tt&gt;.
This method takes an iterable of target/outcome names, and resolves them to everything that they refer to.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;parent&lt;/tt&gt; -&amp;gt; &lt;tt class="docutils literal"&gt;cause_of_outcome&lt;/tt&gt; or something.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;default_and_non_default&lt;/tt&gt; -&amp;gt; ... um, I'm not sure.
Maybe I can figure a way to not need this method, because it feels kind of arbitrary.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;require&lt;/tt&gt; should coordinate with &lt;tt class="docutils literal"&gt;Requirement&lt;/tt&gt;.
This is a multimethod that coordinates the evolution of the &lt;tt class="docutils literal"&gt;Registry&lt;/tt&gt;.
Given a &lt;tt class="docutils literal"&gt;Registry&lt;/tt&gt;, if you pass a &lt;tt class="docutils literal"&gt;Requirement&lt;/tt&gt; to the &lt;tt class="docutils literal"&gt;require&lt;/tt&gt; method, you get back a &lt;tt class="docutils literal"&gt;Registry&lt;/tt&gt; that additionally conforms to that &lt;tt class="docutils literal"&gt;Requirement&lt;/tt&gt;, or it raises some kind of error if it can't reconcile the &lt;tt class="docutils literal"&gt;Requirement&lt;/tt&gt;s.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'd like to give this a bit more consideration, but I just stood up and it made me feel awful, so I'm going to have to sleep on this, maybe switch gears for a few days.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-12-08</title><link href="https://mwchase.neocities.org/coding-2021-12-08" rel="alternate"></link><published>2021-12-08T05:00:00-05:00</published><updated>2021-12-08T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-12-08:/coding-2021-12-08</id><summary type="html">&lt;p class="first last"&gt;Look, it's not just &lt;em&gt;a&lt;/em&gt; hard problem, it's one of &lt;em&gt;the&lt;/em&gt; hard problems.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, after forgetting that I should have been planning to use an interface called &lt;tt class="docutils literal"&gt;MetaBuilder&lt;/tt&gt;, which barely means anything, I decided that I need to re-evaluate the class and interface names in this project.
I'm going to start more or less at the base, because there are issues all over the place.&lt;/p&gt;
&lt;p&gt;First up, a few that I barely care about:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;In &lt;tt class="docutils literal"&gt;test_helpers.py&lt;/tt&gt;, there's an &lt;tt class="docutils literal"&gt;App&lt;/tt&gt; subclass called &lt;tt class="docutils literal"&gt;MOTRTest&lt;/tt&gt;.
I honestly forget whether I named it, or the template named it, but it doesn't matter.&lt;/li&gt;
&lt;li&gt;In &lt;tt class="docutils literal"&gt;core/exc.py&lt;/tt&gt;, there are some &lt;tt class="docutils literal"&gt;Exception&lt;/tt&gt; subclasses.
Probably the biggest problem is that I haven't defined enough of these.&lt;/li&gt;
&lt;li&gt;In &lt;tt class="docutils literal"&gt;controllers/base.py&lt;/tt&gt;, there's a &lt;tt class="docutils literal"&gt;Controller&lt;/tt&gt; subclass.
It's... whatever.&lt;/li&gt;
&lt;li&gt;In &lt;tt class="docutils literal"&gt;motr_app.py&lt;/tt&gt;, there's the &lt;tt class="docutils literal"&gt;MOTR&lt;/tt&gt; subclass of &lt;tt class="docutils literal"&gt;App&lt;/tt&gt;, which makes complete sense.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, the core runtime logic lives in &lt;tt class="docutils literal"&gt;core/runner.py&lt;/tt&gt;.
This code processes the classes from &lt;tt class="docutils literal"&gt;core/registry.py&lt;/tt&gt;, but I'm going to cover &lt;tt class="docutils literal"&gt;runner.py&lt;/tt&gt; first.&lt;/p&gt;
&lt;p&gt;In addition to its classes, &lt;tt class="docutils literal"&gt;runner.py&lt;/tt&gt; also defines a type alias.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;RuntimeAction&lt;/tt&gt; defines the basic unit of customization for MOTR.
If you define a class that implements this interface, you can use it in your configuration.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;TaskWrapper&lt;/tt&gt; is basically an internal implementation detail.
It takes a nullary awaitable with &lt;tt class="docutils literal"&gt;None&lt;/tt&gt; return value, and awaits its value exactly once, blocking subsequent calls until the first call returns.
It doesn't really matter what this is called, because it's never used outside of this module.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Target&lt;/tt&gt;, in &lt;em&gt;this&lt;/em&gt; module, coordinates access to various common resources.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Action&lt;/tt&gt;, in &lt;em&gt;this&lt;/em&gt; module, wraps &lt;tt class="docutils literal"&gt;Target&lt;/tt&gt; and a specific &lt;tt class="docutils literal"&gt;RuntimeAction&lt;/tt&gt; to provide the last bits of logic required to correctly dispatch work.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Between these three public names, there's a bunch wrong.
The most obvious issue is that &lt;tt class="docutils literal"&gt;Target&lt;/tt&gt; is a &lt;em&gt;callable&lt;/em&gt; that takes as its argument an instance of a &lt;em&gt;different&lt;/em&gt; type called &lt;tt class="docutils literal"&gt;Target&lt;/tt&gt;.
These types are all named after the corresponding-ish concept from &lt;tt class="docutils literal"&gt;make&lt;/tt&gt;, and I'm not sure how much that really illuminates things.
I suspect that calling the MOTR version of the concept something like &amp;quot;outcome&amp;quot; might make it clearer.&lt;/p&gt;
&lt;p&gt;Like &amp;quot;One of this [action]'s &lt;strong&gt;outcomes&lt;/strong&gt; is the creation of a junit.xml file&amp;quot;.
One thing that would support this idea would be to remove the use of a bare path in the definition of the &lt;em&gt;other&lt;/em&gt; &lt;tt class="docutils literal"&gt;Target&lt;/tt&gt;/&lt;tt class="docutils literal"&gt;Outcome&lt;/tt&gt; type, and replace it with a &lt;tt class="docutils literal"&gt;Created&lt;/tt&gt; wrapper.
(Presumably, it would need a bunch of wrapper methods to support some of the things I do with &lt;tt class="docutils literal"&gt;Input[Path]&lt;/tt&gt; instances currently.)&lt;/p&gt;
&lt;p&gt;I also kind of want to rename the concept of &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;Task&lt;/tt&gt;, because you can &lt;em&gt;do&lt;/em&gt; either of them, but unlike an &amp;quot;action&amp;quot;, you can &amp;quot;set&amp;quot; a &amp;quot;task&amp;quot; for someone else.&lt;/p&gt;
&lt;p&gt;That's sort of beside the point in the context of this module, because these classes mostly shouldn't be using these names the way they are.
For a first approximation, here's what I want:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;RuntimeAction&lt;/tt&gt; -&amp;gt; &lt;tt class="docutils literal"&gt;Task&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Target&lt;/tt&gt; -&amp;gt; &lt;tt class="docutils literal"&gt;Coordinator&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;Solver&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;Provider&lt;/tt&gt; or something.
&lt;tt class="docutils literal"&gt;Taskmaster&lt;/tt&gt;? I'm not really sure.
&lt;tt class="docutils literal"&gt;Runner&lt;/tt&gt;?&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Action&lt;/tt&gt; can be, like, &lt;tt class="docutils literal"&gt;TaskRunner&lt;/tt&gt;, maybe?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I think part of the confusion her on my part stems from the... somewhat weird signatures some of these callable classes have.
Like, the class-currently-known-as &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt; has to have a signature of &amp;quot;nullary async&amp;quot; to work with the &lt;tt class="docutils literal"&gt;TaskWrapper&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;I think I need to think about this some more.
For now, I want to wrap up early.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2021-12-07</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-12-07" rel="alternate"></link><published>2021-12-07T05:00:00-05:00</published><updated>2021-12-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-12-07:/weekly-roundup-2021-12-07</id><summary type="html">&lt;p class="first last"&gt;It's a bad sign when one problem I have is &amp;quot;Well, I forgot what each part did, because none of the names mean anything.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I did some MOTR work. Honestly, it kind of blends together.&lt;/li&gt;
&lt;li&gt;Thursday: But I made a list Tuesday (and posted about it for Wednesday), and made some progress against it.&lt;/li&gt;
&lt;li&gt;Friday: I ran into typing issues that I probably explained poorly.&lt;/li&gt;
&lt;li&gt;Saturday: I figured out the typing issues, and undid a lot of the workarounds I'd put in.&lt;/li&gt;
&lt;li&gt;Sunday: I made plans for utilities to support, and started thinking about more PRs to put in.&lt;/li&gt;
&lt;li&gt;Monday: I started working on flake8 support, and had some ideas that I later realized didn't make sense.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to investigate using the &lt;tt class="docutils literal"&gt;MetaBuilder&lt;/tt&gt;, &lt;em&gt;and not&lt;/em&gt; the &lt;tt class="docutils literal"&gt;InstallerRegistry&lt;/tt&gt;, for passing &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; values between &lt;tt class="docutils literal"&gt;Builder&lt;/tt&gt; objects.
I'm also going to investigate giving this things better names.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2021-12-06</title><link href="https://mwchase.neocities.org/coding-2021-12-06" rel="alternate"></link><published>2021-12-06T05:00:00-05:00</published><updated>2021-12-06T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-12-06:/coding-2021-12-06</id><summary type="html">&lt;p class="first last"&gt;Discovering entirely new areas of the interface that need to be worked out and locked down.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, I started working on the flake8 module for MOTR, and a few things jumped out at me:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The base command for both pytest and flake requires &lt;em&gt;a lot&lt;/em&gt; of boilerplate to define.
I think I want to address this by adding a helper to the pip module that mostly takes keyword-only arguments.&lt;/li&gt;
&lt;li&gt;There's an overlap in problems to be solved for &amp;quot;create virtualenv&amp;quot; and &amp;quot;create report&amp;quot; that implies to me that I should consider reworking the &lt;tt class="docutils literal"&gt;Installer&lt;/tt&gt; classes and functionality, and creating a &lt;tt class="docutils literal"&gt;Report&lt;/tt&gt; class as a companion to &lt;tt class="docutils literal"&gt;Pip&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'll have to think about this carefully, because this could be a case of premature abstraction.
This could be a case of needing more prototyping or sketching.&lt;/p&gt;
&lt;p&gt;Anyway, it's early, but I'm going to be traveling soon, so I think it's for the best to just cut this short so I know I'm done writing.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-12-05</title><link href="https://mwchase.neocities.org/coding-2021-12-05" rel="alternate"></link><published>2021-12-05T05:00:00-05:00</published><updated>2021-12-05T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-12-05:/coding-2021-12-05</id><summary type="html">&lt;p class="first last"&gt;Always nice when I just dash off an improvement to things.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, good progress.
I believe I've got everything required to kick off a pytest run, except for a few utility functions that I'll need to write soon, but I don't need quite yet.
In terms of reusability, I need to port over the rest of the commands over.
I think the order I want to do that in is something like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;flake&lt;/li&gt;
&lt;li&gt;the commands for manipulating junitxml files&lt;/li&gt;
&lt;li&gt;update pytest to output junitxml&lt;/li&gt;
&lt;li&gt;mypy&lt;/li&gt;
&lt;li&gt;pyinstrument&lt;/li&gt;
&lt;li&gt;coverage&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once those are done, coverage will probably be below 80%, so I'll have my work cut out for me in terms of testing.
There are a few other things to look into, though:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Contribute PRs to some of the tools that I've forked&lt;/li&gt;
&lt;li&gt;Investigate adding dark modes to the HTML reports that don't already have them.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Inspired by those ideas, I just now rewrote my dark mode user style to be a bit less harsh on the eyes.
The links are much easier to read now that it's based off Solarized rather than &amp;quot;I dunno, just make it dark&amp;quot;.
Of course, now this makes me want dark mode that much more for flake8-html, mypy, and junit2html.&lt;/p&gt;
&lt;p&gt;At some point, I should review the requirements for each of the tools I listed above.
For now, I need to get to sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-12-04</title><link href="https://mwchase.neocities.org/coding-2021-12-04" rel="alternate"></link><published>2021-12-04T05:00:00-05:00</published><updated>2021-12-04T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-12-04:/coding-2021-12-04</id><summary type="html">&lt;p class="first last"&gt;Getting closer...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I figured out the type errors.
Basically, because the &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; types are simple wrappers around an underlying value, which is immutable, the type should be covariant with respect to its argument, but I didn't do that to start with.&lt;/p&gt;
&lt;p&gt;The practical effect of changing from &lt;tt class="docutils literal"&gt;Input[T]&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;Input[T_co]&lt;/tt&gt; is that now, &lt;tt class="docutils literal"&gt;Input[A]&lt;/tt&gt; can be passed for &lt;tt class="docutils literal"&gt;Input[Union[A, B]]&lt;/tt&gt; (I mean, I'm pretty sure), and also &lt;tt class="docutils literal"&gt;Input[Impl]&lt;/tt&gt; can be passed for &lt;tt class="docutils literal"&gt;Input[Proto]&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;There's some further cleanup and messing-around I want to do as a result of all this, but the thing I think I should focus on right now (after having done some other miscellaneous cleanup) is setting up the infrastructure for building packages.
That's going to take a little consideration to make sure everything fits together.
Basically, I want to start by scanning the repository layout to build a &lt;tt class="docutils literal"&gt;Packages&lt;/tt&gt; object, that contains some number of &lt;tt class="docutils literal"&gt;Package&lt;/tt&gt; objects.
Each one has an associated name and path, and the following layout is needed in the &lt;tt class="docutils literal"&gt;ObjectRegistry&lt;/tt&gt;: one key with the common root information, and one key with all &lt;tt class="docutils literal"&gt;Package&lt;/tt&gt; data, including name, packed into a &lt;tt class="docutils literal"&gt;PVector&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;I think it goes something like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Find all packages&lt;/li&gt;
&lt;li&gt;Synthesize all packages into a common object&lt;/li&gt;
&lt;li&gt;Build all packages, and write all necessary information to install them into several text files, one universal and a set of package-specific ones&lt;/li&gt;
&lt;li&gt;Pack the information into the &lt;tt class="docutils literal"&gt;ObjectRegistry&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Okay, that's kind of conflating the build-time and run-time actions.
Actually building the packages comes at run-time, but all of the metadata can be calculated ahead of time.
Because the &lt;tt class="docutils literal"&gt;ObjectRegistry&lt;/tt&gt; entries require the metadata, that means that the build-time logic can't use the &lt;tt class="docutils literal"&gt;Builder&lt;/tt&gt; functionality.
So, fundamentally, we need a function that takes the &lt;tt class="docutils literal"&gt;Packages&lt;/tt&gt; data, possibly an initial &lt;tt class="docutils literal"&gt;ObjectRegistry&lt;/tt&gt;, and returns... probably a &lt;tt class="docutils literal"&gt;Requirements[ObjectRegistry]&lt;/tt&gt;.
Or maybe it could just return the raw data, and the calling code is responsible for packing them into a registry.&lt;/p&gt;
&lt;p&gt;Okay, I think this is enough to start drafting code.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;And, things are starting to come together.
What I really need to do is to focus on copying and updating code from the motrfile, and making sure everything makes sense.&lt;/p&gt;
&lt;p&gt;For now, I'm going to wrap up, because it got late.
It does that.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-12-03</title><link href="https://mwchase.neocities.org/coding-2021-12-03" rel="alternate"></link><published>2021-12-03T05:00:00-05:00</published><updated>2021-12-03T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-12-03:/coding-2021-12-03</id><summary type="html">&lt;p class="first last"&gt;Oh no, I have unleashed demons of supreme fiddliness.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, more good progress.
The &lt;tt class="docutils literal"&gt;Pip&lt;/tt&gt; object has all of the fields that I currently know it'll need, and I wrote the &lt;tt class="docutils literal"&gt;combine&lt;/tt&gt; method, which was nice and easy relative to the equivalent on &lt;tt class="docutils literal"&gt;CmdMeta&lt;/tt&gt;, because &lt;tt class="docutils literal"&gt;CmdMeta&lt;/tt&gt; is still handling the &amp;quot;does not exist on one side&amp;quot; logic, which means I can just assume that the other side exists.&lt;/p&gt;
&lt;p&gt;Next up is the &lt;tt class="docutils literal"&gt;resolve&lt;/tt&gt; method, which I'm going to have to think carefully about.
It goes like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Locate the environment directory&lt;/li&gt;
&lt;li&gt;Create its parent directory&lt;/li&gt;
&lt;li&gt;Create the environment&lt;/li&gt;
&lt;li&gt;Run the pip command&lt;/li&gt;
&lt;li&gt;Return the command path&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With some &amp;quot;obvious&amp;quot; steps to make sure everything sequences properly.
The part I want to think about is generating the environment directory.
It's basically supposed to be a prefix plus a unique suffix.
I think for now I'll just set the prefix as a module constant.
So, let's give this a shot...&lt;/p&gt;
&lt;p&gt;Well, the code for the &lt;tt class="docutils literal"&gt;resolve&lt;/tt&gt; method looks good, but I'm trying to get the typing right, and, um...
Things are suddenly going &lt;em&gt;very wrong&lt;/em&gt; and I'm not sure how to fix them yet.&lt;/p&gt;
&lt;p&gt;It looks like I need to redo a bunch of &lt;tt class="docutils literal"&gt;Union&lt;/tt&gt;s.
I strongly suspect that there's a way to get what I want done, done, elegantly, but for now I'll settle for &amp;quot;working&amp;quot;.&lt;/p&gt;
&lt;p&gt;After I get all of these typing errors resolved, I'll still need to get the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;pyproject-build&lt;/span&gt;&lt;/tt&gt; stuff ported, but I think at that point I'll be very close to being ready for a release, code-wise if not test-wise.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to publish this and keep grinding away at those type errors; I don't want to keep this entry any longer.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-12-02</title><link href="https://mwchase.neocities.org/coding-2021-12-02" rel="alternate"></link><published>2021-12-02T05:00:00-05:00</published><updated>2021-12-02T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-12-02:/coding-2021-12-02</id><summary type="html">&lt;p class="first last"&gt;It just works.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got to work on that to-do list I put together yesterday, and it's going pretty well.
Here's what's left:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Add all required fields to the &lt;tt class="docutils literal"&gt;Pip&lt;/tt&gt; object&lt;/li&gt;
&lt;li&gt;Write the &lt;tt class="docutils literal"&gt;combine&lt;/tt&gt; method&lt;/li&gt;
&lt;li&gt;Write the &lt;tt class="docutils literal"&gt;resolve&lt;/tt&gt; method ASAP&lt;/li&gt;
&lt;li&gt;Port over the code from the motrfile that invokes &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;pyproject-build&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'll try to get the fields added after I publish this, but mostly I'm just, oh man, it's so nice to finally be working on this stuff properly.&lt;/p&gt;
&lt;p&gt;Anyway, it ended up being later than I'd like, so I'm just going to wrap things up with no consideration for how awkward it is.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-12-01</title><link href="https://mwchase.neocities.org/coding-2021-12-01" rel="alternate"></link><published>2021-12-01T05:00:00-05:00</published><updated>2021-12-01T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-12-01:/coding-2021-12-01</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;This is a good idea.&amp;quot; *starts implementing it* &amp;quot;What, no it's not.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I ended up getting a bit distracted improving the typing strictness in MOTR, part of which ended up turning into PRs against other libraries.
I... did not do so great with those PRs; I assume they'll get moving in a bit.
(This would all be so much easier if pylint would stop regressing things when it updates...)&lt;/p&gt;
&lt;p&gt;Anyway, I have some stub classes for implementing the Pip versions of the &lt;tt class="docutils literal"&gt;Protocol&lt;/tt&gt;s I need, so let's zoom in on what needs to happen there.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;For now, I want the &lt;tt class="docutils literal"&gt;Installer&lt;/tt&gt; to just build up a command line and not deal with environment variables or extra IO data.&lt;/li&gt;
&lt;li&gt;The command line must support &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; values.&lt;/li&gt;
&lt;li&gt;The root for now is &lt;tt class="docutils literal"&gt;pip install&lt;/tt&gt;, and I think I can get by with just &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-c&lt;/span&gt; &amp;lt;file&amp;gt;&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-r&lt;/span&gt; &amp;lt;file&amp;gt;&lt;/tt&gt;, and string literals for things to concatenate onto it.&lt;/li&gt;
&lt;li&gt;The string literals should be validated to not start with &lt;tt class="docutils literal"&gt;-&lt;/tt&gt;, at minimum.
(I think.)&lt;/li&gt;
&lt;li&gt;The other side of the installer is the combination of &amp;quot;data that determines the root&amp;quot; and &amp;quot;key for retrieving Python version&amp;quot;.&lt;/li&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;Installation&lt;/tt&gt; class needs the ability to associate &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; values with the &lt;tt class="docutils literal"&gt;pip install&lt;/tt&gt; command.
I can either do this the direct hacky way, or the duplication of effort way.
An alternative possibility would be to turn &lt;tt class="docutils literal"&gt;Installation&lt;/tt&gt; into a concrete type that simply combines an &lt;tt class="docutils literal"&gt;Installer&lt;/tt&gt; and some registries, then delegates the underlying functionality to a method on the &lt;tt class="docutils literal"&gt;Installer&lt;/tt&gt;.
Honestly, I think that makes more sense, so let's see what needs to happen for that...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All right, that was pretty painless.
So, let's see what this new &lt;tt class="docutils literal"&gt;Pip&lt;/tt&gt; class, that I got from not needing to note the kind of class, will need.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Sequence of path segments, and property to convert them into a relative path&lt;/li&gt;
&lt;li&gt;Setlike collection of command components, and property to convert them into a command&lt;/li&gt;
&lt;li&gt;Python version key&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It needs to convert all of that into a working environment, and it does so as follows:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Resolve the version key against the registries&lt;/li&gt;
&lt;li&gt;Determine the path of the environment root&lt;/li&gt;
&lt;li&gt;Create the parent directory&lt;/li&gt;
&lt;li&gt;Create the environment with the specified python version&lt;/li&gt;
&lt;li&gt;Resolve the command within the environment, convert to &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;Convert the &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; to an &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; in the context of the pip command, and run it.&lt;/li&gt;
&lt;li&gt;Return the &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I thought I might need something a bit more involved in some cases, but I suspect I was misreading the Mypy documentation.
It would be best to do the following things:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Create a specific data type for &lt;tt class="docutils literal"&gt;(Key[Installer], str)&lt;/tt&gt; pairs, so I'm not keying off whether something is a tuple.&lt;/li&gt;
&lt;li&gt;Prioritize support for PyPy2 once I've got the basics of everything working.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm also going to need to review how I'm going to fit using &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;pyproject-build&lt;/span&gt;&lt;/tt&gt; into this flow, because that's going to be the code responsible for generating a bunch of the requirements and constraints files, and it's also complex enough that it can't fit into the same ecosystem that it's going to be supporting.&lt;/p&gt;
&lt;p&gt;So, things to work on now:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Create the new compound type for getting command paths&lt;/li&gt;
&lt;li&gt;Write the helper methods to process it and patch those into the existing code&lt;/li&gt;
&lt;li&gt;Write the helper types to support pip command generation&lt;/li&gt;
&lt;li&gt;Add all required fields to the &lt;tt class="docutils literal"&gt;Pip&lt;/tt&gt; object&lt;/li&gt;
&lt;li&gt;Write the &lt;tt class="docutils literal"&gt;combine&lt;/tt&gt; method&lt;/li&gt;
&lt;li&gt;Write the &lt;tt class="docutils literal"&gt;resolve&lt;/tt&gt; method ASAP&lt;/li&gt;
&lt;li&gt;Port over the code from the motrfile that invokes &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;pyproject-build&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Actually, it's occurring to me that I should really be able to construct a pip command without needing to rely on the &lt;tt class="docutils literal"&gt;Key&lt;/tt&gt; stuff directly, by leveraging &lt;tt class="docutils literal"&gt;Builder&lt;/tt&gt;s.&lt;/p&gt;
&lt;p&gt;I made the changes now, and I'll see what I think of all that later.
It &lt;em&gt;might&lt;/em&gt; be somewhat unfortunate that I can't be completely consistent about removing late binding, because that's what the &lt;tt class="docutils literal"&gt;Command&lt;/tt&gt; object &lt;em&gt;must&lt;/em&gt; do, but oh well, this should simplify some things, I think/hope.
Or maybe the interface comes out looking virtually identical, but the &lt;tt class="docutils literal"&gt;Installer&lt;/tt&gt; &lt;tt class="docutils literal"&gt;Protocol&lt;/tt&gt; is theoretically more flexible.&lt;/p&gt;
&lt;p&gt;It's all good.
Anyway, I'm going to wrap up for now, and start working on that list later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2021-11-30</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-11-30" rel="alternate"></link><published>2021-11-30T05:00:00-05:00</published><updated>2021-11-30T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-11-30:/weekly-roundup-2021-11-30</id><summary type="html">&lt;p class="first last"&gt;Rough week, but I came out of it feeling relatively rejuvenated.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I was tired and unfocused, trying to prepare for the week ahead.&lt;/li&gt;
&lt;li&gt;Thursday: I traveled, and didn't do much as a result.&lt;/li&gt;
&lt;li&gt;Friday: I fixed some of the problems I'd found with the poem, and then found even more problems.&lt;/li&gt;
&lt;li&gt;Saturday: I transferred the list of problems into the poem source so I can have them handy for reference when I'm revising.&lt;/li&gt;
&lt;li&gt;Sunday: I tried to nail down exactly what I'd need to implement for the additions I want to MOTR.&lt;/li&gt;
&lt;li&gt;Monday: I was late working on stuff because I tried to run a backup and it took &lt;em&gt;forever&lt;/em&gt;, but I did get some work done on MOTR.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm gong to see how much energy and focus I have to keep working on MOTR.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2021-11-29</title><link href="https://mwchase.neocities.org/coding-2021-11-29" rel="alternate"></link><published>2021-11-29T05:00:00-05:00</published><updated>2021-11-29T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-11-29:/coding-2021-11-29</id><summary type="html">&lt;p class="first last"&gt;This was a really eventful day, and most of the events were... not pleasant.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I lost some time today because I was trying to do a backup.
(I'll try again after I publish this.)&lt;/p&gt;
&lt;p&gt;Anyway, today I did the following:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Renamed the old &lt;tt class="docutils literal"&gt;Installer&lt;/tt&gt; type so I can work on the new one without too much disruption.&lt;/li&gt;
&lt;li&gt;Created the new &lt;tt class="docutils literal"&gt;Installer&lt;/tt&gt; &lt;tt class="docutils literal"&gt;Protocol&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Created the &lt;tt class="docutils literal"&gt;InstallerRegistry&lt;/tt&gt; type, and a helper function.&lt;/li&gt;
&lt;li&gt;Created the &lt;tt class="docutils literal"&gt;Installation&lt;/tt&gt; &lt;tt class="docutils literal"&gt;Protocol&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Added an &lt;tt class="docutils literal"&gt;InstallerRegistry&lt;/tt&gt; field to &lt;tt class="docutils literal"&gt;CmdMeta&lt;/tt&gt;, preserving the old fields for now.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are a few possible directions to go from here:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Create &lt;tt class="docutils literal"&gt;Protocol&lt;/tt&gt; instances for pip/virtualenv&lt;/li&gt;
&lt;li&gt;Write the helper methods to process the new &lt;tt class="docutils literal"&gt;CmdMeta&lt;/tt&gt; container types into types that are usable by the lower layers of abstraction&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Everything else I can think to do requires one of those two to be done, and it's getting late, so I'm going to wrap up and try backing up again.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-11-28</title><link href="https://mwchase.neocities.org/coding-2021-11-28" rel="alternate"></link><published>2021-11-28T05:00:00-05:00</published><updated>2021-11-28T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-11-28:/coding-2021-11-28</id><summary type="html">&lt;p class="first last"&gt;This is the quick version.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I really want to make a good guide for myself of the near future work on MOTR, so let's take a look at a use case and see how it illuminates things.&lt;/p&gt;
&lt;p&gt;The global information pertinent to running Python-based scripts is contained in an object called the &lt;tt class="docutils literal"&gt;ObjectRegistry&lt;/tt&gt;.
It maps keys of a parameterized &lt;tt class="docutils literal"&gt;Key[T]&lt;/tt&gt; type to a value of type &lt;tt class="docutils literal"&gt;T&lt;/tt&gt;, and has the expected ancillary operations.
(Technically, this type is uninhabited at runtime, and the actual implementation is handled by some &lt;tt class="docutils literal"&gt;PMap&lt;/tt&gt; objects from &lt;a class="reference external" href="https://pyrsistent.readthedocs.io/"&gt;pyrsistent&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;The &lt;tt class="docutils literal"&gt;ObjectRegistry&lt;/tt&gt; should contain information about which Python interpreters to invoke for a given command, but because this choice depends on the command being run, each command should get its own key.&lt;/p&gt;
&lt;p&gt;So, in the case of running &lt;a class="reference external" href="https://docs.pytest.org/"&gt;pytest&lt;/a&gt; under &lt;a class="reference external" href="https://coverage.readthedocs.io/"&gt;coverage&lt;/a&gt;, the &lt;tt class="docutils literal"&gt;coverage run &lt;span class="pre"&gt;-m&lt;/span&gt; pytest ...&lt;/tt&gt; command should run under every interpreter associated with running tests, while the remainder of the commands should run under a single interpreter.
As such, there should be a &lt;tt class="docutils literal"&gt;PYTEST_INTERPRETERS&lt;/tt&gt; key of type &lt;tt class="docutils literal"&gt;Key[PVector[PythonInterpreter]]&lt;/tt&gt;, and a &lt;tt class="docutils literal"&gt;COVERAGE_INTERPRETER&lt;/tt&gt; key of type &lt;tt class="docutils literal"&gt;Key[PythonInterpreter]&lt;/tt&gt;, where &lt;tt class="docutils literal"&gt;PythonInterpreter&lt;/tt&gt; is probably just a &lt;tt class="docutils literal"&gt;NewType&lt;/tt&gt; wrapper around &lt;tt class="docutils literal"&gt;str&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Now, some quick background:&lt;/p&gt;
&lt;p&gt;I'm building up command line arguments using several helper classes.
The relevant class for this discussion is called &lt;tt class="docutils literal"&gt;CmdMeta&lt;/tt&gt;, and it contains most of the data that the other classes use.
It has a field called &lt;tt class="docutils literal"&gt;installer_segments&lt;/tt&gt;, because it was originally just meant to contain path segments for locating the installation directory associated with a virtual environment.&lt;/p&gt;
&lt;p&gt;My intention is to make &lt;tt class="docutils literal"&gt;installer_segments&lt;/tt&gt; into something fuller-featured.
Its keys are &lt;tt class="docutils literal"&gt;Installer&lt;/tt&gt; objects, the current definition of which is unimportant.
Its values should be whatever data is required to generate an installation command, which includes the choice of key to use for retrieving interpreter data.
In the interest of not hardcoding the installation command generation flow into the command concatenation logic, each installer should define a custom type that conforms to a &lt;tt class="docutils literal"&gt;Protocol&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;tt class="docutils literal"&gt;Protocol&lt;/tt&gt; should include:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;A method for combining two instances of the same class.&lt;/li&gt;
&lt;li&gt;A method for generating an installation command, given the &lt;tt class="docutils literal"&gt;ObjectRegistry&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;ItemRegistry&lt;/tt&gt; associated with the overall call.
This method should produce a generator that generates lower-level &lt;tt class="docutils literal"&gt;Requirement&lt;/tt&gt; objects, and returns an object that contains several bits of data:
The last command it generated, and the script path for the generated environment.
This can be bundled up into a class, there shouldn't be any harm in that.
Call it &lt;tt class="docutils literal"&gt;Installation&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(An &lt;tt class="docutils literal"&gt;ItemRegistry&lt;/tt&gt; is similar to an &lt;tt class="docutils literal"&gt;ObjectRegistry&lt;/tt&gt;, but the keys are of type &lt;tt class="docutils literal"&gt;Key[PVector[T]]&lt;/tt&gt; while the values are of type &lt;tt class="docutils literal"&gt;T&lt;/tt&gt;.)&lt;/p&gt;
&lt;p&gt;(It makes sense to roll the &amp;quot;requirements&amp;quot; information into this new class, so that other classes can define the data types they want.)&lt;/p&gt;
&lt;p&gt;The various containers in the &lt;tt class="docutils literal"&gt;CmdMeta&lt;/tt&gt; that can contain &lt;tt class="docutils literal"&gt;IO&lt;/tt&gt; objects need to be modified to also allow &lt;tt class="docutils literal"&gt;Tuple[Installer, str]&lt;/tt&gt;, or some similar type.
These pairs need to be post-processed out.
This consists of having the &lt;tt class="docutils literal"&gt;Installation&lt;/tt&gt; returned by a given &lt;tt class="docutils literal"&gt;Installer&lt;/tt&gt; generating &lt;tt class="docutils literal"&gt;Requirement&lt;/tt&gt; data in response to the string argument, and returning an &lt;tt class="docutils literal"&gt;Input[Path]&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;All of this represents a high-level overview that fits into the generic &amp;quot;core&amp;quot; code I'm working on.
The specific programs I want to cover may end up requiring specialized helper functions, but I should be able to avoid thinking about that right now.&lt;/p&gt;
&lt;p&gt;For the moment, I need to review those notes later and come up with answers to some of the stuff I glossed over above, like &amp;quot;where does some of this code &lt;em&gt;go&lt;/em&gt;?&amp;quot;&lt;/p&gt;
&lt;p&gt;Hopefully, after no more than a few more rounds of this, I'll be ready to touch the code again.&lt;/p&gt;
&lt;p&gt;Anyway, it's late and I'm tired.
I'm happy with how this is shaping up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Worldbuilding — Korín, Sorín, and Arín 2021-11-27</title><link href="https://mwchase.neocities.org/worldbuilding-ksa-2021-11-27" rel="alternate"></link><published>2021-11-27T05:00:00-05:00</published><updated>2021-11-27T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-11-27:/worldbuilding-ksa-2021-11-27</id><summary type="html">&lt;p class="first last"&gt;Cutting down on the need to cross-reference.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I had a nice relaxed day, but it didn't have much worth blogging about.
I want to take it easy, so I'm going to just convert my current list of gripes into comments in the poem's source code.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Okay, I did it.
My feeling on this currently is that it's nice that several of the stanzas don't have comments on them.&lt;/p&gt;
&lt;p&gt;I guess there's not much more to say on the matter.
I just want to get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Worldbuilding — Korín, Sorín, and Arín"></category></entry><entry><title>Worldbuilding — Korín, Sorín, and Arín 2021-11-26</title><link href="https://mwchase.neocities.org/worldbuilding-ksa-2021-11-26" rel="alternate"></link><published>2021-11-26T05:00:00-05:00</published><updated>2021-11-26T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-11-26:/worldbuilding-ksa-2021-11-26</id><summary type="html">&lt;p class="first last"&gt;Somehow, I ended this with more work to do on the poem than when I started.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Busy day today, for reasons that should be obvious when you take into account that I:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Am in the USA.&lt;/li&gt;
&lt;li&gt;Date these entries the day after I write them.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, I'm kind of zapped, and trying get this done quick so I can relax more.
I figured I'd try to edit the poem a little.
Let's see what I can fix, and what I'll have to come back to later.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Replaced &amp;quot;lapse&amp;quot; with &amp;quot;collapse&amp;quot;&lt;/li&gt;
&lt;li&gt;Removed a &amp;quot;forsake&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;From&amp;quot; in thirteenth stanza&lt;/li&gt;
&lt;li&gt;Replaced &amp;quot;almost&amp;quot; with &amp;quot;practically&amp;quot; (er, &amp;quot;practic'ly&amp;quot;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unfortunately, I'm probably not going to get much farther on the list below, because I just tried reading this all out loud, and the second stanza just... doesn't scan, like, at all.
So, I'm going to end up with some new tasks.&lt;/p&gt;
&lt;p&gt;Still need to figure out:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Start of second stanza does not scan&lt;/li&gt;
&lt;li&gt;Start of fourth stanza isn't great in that respect either&lt;/li&gt;
&lt;li&gt;The whole eighth stanza is a wreck&lt;/li&gt;
&lt;li&gt;Ninth stanza isn't much better&lt;/li&gt;
&lt;li&gt;The tenth stanza just straight up has an extra syllable???&lt;/li&gt;
&lt;li&gt;The twelfth stanza is super weird, but I'm not sure that's a problem&lt;/li&gt;
&lt;li&gt;Something seems off about the thirteenth stanza, but I can't tell what&lt;/li&gt;
&lt;li&gt;The same thing with the eighteenth stanza&lt;/li&gt;
&lt;li&gt;Similar, but not as bad in the nineteenth stanza&lt;/li&gt;
&lt;li&gt;Something just kills the momentum in the twentieth stanza&lt;/li&gt;
&lt;li&gt;Potential clarity issue in the second-last stanza&lt;/li&gt;
&lt;li&gt;And another in the last stanza&lt;/li&gt;
&lt;li&gt;Replacing &amp;quot;health&amp;quot; with &amp;quot;healing&amp;quot;&lt;/li&gt;
&lt;li&gt;The beginning of the speech&lt;/li&gt;
&lt;li&gt;&amp;quot;then&amp;quot;/&amp;quot;kin&amp;quot;, and for that matter, &amp;quot;home&amp;quot;/&amp;quot;down&amp;quot;, and &amp;quot;clashed&amp;quot;/&amp;quot;lash&amp;quot;.
Maybe some way to get it to &amp;quot;clash&amp;quot;... &amp;quot;then&amp;quot;/&amp;quot;in&amp;quot;, &amp;quot;in&amp;quot;/&amp;quot;mend&amp;quot;&lt;/li&gt;
&lt;li&gt;End of eighth stanza&lt;/li&gt;
&lt;li&gt;Ninth stanza&lt;/li&gt;
&lt;li&gt;Still not sure what the deal is with &amp;quot;storm'd&amp;quot;&lt;/li&gt;
&lt;li&gt;Last line of twenty-sixth stanza&lt;/li&gt;
&lt;li&gt;&amp;quot;Sore&amp;quot; in twenty-seventh stanza&lt;/li&gt;
&lt;li&gt;Too much &amp;quot;struck&amp;quot;/not enough parallelism&lt;/li&gt;
&lt;li&gt;General awkwardness in the twenty-ninth through thirty-third stanzas&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Okay, that's enough work.
I could try to do more, but I don't want to, so I won't.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Worldbuilding — Korín, Sorín, and Arín"></category></entry><entry><title>Diary 2021-11-25</title><link href="https://mwchase.neocities.org/diary-2021-11-25" rel="alternate"></link><published>2021-11-25T05:00:00-05:00</published><updated>2021-11-25T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-11-25:/diary-2021-11-25</id><summary type="html">&lt;p class="first last"&gt;Setting my expectations low and clearing them handily.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Travel today.
Did manage to do a bit better with some of the stuff I don't usually blog about.&lt;/p&gt;
&lt;p&gt;At the same time, it's now really late and I want to get to sleep soon, so I'm not going to dwell on anything too much now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2021-11-24</title><link href="https://mwchase.neocities.org/diary-2021-11-24" rel="alternate"></link><published>2021-11-24T05:00:00-05:00</published><updated>2021-11-24T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-11-24:/diary-2021-11-24</id><summary type="html">&lt;p class="first last"&gt;Just kind of flopping around with no energy, somehow still managing to do stuff.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was super tired today.
And even though I'm trying to pace myself on MOTR development to avoid burnout, I'm really really excited for the potential to finally start cutting down on the current motrfile, so I'm kind of stuck mentally going over planning.&lt;/p&gt;
&lt;p&gt;Let's see... I've got some travel to do tomorrow, so that's going to take some time out for sure.&lt;/p&gt;
&lt;p&gt;I'll see if I can manage to focus on Korín etc, or get more direction for Missable Mysteries.&lt;/p&gt;
&lt;p&gt;In any case, I'd better try to get a good night's sleep, in order to have the best chance at pulling any of that off.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2021-11-23</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-11-23" rel="alternate"></link><published>2021-11-23T05:00:00-05:00</published><updated>2021-11-23T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-11-23:/weekly-roundup-2021-11-23</id><summary type="html">&lt;p class="first last"&gt;A burst of productivity that is almost enough to get things working properly.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I had a weird night and worked on some unimportant Lua code.&lt;/li&gt;
&lt;li&gt;Thursday: I shelved the Lua code for now, and started planning changes to MOTR.&lt;/li&gt;
&lt;li&gt;Friday: I did some initial work on new stuff for MOTR.&lt;/li&gt;
&lt;li&gt;Saturday: I worked through obvious improvements to MOTR.&lt;/li&gt;
&lt;li&gt;Sunday: I got a lot of the plans I've made for MOTR properly implemented.&lt;/li&gt;
&lt;li&gt;Monday: I started making new plans, and addressing known issues with them.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to take it easy, and step away from code for a bit.
I've got plenty of writing I can focus on.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2021-11-22</title><link href="https://mwchase.neocities.org/coding-2021-11-22" rel="alternate"></link><published>2021-11-22T05:00:00-05:00</published><updated>2021-11-22T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-11-22:/coding-2021-11-22</id><summary type="html">&lt;p class="first last"&gt;Writing &lt;em&gt;good&lt;/em&gt; documentation for all of this is going to be... interesting.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today, I ended up just trying to do more with MOTR.
It was mainly focused on planning.
I was figuring out what the functionality related to running tests under coverage would look like (there are some weird subtleties), and I think I'm going to need to work things out from the &amp;quot;how are environments created?&amp;quot; perspective.&lt;/p&gt;
&lt;p&gt;So, first off, there's some awkward stuff going on that means that things aren't quite right, because I've got this idea that it should be possible to dispatch commands to things besides a Python virtualenv with all of this, but I don't know if it should be possible to run disparate installers for a single command.
The &lt;em&gt;data types&lt;/em&gt; support specifying the information, but right now the shape of the code forces a very specific flow that prevents actually using more than one binary directory.
Thinking about this, I think the solution is to create a pair of &lt;tt class="docutils literal"&gt;(installer, command)&lt;/tt&gt; objects, and allow that type anywhere in a &lt;tt class="docutils literal"&gt;CmdMeta&lt;/tt&gt;.
Then, after the installers run, the pairs can be processed into &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt;.
Actually, since the path can be pre-calculated, it would mean less changes to the rest of the stack if the &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; data were calculated before the installers run, and injected into their commands.&lt;/p&gt;
&lt;p&gt;I think this will help out the structure in general, even if I'm not currently taking advantage of the flexibility this provides.
(It allows my to process the data based on its contents rather than its location, which feels nicer to me.)&lt;/p&gt;
&lt;p&gt;Anyway, there are a few related improvements required to get this to work.
The smaller improvement required is for there to be a key for python interpreters (&lt;tt class="docutils literal"&gt;NewType&lt;/tt&gt; around string with some minor validation, wrapped in an &lt;tt class="docutils literal"&gt;Optional&lt;/tt&gt;), and then each &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; type gets an associated key, to allow for stuff like &amp;quot;processing coverage data under one interpreter, but generating coverage data under multiple interpreters&amp;quot;.
The bigger improvement, by my estimation, is to set up something like the &lt;tt class="docutils literal"&gt;Key&lt;/tt&gt; system, but for installer names.&lt;/p&gt;
&lt;p&gt;Let's put that aside for a moment and consider what the &amp;quot;run a &lt;tt class="docutils literal"&gt;Script&lt;/tt&gt; &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; code&amp;quot; has to look like now.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; contains a mapping from installers to &amp;quot;segments&amp;quot;, which can be processed into a mapping from installers to virtualenv directories.&lt;/li&gt;
&lt;li&gt;Somewhere there has to be a mapping from installers to keys; I think I skipped over this... I think this has to live on the &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; or the &lt;tt class="docutils literal"&gt;CmdMeta&lt;/tt&gt;.
It shouldn't live in the data type I'm talking about above,
Maybe it should be in the values of the segments mapping.
Let's go with that for now.&lt;/li&gt;
&lt;li&gt;So anyway, let's say it retrieves additional argument data for the installer from the segments.
(Combining this data should probably be delegated to a custom class per installer.)&lt;/li&gt;
&lt;li&gt;So, that's all the information it needs to &lt;em&gt;run&lt;/em&gt; the installer, but before we can run the command, we need to process the &lt;tt class="docutils literal"&gt;CmdMeta&lt;/tt&gt; to extract the dependencies.&lt;/li&gt;
&lt;li&gt;So, we inject the dependencies into the &lt;tt class="docutils literal"&gt;cmd_&lt;/tt&gt; factory, and probably also do some &lt;tt class="docutils literal"&gt;Mkdir&lt;/tt&gt; stuff so the directory parents exist.&lt;/li&gt;
&lt;li&gt;The installer command is ready to generate, and the &lt;tt class="docutils literal"&gt;CmdMeta&lt;/tt&gt; is processed, so now we can generate the installer commands, then generate the main command.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The big change this needs is to create a &amp;quot;combiner&amp;quot; protocol, and to create another registry-type object to house segments and metadata, complete with a utility function to combine these registries.&lt;/p&gt;
&lt;p&gt;Let's see...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Combining metadata protocol&lt;/li&gt;
&lt;li&gt;Rework &lt;tt class="docutils literal"&gt;Installer&lt;/tt&gt; type, fix type errors (including by creating a Pip installer type)&lt;/li&gt;
&lt;li&gt;Switch to registry-style type.&lt;/li&gt;
&lt;li&gt;Potentially fold &lt;tt class="docutils literal"&gt;req_set&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;installer_segments&lt;/tt&gt; together&lt;/li&gt;
&lt;li&gt;Rework &lt;tt class="docutils literal"&gt;CmdMeta&lt;/tt&gt;.
This may involve threading a type parameter through the library that unions onto the data types in the &lt;tt class="docutils literal"&gt;CmdMeta&lt;/tt&gt;, and it can either be the new type I was describing above, or &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Union[()]&lt;/span&gt;&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Around that point, I can step back and reorient.&lt;/p&gt;
&lt;p&gt;I think for the next few days, I should take a break from this.&lt;/p&gt;
&lt;p&gt;Anyway, I want to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-11-21</title><link href="https://mwchase.neocities.org/coding-2021-11-21" rel="alternate"></link><published>2021-11-21T05:00:00-05:00</published><updated>2021-11-21T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-11-21:/coding-2021-11-21</id><summary type="html">&lt;p class="first last"&gt;Some of the type inference in mypy feels like it flows in weird directions.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, this was a good day.
I did some work on Missable Mysteries, there might have been something else I did, but the main thrust of it was taking all of my far-enough-along plans for MOTR and getting them to more-or-less work.&lt;/p&gt;
&lt;p&gt;The main thing missing right now is to get requirement sets and &amp;quot;segments&amp;quot; properly supported.
That functionality is basically to name and configure the virtualenv, and tweak the command name to be in it.&lt;/p&gt;
&lt;p&gt;On the outer side, I need code to create the &amp;quot;registry&amp;quot; data required by this functionality.&lt;/p&gt;
&lt;p&gt;The stuff I've been working on is kind of the in-between stuff.
Creating &lt;tt class="docutils literal"&gt;Builder&lt;/tt&gt;s, and processing them into more complicated forms.
Looking over the diff, the big changes are the reworks of the &amp;quot;registry&amp;quot; types, converting the &lt;tt class="docutils literal"&gt;Builder&lt;/tt&gt; class to require a requirements generator, fixing a few minor typing issues, writing a bunch more helper methods, and copying code from the motrfile into the core.&lt;/p&gt;
&lt;p&gt;I'm going to wind down for now, but, depending on how I prioritize things, I should be good to cut a new version soon-ish.
Basically, I need to get all of the new functionality written or ported, then write tests to exercise the new code; it's possible that, by the time I've written all of the new code I want, it'll have pushed coverage below 90%.
Once I get everything to pass, I'll create a new local version, and start rewriting the motrfile to take advantage of the new features.
I really hope that, once the new release is cut, I'll be prepared to start using MOTR for other projects.
It's a question of having the motrfile be &lt;em&gt;small&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Anyway, if I get it working for my projects, I'll kind of still want to extend it to cope with different layouts, but that's not as high a priority for me as just cutting down on the amount of code in the motrfile.&lt;/p&gt;
&lt;p&gt;Cannot stay awake any longer.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-11-20</title><link href="https://mwchase.neocities.org/coding-2021-11-20" rel="alternate"></link><published>2021-11-20T05:00:00-05:00</published><updated>2021-11-20T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-11-20:/coding-2021-11-20</id><summary type="html">&lt;p class="first last"&gt;Nice, simple cleanup.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was tired today, so I picked some easy stuff to work on.
I fixed some mypy errors, some flake8 errors, and got coverage up, but not all the way up.
Then I rewrote the imports to be shorter, and this actually uncovered an issue that had been concealed by the previous format, so I think this has already been a positive change.&lt;/p&gt;
&lt;p&gt;Of the remaining thirty lines to have coverage added, some of them need further design work to be able to write the code that produces the data that the functions need to execute properly.&lt;/p&gt;
&lt;p&gt;So, for now, I'm going to do something I realized that I could do earlier today, and get rid of one of the actions that I don't need.
It shouldn't seriously change things, but getting rid of it makes things make that much more sense.
Basically, it was an artifact of how I was doing stuff in the noxfile that I derived the motrfile from, that I was doing &lt;tt class="docutils literal"&gt;coverage report&lt;/tt&gt; after &lt;tt class="docutils literal"&gt;coverage html&lt;/tt&gt;, and passing the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--fail-under&lt;/span&gt;&lt;/tt&gt; argument to the former instead of the latter.
See, because I wanted the report to be at the bottom for when I scrolled up, but that meant it was the last thing to run, so it was the thing that needed to be failing if coverage was too low.
But now that everything happens at once and I don't &lt;em&gt;see&lt;/em&gt; the &lt;tt class="docutils literal"&gt;coverage report&lt;/tt&gt; output ever, it makes more sense to put all of the responsibilities on &lt;tt class="docutils literal"&gt;coverage html&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;So, I accomplished some stuff, and now I've got to put in the work to do stuff like enhance the &amp;quot;registry&amp;quot; types, and plan out things like &amp;quot;How do I specify different &lt;tt class="docutils literal"&gt;.coverage&lt;/tt&gt; files, in the context of stuff like having multiple packages under test, and potentially using &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;limit-coverage&lt;/span&gt;&lt;/tt&gt;?&amp;quot;.
That's a good thing to look into for tomorrow, because I'm done for today.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-11-19</title><link href="https://mwchase.neocities.org/coding-2021-11-19" rel="alternate"></link><published>2021-11-19T05:00:00-05:00</published><updated>2021-11-19T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-11-19:/coding-2021-11-19</id><summary type="html">&lt;p class="first last"&gt;Why worry? The code type checks. *twitch*&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well.
Hm.
I've started working on that stuff for MOTR, and I've hit a hurdle.
I might be able to just figure it out by describing it.&lt;/p&gt;
&lt;p&gt;So, I've got this &lt;tt class="docutils literal"&gt;Builder[T]&lt;/tt&gt; class that can create instances of &lt;tt class="docutils literal"&gt;T&lt;/tt&gt;, and I want to write helper functions that perform various simplifications to the interface.
One of these is to have a way to create a &lt;tt class="docutils literal"&gt;Builder&lt;/tt&gt; that produces &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt;s, given a &lt;tt class="docutils literal"&gt;Builder[Input]&lt;/tt&gt;.
The one I'm trying to nail down right now is to create a &lt;tt class="docutils literal"&gt;Builder[T]&lt;/tt&gt; in which &lt;tt class="docutils literal"&gt;T&lt;/tt&gt; is not an &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt;, and it's not a &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; or an &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt; that &lt;em&gt;contains&lt;/em&gt; an &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Laying it out like that gives me an idea that I'm going to try.&lt;/p&gt;
&lt;p&gt;Okay, let's see if this typechecks, but the basic idea is to create a validator using &lt;tt class="docutils literal"&gt;functools.singledispatch&lt;/tt&gt; to put together a really quick recursive setup.
This recurses over &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt;s, &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt;s, into &lt;tt class="docutils literal"&gt;CmdMeta&lt;/tt&gt;, and bombs out on &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt;s, and accepts all other inputs.
This feels kind of hacky, but it looks like it should work.
Anyway, the first decorator I wrote injects a call to the validator.
Unfortunately, it can't do this any earlier than &amp;quot;when it's called to produce output&amp;quot;, but this should at least prevent errors from going by unnoticed.
Let's try using the decorator now...&lt;/p&gt;
&lt;p&gt;Assuming this works (it just passed typechecking), my concern now is, my previous ideas about structuring imports are definitively super-obnoxious at this point, so I need to remember what, if anything, I was going to replace them with.&lt;/p&gt;
&lt;p&gt;It's not great to switch focus in the middle of a big effort like this, but I just typed &lt;em&gt;way&lt;/em&gt; too many full paths.
When I have time (not now), I'm going to document any possible collisions, then address them, and cut some painfully long names out of this code.&lt;/p&gt;
&lt;p&gt;Anyway, I shouldn't be up any longer.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-11-18</title><link href="https://mwchase.neocities.org/coding-2021-11-18" rel="alternate"></link><published>2021-11-18T05:00:00-05:00</published><updated>2021-11-18T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-11-18:/coding-2021-11-18</id><summary type="html">&lt;p class="first last"&gt;Let's do this! ... In a few days.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The Lua code is getting to some design issues that I don't want to work through right now, so I'm going to make some simple changes to MOTR.&lt;/p&gt;
&lt;p&gt;Basically, the prototype code for manipulating command-line arguments at a high level is in the following module: &lt;tt class="docutils literal"&gt;src/motr/_api/cli.py&lt;/tt&gt;.
I want to add in code that uses these prototypes, so I can see if there's anything wrong, but first, I want to figure out where to put everything.&lt;/p&gt;
&lt;p&gt;My initial thought is to make a &lt;tt class="docutils literal"&gt;cli&lt;/tt&gt; package, and have another package under that with modules for each &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; type and its associated &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt;s.
The current package would go next to that, but I'm not totally sure what to call it.
I think I'll just call it &amp;quot;types&amp;quot;.&lt;/p&gt;
&lt;p&gt;Let's see if I can do that.
I'm not going to get too much done today, but I can do that and lay the groundwork for stuff over the weekend.&lt;/p&gt;
&lt;p&gt;Okay, that's started.
I could make a sub-package, or I could just have everything next to &lt;tt class="docutils literal"&gt;types&lt;/tt&gt;.
It's getting late, so I'll stop for now and think about it for later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2021-11-17</title><link href="https://mwchase.neocities.org/diary-2021-11-17" rel="alternate"></link><published>2021-11-17T05:00:00-05:00</published><updated>2021-11-17T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-11-17:/diary-2021-11-17</id><summary type="html">&lt;p class="first last"&gt;Too much blood outside of bodies.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, this wasn't quite a normal day.
Some good things happened, some really unpleasant.&lt;/p&gt;
&lt;p&gt;I ended up dinking around with the Lua code I was talking about earlier.
It's a class system, and for now, I'm calling it &lt;tt class="docutils literal"&gt;disinherit&lt;/tt&gt;.
Unlike my earlier caginess about MOTR, I... kind of don't care if anyone knows the name before I put it up anywhere.
Because of the following related facts:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I'm not planning to put it anywhere&lt;/li&gt;
&lt;li&gt;I'm not confident that it will ever be useful&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It's mainly good for a weird change of pace, since I'm using somewhat out-there (by programming standards) editor settings for the source file.&lt;/p&gt;
&lt;p&gt;Anyway, I was once again way slow writing this up, and I can't be up much longer.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2021-11-16</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-11-16" rel="alternate"></link><published>2021-11-16T05:00:00-05:00</published><updated>2021-11-16T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-11-16:/weekly-roundup-2021-11-16</id><summary type="html">&lt;p class="first last"&gt;Important progress, but I would like to hit some kind of milestone...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I got right back into MOTR to take the edge off... I don't remember what, at that point.&lt;/li&gt;
&lt;li&gt;Thursday: I took care of the low-hanging fruit with the poem, and wrote up the state of editing it.&lt;/li&gt;
&lt;li&gt;Friday: I got a flu shot.&lt;/li&gt;
&lt;li&gt;Saturday: I was really tired.&lt;/li&gt;
&lt;li&gt;Sunday: I did some prototyping work on MOTR from a &amp;quot;how does it feel to use these abstractions?&amp;quot; perspective.&lt;/li&gt;
&lt;li&gt;Monday: I messed around with some Lua code that has no obvious application.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I hope to translate some of my prototyping work into MOTR modules, then verify them against the current contents of the motrfile.
Also, I need to do more with writing, and I might go back to that Lua stuff.
I don't want to rush that, though.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Diary 2021-11-15</title><link href="https://mwchase.neocities.org/diary-2021-11-15" rel="alternate"></link><published>2021-11-15T05:00:00-05:00</published><updated>2021-11-15T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-11-15:/diary-2021-11-15</id><summary type="html">&lt;p class="first last"&gt;I'd like to have some less-weird days.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't get a chance to touch MOTR's code today, so that's just exactly where it was.
I did mess around with some Lua code for the heck of it, but I don't think the result is useful, per se.
The two things I can do with that are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Get LDoc working the way I want it to.&lt;/li&gt;
&lt;li&gt;Find toy problems to throw it at once I nail down the interfaces, which are currently not-quite-right.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, I'm really sleepy and time's getting away from me, so I need to wrap up and get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2021-11-14</title><link href="https://mwchase.neocities.org/coding-2021-11-14" rel="alternate"></link><published>2021-11-14T05:00:00-05:00</published><updated>2021-11-14T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-11-14:/coding-2021-11-14</id><summary type="html">&lt;p class="first last"&gt;Some interesting &amp;quot;Huh,so &lt;em&gt;that's&lt;/em&gt; how that works&amp;quot; moments in here, IMO.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Feeling kind of out of it, but I think making some progress on MOTR will help.
So, the goal right now is to write some prototype code from a usage perspective.&lt;/p&gt;
&lt;p&gt;Let's take a look at the simple cases.&lt;/p&gt;
&lt;p&gt;The name of a command requires a non-empty sequence, which it only really makes sense to have as strings.
(The &lt;em&gt;first&lt;/em&gt; string gets converted to an &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; as part of processing.)
The only other &lt;tt class="docutils literal"&gt;CmdMeta&lt;/tt&gt; field to cover is &lt;tt class="docutils literal"&gt;req_set&lt;/tt&gt;, which is &lt;em&gt;pretty necessary&lt;/em&gt; in every case I can think of.
Beyond that, it needs the ability to customize every other &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; argument.
With that in mind, I can't think of any sensible shortcut for creating these, since it's just going to need to forward (nearly) all of the arguments.
The stuff that it makes sense to shortcut is the &lt;tt class="docutils literal"&gt;CmdMeta&lt;/tt&gt;.
Maybe something like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# The linewrapping is aggressive&lt;/span&gt;
&lt;span class="c1"&gt;# because I&amp;#39;m trying to keep the&lt;/span&gt;
&lt;span class="c1"&gt;# width of the code block boxes in&lt;/span&gt;
&lt;span class="c1"&gt;# mind.&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;base_cmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;sub_cmds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;req_set&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;RequirementSet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;frozenset&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;CmdMeta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;CmdMeta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;sub_cmds&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;req_set&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;req_set&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;static_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Option&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;typing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CmdMeta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;Pytest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Literal&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;pytest&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;PYTEST_BASE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Fragment&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="n"&gt;Module&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Pytest&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Fragment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;base_cmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;pytest&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;req_set&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;frozenset&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
            &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;pip&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;pytest&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;allowed_codes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;frozenset&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;NO_CACHE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Option&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="n"&gt;Pytest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;static_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;-p&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;no:cacheprovider&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;PYTEST_DEFAULT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Fragment&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="n"&gt;Module&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Pytest&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PYTEST_BASE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;with_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;NO_CACHE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;There are some improvements that could be made to this code from a conciseness perspective.
For example, if the pytest stuff were in it own module, then that module could define local type aliases for &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt; to fill in the type arguments.
Things start to get interesting for the other options.
Also, there should really be a static builder wrapped around that stuff...
So maybe the last bit should be more like&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;PYTEST_DEFAULT_BUILDER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Builder&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="n"&gt;Fragment&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Module&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Pytest&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;static_builder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;PYTEST_BASE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;with_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;NO_CACHE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;But the other options have to be embedded in &lt;tt class="docutils literal"&gt;Builder&lt;/tt&gt;s...&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Avoid too much flexibility to start with.&lt;/span&gt;
&lt;span class="n"&gt;TESTDIR_BUILDER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Builder&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="n"&gt;Option&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Pytest&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Builder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;sreg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;oreg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;static_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;oreg&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;package&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;
            &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;tests&amp;quot;&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;frozenset&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;package&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That would really benefit from a decorator helper, to use instead of the lambda.
I'd also really like to nail down a stricter interface for the registries.
Let's see if I can get anywhere when it comes to the output files.&lt;/p&gt;
&lt;p&gt;I'd like to see a single object that can construct either of the following:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;XUNIT_OUT_BUILDER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Builder&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="n"&gt;Option&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Pytest&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Builder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;sreg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;oreg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;CmdMeta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="s2"&gt;&amp;quot;--junitxml&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="n"&gt;REPORTS&lt;/span&gt;
                    &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;oreg&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;segments&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                    &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;oreg&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;package&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;
                    &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;junit.xml&amp;quot;&lt;/span&gt;
                &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;frozenset&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;package&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;segments&amp;quot;&lt;/span&gt;
    &lt;span class="p"&gt;]),&lt;/span&gt;
    &lt;span class="n"&gt;maximal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;XUNIT_IN_BUILDER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Builder&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="n"&gt;Option&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;JunitMerge&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Builder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;sreg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;oreg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;CmdMeta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;REPORTS&lt;/span&gt;
                &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;oreg&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;segments&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;
                &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;junit.xml&amp;quot;&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt;
            &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sreg&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;package&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;frozenset&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;segments&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Writing this out is making me really want to have the registries work with typed keys, but I'll put a pin in that.
Now, because the types of these builders have to be different, that implies to me that there must be some kind of callback involved, which is also setting up the prefix.
The types can't really elegantly control the &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt;/&lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; distinction or the &lt;tt class="docutils literal"&gt;maximal&lt;/tt&gt; field, which implies to me that these are two related methods that get passed similar callbacks.
One method generates &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt;s, the other generates &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt;s.
Either that, or there's a flag to control what's produced, and the flag defaults to &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt;.
To handle it correctly in either case, the output case needs a callback to determine the names of the &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt;, if any.&lt;/p&gt;
&lt;p&gt;The other possible way to handle the types is to... actually, I thought of something promising in the middle of this sentence.
Let's give it a shot.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;XUNIT_META_BUILDER&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Builder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;sreg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;oreg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;REPORTS&lt;/span&gt;
        &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;oreg&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;segments&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;oreg&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;package&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;
        &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;junit.xml&amp;quot;&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;frozenset&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;segments&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;package&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;XUNIT_OUT_BUILDER&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;XUNIT_META_BUILDER&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;meta_build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;PYTEST_JUNITXML&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# Option[Pytest]&lt;/span&gt;
    &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;frozenset&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;package&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;segments&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
    &lt;span class="n"&gt;output_names&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;XUNIT_IN_BUILDER&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;XUNIT_META_BUILDER&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;meta_build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;JUNIT_MERGE_NOOP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# Option[JunitMerge], empty&lt;/span&gt;
    &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;frozenset&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;segments&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I'm not sure it'll make sense to use &lt;tt class="docutils literal"&gt;Builder[Input]&lt;/tt&gt; for this, but the types match up.
(I mean, it's actually &lt;tt class="docutils literal"&gt;Builder[Input[T]]&lt;/tt&gt; like that, and maybe it can be constrained to &lt;tt class="docutils literal"&gt;Builder[Input[PathStr]]&lt;/tt&gt;.)&lt;/p&gt;
&lt;p&gt;Anyway, this has been pretty enlightening.
Let's see what I need.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&amp;#64;builder&lt;/tt&gt; decorator, possibly multiple versions&lt;/li&gt;
&lt;li&gt;A bunch of the utility stuff I wrote up there&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;meta_build&lt;/tt&gt;, with a better name, and possibly support for automatically invoking &lt;tt class="docutils literal"&gt;Mkdir&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, notes on the proper way to invoke builders:&lt;/p&gt;
&lt;p&gt;They should somehow create a bunch of prefix requirements.
My inclination is that they're generators with return values, so those all get composed together, then the top-level return value gets processed into another requirement.
To get this right, I'll need to nail those details down, and possibly add fields to &lt;tt class="docutils literal"&gt;Builder&lt;/tt&gt;, before I design &lt;tt class="docutils literal"&gt;meta_build&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Anyway, it's late and I extremely need to sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2021-11-13</title><link href="https://mwchase.neocities.org/diary-2021-11-13" rel="alternate"></link><published>2021-11-13T05:00:00-05:00</published><updated>2021-11-13T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-11-13:/diary-2021-11-13</id><summary type="html">&lt;p class="first last"&gt;Tired...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I can't write about much tonight, because I've been tired and spaced out all day, because of various reasons.&lt;/p&gt;
&lt;p&gt;And now I'm even less prepared to write stuff, so I'm not going to try.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2021-11-12</title><link href="https://mwchase.neocities.org/diary-2021-11-12" rel="alternate"></link><published>2021-11-12T05:00:00-05:00</published><updated>2021-11-12T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-11-12:/diary-2021-11-12</id><summary type="html">&lt;p class="first last"&gt;Not to get &lt;em&gt;political&lt;/em&gt; or anything...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't really work on any of the projects that I blog about today, so this is going to be a short &amp;quot;how am I doing&amp;quot; update.
Well, I'm definitely feeling better than I did yesterday.&lt;/p&gt;
&lt;p&gt;I finally got my flu shot today, so that's over with for this year.
I'm a little sore, but nothing crazy so far.&lt;/p&gt;
&lt;p&gt;I've got a few other things I want to take care of before I get to bed, so my basic plan is:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Publish this&lt;/li&gt;
&lt;li&gt;Brush teeth&lt;/li&gt;
&lt;li&gt;Other stuff&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That should all work out, if I can just finish writing this ASAP.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Worldbuilding — Korín, Sorín, and Arín 2021-11-11</title><link href="https://mwchase.neocities.org/worldbuilding-ksa-2021-11-11" rel="alternate"></link><published>2021-11-11T04:00:00-05:00</published><updated>2021-11-11T04:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-11-11:/worldbuilding-ksa-2021-11-11</id><summary type="html">&lt;p class="first last"&gt;Basic fixes to the poem draft.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did some poetry editing.
Let's see how that breaks down.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Changed &amp;quot;the land&amp;quot;&lt;/li&gt;
&lt;li&gt;Punctuation pass (including fixing the quote marks)&lt;/li&gt;
&lt;li&gt;Made a call on the line breaks (including the tenth stanza)&lt;/li&gt;
&lt;li&gt;I am using &amp;quot;ere&amp;quot; correctly&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Still need to figure out:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Replacing &amp;quot;health&amp;quot; with &amp;quot;healing&amp;quot;&lt;/li&gt;
&lt;li&gt;The beginning of the speech&lt;/li&gt;
&lt;li&gt;&amp;quot;then&amp;quot;/&amp;quot;kin&amp;quot;, and for that matter, &amp;quot;home&amp;quot;/&amp;quot;down&amp;quot;, and &amp;quot;clashed&amp;quot;/&amp;quot;lash&amp;quot;.
Maybe some way to get it to &amp;quot;clash&amp;quot;... &amp;quot;then&amp;quot;/&amp;quot;in&amp;quot;, &amp;quot;in&amp;quot;/&amp;quot;mend&amp;quot;&lt;/li&gt;
&lt;li&gt;Too much &amp;quot;forsake&amp;quot;&lt;/li&gt;
&lt;li&gt;Replacing &amp;quot;lapse&amp;quot; with &amp;quot;collapse&amp;quot;&lt;/li&gt;
&lt;li&gt;End of eighth stanza&lt;/li&gt;
&lt;li&gt;Ninth stanza&lt;/li&gt;
&lt;li&gt;&amp;quot;From&amp;quot; in thirteenth stanza&lt;/li&gt;
&lt;li&gt;Still not sure what the deal is with &amp;quot;storm'd&amp;quot;&lt;/li&gt;
&lt;li&gt;Replacing &amp;quot;almost&amp;quot; with &amp;quot;practically&amp;quot;&lt;/li&gt;
&lt;li&gt;Last line of twenty-sixth stanza&lt;/li&gt;
&lt;li&gt;&amp;quot;Sore&amp;quot; in twenty-seventh stanza&lt;/li&gt;
&lt;li&gt;Too much &amp;quot;struck&amp;quot;/not enough parallelism&lt;/li&gt;
&lt;li&gt;General awkwardness in the twenty-ninth through thirty-third stanzas&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm not sure what to focus on next.&lt;/p&gt;
&lt;p&gt;I guess I'll just take things from either the beginning or the end.&lt;/p&gt;
&lt;p&gt;For now, I want to take things easy-ish, because I had a rough night.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Worldbuilding — Korín, Sorín, and Arín"></category></entry><entry><title>Coding 2021-11-10</title><link href="https://mwchase.neocities.org/coding-2021-11-10" rel="alternate"></link><published>2021-11-10T05:00:00-05:00</published><updated>2021-11-10T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-11-10:/coding-2021-11-10</id><summary type="html">&lt;p class="first last"&gt;I hope this ends up making things simple.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm feeling a little rough right now, and I think focusing on MOTR might help, so, early coding post, let's go.&lt;/p&gt;
&lt;p&gt;All right, there are two major aspects of the current motrfile that I still have to document.
Here's the &lt;tt class="docutils literal"&gt;mypy&lt;/tt&gt; command:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;mypy &lt;span class="pre"&gt;--html-report&lt;/span&gt; &lt;span class="pre"&gt;[input-dir]&lt;/span&gt; &lt;span class="pre"&gt;--junit-xml&lt;/span&gt; &lt;span class="pre"&gt;[output-xml]&lt;/span&gt; &lt;span class="pre"&gt;[src-param]&lt;/span&gt;&lt;/tt&gt;, where the input-dir has an associated HTML output.
There are three &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt;s here, and a base &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; with an &lt;tt class="docutils literal"&gt;allowed_codes&lt;/tt&gt; of &lt;tt class="docutils literal"&gt;{1}&lt;/tt&gt;.
The &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt;s break down into &amp;quot;specifying output files&amp;quot; and &amp;quot;specifying an input directory, and it all basically makes sense.&lt;/p&gt;
&lt;p&gt;The &lt;tt class="docutils literal"&gt;pyinstrument&lt;/tt&gt; command goes like this:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;pyinstrument &lt;span class="pre"&gt;--renderer&lt;/span&gt; html &lt;span class="pre"&gt;--outfile&lt;/span&gt; &lt;span class="pre"&gt;[output-html]&lt;/span&gt; &lt;span class="pre"&gt;-m&lt;/span&gt; [module]&lt;/tt&gt;.
I'd say &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--renderer&lt;/span&gt; html &lt;span class="pre"&gt;--outfile&lt;/span&gt; &lt;span class="pre"&gt;[output-html]&lt;/span&gt;&lt;/tt&gt; should be all one &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt; from the user's perspective.
I don't remember whether &lt;tt class="docutils literal"&gt;pyinstrument&lt;/tt&gt; forwards the return codes from the module, but I know &lt;tt class="docutils literal"&gt;pyspy&lt;/tt&gt; doesn't, and I sort of remember that being a point of difference between them, so maybe it does?
This is really easy to check, but I don't feeeeeel like it...&lt;/p&gt;
&lt;p&gt;That's the details of usage.
A few random thoughts:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;extra_io&lt;/tt&gt; field is the easiest to overload, because extra &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt;s and &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt;s just coexist next to each other.&lt;/li&gt;
&lt;li&gt;I think the most sensible way to handle overloading &lt;tt class="docutils literal"&gt;args&lt;/tt&gt; is to, like I said, have some specifiable prefix (and maybe suffix), and just put the whole thing together before concatenating all the different overlapping versions.&lt;/li&gt;
&lt;li&gt;I'm not sure what would make the most sense when it comes to environment variables.
I see &amp;quot;require a different name&amp;quot; and &amp;quot;pack the arguments together in some way&amp;quot; as possibilities, but I'm not sure what I really want.
I can just disallow it until I have a use case.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thinking more about how I want to reuse components (like, ideally, I should be able to construct the pytest module invocation builder &lt;em&gt;once&lt;/em&gt;, which means the output xml path needs to have a component that varies per-registry in terms of invocation).
It looks like, given that consideration, I lucked into the correct answer to one of the design questions I was considering earlier.&lt;/p&gt;
&lt;p&gt;The question in that case is, when does this per-call variation get introduced?
I think what I'd like to see is some data that somehow gets injected and recombined at the &lt;tt class="docutils literal"&gt;Builder&lt;/tt&gt; level, because doing it at the &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt;/&lt;tt class="docutils literal"&gt;Option&lt;/tt&gt; level seems like it's too late.&lt;/p&gt;
&lt;p&gt;I could imagine doing some combinatoric stuff will multiple choices, but all I need currently is one per full &lt;tt class="docutils literal"&gt;Fragment[Script, &lt;span class="pre"&gt;...]&lt;/span&gt;&lt;/tt&gt;.
I'm inclined to say it should be a tuple of strings for now.&lt;/p&gt;
&lt;p&gt;... and thinking about this, I realized that I'm sometimes going to want to ensure the directory is created, which means that the ultimate construction needs to be a &lt;tt class="docutils literal"&gt;Requirements&lt;/tt&gt;, and there needs to be a way to generate &lt;tt class="docutils literal"&gt;Mkdir&lt;/tt&gt; and probably &lt;tt class="docutils literal"&gt;WriteBytes&lt;/tt&gt; &lt;tt class="docutils literal"&gt;RuntimeAction&lt;/tt&gt;s to accompany an &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt; with an &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt;...&lt;/p&gt;
&lt;p&gt;Well, &lt;em&gt;now&lt;/em&gt; I should be prototyping the interface from the motrfile side, because this seems like a big, complicated, something.&lt;/p&gt;
&lt;p&gt;Okay, time to wrap up, because that's enough of that for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2021-11-09</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-11-09" rel="alternate"></link><published>2021-11-09T05:00:00-05:00</published><updated>2021-11-09T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-11-09:/weekly-roundup-2021-11-09</id><summary type="html">&lt;p class="first last"&gt;Looking over various rough versions of things, and being astonished at the oversights...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I wrote up a bunch of the obvious issues with the rough draft of my worldbuilding poem.&lt;/li&gt;
&lt;li&gt;Thursday: I started bringing &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; code from prototype files into MOTR's main source.&lt;/li&gt;
&lt;li&gt;Friday: I took a nap, and that took more out of me than some of the stuff I normally turn into posts.&lt;/li&gt;
&lt;li&gt;Saturday: I tried to come up with every piece of information that would need to be associated with a command execution. Several days later, I would realize that I missed at least one.&lt;/li&gt;
&lt;li&gt;Sunday: I started trying to design a nice user interface for this stuff.&lt;/li&gt;
&lt;li&gt;Monday: I started to review existing command-line invocations from MOTR's motrfile.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'll hopefully review everything that's going on with &lt;tt class="docutils literal"&gt;mypy&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;pyinstrument&lt;/tt&gt;, but I think I should focus on the poem, or maybe finally getting back to Missable Mysteries, first.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2021-11-08</title><link href="https://mwchase.neocities.org/coding-2021-11-08" rel="alternate"></link><published>2021-11-08T05:00:00-05:00</published><updated>2021-11-08T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-11-08:/coding-2021-11-08</id><summary type="html">&lt;p class="first last"&gt;I promise this all makes sense.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I want to implement the helpers for making &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt;s and &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt;s and &lt;tt class="docutils literal"&gt;Builder&lt;/tt&gt;s.
Rather than throwing stuff together all at once, I'm going to take a look at the kind of stuff that the current motrfile uses, since I need to replace most of that functionality.
Looking over the output diagnostics, I see...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;pip install &lt;span class="pre"&gt;-U&lt;/span&gt; pip&lt;/tt&gt;.
This won't be necessary when I switch to full &lt;tt class="docutils literal"&gt;virtualenv&lt;/tt&gt; instead of &lt;tt class="docutils literal"&gt;venv&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;pip install &lt;span class="pre"&gt;-r&lt;/span&gt; &lt;span class="pre"&gt;requirements/[something].txt&lt;/span&gt;&lt;/tt&gt;.
Part of the point of the &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; API is to remove this specific structure; in addition, it'll be generating the &lt;tt class="docutils literal"&gt;pip install&lt;/tt&gt; command implicitly.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;flake8 &lt;span class="pre"&gt;--format=html&lt;/span&gt; &lt;span class="pre"&gt;--htmldir&lt;/span&gt; reports/flake8 &lt;span class="pre"&gt;--isort-show-traceback&lt;/span&gt; src tests&lt;/tt&gt; with allowed codes &lt;tt class="docutils literal"&gt;{1}&lt;/tt&gt;.
Oh no.
I missed the &lt;tt class="docutils literal"&gt;allowed_codes&lt;/tt&gt; concept.
That's actually really important.&lt;ul&gt;
&lt;li&gt;Anyway, we've got the command, &lt;tt class="docutils literal"&gt;flake8&lt;/tt&gt; with a python requirement of &lt;tt class="docutils literal"&gt;flake8&lt;/tt&gt;.
That's a &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; with &lt;tt class="docutils literal"&gt;allowed_codes&lt;/tt&gt; of &lt;tt class="docutils literal"&gt;{1}&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Next, there's an &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt; that is parameterized to produce a value in &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--format=html&lt;/span&gt; &lt;span class="pre"&gt;--htmldir&lt;/span&gt; [param]&lt;/tt&gt; with a python requirement of &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;flake8-html&lt;/span&gt;&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;There's the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--isort-show-traceback&lt;/span&gt;&lt;/tt&gt; &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt;, which needs &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;flake8-isort&lt;/span&gt;&lt;/tt&gt;, and I'm starting to realize that I'm not sure what some of these requirements are &lt;em&gt;for&lt;/em&gt;, per se.
Looks like I'm going to need to audit my requirements files.
Like, what's &lt;tt class="docutils literal"&gt;pygments&lt;/tt&gt; doing in there?&lt;/li&gt;
&lt;li&gt;Anyway, the last &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt;s are the target directories, which should either be parameterized or dumped all into a single command; I think I'd prefer parameterization, because that's what I'm doing in the relevant &lt;tt class="docutils literal"&gt;noxfile&lt;/tt&gt;s.&lt;/li&gt;
&lt;li&gt;This command also has an &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; that needs to be indicated in some way, parameterized.
This &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; is via the &lt;tt class="docutils literal"&gt;extra_io&lt;/tt&gt; field, which can have a simple implementation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Next command is one of the test runs. Starting with the general test run data...&lt;ul&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;pytest&lt;/tt&gt; is a module &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; with &lt;tt class="docutils literal"&gt;allowed_codes&lt;/tt&gt; of &lt;tt class="docutils literal"&gt;{1}&lt;/tt&gt;.
It requires &lt;tt class="docutils literal"&gt;pytest&lt;/tt&gt;, and the MOTR tests have an additional dependency on &lt;tt class="docutils literal"&gt;oschmod&lt;/tt&gt;, so there needs to be some nice way to indicate &amp;quot;extra dependencies&amp;quot;.&lt;/li&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-p&lt;/span&gt; no:cacheprovider&lt;/tt&gt; &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt; should be added by the default invocation of the &lt;tt class="docutils literal"&gt;pytest&lt;/tt&gt; helper.&lt;/li&gt;
&lt;li&gt;There needs to be an &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt; for the test directory, which should be parameterized.&lt;/li&gt;
&lt;li&gt;Lastly, there needs to be an &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt; with &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--junitxml&lt;/span&gt; [param]&lt;/tt&gt;, which suggests to me that the likely helper for parameterized &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; arguments should include some form of &amp;quot;prefix&amp;quot; &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt; data.&lt;/li&gt;
&lt;li&gt;It also needs a parameterized pip requirement for getting the proper project installed.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;It's wrapping that in &lt;tt class="docutils literal"&gt;coverage run&lt;/tt&gt;, and how I want to handle that is:&lt;ul&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;coverage run&lt;/tt&gt; is a full &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; from the perspective of the helpers, and it requires &lt;tt class="docutils literal"&gt;coverage&lt;/tt&gt;.
Its module runner code passes through the allowed codes for the underlying module; this should be the default behavior.&lt;/li&gt;
&lt;li&gt;This will need an &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt; with parameterization to locate the coverage file.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;There are additional Coverage &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt;s:&lt;ul&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;coverage combine&lt;/tt&gt; (needs input files generated from all coverage output files combined) and produces a single &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; file.
This indicates something kind of subtle I need to surface from the lower layers.
The &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt;/&lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; duality is not quite as clean, because we end up in a situation where each &amp;quot;side&amp;quot; could either be parameterized or not.
Or they could be parameterized &lt;em&gt;differently&lt;/em&gt;.
I think the high-level abstraction here is some kind of &amp;quot;parameter set&amp;quot; that combines with a function to create a single parameterized version.
It should take a subset of parameters (not sure whether it should be the Object or Sequence ones; I guess it should be Object since that's what the keys correspond to on the &lt;tt class="docutils literal"&gt;Builder&lt;/tt&gt;), and default to creating &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt;s, with an option to create &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt;s.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;coverage erase&lt;/tt&gt; produces a bunch of abstract &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt;s.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;coverage html&lt;/tt&gt; works with the &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt;s from &lt;tt class="docutils literal"&gt;coverage combine&lt;/tt&gt; (or &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;limit-coverage&lt;/span&gt;&lt;/tt&gt;, which I haven't set up on this project yet) to produce a corresponding HTML file&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;coverage report&lt;/tt&gt; works on the same files as &lt;tt class="docutils literal"&gt;coverage html&lt;/tt&gt;, but only produces abstract &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt;s.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;There are &lt;tt class="docutils literal"&gt;junit2html&lt;/tt&gt; commands, which need &lt;tt class="docutils literal"&gt;junit2html&lt;/tt&gt; and map an &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; to an &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; file.&lt;/li&gt;
&lt;li&gt;Some of the &lt;tt class="docutils literal"&gt;noxfile&lt;/tt&gt;s have &lt;tt class="docutils literal"&gt;junitparser merge&lt;/tt&gt; lines to combine multiple &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; JUnit files into a single &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; JUnit file that can be used by &lt;tt class="docutils literal"&gt;junit2html&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm getting incredibly tired, so I'll just note the stuff I need to document later:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;mypy&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;pyinstrument&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That's not much, but I'm &lt;em&gt;really&lt;/em&gt; tired.&lt;/p&gt;
&lt;p&gt;Need to get to sleep...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-11-07</title><link href="https://mwchase.neocities.org/coding-2021-11-07" rel="alternate"></link><published>2021-11-07T05:00:00-05:00</published><updated>2021-11-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-11-07:/coding-2021-11-07</id><summary type="html">&lt;p class="first last"&gt;Writing tests for this is going to be... a whole thing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've written a bunch of the foundational code for the &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; API.
I did some rewrites as I copied things over that caused it to make a lot more sense, but there are still a few things missing:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I haven't ported over the end-user code to actually create any of this.
Part of the reason for that is, I've refined my ideas about what that should look like since I wrote the first prototype.&lt;/li&gt;
&lt;li&gt;I haven't written the code to convert all of this into a series of command invocations.
This code is &amp;quot;obvious&amp;quot;, which means I should make sure I'm in peak condition before I attempt to write it, because I'm going to run into some problem that'll be completely incomprehensible for over ten minutes if I'm &lt;em&gt;lucky&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here's what the changes I made look like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The majority of the &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt; classes has been combined into a single implementation class.
The &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt; classes basically exist as wrappers that carry additional type information, and one extra field.&lt;/li&gt;
&lt;li&gt;There's now a single &lt;tt class="docutils literal"&gt;Builder&lt;/tt&gt; class that &lt;em&gt;could&lt;/em&gt; wrap anything, but only does anything vaguely useful if it's parameterized with a &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; or an &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt; class.
I turned some of the helper functions from the first prototype into methods.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here's everything from the first prototype that's missing in the current prototype:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;InstallRunner&lt;/tt&gt; class, which I forget what I was trying to do with it, so I'll just wing it until I'm writing the code to go from a &lt;tt class="docutils literal"&gt;Fragment[Script, typing.Any]&lt;/tt&gt; to a &lt;tt class="docutils literal"&gt;Requirements&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Helpers to convert a non-parameterized bit of &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt;-y or &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt;-y data into a &lt;tt class="docutils literal"&gt;Builder&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;A helper to convert a &lt;tt class="docutils literal"&gt;Builder[Fragment[Script, typing.Any]]&lt;/tt&gt; into a sequence of &lt;tt class="docutils literal"&gt;Fragment[Script, typing.Any]&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here's what I think I need to be looking into:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Helpers to produce single parameterized &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; segments.&lt;/li&gt;
&lt;li&gt;Helpers to produce larger parameterized non &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; segment sequences.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm trying to figure out if there's anything else, and I'm not coming up with anything.
We'll see if there's something later that I'm like &amp;quot;Oh, well, of course!&amp;quot;, but I'm not going to think too hard about it right now.&lt;/p&gt;
&lt;p&gt;(I also did some really obvious work on the poem.)&lt;/p&gt;
&lt;p&gt;Anyway, I'd like to wrap up early, so I'm done for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-11-06</title><link href="https://mwchase.neocities.org/coding-2021-11-06" rel="alternate"></link><published>2021-11-06T04:00:00-04:00</published><updated>2021-11-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-11-06:/coding-2021-11-06</id><summary type="html">&lt;p class="first last"&gt;I tried to set up OpenGraph support earlier. Last I checked, I couldn't tell whether it was working.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, I did a certain amount of the work for the second Fragment API prototype in my head.
A lot of it.
I did a lot of the work in my head.
This is a rough habit I've picked up from trying to do math quickly back in school, and it doesn't scale for complicated stuff, but the interfaces I have in mind are pretty simple, so I'm getting away with it.
Currently.&lt;/p&gt;
&lt;p&gt;What I'm going for right now is to divide command arguments into &amp;quot;exclusive&amp;quot; (&lt;tt class="docutils literal"&gt;Output&lt;/tt&gt;) and &amp;quot;everything else&amp;quot;.
I might be missing a field... yes, I think I am.
It was quick enough to add it.&lt;/p&gt;
&lt;p&gt;Basically, the &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt; classes track arguments, environment variables, extra IO data, a set of install requirements, additional segments to add to the root directory of the environment installation, and, in the case of &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt;, an optional sequence of additional arguments to invoke another &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; as a module.&lt;/p&gt;
&lt;p&gt;The goal here is to take everything that could need to be associated with a command execution, and have a field for it, so there doesn't need to be special casing for anything in the motrfile itself, and the helpers hopefully properly handle dependencies, because the current system is... not smart.
It just does what you tell it, and I haven't thought of a way to have it provide visibility into whether what you tell it &amp;quot;makes sense&amp;quot;.&lt;/p&gt;
&lt;p&gt;Anyway, hopefully I'll get more done with this tomorrow.
I don't want to drag this entry out any longer.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2021-11-05</title><link href="https://mwchase.neocities.org/diary-2021-11-05" rel="alternate"></link><published>2021-11-05T04:00:00-04:00</published><updated>2021-11-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-11-05:/diary-2021-11-05</id><summary type="html">&lt;p class="first last"&gt;TIRED&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I was extremely tired today, so I didn't really try to accomplish anything.
I mean, there was that nap I took for like an hour that left me extremely disoriented.&lt;/p&gt;
&lt;p&gt;I'm thinking of trying to redo my weekly schedule concept in the new year.
Anyway, thinking of nearer-term plans, hopefully I'll be able to translate yesterdays coding post to prototypes in the next few days.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to go wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2021-11-04</title><link href="https://mwchase.neocities.org/coding-2021-11-04" rel="alternate"></link><published>2021-11-04T04:00:00-04:00</published><updated>2021-11-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-11-04:/coding-2021-11-04</id><summary type="html">&lt;p class="first last"&gt;A little action and a lot of planning.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was doing a few things today that I'm not going to blog about, and I decided that I want to start laying the groundwork for putting the &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; API into MOTR.&lt;/p&gt;
&lt;p&gt;I got started pretty late, so in practice, this just meant adding a file to source control that I'm going to transcribe the prototype code into.&lt;/p&gt;
&lt;p&gt;Here's the steps to move forward:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Sketch out the desired interface (going to need the ability to create literal stretches, functions that do not generate an &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt;, and functions that generate exactly an &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt;; this division will lock in some choices on the interface side, and simplify implementation; also going to need to make sure the composition operators I prototyped are in there)&lt;/li&gt;
&lt;li&gt;Get all those interfaces into the file I wrote.
Due to the high level of coupling in the implementations, I'm not going to try to separate things out just yet.&lt;/li&gt;
&lt;li&gt;Pull in some of the foundational code I've been prototyping in the motrfile.
I'm not yet sure where it goes.&lt;/li&gt;
&lt;li&gt;Create the data required to generate the current content of the configuration file, more or less.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One thing I've been punting on is figuring out how to coordinate the naming of the virtualenv.
Because some of the parameters should change the requirements, which means they need a custom environment...
Maybe the environment names need to be formed from segments associated with the requirements sets...
Or something?&lt;/p&gt;
&lt;p&gt;Anyway, it's late, and I don't want to dawdle any more.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Worldbuilding — Korín, Sorín, and Arín 2021-11-03</title><link href="https://mwchase.neocities.org/worldbuilding-ksa-2021-11-03" rel="alternate"></link><published>2021-11-03T04:00:00-04:00</published><updated>2021-11-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-11-03:/worldbuilding-ksa-2021-11-03</id><summary type="html">&lt;p class="first last"&gt;I think that's an average of over one problem per stanza. So far.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I let things get kind of late, and there are some other things I want to work on, so I'm going to try taking some quick notes on things I could change in the poem.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Early on, I have &amp;quot;the land&amp;quot;. Perhaps it should be &amp;quot;this land&amp;quot; or &amp;quot;these lands&amp;quot;.&lt;/li&gt;
&lt;li&gt;My punctuation seems kind of inconsistent.&lt;/li&gt;
&lt;li&gt;I'm saying &amp;quot;from health to hurt&amp;quot; at one point, and I'd like to get &amp;quot;healing&amp;quot; to work instead.&lt;/li&gt;
&lt;li&gt;I think I went back and further on whether to break the lines midway through always at the nine-syllable mark, or at the internal rhyme.
These &lt;em&gt;usually&lt;/em&gt; line up.
But, I mean, in the third stanza, they don't.&lt;/li&gt;
&lt;li&gt;I don't like &amp;quot;Thanks, all&amp;quot; as the beginning of a speech.&lt;/li&gt;
&lt;li&gt;Hm, I'm rhyming &amp;quot;then&amp;quot; and &amp;quot;kin&amp;quot;.&lt;/li&gt;
&lt;li&gt;Just noticed I used &amp;quot;forsake&amp;quot; twice in three stanzas, and I don't think it's serving any helpful function.&lt;/li&gt;
&lt;li&gt;In the fifth stanza, see if I can swipe a syllable from the beginning of the last line, so I can change out &amp;quot;lapse&amp;quot; for &amp;quot;collapse&amp;quot;.&lt;/li&gt;
&lt;li&gt;Is &amp;quot;ere&amp;quot; a contraction, and also, am I using it correctly?&lt;/li&gt;
&lt;li&gt;In the eighth stanza, it would be great if the last line's word order were a bit closer to spoken English somehow.&lt;/li&gt;
&lt;li&gt;I forget what's going on with some of the metaphors in the ninth stanza.&lt;/li&gt;
&lt;li&gt;Should the stanzas that are part of a speech all start with quotation marks?&lt;/li&gt;
&lt;li&gt;In the tenth stanza, am I rhyming the &amp;quot;el&amp;quot; in &amp;quot;elder&amp;quot; with the &amp;quot;hel&amp;quot; in &amp;quot;helping&amp;quot;?
I think that's what's going on, and it's a doozy.
Should I break the words across the lines?&lt;/li&gt;
&lt;li&gt;Okay, I've got a period in the middle of a line in the twelfth stanza, so I should probably err on the side of including periods.&lt;/li&gt;
&lt;li&gt;In the thirteenth stanza I've got a &amp;quot;from&amp;quot; that I think should be some other word, not sure what.&lt;/li&gt;
&lt;li&gt;I forgot to close the quote marks at the end of the thirteenth stanza.&lt;/li&gt;
&lt;li&gt;I forget why I spelled &amp;quot;stormed&amp;quot; &amp;quot;storm'd&amp;quot;.&lt;/li&gt;
&lt;li&gt;Okay, &amp;quot;home&amp;quot; and &amp;quot;down&amp;quot; are, as rhymes go, way too slant for me.&lt;/li&gt;
&lt;li&gt;Forgot the closing quote on the eighteenth stanza.&lt;/li&gt;
&lt;li&gt;The twentieth stanza rhymes &amp;quot;clashed&amp;quot; and &amp;quot;lash&amp;quot;, which isn't quite as slant, but I'd like it to be closer.&lt;/li&gt;
&lt;li&gt;&amp;quot;then&amp;quot; and &amp;quot;in&amp;quot;. Maybe this is just A Thing with this poem?&lt;/li&gt;
&lt;li&gt;In the twenty-fifth stanza, I'd like to find some way to change &amp;quot;almost&amp;quot; to &amp;quot;practically&amp;quot;.
Also, &amp;quot;in&amp;quot; and &amp;quot;mend&amp;quot;...&lt;/li&gt;
&lt;li&gt;The last line of the twenty-sixth stanza is a bit awkward.&lt;/li&gt;
&lt;li&gt;I'd like to find another word than &amp;quot;sore&amp;quot; for the twenty-seventh stanza.&lt;/li&gt;
&lt;li&gt;Using &amp;quot;struck&amp;quot; for a rhyme in the twenty-sixth and twenty-eighth stanzas.
Maybe there's potential for parallelism there, but if so, it's not realized yet.&lt;/li&gt;
&lt;li&gt;The twenty-ninth stanza feels generally awkward.
As does the thirtieth.
And the thirty-first.&lt;/li&gt;
&lt;li&gt;The phrasing is also a bit awkward in the two stanzas after those.&lt;/li&gt;
&lt;li&gt;Okay, reading the last stanza, definitely want to use &amp;quot;these lands&amp;quot; in the first.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Oof, I'm trying to figure out if this is more or less issues than I was expecting.
Some of the punctuation problems kind of caught me off guard.&lt;/p&gt;
&lt;p&gt;Anyway, I should wrap up for now.
This initial pass is enough for now.
Later, I'll write this down to turn it into a checklist.&lt;/p&gt;
&lt;p&gt;For now, I've got other things I need to focus on.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Worldbuilding — Korín, Sorín, and Arín"></category></entry><entry><title>Weekly Roundup 2021-11-02</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-11-02" rel="alternate"></link><published>2021-11-02T04:00:00-04:00</published><updated>2021-11-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-11-02:/weekly-roundup-2021-11-02</id><summary type="html">&lt;p class="first last"&gt;I feel like I'm starting to spin back up...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I filled in the most obvious deficits in the rough draft of the poem to introduce my worldbuilding.&lt;/li&gt;
&lt;li&gt;Thursday: I worked on formatting the draft, so now it renders nicely.&lt;/li&gt;
&lt;li&gt;Friday: I circled back around to try to cover all of the issues my current work on MOTR can hit.&lt;/li&gt;
&lt;li&gt;Saturday: I sketched out some ideas there, but didn't come to anything really clear.&lt;/li&gt;
&lt;li&gt;Sunday: I figured out some stuff that's (probably?) missing from that.&lt;/li&gt;
&lt;li&gt;Monday: I focused on stuff that I don't write blog posts for, so... yeah.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to focus on writing for a bit, and then start developing the &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; API within MOTR's libraries, because I don't think incrementally writing it in the motrfile is worth it, because it doesn't really make sense to switch a script call &amp;quot;halfway&amp;quot; over.
(Although, it might make sense to have some kind of commented block that I can prototype the desired calls in, to firm up the interface ahead-of-time.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Diary 2021-11-01</title><link href="https://mwchase.neocities.org/diary-2021-11-01" rel="alternate"></link><published>2021-11-01T04:00:00-04:00</published><updated>2021-11-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-11-01:/diary-2021-11-01</id><summary type="html">&lt;p class="first last"&gt;Looks like I took a day off? I didn't realize it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I seem to have taken things mostly easy today.
I put in some work on projects that I don't want to write up yet/ever.&lt;/p&gt;
&lt;p&gt;I thought for some reason I'd end up with more to talk about, but I guess I was wrong.
No reason to drag things out.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2021-10-31</title><link href="https://mwchase.neocities.org/coding-2021-10-31" rel="alternate"></link><published>2021-10-31T04:00:00-04:00</published><updated>2021-10-31T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-10-31:/coding-2021-10-31</id><summary type="html">&lt;p class="first last"&gt;Further and further down some kind of rabbit hole.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Looks like the &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; API wasn't fully baked before, and it's not quite baked now.&lt;/p&gt;
&lt;p&gt;Earlier today, I added stuff onto the prototype, focusing on the Generator classes and helpers.
I got the basics done, though not tested, and I ran across a concept that I need to make sure makes sense.&lt;/p&gt;
&lt;p&gt;The motivation is, it should be possible for a &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; to contain &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; values.
&lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; is fine, but each &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; must be unique.
That means that the &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; needs to depend on every iteration variable used by the top-level generator helper.
As such, it would help to catch errors sooner if a generator could be marked as needing to depend on every variable.&lt;/p&gt;
&lt;p&gt;This could be accomplished with something like a &lt;tt class="docutils literal"&gt;maximal&lt;/tt&gt; boolean field.
Then the combining helpers could check that if one input is &lt;tt class="docutils literal"&gt;maximal&lt;/tt&gt;, then the other input's keys are a subset of the &lt;tt class="docutils literal"&gt;maximal&lt;/tt&gt; input.
And the combined output would have the boolean &lt;tt class="docutils literal"&gt;or&lt;/tt&gt; of the inputs as its &lt;tt class="docutils literal"&gt;maximal&lt;/tt&gt; field.
Would probably want warning helpers for invoking things, that can check if an &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; is generated from a non &lt;tt class="docutils literal"&gt;maximal&lt;/tt&gt; root generator, or if a &lt;tt class="docutils literal"&gt;maximal&lt;/tt&gt; root generator does not generate an &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;I don't want to keep on writing this until super late, so I'm going to wrap it for now, and think about something else to shift to for a bit.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-10-30</title><link href="https://mwchase.neocities.org/coding-2021-10-30" rel="alternate"></link><published>2021-10-30T04:00:00-04:00</published><updated>2021-10-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-10-30:/coding-2021-10-30</id><summary type="html">&lt;p class="first last"&gt;I guess this went as well as could be hoped.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm not going to touch code for now; I'm just going to try to sketch out that &lt;tt class="docutils literal"&gt;FragmentGenerator&lt;/tt&gt; idea I thought of last night.&lt;/p&gt;
&lt;p&gt;First note, it's not really a good name, and I should come up with something else at some point.
In any case...&lt;/p&gt;
&lt;p&gt;The idea I kind of have right now is that there's some kind of registry-ish object (it can just be a dictionary in the prototype) that contains sequences of values associated with different fields.
So, the idea is that the types are like &lt;tt class="docutils literal"&gt;def generate(self, registry: Registry) &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; Fragment:&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Or... I guess the generator has to explicitly expose the fields it's iterating over, because it has to be possible to compose these generators.
That seems to give me an interface where, on the one hand, it passes a registry of sequences, and on the other, it passes a registry of specific values.&lt;/p&gt;
&lt;p&gt;But, since we're never going to vary the global registry passed to an overall command, maybe there's some way to move the registry into the construction logic.
Then the top-level fragment generator could set up the proper for-loop, and call the sub-generators just with the for-loop variables required by the sub-generators.
On the other hand, it's not reasonable to duplicate it as an argument to so many constructors...
So, I guess the first idea makes sense.
Pass a registry to the top-level &lt;tt class="docutils literal"&gt;FragmentGenerator&lt;/tt&gt;, get an iterator of &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt;s.
Within the iterator, convert the registry into a product iterator, and pass all that information into the sub-generators, implicitly, by passing it to a recursive function on the top level.
(I'll want to cache the requirements in each sub-generator, because otherwise there's some level of redundant work, I think...)
Hm, the top-level should be an independent function.&lt;/p&gt;
&lt;p&gt;Okay, I'm too tired to go through the rest of this now.
I'll have to make another attempt tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-10-29</title><link href="https://mwchase.neocities.org/coding-2021-10-29" rel="alternate"></link><published>2021-10-29T04:00:00-04:00</published><updated>2021-10-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-10-29:/coding-2021-10-29</id><summary type="html">&lt;p class="first last"&gt;I don't &lt;em&gt;think&lt;/em&gt; I'm inflicting problems on myself, but it does slightly feel like it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did a little poetry work tonight, but I want to focus on planning for MOTR.
Now, from an implementation perspective, &amp;quot;Shove platform-based string interpolation into a callback&amp;quot; is easier... except that I'm the one who has to implement &lt;em&gt;everything&lt;/em&gt;, so I can't pass the buck on this, because it just instantly comes back to me.&lt;/p&gt;
&lt;p&gt;So, here's what I know about how the &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt;s will be used:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Some &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt;s will need to run against multiple versions of Python, and each will need to specify distinct output files.&lt;/li&gt;
&lt;li&gt;Some &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt;s will need to run against one project per run.&lt;/li&gt;
&lt;li&gt;Some &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt;s will need to run against all projects in one run.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From that, it seems like there needs to be an interface that takes a multi-project object, and yields some number of concrete &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt;s.
I don't &lt;em&gt;think&lt;/em&gt; it makes sense to put this ability on the individual &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt;s.
It would probably be easier to have a general case of &amp;quot;doesn't need individual projects (possibly because it got a multi-project)&amp;quot;.&lt;/p&gt;
&lt;p&gt;One thing that just occurred to me is that, in the case of stuff like &lt;tt class="docutils literal"&gt;coverage erase&lt;/tt&gt;, the platforms that it has to &lt;em&gt;parameterize over&lt;/em&gt; are different than the platforms it has to &lt;em&gt;run on&lt;/em&gt;.
So, these should be separate at the base level, and have some kind of helper to unify them for the common case.&lt;/p&gt;
&lt;p&gt;Another possibility is to avoid baking in the different ideas of what to parameterize against, and construct a framework for combining streams of fragments into streams of larger fragments, via &lt;tt class="docutils literal"&gt;zip&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;product&lt;/tt&gt;.
That doesn't sound right as an end-user interface, because the choice of whether to &lt;tt class="docutils literal"&gt;zip&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;product&lt;/tt&gt; would be based on whether there was an existing parameter of the same type, which would have to be in the same order...
It makes more sense to have something that can generate &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt;s based on external parameters, and then those parameters can simply be looped over once.&lt;/p&gt;
&lt;p&gt;So, because the &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt;s don't directly code this, I suppose there needs to be some form of &lt;tt class="docutils literal"&gt;FragmentGenerator&lt;/tt&gt; protocol...
(One implementation should take a sequence of platforms, and another both a sequence of platforms and a multi-project.
It might make sense to make these explicitly Python-specific.)&lt;/p&gt;
&lt;p&gt;I'll try to figure this out later.
For now, I'll be happy that I came to a decision on how to handle this.
And try to wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Worldbuilding — Korín, Sorín, and Arín 2021-10-28</title><link href="https://mwchase.neocities.org/worldbuilding-ksa-2021-10-28" rel="alternate"></link><published>2021-10-28T04:00:00-04:00</published><updated>2021-10-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-10-28:/worldbuilding-ksa-2021-10-28</id><summary type="html">&lt;p class="first last"&gt;I wasn't expecting to file a bug report from this.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, there we go.
I removed the comments from the draft, and formatted the draft based on my initial metrical analysis.
I then added some custom CSS to fix how it rendered in the theme.&lt;/p&gt;
&lt;p&gt;The next step from this is to do a few passes of revision on screen, then print it out (it's like 4 pages), and take notes on issues.&lt;/p&gt;
&lt;p&gt;The main focus show be on improving the quality of the draft, but I also want to think some about presentation and work on writing up my notes for the rest of the setting document.&lt;/p&gt;
&lt;p&gt;All right, I'd better get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Worldbuilding — Korín, Sorín, and Arín"></category></entry><entry><title>Worldbuilding — Korín, Sorín, and Arín 2021-10-27</title><link href="https://mwchase.neocities.org/worldbuilding-ksa-2021-10-27" rel="alternate"></link><published>2021-10-27T04:00:00-04:00</published><updated>2021-10-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-10-27:/worldbuilding-ksa-2021-10-27</id><summary type="html">&lt;p class="first last"&gt;I did a thing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today was incredibly tiring, but I did get a single concrete task accomplished: I revised the rough draft enough that it has all of the syllables it needs.&lt;/p&gt;
&lt;p&gt;I see no reason to attempt anything else for now.
It's a small task, but now it's done, and I'm closer.&lt;/p&gt;
&lt;p&gt;I'm going to get ready for bed now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Worldbuilding — Korín, Sorín, and Arín"></category></entry><entry><title>Weekly Roundup 2021-10-26</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-10-26" rel="alternate"></link><published>2021-10-26T04:00:00-04:00</published><updated>2021-10-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-10-26:/weekly-roundup-2021-10-26</id><summary type="html">&lt;p class="first last"&gt;That was a bit frustrating, but my main priority is sleeping better, which, um, we'll see...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I was really tired.&lt;/li&gt;
&lt;li&gt;Thursday: I was even more tired.&lt;/li&gt;
&lt;li&gt;Friday: I planned out a quick enhancement to MOTR.&lt;/li&gt;
&lt;li&gt;Saturday: I put that plan into action, and then considered the next things to work on afterwards.&lt;/li&gt;
&lt;li&gt;Sunday: I couldn't work on much.&lt;/li&gt;
&lt;li&gt;Monday: I tried to plan the next changes to MOTR, and I ran into trouble.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to take things easy tomorrow, try to work on some other things after, and revisit MOTR later.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2021-10-25</title><link href="https://mwchase.neocities.org/coding-2021-10-25" rel="alternate"></link><published>2021-10-25T04:00:00-04:00</published><updated>2021-10-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-10-25:/coding-2021-10-25</id><summary type="html">&lt;p class="first last"&gt;Spinning my wheels a bit.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, my plans for the &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; API are conflicting with some of my recollections of plans for the &lt;tt class="docutils literal"&gt;Project&lt;/tt&gt; API, but I'm having trouble tracking down my notes to confirm this.
So, I'm going to need to try to re-derive some of this, and maybe have some new layouts in light of the &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; API.&lt;/p&gt;
&lt;p&gt;One of the key things going on with the &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; API is that it makes it non-trivial to combine a &lt;tt class="docutils literal"&gt;Project&lt;/tt&gt; and a &lt;tt class="docutils literal"&gt;Platform&lt;/tt&gt;.
This is because the choices associated with the &lt;tt class="docutils literal"&gt;Project&lt;/tt&gt; get baked into the final &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt;, and the &lt;tt class="docutils literal"&gt;Platform&lt;/tt&gt; does not feed into the contents of the &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt;.
At least, not inherently...
Because each command execution should be creating distinct artifacts, the &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; API needs to be extended with a system of parameterization or templating in order to have some degree of polymorphism depending on the choice of &lt;tt class="docutils literal"&gt;Platform&lt;/tt&gt; or other considerations.&lt;/p&gt;
&lt;p&gt;My choices for templating systems include the built-in options like &lt;tt class="docutils literal"&gt;format()&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;string.Template&lt;/tt&gt;, as well as Jinja, which must be installed, otherwise MOTR is very broken.&lt;/p&gt;
&lt;p&gt;Another possibility is to forgo changing the data model significantly, and simply work with &lt;tt class="docutils literal"&gt;Callabable&lt;/tt&gt;s that use f-string interpolation instead.
Going down that route requires me to remember which order I wanted to pass the objects in.
I &lt;em&gt;believe&lt;/em&gt; the idea was that a &lt;tt class="docutils literal"&gt;Session&lt;/tt&gt;/&lt;tt class="docutils literal"&gt;Runner&lt;/tt&gt;/&lt;tt class="docutils literal"&gt;Whatever&lt;/tt&gt; would be first parameterized by all possible &lt;tt class="docutils literal"&gt;Platforms&lt;/tt&gt;, and secondarily by all possible &lt;tt class="docutils literal"&gt;Package&lt;/tt&gt;s/&lt;tt class="docutils literal"&gt;Project&lt;/tt&gt;s/&lt;tt class="docutils literal"&gt;Whatever&lt;/tt&gt;s.&lt;/p&gt;
&lt;p&gt;Although...
Perhaps the runner shouldn't know about the &lt;tt class="docutils literal"&gt;Package&lt;/tt&gt;s, and should just get a collection of &lt;tt class="docutils literal"&gt;Callable&lt;/tt&gt;s that take information about the environment...
But at that point, I think something's gone wrong with the abstraction.
Fundamentally, an environment-type object is being constructed to run a single command, which must exist in a single location, so there is always a &amp;quot;main&amp;quot; binary directory, even if, I don't know, I contrive some way to run a command that requires some combination of Node, Python, and Rust packages.&lt;/p&gt;
&lt;p&gt;Now, a &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; contains the data required to construct the environment that can execute it, except for details about the exact &lt;tt class="docutils literal"&gt;Platform&lt;/tt&gt;s used.
We could suppose that the requirements are encoded as pairs of strings containing a platform alias and a requirement, and the interface for combining a group of &lt;tt class="docutils literal"&gt;Platform&lt;/tt&gt;s with a &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; would look something like&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@attr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataclass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frozen&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Platforms&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;platforms&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PMap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Platform&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now, the contents of a &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; could depend on any &lt;tt class="docutils literal"&gt;Platform&lt;/tt&gt; in a &lt;tt class="docutils literal"&gt;Platforms&lt;/tt&gt;, and once the full &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; is completed, it's then ready to be passed to the main &lt;tt class="docutils literal"&gt;Platform&lt;/tt&gt; to be converted into an executable call...&lt;/p&gt;
&lt;p&gt;Something about this whole setup is striking me as not quite right, but it's in the interaction between &amp;quot;how this must be used&amp;quot; and &amp;quot;the data structures I want&amp;quot;.
To settle this, I need to get a firmer understanding of the usage, so I can change the data structures.&lt;/p&gt;
&lt;p&gt;I'm not getting that tonight, so I'll wrap up for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2021-10-24</title><link href="https://mwchase.neocities.org/diary-2021-10-24" rel="alternate"></link><published>2021-10-24T04:00:00-04:00</published><updated>2021-10-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-10-24:/diary-2021-10-24</id><summary type="html">&lt;p class="first last"&gt;Ugh, not again.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I thought I was going to have a chance to work on the &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; API today, but all of a sudden it's 11:30 and I feel terrible.&lt;/p&gt;
&lt;p&gt;I've got to put everything towards feeling less gross, so I'm putting in a super-short entry.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2021-10-23</title><link href="https://mwchase.neocities.org/coding-2021-10-23" rel="alternate"></link><published>2021-10-23T04:00:00-04:00</published><updated>2021-10-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-10-23:/coding-2021-10-23</id><summary type="html">&lt;p class="first last"&gt;That was easy. What's next is... probably not.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I got the &lt;tt class="docutils literal"&gt;map&lt;/tt&gt; method written and updated the motrfile.
Next up is figuring out the next iteration of the custom actions, and I think that means putting the &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; prototypes into the motrfile and trying to build from there.&lt;/p&gt;
&lt;p&gt;Because of how different the endpoint is from the existing action classes, I think it makes more sense to build it up next to the existing classes, and try to phase out some auxiliary usages, before getting to the meat of it all.&lt;/p&gt;
&lt;p&gt;Anyway, I let things go way too late again, and I'm really tired.
I'll wrap up now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-10-22</title><link href="https://mwchase.neocities.org/coding-2021-10-22" rel="alternate"></link><published>2021-10-22T04:00:00-04:00</published><updated>2021-10-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-10-22:/coding-2021-10-22</id><summary type="html">&lt;p class="first last"&gt;One of the perks of this project is that I get to decide what to work on.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;This is going to be a quick entry.&lt;/p&gt;
&lt;p&gt;I looked over the many, many 1.0 blockers that I put in for MOTR, and I picked one that's probably not a big deal, but it should make the code look nicer, so I started working on it.
That issue is &amp;quot;Figure out how to lift operations on the underlying type into the context of the &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; wrapper&amp;quot;.
And I think the solution is pretty simple: add the following code to the &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; class:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;U&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;U&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This can then be called like &lt;tt class="docutils literal"&gt;input_.map(lambda path: path / &amp;quot;child&amp;quot;)&lt;/tt&gt;, and it's a bit wordy, but it's not a big deal.
In particular, it allows me to get rid of explicit references to the &lt;tt class="docutils literal"&gt;path&lt;/tt&gt; field, so I can eventually change it to something that makes more sense, given that &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; are generic types now.&lt;/p&gt;
&lt;p&gt;Working on this issue is one thing that will take references to the field out of the motrfile.
The other is converting some of the custom actions into core actions, which is going to be a much bigger and more complicated undertaking, and maybe I should just be ready to do that one wrong the first time I try.&lt;/p&gt;
&lt;p&gt;The central issue with bringing in the custom actions is, I have two custom actions, and I want to get rid of one, and rewrite the other, so I guess I'd rather complete and prove out the rewrite of the latter before I bring it into the core.
Getting the rewrite done is going to require a bunch of other &lt;em&gt;stuff&lt;/em&gt;.
(Like the &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; classes.)&lt;/p&gt;
&lt;p&gt;So, low-hanging fruit in the near future, big rewrite project soon after.
Sounds like a plan, and I don't care how good a plan it sounds like.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2021-10-21</title><link href="https://mwchase.neocities.org/diary-2021-10-21" rel="alternate"></link><published>2021-10-21T04:00:00-04:00</published><updated>2021-10-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-10-21:/diary-2021-10-21</id><summary type="html">&lt;p class="first last"&gt;So tired... head hurt...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Traveled today.
For hours and hours.&lt;/p&gt;
&lt;p&gt;I absolutely should not try to work on anything for the long term tonight.&lt;/p&gt;
&lt;p&gt;Maybe I'll poke at stuff after this publishes, maybe I won't.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2021-10-20</title><link href="https://mwchase.neocities.org/diary-2021-10-20" rel="alternate"></link><published>2021-10-20T04:00:00-04:00</published><updated>2021-10-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-10-20:/diary-2021-10-20</id><summary type="html">&lt;p class="first last"&gt;I don't remember what I had planned. It's almost as if something is impairing my cognitive functions...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I thought I had something planned for tonight, but I don't remember.
It would really be better to take things easy, rather than think too hard about what it could have been.&lt;/p&gt;
&lt;p&gt;Let's see what I can work on in the next few days:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Enhancements to MOTR&lt;/li&gt;
&lt;li&gt;Finally revisit Missable Mysteries&lt;/li&gt;
&lt;li&gt;Try to work on the poem draft&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For now, I ought to wrap up and try to get a reasonable amount of sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2021-10-19</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-10-19" rel="alternate"></link><published>2021-10-19T04:00:00-04:00</published><updated>2021-10-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-10-19:/weekly-roundup-2021-10-19</id><summary type="html">&lt;p class="first last"&gt;Laying some important groundwork.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I planned out the code required to streamline the release workflow for MOTR.&lt;/li&gt;
&lt;li&gt;Thursday: I evaluated bump2version. It should work for my purposes, but it does have one weird interface quirk that I've entered a bug for.&lt;/li&gt;
&lt;li&gt;Friday: I looked over my mercurial commands for the simplified workflow, and thought &amp;quot;You know what, that all looks good. It's probably fine.&amp;quot;&lt;/li&gt;
&lt;li&gt;Saturday: I was extremely tired.&lt;/li&gt;
&lt;li&gt;Sunday: I had some... ideas.&lt;/li&gt;
&lt;li&gt;Monday: I wrote like 15 bugs against MOTR.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try and take things easy, and work on whatever I feel like.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2021-10-18</title><link href="https://mwchase.neocities.org/coding-2021-10-18" rel="alternate"></link><published>2021-10-18T04:00:00-04:00</published><updated>2021-10-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-10-18:/coding-2021-10-18</id><summary type="html">&lt;p class="first last"&gt;A partial list of things I need to change about MOTR.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Checking over the motrfile to see which bugs I should write up...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Move wheel creation code into core.&lt;/li&gt;
&lt;li&gt;Move requirements file creation code into core.&lt;/li&gt;
&lt;li&gt;Figure out how to lift operations on the underlying type into the context of the &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; wrapper.&lt;/li&gt;
&lt;li&gt;Move project package code into core.&lt;/li&gt;
&lt;li&gt;Move path utility function into core.&lt;/li&gt;
&lt;li&gt;Create helpers for generating sets of project packages.&lt;/li&gt;
&lt;li&gt;Move &lt;tt class="docutils literal"&gt;make_parent&lt;/tt&gt; helper into core and evaluate the possibility of using it with &lt;tt class="docutils literal"&gt;write_bytes&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Rewrite virtualenv creation code (including pip calls) to use the &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; API.&lt;/li&gt;
&lt;li&gt;Eliminate usage of &lt;tt class="docutils literal"&gt;venv&lt;/tt&gt; module.&lt;/li&gt;
&lt;li&gt;Eliminate direct references to Flit.&lt;/li&gt;
&lt;li&gt;Rework the &lt;tt class="docutils literal"&gt;RuntimeAction&lt;/tt&gt; interface to take a callback to register output streams.&lt;/li&gt;
&lt;li&gt;Rewrite pytest calls to use the &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; API.&lt;/li&gt;
&lt;li&gt;Rewrite flake8 call to use the &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; API.&lt;/li&gt;
&lt;li&gt;Rewrite mypy call to use the &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; API.&lt;/li&gt;
&lt;li&gt;Rewrite coverage calls to use the &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; API.&lt;/li&gt;
&lt;li&gt;Rewrite pyinstrument calls to use the &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; API.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That's going to give me plenty to chew on.
I'll enter that in after I publish this.&lt;/p&gt;
&lt;p&gt;I'm not going to try to write any more; I just want to wrap things up quickly.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-10-17</title><link href="https://mwchase.neocities.org/coding-2021-10-17" rel="alternate"></link><published>2021-10-17T04:00:00-04:00</published><updated>2021-10-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-10-17:/coding-2021-10-17</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;I don't think I have anything else to say.&amp;quot; *spontaneously types a bunch of crazy-sounding ideas*&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Several corrections later, and I've successfully published a version of MOTR using a script.
Next up, I should make sure it better explains what it's doing.&lt;/p&gt;
&lt;p&gt;(The published version has some lines commented out, but it's not like this code needs to work for anyone else.
Moreso than MOTR's whole &amp;quot;most of the code still lives in the configuration file&amp;quot; problem.)&lt;/p&gt;
&lt;p&gt;I'm feeling a little iffy tonight, so I guess I'm not going to come up with much more to say.
My big feeling on all of this is that it's nice to do this kind of sketch-then-retype flow.
Lets me do the high-level design first, rough it in, then do a quick full rewrite to sand off any intense awkwardness.&lt;/p&gt;
&lt;p&gt;It might be interesting if I could come up with some kind of &amp;quot;pseudo-English&amp;quot; in line with &amp;quot;pseudocode&amp;quot;.
If the various analogies hold, that'd make drafting prose, and possibly poetry, easier.&lt;/p&gt;
&lt;p&gt;Maybe for prose, I should look into restricting myself to a subset of English and see how that feels.
Or maybe I need to take my drafts, and work on developing some kind of higher-level abstraction of them, that exhibits sensible changes from draft to draft.
Like maybe there's some kind of &amp;quot;higher-level language of prose&amp;quot; that's not satisfying to read if you're in the target audience of the finished product, but that makes it easier to reason about and change the narrative.&lt;/p&gt;
&lt;p&gt;Unfortunately, as I say that, I realize that what I'm describing is not analogous to an artifact in a high-level language getting compiled, but an artifact in a formal language getting refined.
I guess I should look more into advanced formal methods.
This sounds crazy enough that I assume it could be mistaken for an attempt at dry humor, but I'm genuinely curious whether this concept could be made to work.&lt;/p&gt;
&lt;p&gt;Anyway, I need to wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2021-10-16</title><link href="https://mwchase.neocities.org/diary-2021-10-16" rel="alternate"></link><published>2021-10-16T04:00:00-04:00</published><updated>2021-10-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-10-16:/diary-2021-10-16</id><summary type="html">&lt;p class="first last"&gt;Feeling a bit wrung-out.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm going to take things easy for now, and try to get started on the work for MOTR tomorrow.&lt;/p&gt;
&lt;p&gt;I'm just really tired is all, and I need to take some rest.&lt;/p&gt;
&lt;p&gt;I don't have anything else to say.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2021-10-15</title><link href="https://mwchase.neocities.org/coding-2021-10-15" rel="alternate"></link><published>2021-10-15T04:00:00-04:00</published><updated>2021-10-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-10-15:/coding-2021-10-15</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;I don't know which of these assumptions might be wrong, so I guess I'll try running it and see what blows up.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I'm still not feeling up for serious work, so I'm just going to review the other things I want to verify for the streamlined publishing workflow.&lt;/p&gt;
&lt;p&gt;Honestly, all of my hopes/impressions for how mercurial works seem sensible enough that I think I'd rather convert my prototype into a script, comment out the last command, and make sure it handles everything properly.
If that all works, I'll then publish a new version just to make sure that the published version matches whatever I have locally.
(Also, I guess I should avoid letting it publish a major version for now.)&lt;/p&gt;
&lt;p&gt;Once that's done, I'll have to get better about handling the issue tracker, and probably using topics.
(Right now, I'm just lumping everything in a topic called &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;self-hosting&lt;/span&gt;&lt;/tt&gt;, which I suppose is reasonable, insofar as I keep moving the goalposts.
MOTR absolutely runs against itself, &lt;em&gt;but&lt;/em&gt; it accomplishes this by offloading a heroic quantity of functions and data types onto the configuration file, which means that it's not reasonable to use MOTR for my other projects, let alone expect anyone else to use it.
I should maybe consider renaming the topic to something like &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;other-hosting&lt;/span&gt;&lt;/tt&gt;, I don't really know, and right now, I don't really care.)&lt;/p&gt;
&lt;p&gt;Anyway, I've got some other stuff to work on right now, and I want to get this published and over with.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-10-14</title><link href="https://mwchase.neocities.org/coding-2021-10-14" rel="alternate"></link><published>2021-10-14T04:00:00-04:00</published><updated>2021-10-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-10-14:/coding-2021-10-14</id><summary type="html">&lt;p class="first last"&gt;I think compressing modal qualifiers is supposed to be &amp;quot;acceptable&amp;quot; under some circumstances, maybe, but it's certainly not clear in these circumstances.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right.
I haven't been doing super great with organization after that migraine, so I didn't have time for much tonight.&lt;/p&gt;
&lt;p&gt;I did get &lt;tt class="docutils literal"&gt;bump2version&lt;/tt&gt; set up and I did some basic tests via the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-dry-run&lt;/span&gt;&lt;/tt&gt; option.
The &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--verbose&lt;/span&gt;&lt;/tt&gt; output from that is &lt;em&gt;a little&lt;/em&gt; confusing, because it doesn't distinguish between &amp;quot;not tagging because it's dry-run&amp;quot; (true) and &amp;quot;not tagging because it's disabled in the configuration&amp;quot; (should &lt;em&gt;also&lt;/em&gt; be true).&lt;/p&gt;
&lt;p&gt;Actually, this output is misleading enough that I'm going to enter an issue for it.&lt;/p&gt;
&lt;p&gt;And, that's about all I have time for.
Time to watch some videos about doing horrible things to video games, and I'll try to verify my workflow assumptions later, when I don't need spell-check holding my hand &lt;em&gt;quite&lt;/em&gt; so much...&lt;/p&gt;
&lt;p&gt;(... &amp;quot;veryify&amp;quot;?)&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-10-13</title><link href="https://mwchase.neocities.org/coding-2021-10-13" rel="alternate"></link><published>2021-10-13T04:00:00-04:00</published><updated>2021-10-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-10-13:/coding-2021-10-13</id><summary type="html">&lt;p class="first last"&gt;I don't gamble with money. I gamble with &amp;quot;Is this remotely the intended way to accomplish this task?&amp;quot; I don't know how to tell if I've won or lost.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I filled in the prototype of the release streamlining.
Here's what needs to happen:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Set up bump2version, and configure it to update the &lt;tt class="docutils literal"&gt;__init__.py&lt;/tt&gt; file, and to commit, but &lt;em&gt;not&lt;/em&gt; to tag.&lt;/li&gt;
&lt;li&gt;Add a check for multiple heads on the current topic.
This appears to be &lt;tt class="docutils literal"&gt;hg heads &lt;span class="pre"&gt;--rev&lt;/span&gt; &lt;span class="pre"&gt;topic(topic-of-interest)&lt;/span&gt; &lt;span class="pre"&gt;--template&lt;/span&gt; &lt;span class="pre"&gt;&amp;quot;{rev}\n&amp;quot;&lt;/span&gt;&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Test a bunch of things on a separate repo, including:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Test the above &lt;tt class="docutils literal"&gt;hg heads&lt;/tt&gt; command.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;hg status&lt;/tt&gt; always outputs to &lt;tt class="docutils literal"&gt;stdout&lt;/tt&gt; if there's &lt;em&gt;something&lt;/em&gt; there to talk about.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;hg topics &lt;span class="pre"&gt;--current&lt;/span&gt;&lt;/tt&gt; fails if no topic is set, and returns the current topic otherwise.&lt;/li&gt;
&lt;li&gt;I've got a reasonable format for generated topic names; I'm currently trying alphanumerics separated by underscores.
This mainly needs to be comprehensible in the context of revsets.&lt;/li&gt;
&lt;li&gt;Regardless of repository state, calling &lt;tt class="docutils literal"&gt;hg update &lt;span class="pre"&gt;--clean&lt;/span&gt;&lt;/tt&gt; with a topic name will at least ensure that there are no changes to commit.&lt;/li&gt;
&lt;li&gt;I have the correct logic for reading the &lt;em&gt;second&lt;/em&gt; component in a filename that is a period-separated string.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;hg topics target &lt;span class="pre"&gt;--rev&lt;/span&gt; topic(source)&lt;/tt&gt; brings all commits in the &lt;tt class="docutils literal"&gt;source&lt;/tt&gt; topic into the &lt;tt class="docutils literal"&gt;target&lt;/tt&gt; topic.
It is acceptable (but maybe not necessary, I don't know?) to assume that the newest commit in the target is the parent of the oldest commit in the target.
I'm also not sure if this is a &lt;em&gt;sensible&lt;/em&gt; way to accomplish this.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm probably missing more things, but &lt;em&gt;hopefully&lt;/em&gt; I won't hit too many more edge cases, and when it does, hopefully it'll fail for a weird reason rather than &amp;quot;succeed&amp;quot; in a weird way.&lt;/p&gt;
&lt;p&gt;Anyway, it's way too late right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2021-10-12</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-10-12" rel="alternate"></link><published>2021-10-12T04:00:00-04:00</published><updated>2021-10-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-10-12:/weekly-roundup-2021-10-12</id><summary type="html">&lt;p class="first last"&gt;I feel like I can't trust my eyes not to hurt my brain again.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I finished the rough draft of the poem.&lt;/li&gt;
&lt;li&gt;Thursday: Mostly played videogames and did fan region stuff.&lt;/li&gt;
&lt;li&gt;Friday: Played videogames.&lt;/li&gt;
&lt;li&gt;Saturday: Sick.&lt;/li&gt;
&lt;li&gt;Sunday: Sick.&lt;/li&gt;
&lt;li&gt;Monday: Not as sick. Played videogames.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I &lt;em&gt;hope&lt;/em&gt; to not be as sick.
I've got a few things I can/want to work on, but it's kind of down to what turns out to be possible.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Diary 2021-10-11</title><link href="https://mwchase.neocities.org/diary-2021-10-11" rel="alternate"></link><published>2021-10-11T04:00:00-04:00</published><updated>2021-10-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-10-11:/diary-2021-10-11</id><summary type="html">&lt;p class="first last"&gt;Videogames, mostly.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I felt &lt;em&gt;terrible&lt;/em&gt; after last night's entry, and now I feel... okay?
Ish?&lt;/p&gt;
&lt;p&gt;I still wanted to take things easy today, so there's not much to talk about.&lt;/p&gt;
&lt;p&gt;Hopefully I'll get clear of all of this tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2021-10-10</title><link href="https://mwchase.neocities.org/diary-2021-10-10" rel="alternate"></link><published>2021-10-10T04:00:00-04:00</published><updated>2021-10-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-10-10:/diary-2021-10-10</id><summary type="html">&lt;p class="first last"&gt;Apparently, one of the signs of &amp;quot;migraine is getting better&amp;quot; is &amp;quot;oh wow, my stomach just clenched for no apparent reason&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Migraine update: starting to recover just now, and that hit me hard.
I'm going to do another short post, then space out for a while.&lt;/p&gt;
&lt;p&gt;If I feel like it, I might come back and update this post afterwards, but I'm not really planning to.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2021-10-09</title><link href="https://mwchase.neocities.org/diary-2021-10-09" rel="alternate"></link><published>2021-10-09T04:00:00-04:00</published><updated>2021-10-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-10-09:/diary-2021-10-09</id><summary type="html">&lt;p class="first last"&gt;It sucks not getting everything done that I want done, but sometimes it's just not possible at the time.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've had a migraine coming on for a while.
So that sucks.
I'm going to avoid pushing myself any more tonight, and just take it easy.
This post is going to be one of the things I put minimal effort into.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2021-10-08</title><link href="https://mwchase.neocities.org/diary-2021-10-08" rel="alternate"></link><published>2021-10-08T04:00:00-04:00</published><updated>2021-10-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-10-08:/diary-2021-10-08</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;I'm a genius! ... Oh no!&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I guess what's really been taking up a bunch of my time lately is playing &lt;a class="reference external" href="http://roguetemple.com/z/hyper/"&gt;HyperRogue&lt;/a&gt;.
There's a lot for me to see, still; I'd probably see more of it if I could stop getting over-confident or impatient.&lt;/p&gt;
&lt;p&gt;I was going to see if I had more to say on the matter, and I guess not.
I should get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2021-10-07</title><link href="https://mwchase.neocities.org/diary-2021-10-07" rel="alternate"></link><published>2021-10-07T04:00:00-04:00</published><updated>2021-10-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-10-07:/diary-2021-10-07</id><summary type="html">&lt;p class="first last"&gt;Apparently, I need to design more water and steel types.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I basically took things easy today.
I'm doing all right focusing on the fan region I mentioned, though I suspect I'll want a break from that soon.&lt;/p&gt;
&lt;p&gt;The big effort I put into things today was to put together a spreadsheet of all of my concepts, with metrics.
I think I'm going to want to refine the metrics later; what I have right now is stuff related to type distributions, and it seems to me like stuff like legendaries should maybe be weighted differently in that context.&lt;/p&gt;
&lt;p&gt;Anyway, I don't really have anything else to say, and I'll suffer if I don't get to bed, so I'm going to do that.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Worldbuilding — Korín, Sorín, and Arín 2021-10-06</title><link href="https://mwchase.neocities.org/worldbuilding-ksa-2021-10-06" rel="alternate"></link><published>2021-10-06T04:00:00-04:00</published><updated>2021-10-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-10-06:/worldbuilding-ksa-2021-10-06</id><summary type="html">&lt;p class="first last"&gt;Struggling across the finish line, visibly disgusted with my performance.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The rough draft is done.
I feel like the ending falls flat, but it does what it's supposed to, so I'm just going to accept this for now.&lt;/p&gt;
&lt;p&gt;I've got other stuff I want to do tonight, so I'm going to rush through finishing this post.&lt;/p&gt;
&lt;p&gt;Here's what needs to happen to the draft:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Clean up the outline notes.&lt;/li&gt;
&lt;li&gt;Fix up the formatting.&lt;/li&gt;
&lt;li&gt;Analyze the scansion and note any serious issues.&lt;/li&gt;
&lt;li&gt;Do spot improvements, now that I can edit. (Like I think there are some missing syllables that I just outright gave up on for now, in the name of finishing the draft?)&lt;/li&gt;
&lt;li&gt;Print it out and read it and mark it up.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For now, I need to work on that other stuff.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Worldbuilding — Korín, Sorín, and Arín"></category></entry><entry><title>Weekly Roundup 2021-10-05</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-10-05" rel="alternate"></link><published>2021-10-05T04:00:00-04:00</published><updated>2021-10-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-10-05:/weekly-roundup-2021-10-05</id><summary type="html">&lt;p class="first last"&gt;Would you believe I haven't been holding myself to work on a particular thing on a given day in quite some time? Shocking, I know.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I worked on poetry, and thought I was going to plan Missable Mysteries stuff, which... didn't happen.&lt;/li&gt;
&lt;li&gt;Thursday: Same...&lt;/li&gt;
&lt;li&gt;Friday: I was distracted from bloggable stuff.&lt;/li&gt;
&lt;li&gt;Saturday: I did some prototyping for MOTR.&lt;/li&gt;
&lt;li&gt;Sunday: I noticed that MOTR is unusable in an automated context.&lt;/li&gt;
&lt;li&gt;Monday: I fixed the most glaring issue there.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I want to get a bit further with poetry, and actually work on Missable Mysteries stuff.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2021-10-04</title><link href="https://mwchase.neocities.org/coding-2021-10-04" rel="alternate"></link><published>2021-10-04T04:00:00-04:00</published><updated>2021-10-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-10-04:/coding-2021-10-04</id><summary type="html">&lt;p class="first last"&gt;Bug fixing speedrun.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I was focused on other stuff today, but I managed to get the exit code stuff handled pretty quickly.&lt;/p&gt;
&lt;p&gt;Basically, I added some tests, fixed the tests a few times, discovered that I was missing an exception suppression, added it, got the tests to pass, and then confirmed that the exit code behavior is now correct.&lt;/p&gt;
&lt;p&gt;With this, MOTR now has the potential to be useful in an automated context, like what I'm planning to do with the release workflow.&lt;/p&gt;
&lt;p&gt;I'll take notes on that workflow later.
For now, I let things go late again, so I need to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-10-03</title><link href="https://mwchase.neocities.org/coding-2021-10-03" rel="alternate"></link><published>2021-10-03T04:00:00-04:00</published><updated>2021-10-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-10-03:/coding-2021-10-03</id><summary type="html">&lt;p class="first last"&gt;&lt;em&gt;OOPS&lt;/em&gt;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got a basic sketch of a streamlined release cutting process, but when I was checking over all of the components, I discovered a show-stopping defect in MOTR that I need to address before I can use it in the process:&lt;/p&gt;
&lt;p&gt;MOTR exits with return code 0 if it gets all the way through its tasks &lt;em&gt;even if&lt;/em&gt; some of the tasks failed.
That's obviously pretty bad, because it's never going to be able to block a release like that.
Looks like what I want is to set the exit code to 1 after everything is printed, if there are any failed or aborted tasks.&lt;/p&gt;
&lt;p&gt;I'll write tests for this tomorrow.
It should be a simple change, but I want to be pretty thorough, which I can't be when I'm tired.&lt;/p&gt;
&lt;p&gt;I'll wrap up early and try to get some rest.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-10-02</title><link href="https://mwchase.neocities.org/coding-2021-10-02" rel="alternate"></link><published>2021-10-02T04:00:00-04:00</published><updated>2021-10-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-10-02:/coding-2021-10-02</id><summary type="html">&lt;p class="first last"&gt;I'm trying to hold off on refactoring the common behaviors until I understand how any of this needs to work.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I managed to give myself kind of a rough day today, so I just focused on exploratory prototyping for MOTR.
Just, like, zoning out a bit, translating notes to code.&lt;/p&gt;
&lt;p&gt;Basically... MOTR runs a bunch of commands, and those commands can be decomposed into distinct parts that carry installation requirements in order to work.
So, I've got prototype &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt; classes.
A &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; is &lt;em&gt;either&lt;/em&gt; a complete command (just requiring a bin directory prefix), or an invocation of a Python module.
(This may open up as I look into working with other kinds of command.)
An &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt; is a sequence of command-line arguments or environment variables, along with associated requirements.
From a runtime perspective, they are nearly the same, except that &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt;s have an optional field that allows them to combine with another &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt;, if the field is not &lt;tt class="docutils literal"&gt;None&lt;/tt&gt;.
An &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt; can be added to the end of a &lt;tt class="docutils literal"&gt;Fragment&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;Option&lt;/tt&gt;.
In the prototype, this is pretty loosey-goosey, at least at runtime, but I've got a sketch of type-level stuff that should do the right thing, more or less.&lt;/p&gt;
&lt;p&gt;Now that I've got something that can be fed into some kind of environment preparation function, I need to design that function.
Focusing on virtualenv for now, here are the axes of variation:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Which Python version gets installed&lt;/li&gt;
&lt;li&gt;Which constraints file to use&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And the different stages:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Creation &lt;em&gt;subsumes&lt;/em&gt; the &amp;quot;update&amp;quot; step from the current working version, because virtualenv bundles the latest pip.&lt;/li&gt;
&lt;li&gt;Installation is much as the current version, I &lt;em&gt;think&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Running is added; because the command and the requirements are built in parallel, there's no reason to hold off on running the command.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As a result, all of the stages should collapse into a single invocation from the perspective of the code at large.&lt;/p&gt;
&lt;p&gt;The main thing I need to figure out is how to handle specifying the constraints file.
The design problem arises from the fact that I want to specify environment variables, and I want to build an install command, but the constraints file is the only environment variable that I want to pass to the install command.
I suppose one way around this would be to check if the bug I filed against pip is still open...
&lt;a class="reference external" href="https://github.com/pypa/pip/issues/8439"&gt;Yep, there it is&lt;/a&gt;.
Looking over Flit's source code, I believe it's currently safe for me to use the command-line options for constraints files.
This is probably the way to go, just punting on addressing the design.
Either I'll come up with a design, or the pip issue will get triaged.
One of those has to happen before 1.0, but I'm not there yet.&lt;/p&gt;
&lt;p&gt;Anyway, I think tomorrow I'll put the design on hold, and try to come up with a plan for making releases not have like seven steps or whatever.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2021-10-01</title><link href="https://mwchase.neocities.org/diary-2021-10-01" rel="alternate"></link><published>2021-10-01T04:00:00-04:00</published><updated>2021-10-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-10-01:/diary-2021-10-01</id><summary type="html">&lt;p class="first last"&gt;I didn't realize I was taking a break and/or switching gears today, but I guess that happened.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got distracted by stuff I don't want to write up right now, so I guess today is kind of a loss so far.
The process behind the existence of the &amp;quot;stuff&amp;quot; is &amp;quot;I've been watching a bunch of videos about fanmade Pokémon regions lately; why don't I try doing that?&amp;quot;
I don't have any kind of plan right now to make it widely available; maybe I'll want to reconsider making it more public in a few weeks, but I don't think it makes sense to think about the level of polish that would require right now.&lt;/p&gt;
&lt;p&gt;I was spinning my wheels a bit seeing if I'd come up with anything else, but I guess not.
I definitely shouldn't push it any further, so I should wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Worldbuilding — Korín, Sorín, and Arín 2021-09-30</title><link href="https://mwchase.neocities.org/worldbuilding-ksa-2021-09-30" rel="alternate"></link><published>2021-09-30T04:00:00-04:00</published><updated>2021-09-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-09-30:/worldbuilding-ksa-2021-09-30</id><summary type="html">&lt;p class="first last"&gt;I don't have to &lt;em&gt;like&lt;/em&gt; it for it to count as progress...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm approaching the end of the outline.
The quality of each new stanza feels like it's going down, so, that's not great.&lt;/p&gt;
&lt;p&gt;All I can do I push through the last few stanzas, it can't be much more than half a dozen, if that, and then focus on stuff like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Prototyping more code for MOTR.&lt;/li&gt;
&lt;li&gt;Outlining the next for Missable Myteries posts.&lt;/li&gt;
&lt;li&gt;Going over the current version of the first post with more scrutiny, now that SoME1 is over and done with, from my perspective.
I would like to see if I can make it less wordy somehow.
I &lt;em&gt;think&lt;/em&gt; that's a reasonable thing to attempt.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Zoned out, need to wrap up ASAP.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Worldbuilding — Korín, Sorín, and Arín"></category></entry><entry><title>Worldbuilding — Korín, Sorín, and Arín 2021-09-29</title><link href="https://mwchase.neocities.org/worldbuilding-ksa-2021-09-29" rel="alternate"></link><published>2021-09-29T04:00:00-04:00</published><updated>2021-09-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-09-29:/worldbuilding-ksa-2021-09-29</id><summary type="html">&lt;p class="first last"&gt;Not really excited to see how much of this gets junked in revisions, but whatever.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm getting into the home stretch on this first draft of the poem.
I didn't get much written tonight, but I got some written, and there's just a handful of story beats left to hit.&lt;/p&gt;
&lt;p&gt;I think my plan with this is to finish up the draft, and then let it sit while I finally get back to planning Missable Mysteries content.&lt;/p&gt;
&lt;p&gt;For now, I'm going to try to take things easy.
And at the moment, that involves doing some stuff that's a little distracting, so I'm going to wrap this post up before it somehow goes way late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Worldbuilding — Korín, Sorín, and Arín"></category></entry><entry><title>Weekly Roundup 2021-09-28</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-09-28" rel="alternate"></link><published>2021-09-28T04:00:00-04:00</published><updated>2021-09-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-09-28:/weekly-roundup-2021-09-28</id><summary type="html">&lt;p class="first last"&gt;Just putting in a bunch of effort.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I wrote some poetry for my worldbuilding project.&lt;/li&gt;
&lt;li&gt;Thursday: I wrote a bit more, and filled space trying to figure out how best to write about writing this stuff.&lt;/li&gt;
&lt;li&gt;Friday: I made a bunch of progress with the poetry, and then didn't have the energy to write pretty much any more at all.&lt;/li&gt;
&lt;li&gt;Saturday: I made some improvements to MOTR's code.&lt;/li&gt;
&lt;li&gt;Sunday: I documented exactly how messed up the process currently is, to publish a new version of MOTR.&lt;/li&gt;
&lt;li&gt;Monday: I wrote up hundreds of documentation stubs for MOTR.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to get back into the poetry stuff for a few days, and work on refining the design for the high-level abstractions I'm designing for MOTR.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2021-09-27</title><link href="https://mwchase.neocities.org/coding-2021-09-27" rel="alternate"></link><published>2021-09-27T04:00:00-04:00</published><updated>2021-09-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-09-27:/coding-2021-09-27</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;This is the Foo class. It is a class that foos.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right.
Everything that I got flake8 to complain about not being documented, is now documented.
The documentation isn't particularly &lt;em&gt;good&lt;/em&gt;, but it's &lt;em&gt;there&lt;/em&gt;, and it's ready to be processed by Sphinx.
I'm not ready to hook Sphinx up yet, so now I'm back to making changes to the motrfile.&lt;/p&gt;
&lt;p&gt;Right at the moment, I'm cleaning up the requirements files in various ways.
I removed a few unneeded requirements, and some obsolete extras requirements.
I've written a small constraints file based on the few version locks I did.
The steps to change next are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Wire the constraints file everywhere in the motrfile.
That means using it explicitly in everything that doesn't use the generated constraints file, and using &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-c&lt;/span&gt;&lt;/tt&gt; to include it in the generated constraints file.&lt;/li&gt;
&lt;li&gt;Remove the version locks from the requirements file, and check that the locked versions are still installed.&lt;/li&gt;
&lt;li&gt;Create the classes that I've designed to represent parts of command lines.&lt;/li&gt;
&lt;li&gt;Allow the existing environment functions to take instances of those classes.
This will take some work updating interfaces, because the new classes bundle together relevant information like &amp;quot;what do you want to do on the command line&amp;quot; and &amp;quot;what do you need to install to do that thing&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Looking over the file, I think the proper order for the last two is:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Implement the classes&lt;/li&gt;
&lt;li&gt;Create the necessary helpers for flit and pyproject&lt;/li&gt;
&lt;li&gt;Update the &lt;em&gt;new&lt;/em&gt; environment code to take the new classes&lt;/li&gt;
&lt;li&gt;So how that works out for me&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once that's done, I can start working on creating helpers for the other commands, and do migrations as I finish them.&lt;/p&gt;
&lt;p&gt;I don't really have a lot of focus left for this right now, so I'm going to wrap up early and zone out a bit.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-09-26</title><link href="https://mwchase.neocities.org/coding-2021-09-26" rel="alternate"></link><published>2021-09-26T04:00:00-04:00</published><updated>2021-09-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-09-26:/coding-2021-09-26</id><summary type="html">&lt;p class="first last"&gt;This is not a one-step process.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I took care of the first bullet point from earlier, and now I want to cut a new release.
This turns out to be harder than it should be, so I'm going to try to document all of the steps in an attempt to get it all to make sense.&lt;/p&gt;
&lt;p&gt;So, I need to get a bunch of things done in the right order, which I haven't fully figured out.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The release tag needs to be updated. Right now, I want this to be the last thing I do before I build the release. I appear to have forgotten to do this at least once.&lt;/li&gt;
&lt;li&gt;I need to update the version field in the &lt;tt class="docutils literal"&gt;__init__.py&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;I need to run &lt;tt class="docutils literal"&gt;towncrier build&lt;/tt&gt;. I'm having troubles with this giving me the wrong version, so I need to look into how that works.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;flit build&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;flit publish&lt;/tt&gt;. I need to look up how to store my credentials for the publish step.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the flit thing, I just installed &lt;tt class="docutils literal"&gt;keyring&lt;/tt&gt;, and hopefully that will help.
Now, let's take a look at how &lt;tt class="docutils literal"&gt;towncrier&lt;/tt&gt; works...
Okay, because I'm running MOTR on itself, I guess the sequence is:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Update the version field.&lt;/li&gt;
&lt;li&gt;Install the newest version (because towncrier is doing an import in preference to inspecting the filesystem).&lt;/li&gt;
&lt;li&gt;Run &lt;tt class="docutils literal"&gt;towncrier&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Tag the release.&lt;/li&gt;
&lt;li&gt;Run &lt;tt class="docutils literal"&gt;flit&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let's try that.
I've already updated, so let's see...&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;hg st&lt;/tt&gt;...
Clean.&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;pip install .&lt;/tt&gt;
Worked.&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;towncrier build&lt;/tt&gt;
Worked as desired.&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;hg tag v0.1.4&lt;/tt&gt;
Something would have been pretty wrong if that failed.&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;flit build&lt;/tt&gt;
All set.&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;flit publish&lt;/tt&gt;
And keyring worked, so that'll be convenient.&lt;/p&gt;
&lt;p&gt;Well, then.
That's too many steps.
And I didn't even realize I was supposed to &lt;em&gt;do&lt;/em&gt; one of them.
Let's try to fill it all in...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;nvim src/motr/_init__.py&lt;/tt&gt; Needs something better&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;hg commit&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;pip install .&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;towncrier build &lt;span class="pre"&gt;--yes&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;hg commit&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;hg tag v&amp;lt;tag&amp;gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;flit build&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;flit publish&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Right now, I'm not sure how I want to consolidate all that together, so I'm going to put that off until tomorrow.
For now, I'm going to install &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;flake8-docstrings&lt;/span&gt;&lt;/tt&gt; and see what kind of carnage that unleashes.
180 violations.
Sounds about right.&lt;/p&gt;
&lt;p&gt;I'll publish this post, and then try to fix some of these violations.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-09-25</title><link href="https://mwchase.neocities.org/coding-2021-09-25" rel="alternate"></link><published>2021-09-25T04:00:00-04:00</published><updated>2021-09-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-09-25:/coding-2021-09-25</id><summary type="html">&lt;p class="first last"&gt;The attribute name doesn't make sense any more, but I can't fix that yet.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I wrote a bit more poetry, then focused on improving MOTR.
Before anything else, I made &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; generic, and put some convenience methods for manipulating iterables of them into their module.
I reworked the &lt;tt class="docutils literal"&gt;cmd&lt;/tt&gt; module to use this new stuff, which is just complex enough that I need to give the type system a little boost to get it going.&lt;/p&gt;
&lt;p&gt;The next step is going to be reworking the &lt;tt class="docutils literal"&gt;*inputs&lt;/tt&gt; argument into something like &lt;tt class="docutils literal"&gt;*io&lt;/tt&gt;, which is going to be interesting because, once I build and locally install a new version, the motrfile will be broken until I fix it.&lt;/p&gt;
&lt;p&gt;Actually, speaking of the motrfile, I just remembered something else that I'm wondering if it works...
Ah, not worth trying right now.
Basically, I'd like to see if &lt;tt class="docutils literal"&gt;importlib&lt;/tt&gt; can replace the weird dance I'm doing right now to execute the motrfile, and it &lt;em&gt;probably&lt;/em&gt; can, I just need to put in a bunch of time to redo the error wrapping, and it's too late at night for that right now.&lt;/p&gt;
&lt;p&gt;I'll get back to work on improving the &lt;tt class="docutils literal"&gt;cmd&lt;/tt&gt; helper, which is a bit harder because it's not a simple refactor.
Hopefully I'll have time to make some of the more interesting changes I have in mind.&lt;/p&gt;
&lt;p&gt;Anyway, I should wrap up now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Worldbuilding — Korín, Sorín, and Arín 2021-09-24</title><link href="https://mwchase.neocities.org/worldbuilding-ksa-2021-09-24" rel="alternate"></link><published>2021-09-24T04:00:00-04:00</published><updated>2021-09-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-09-24:/worldbuilding-ksa-2021-09-24</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;The word 'should've' can have one syllable if I &lt;em&gt;truly believe&lt;/em&gt;, right?&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Like eight more stanzas done.
At this point, I'm &lt;em&gt;definitely&lt;/em&gt; at least halfway done.
I think.&lt;/p&gt;
&lt;p&gt;I'm making progress for sure, but it's still such a slog.&lt;/p&gt;
&lt;p&gt;And, once again, I'm too wiped out to write much &lt;em&gt;about&lt;/em&gt; what I've written.
I'm really itching to turn my focus to MOTR.
I've got a pretty solid idea of the kinds of challenges I need to deal with to move forward.&lt;/p&gt;
&lt;p&gt;Anyway, it's late, and I will regret it &lt;em&gt;a lot&lt;/em&gt; if I don't call this post now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Worldbuilding — Korín, Sorín, and Arín"></category></entry><entry><title>Worldbuilding — Korín, Sorín, and Arín 2021-09-23</title><link href="https://mwchase.neocities.org/worldbuilding-ksa-2021-09-23" rel="alternate"></link><published>2021-09-23T04:00:00-04:00</published><updated>2021-09-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-09-23:/worldbuilding-ksa-2021-09-23</id><summary type="html">&lt;p class="first last"&gt;Three more of these ground out.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I ended last night trying to figure out how to complete a rhyme.
I ended tonight trying to figure out how to complete a rhyme.
The difference is, it's a few stanzas later.&lt;/p&gt;
&lt;p&gt;As long as I'm working through the outline, I'm making progress.
It's just... kind of unpleasant, sometimes.
Maybe a lot of the time.&lt;/p&gt;
&lt;p&gt;I feel like I've dug myself into a hole somewhat, blog-content-wise.
Because I can't just post the stuff I've been writing.
It's rough-draft quality, which I admit doesn't stop me from putting up most of my posts, but, I don't have a good counter-argument to the point I brought up.
Still not doing it, though.&lt;/p&gt;
&lt;p&gt;I think I'm at least halfway through, currently.
I mean, let's see, that's 18 stanzas so far, rounding up.&lt;/p&gt;
&lt;p&gt;At least 6 stanzas for the fight, and it would kind of surprise me if the aftermath took even 10...
I could be completely wrong about that, though.&lt;/p&gt;
&lt;p&gt;This may end up lacking a certain punchiness next to the outline, but whatever.
If there's material to shave off, that's happening after I finish the draft.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to regret it if I think too much more about the post, so let's wrap it up abruptly.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Worldbuilding — Korín, Sorín, and Arín"></category></entry><entry><title>Worldbuilding — Korín, Sorín, and Arín 2021-09-22</title><link href="https://mwchase.neocities.org/worldbuilding-ksa-2021-09-22" rel="alternate"></link><published>2021-09-22T04:00:00-04:00</published><updated>2021-09-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-09-22:/worldbuilding-ksa-2021-09-22</id><summary type="html">&lt;p class="first last"&gt;Restrictions breed creativity&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Got about two stanzas written.
I've just got to fill up the outline, and then that's the draft done.
Just a little bit each day.&lt;/p&gt;
&lt;p&gt;I don't remember if I explained what the hook is, so I'm going to do that now.&lt;/p&gt;
&lt;p&gt;The first thing I wrote for the setting document for &lt;em&gt;Korín, Sorín, and Arín&lt;/em&gt; was a very high-level description of its ridiculous cosmology.
It was very boring.&lt;/p&gt;
&lt;p&gt;After some discussion, I decided that the thing to lead with was some in-universe art, that highlighted some of the setting details.
Part of the reason there is that, of all of the things unique to this setting, I think art is the most obviously interesting thing to show other people.
The various implications of the magic system are interesting and all, but a description of them is itself a kind of art, just more dry and technical than I'd personally like to put out.
What's going on there is, to engage with such material, you kind of have to accept some hypotheticals that remove it from your experience.
Thinking about the implications of magic for agriculture doesn't relate in any way to your life, but if you're consuming a song, poem, book, painting, etc, then you are &lt;em&gt;actually consuming that art in your own life&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The fact that this is more engaging, I think, than basically an atlas of a place you can't actually visit, has me hopeful that it'll be a better introduction to the setting.&lt;/p&gt;
&lt;p&gt;So, what it actually is, is a song about two brothers.
One of them becomes evil, and the other one has to kill him, for the good of everyone around them.
Lots of dramatic proclamations, and battles, and crying.
And gods, and dragons.&lt;/p&gt;
&lt;p&gt;One thing I'm liking about it so far is that the combination of in-universe narrator and metrical constraints basically forbids me from over-explaining things.
So I'm all like &amp;quot;Well, I can write up a detailed explanation of what dragons look like, and do, in this setting, but everyone in the notional audience knows that and it would translate into very quantifiable bloat, as the number of stanzas grows for no good reason.&amp;quot;
I don't think I could handle doing anything really longform in verse, but I think it really helps where it makes sense.&lt;/p&gt;
&lt;p&gt;Anyway, I spent a good amount of time writing this up, and now I'm tired.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Worldbuilding — Korín, Sorín, and Arín"></category></entry><entry><title>Weekly Roundup 2021-09-21</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-09-21" rel="alternate"></link><published>2021-09-21T04:00:00-04:00</published><updated>2021-09-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-09-21:/weekly-roundup-2021-09-21</id><summary type="html">&lt;p class="first last"&gt;I made progress, but I'm not really feeling momentum from it.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I went into more direct detail about the &lt;em&gt;Korín, Sorín, and Arín&lt;/em&gt; setting.&lt;/li&gt;
&lt;li&gt;Thursday: I had problems working on material for &lt;em&gt;Korín, Sorín, and Arín&lt;/em&gt;, which I solved, apparently by complaining about them.&lt;/li&gt;
&lt;li&gt;Friday: I made some more progress on the material, and kind of tired myself out before I could write much &lt;em&gt;about&lt;/em&gt; my progress.&lt;/li&gt;
&lt;li&gt;Saturday: I didn't work on &lt;em&gt;Korín, Sorín, and Arín&lt;/em&gt; or MOTR, but I did some thinking &lt;em&gt;about&lt;/em&gt; MOTR, and why I'd rather keep on developing it, than switch to what I think of as the major alternatives.&lt;/li&gt;
&lt;li&gt;Sunday: I started working on MOTR some more, given a few days worth of notes.&lt;/li&gt;
&lt;li&gt;Monday: I realized that the natural way to handle the high-level abstractions for MOTR doesn't match up with the projects I want to use it with; the projects will have to change.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to get back to &lt;em&gt;Korín, Sorín, and Arín&lt;/em&gt; for a bit, while taking notes on some high-level concepts I need to nail down for MOTR.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2021-09-20</title><link href="https://mwchase.neocities.org/coding-2021-09-20" rel="alternate"></link><published>2021-09-20T04:00:00-04:00</published><updated>2021-09-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-09-20:/coding-2021-09-20</id><summary type="html">&lt;p class="first last"&gt;Figuring out how to make this more reasonable for other people to use.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Right now, I'm pondering a change in my project structure.
Basically, when I was basically propagating my tooling by mass copy/paste, it more-or-less made sense to encode a bunch of ideas about &amp;quot;here's how to do things&amp;quot; in data files that aren't part of any explicit configuration.&lt;/p&gt;
&lt;p&gt;To be more specific:
In a lot of my projects, I have a top-level &lt;tt class="docutils literal"&gt;requirements&lt;/tt&gt; directory that contains several &lt;tt class="docutils literal"&gt;requirements.txt&lt;/tt&gt;-type files, meant to be installed in specific circumstances.
But I just checked, and most of them are only like that in some kind of attempt to &amp;quot;streamline&amp;quot; the noxfile, so I can replace &amp;quot;install this and this&amp;quot; with a single filename.&lt;/p&gt;
&lt;p&gt;Now, this is a bad fit for the paradigm I'm aiming for with MOTR, because the high-level abstractions I'm writing are connecting an installation task to a script that they expect the task to make available.
In effect, this is asking any consumers to put a file in a specific place, and also put specific things in that file.
In the majority of cases, the onus to do all of this could be entirely removed by just putting the requirement data into the code, and expecting any project-specific fine-tuning to be in a &lt;tt class="docutils literal"&gt;constraints.txt&lt;/tt&gt; file.
In the remainder of cases, the required work could be somewhat diminished.
These cases are when there are additional plugins that can be installed to augment the functionality of a script.
I mainly have this use case for running &lt;a class="reference external" href="https://flake8.pycqa.org/"&gt;flake8&lt;/a&gt;, maybe &lt;a class="reference external" href="https://mypy.readthedocs.io/"&gt;mypy&lt;/a&gt;, and sometimes &lt;a class="reference external" href="https://docs.pytest.org/"&gt;pytest&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So, here's what I think I'm leaning towards:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The user can provide a top-level &lt;tt class="docutils literal"&gt;constraints.txt&lt;/tt&gt; file that covers most details of version/source to install.&lt;/li&gt;
&lt;li&gt;The build step generates an additional &lt;tt class="docutils literal"&gt;constraints.txt&lt;/tt&gt; file that references the user-provided file, if given.&lt;/li&gt;
&lt;li&gt;In addition to the package name, the environment creation flow can take a path to a supplementary &lt;tt class="docutils literal"&gt;requirements.txt&lt;/tt&gt; file, relative to the root. This file &lt;em&gt;does not need&lt;/em&gt; to specify the base package name, but doing so shouldn't hurt anything.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, an additional thing I'll need to work on is plugin code that requires command line arguments.
I can't gloss over that, which means that some of this is going to live in code rather than as requirements files.&lt;/p&gt;
&lt;p&gt;Let's see what that looks like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;flake8-isort needs code-level support&lt;/li&gt;
&lt;li&gt;as does flake8-html&lt;/li&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--html-report&lt;/span&gt;&lt;/tt&gt; flag for mypy needs code-level support.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thinking over this, here's what I think makes sense:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Make the &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; classes more flexible in what they can contain, and allow specifying both in the freeform section of the &lt;tt class="docutils literal"&gt;cmd&lt;/tt&gt; helper function.&lt;/li&gt;
&lt;li&gt;Cut a new release so I can confirm that this simplifies writing the higher-level abstractions.&lt;/li&gt;
&lt;li&gt;Remove some hackery from the &lt;tt class="docutils literal"&gt;cmd&lt;/tt&gt; function.&lt;/li&gt;
&lt;li&gt;Cut another new release to confirm that didn't break anything. (I may be able to condense these into one release.)&lt;/li&gt;
&lt;li&gt;Write initial documentation of everything, since there's about to be &lt;em&gt;a lot&lt;/em&gt; more code in there.&lt;/li&gt;
&lt;li&gt;Outline and fill out the new &lt;tt class="docutils literal"&gt;constraints.txt&lt;/tt&gt; way of doing things.&lt;/li&gt;
&lt;li&gt;Migrate the motrfile from the old to the new way, including deleting the old code.&lt;/li&gt;
&lt;li&gt;Start pulling code from the motrfile into MOTR.&lt;/li&gt;
&lt;li&gt;Figure out how I want to organize the different abstractions in the &lt;tt class="docutils literal"&gt;api&lt;/tt&gt; module.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-09-19</title><link href="https://mwchase.neocities.org/coding-2021-09-19" rel="alternate"></link><published>2021-09-19T04:00:00-04:00</published><updated>2021-09-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-09-19:/coding-2021-09-19</id><summary type="html">&lt;p class="first last"&gt;Come work on MOTR! We have: inscrutable errors!&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I spent a good portion of last week writing up thoughts on how to improve my prototype motrfile, before I start moving more stuff into MOTR proper.&lt;/p&gt;
&lt;p&gt;Today, I put some of those notes into practice, which was mainly focused on putting together a wrapper around the &lt;a class="reference external" href="https://virtualenv.pypa.io/"&gt;virtualenv&lt;/a&gt; package to replace the wrapper around the stdlib &lt;a class="reference external" href="https://docs.python.org/3/library/venv.html"&gt;venv&lt;/a&gt; module.
This is mainly important because I want to support multi-version testing, and specifically pypy2.
I haven't looked at all into how to attain the speed benefits that are supposed to be possible.&lt;/p&gt;
&lt;p&gt;Where I'm at now is, I have a basic implementation of the virtualenv wrapper, more-or-less according to my notes.
Now, I need to kind of iterate on things until I'm using a proper combination of virtualenv and &lt;a class="reference external" href="https://pypa-build.readthedocs.io/"&gt;pyproject-build&lt;/a&gt;, at which point I should be able to ditch the wrappers for venv and &lt;a class="reference external" href="https://flit.readthedocs.io/"&gt;Flit&lt;/a&gt;.
Actually getting there will be interesting, because I'm going to want to write actions for generating configuration files for &lt;a class="reference external" href="https://docs.pytest.org/"&gt;pytest&lt;/a&gt; and &lt;a class="reference external" href="https://coverage.readthedocs.io/"&gt;coverage.py&lt;/a&gt;.
(And later, &lt;a class="reference external" href="https://mypy.readthedocs.io/"&gt;mypy&lt;/a&gt;, I think, once I have mutation testing.)&lt;/p&gt;
&lt;p&gt;Anyway, I think carrying this out is going to take another high-level look at the code.&lt;/p&gt;
&lt;p&gt;Which is going to happen tomorrow, not tonight, because I am &lt;em&gt;exhausted&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2021-09-18</title><link href="https://mwchase.neocities.org/diary-2021-09-18" rel="alternate"></link><published>2021-09-18T04:00:00-04:00</published><updated>2021-09-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-09-18:/diary-2021-09-18</id><summary type="html">&lt;p class="first last"&gt;Remember when I worked on stuff besides tooling for the stuff I want to be working on?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I thought I was going to have a chance to work on the hook for Korín, or put the notes I've been taking on MOTR into practice, but I guess I was too busy relaxing and I let time get away from me.&lt;/p&gt;
&lt;p&gt;I'm really itching to get MOTR into a good enough state that I feel comfortable using it for other projects, because I feel a bit like I've let, if not the perfect, at least the better*, be the enemy of the good here.
I think a good amount of sustained effort would get me there, but I don't know when I'll have the time to put all that effort in.&lt;/p&gt;
&lt;p&gt;*This judgement has to be understood in the context of my motrfile being an evolution of my noxfile template.
I prefer Nox to tox because I prefer Python to INI as a host language, but this loses me the potential for concurrency.
Now, Nox has a barrier to adding concurrency, in that it tries to provide streaming output.
&lt;em&gt;But&lt;/em&gt;, my pytest failures have a tendency to generate such monstrous spews of output that there's no point in reading them from the terminal.
So, MOTR sacrifices streaming output in order to obtain concurrency by default, without sacrificing quality of host language.
It also provides means of selecting tasks that make more sense to me than how Nox and tox handle it.&lt;/p&gt;
&lt;p&gt;(At some point after I stopped paying attention to tox, it introduced a &lt;tt class="docutils literal"&gt;dependency&lt;/tt&gt; field, which &lt;em&gt;enforces an ordering of all selected environments&lt;/em&gt;, which means you still need to know &lt;em&gt;which environments to select&lt;/em&gt;.
Also, I found I prefer to think of dependencies in terms of &lt;em&gt;what a task provides and needs&lt;/em&gt; rather than &amp;quot;do this before this because of reasons&amp;quot;.)&lt;/p&gt;
&lt;p&gt;Time will tell if I end up wanting some more expressive means of specifying targets.
My thinking, or rather hope, is that if just running everything is fast enough, then there's no need to get really fine-grained with the requirements.
Unfortunately, it's kind of hard to tell if there's any way to make the current code much faster, since if I profile the main thread, the vast majority of the runtime is spent polling IO-bound tasks.&lt;/p&gt;
&lt;p&gt;I guess I just need to put in the work to make this all work in general.&lt;/p&gt;
&lt;p&gt;Anyway, it's later than I though, and I don't want to put off sleeping any longer.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Worldbuilding — Korín, Sorín, and Arín 2021-09-17</title><link href="https://mwchase.neocities.org/worldbuilding-ksa-2021-09-17" rel="alternate"></link><published>2021-09-17T04:00:00-04:00</published><updated>2021-09-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-09-17:/worldbuilding-ksa-2021-09-17</id><summary type="html">&lt;p class="first last"&gt;Me: &amp;quot;Boy, some of these old poets were A Lot.&amp;quot; Also me: *rhymes &amp;quot;dedication&amp;quot; and &amp;quot;reconsecration&amp;quot;*&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Several stanzas later, and I'm starting to doubt my ability to come up with sentences in English.&lt;/p&gt;
&lt;p&gt;I wasn't paying attention to just how much I wrote, but it's both not much in terms of raw words, and decent progress along the outline.
The main thing that makes this kind of bittersweet is, I'm pretty sure I'm going to hate most of this when I finally get to my first editing pass.
Just going to be constantly, like, reading one line, and then covering the page with notes and correction marks.&lt;/p&gt;
&lt;p&gt;But yeah, it feels like doing that used up enough of my... writing... juice?... that I can't muster the mental acuity to actually describe what I did in any more detail.&lt;/p&gt;
&lt;p&gt;So, instead of a short post because I didn't put any effort towards the stuff I want to write about, it's a short post because I put in &lt;em&gt;a lot&lt;/em&gt; of effort (too much?), and I don't have any left.
I guess that's better?&lt;/p&gt;
&lt;p&gt;Anyway, my body is telling me to go to bed, and I'm going to listen.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Worldbuilding — Korín, Sorín, and Arín"></category></entry><entry><title>Worldbuilding — Korín, Sorín, and Arín 2021-09-16</title><link href="https://mwchase.neocities.org/worldbuilding-ksa-2021-09-16" rel="alternate"></link><published>2021-09-16T04:00:00-04:00</published><updated>2021-09-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-09-16:/worldbuilding-ksa-2021-09-16</id><summary type="html">&lt;p class="first last"&gt;I manage to psych myself into doing something by writing about how I don't know how to do it. Whatever works, right?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I want to take the hook from outline to actual poem.
And so, I just need to, like, &lt;em&gt;do it&lt;/em&gt;, right?
Just need to, make the thing, like, &lt;em&gt;happen&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;It's like I'm playing a text parser adventure game, and &lt;em&gt;I don't know the right verb&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I &lt;em&gt;hate&lt;/em&gt; this.&lt;/p&gt;
&lt;p&gt;I'm going to hope that the problem is with writing poetry in general, and that maybe I can get better at this process by trying to write something less ambitious to start with.
Smaller overall scope.&lt;/p&gt;
&lt;p&gt;Okay, actually researching &amp;quot;how do I write poems&amp;quot; helped a bit with the hook.
(I mean, English classes covered this some, but that was over a decade ago.)&lt;/p&gt;
&lt;p&gt;I'm, actually not totally sure what I'm doing with this first stanza.
Four lines, nine syllables each, ABAB rhyme scheme, and the stress is &lt;em&gt;mostly&lt;/em&gt; dactylic trimeter.
(Or maybe it's dactylic hexameter with internal rhymes?)
Whatever, if I can keep this up, I'm good.&lt;/p&gt;
&lt;p&gt;Okay, I've written, like, three and a half-ish stanzas, and I'm ready for a break.&lt;/p&gt;
&lt;p&gt;One thing I'm worried about is handling the transitions between scenes.
Maybe I need to jam another stanza in the middle of what I have so far?&lt;/p&gt;
&lt;p&gt;I'll have to work on it later, and do some other research.
For now, break.
I'm going to get ready for bed, and see what I can squeeze in around it.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Worldbuilding — Korín, Sorín, and Arín"></category></entry><entry><title>Worldbuilding — Korín, Sorín, and Arín 2021-09-15</title><link href="https://mwchase.neocities.org/worldbuilding-ksa-2021-09-15" rel="alternate"></link><published>2021-09-15T04:00:00-04:00</published><updated>2021-09-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-09-15:/worldbuilding-ksa-2021-09-15</id><summary type="html">&lt;p class="first last"&gt;The grand debut of a setting I've, um, already talked about.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I've got enough of a grasp on &amp;quot;things to direct worldbuilding for this setting&amp;quot; that now I'm comfortable with giving it a category.
The setting is called Korín, Sorín, and Arín, and those are the names I'm using for its analogues of the Earth, Moon, and Sun.&lt;/p&gt;
&lt;p&gt;To recap, I've been gradually developing the idea for this setting for a while.
The quote-unquote original point of all this was to provide a setting that would allow me to direct and contextualize the development of a conlang.
Which, um, oops, I'm &lt;em&gt;several&lt;/em&gt; yaks away from that at this point.
I do want to give that conlang its due at some point, but right now I want to work on the scaffolding of the setting.&lt;/p&gt;
&lt;p&gt;And the strategy that I'm taking to develop that scaffolding, is to try to worldbuild just enough for a barebones-feeling roleplaying setting, and then bootstrap it from there by learning to GM and running games in it.
And for that, I need:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;A hook that establishes some of the features of the setting, and hints at the kinds of things that a character could do, interact with, or fight with.&lt;/li&gt;
&lt;li&gt;A god's-eye view of the setting, establishing the basic details of stuff like &amp;quot;here are the continents you can do stuff on&amp;quot;.&lt;/li&gt;
&lt;li&gt;For each general category of playable character, a description of what they do, what they can look like.&lt;/li&gt;
&lt;li&gt;A &lt;em&gt;limited&lt;/em&gt; selection of places to play and general sketch of demographics.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is probably more than I &lt;em&gt;should&lt;/em&gt; be planning to do, but I've sunk so much of this cost already.&lt;/p&gt;
&lt;p&gt;Here's where I am so far:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The god's-eye view is &lt;em&gt;painfully&lt;/em&gt; dull prose right now.
It's too bad I'm not enjoying my own authorial voice there, because I'm the only person I could imagine liking this, and I... don't.&lt;/li&gt;
&lt;li&gt;I've outlined the hook, which is going to be my main focus for elaborating on setting details.
If I need it for the hook, it goes in.
If I don't need it for the hook, I'm going to try &lt;em&gt;really hard&lt;/em&gt; to put it on the backlog.&lt;/li&gt;
&lt;li&gt;I have notes on all of the character design guidelines, which I'll work on putting into a usable form once the hook is firmed up.&lt;/li&gt;
&lt;li&gt;I have notes that &lt;em&gt;could&lt;/em&gt; feed into the selection of places to play, but it would be best to focus my initial efforts there based on feedback from other people.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, I'm trying to remember if I forgot to do anything today, because I'm doing much better on time than I'm used to doing.
Unless I think of something and go &amp;quot;oh no!&amp;quot; I'm going to take some notes on MOTR after I publish this.&lt;/p&gt;
&lt;p&gt;It's a bit early now, as I said, but I'd rather take the win there, than try to wring more out of the next hour or so.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Worldbuilding — Korín, Sorín, and Arín"></category></entry><entry><title>Weekly Roundup 2021-09-14</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-09-14" rel="alternate"></link><published>2021-09-14T04:00:00-04:00</published><updated>2021-09-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-09-14:/weekly-roundup-2021-09-14</id><summary type="html">&lt;p class="first last"&gt;I don't want this to get me too far down, but I definitely shouldn't be hard on myself if I go that way...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I cut out functionality from MOTR, to make it easier to extend.&lt;/li&gt;
&lt;li&gt;Thursday: I made some improvements to MOTR. I don't think they were anything big.&lt;/li&gt;
&lt;li&gt;Friday: I made a little progress on worldbuilding.&lt;/li&gt;
&lt;li&gt;Saturday: I tried to figure out what kind of limits I wanted to put on magic in this setting.&lt;/li&gt;
&lt;li&gt;Sunday: I ran into deeply weird problems hacking on MOTR.&lt;/li&gt;
&lt;li&gt;Monday: I made some proper progress updating the motrfile, but I also took some time to identify a bunch of the problems I'd had with similar code in the past.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I don't know how much I'm really going to get done.
I found out some really heavy family news earlier today, and I don't know how I'm going to process it yet.
I think I'll do better focusing once I've got some plans nailed down, but for now, I'm going to take things easy.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2021-09-13</title><link href="https://mwchase.neocities.org/coding-2021-09-13" rel="alternate"></link><published>2021-09-13T04:00:00-04:00</published><updated>2021-09-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-09-13:/coding-2021-09-13</id><summary type="html">&lt;p class="first last"&gt;Doing code archeology to figure out how obscure the bugs I was hitting were.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, after I posted last night, I got the isolated environment of &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;pyproject-build&lt;/span&gt;&lt;/tt&gt; &lt;em&gt;probably&lt;/em&gt; working.
The next step is to allow the pip-related functionality to handle environment variables.
This is because I kind of don't trust the result of passing constraint files on the command line, even though it's &lt;em&gt;probably&lt;/em&gt; fine.
It's been a while since doing that bit me, and a lot has changed.
I think the bug I filed is still open, though.&lt;/p&gt;
&lt;p&gt;So, I'm passing in an environment, and that's getting processed by the &lt;tt class="docutils literal"&gt;cmd&lt;/tt&gt; function, which will handle &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; instances...
That means I can just hardcode the environment variables in a global dictionary for now.
When I was looking over one of my noxfiles to get environment-related data, I noticed that I'm also setting &lt;tt class="docutils literal"&gt;&amp;quot;PIP_NO_CACHE_DIR&amp;quot;: &amp;quot;YES&amp;quot;&lt;/tt&gt;.
My vague recollection is that this was to deal with local packages sometimes not updating, but it looks like that was maybe an sdist issue?
I certainly haven't encountered it using wheels, so I don't think I need it.
(The &amp;quot;specify it as an environment variable&amp;quot; thing may have &lt;em&gt;also&lt;/em&gt; been an artifact of using sdists?)
(Did I only need to use sdists because of some flit-related behavior that has since apparently changed?
&lt;a class="reference external" href="https://flit.readthedocs.io/en/latest/history.html#version-3-0"&gt;There we go, yes.&lt;/a&gt;
Okay, wait, I think I was using sdists &lt;em&gt;indirectly&lt;/em&gt;, because I was pointing pip at a directory rather than at a file?
Well, there are so many reasons not to want to go back to that.)&lt;/p&gt;
&lt;p&gt;Anyway, back to what I need to work on now.
I've somewhat solidified the classes I need for this to work, and now it's a question of tracking down the various usages and updating then to work with a &lt;tt class="docutils literal"&gt;SinglePythonPackage&lt;/tt&gt;, then writing an adaptor that dispatches over a &lt;tt class="docutils literal"&gt;MultiPythonPackage&lt;/tt&gt;, which is almost, but not quite, just a sequence of &lt;tt class="docutils literal"&gt;SinglePythonPackage&lt;/tt&gt;s.
I also need to generate the &lt;tt class="docutils literal"&gt;MultiPythonPackage&lt;/tt&gt; for the MOTR project.
That can be handled for now by just hardcoding a reference to the current directory.&lt;/p&gt;
&lt;p&gt;I don't know when I'll be up for working on that.
I kind of don't like working on this during the week, and I'm starting to make some real progress on the setting document.
Anyway, none of that's going to happen right now, because I need to wrap up and get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-09-12</title><link href="https://mwchase.neocities.org/coding-2021-09-12" rel="alternate"></link><published>2021-09-12T04:00:00-04:00</published><updated>2021-09-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-09-12:/coding-2021-09-12</id><summary type="html">&lt;p class="first last"&gt;This post was delayed thanks to: &lt;em&gt;something&lt;/em&gt; in my Neovim install or environment that jacked up the file recovery process somehow.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I made some improvements and changes to MOTR's motrfile.
&lt;em&gt;Unfortunately&lt;/em&gt;, I'm going to have to roll one of the changes back.
I &lt;em&gt;thought&lt;/em&gt; &amp;quot;Oh, I can just make MOTR require &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;pyproject-build&lt;/span&gt;&lt;/tt&gt; and not need a venv for that,&amp;quot; but &lt;em&gt;no&lt;/em&gt;.
It couldn't be that easy.
Somehow that causes the test environments to try to install &lt;em&gt;apparently every version of pytest&lt;/em&gt;.
This shouldn't be a problem for end users, but it means I can't run my own tests.&lt;/p&gt;
&lt;p&gt;That means I need to reintroduce the path field, and... let's see...
I don't feel like figuring out the right way to do the installation, so I'm just leaving it pretty much as-is for now.&lt;/p&gt;
&lt;p&gt;I also fixed up some type errors in the motrfile that weren't really affecting anything, but they made the output kind of obnoxious to read.&lt;/p&gt;
&lt;p&gt;The two big things I want to focus on are: putting together the files I need to to handle installing &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;pyproject-build&lt;/span&gt;&lt;/tt&gt; in an isolated environment, because apparently that's something I need to do, and getting the rest of the functions to work with a combination of requirements file and constraints file, instead of just requirements file.
Because I'm working on the &lt;tt class="docutils literal"&gt;Package&lt;/tt&gt; code in tandem with the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;pyproject-build&lt;/span&gt;&lt;/tt&gt; update, that'll get the code in the motrfile closer to ready for integration into MOTR.&lt;/p&gt;
&lt;p&gt;I'm about done for the night, so I'll get all the thinking for this done tomorrow.
For now, I should get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2021-09-11</title><link href="https://mwchase.neocities.org/diary-2021-09-11" rel="alternate"></link><published>2021-09-11T04:00:00-04:00</published><updated>2021-09-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-09-11:/diary-2021-09-11</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Most people can learn how to kill someone barehanded, but it's not really practical, so this doesn't change much.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Worldbuilding status: I'm trying to figure out how I want really widespread access to magic to have affected the setting.
There are basically a few knobs that I'm adjusting here:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Scope of effect (stuff like conjuring objects is generally out of reach)&lt;/li&gt;
&lt;li&gt;Range of effect (anything that's effectively an extension to reach or sensory range is rare or difficult)&lt;/li&gt;
&lt;li&gt;Availability of magic (technically, anyone can learn any kind of magic; if I locked this &lt;em&gt;all&lt;/em&gt; the way down, it would break some of the setting, so I guess I just took it all the way in the opposite direction)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What I basically want to get to is a scenario where the existence of magic has obvious, logical effects, but it's reasonable to apply high-level concepts from our own history to the broad strokes.&lt;/p&gt;
&lt;p&gt;I guess the sensible thing to do now is to try to work in the other direction, given a few of the other notes I've taken.&lt;/p&gt;
&lt;p&gt;The thing that always gets me worried about my worldbuilding efforts is, what if I come up with some stuff that has a particular logical consequence, but I miss that, and come up with something else that isn't compatible with that logical consequence.&lt;/p&gt;
&lt;p&gt;Maybe I just need to lighten up about that.
It's not like anyone can send me to &lt;a class="reference external" href="https://www.youtube.com/watch?v=X7LOoWdbSco"&gt;liar's jail&lt;/a&gt; over it.&lt;/p&gt;
&lt;p&gt;Anyway, I'm hoping to make some real progress on MOTR in the next few days.
See you then.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2021-09-10</title><link href="https://mwchase.neocities.org/diary-2021-09-10" rel="alternate"></link><published>2021-09-10T04:00:00-04:00</published><updated>2021-09-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-09-10:/diary-2021-09-10</id><summary type="html">&lt;p class="first last"&gt;I mean, it'd be weird to have Clydesdales without a Clydesdale.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Back to worldbuilding stuff.
I'm focusing on outlining a short, simple narrative that covers a bunch of the basic ideas I've worked out.
Unfortunately, the experience is so like pulling teeth that, after I wrote a paragraph-long outline, I'm now all &amp;quot;Okay, that's enough for now&amp;quot;.&lt;/p&gt;
&lt;p&gt;I wanted to come up with something else to say about this, but I'm feeling a little on-edge right now as a result of stuff I don't want to put in this entry.&lt;/p&gt;
&lt;p&gt;Anyway, besides that, I was considering some other aspects of the worldbuilding.
The setting has kind of a mythic-scale history that means I want to generally ignore anything but the broad strokes of its history beyond a few thousand years before the &amp;quot;present&amp;quot;.
I don't really feel value &lt;em&gt;for this setting&lt;/em&gt; in coming up with elaborate alternative flora and fauna, especially since humans are already a thing in the setting.
At the same time, I don't want to have very specific forms of animal, plant, (fungus?) showing up.
So, there are horses, but rather than having, say, Clydesdales show up, I want to have breeds based on the needs and aesthetics of regions in the setting.
All that said, I do think it would be worth having some animals and plants show up with no obvious Earth analogue, but &lt;em&gt;in general&lt;/em&gt;...&lt;/p&gt;
&lt;p&gt;Anyway, that's enough for now.
I'm going to wrap up and get to bed soon.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2021-09-09</title><link href="https://mwchase.neocities.org/coding-2021-09-09" rel="alternate"></link><published>2021-09-09T04:00:00-04:00</published><updated>2021-09-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-09-09:/coding-2021-09-09</id><summary type="html">&lt;p class="first last"&gt;It's kind of hard to read the output from the nameless-actions version of MOTR, but, like, oh well.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I just kind of poked at MOTR's code today.
I made some minor fixes to the dead code inside the motrfile, and slightly rearranged the imports in the main package.
I still need to decide how to rewrite those imports, but &amp;quot;divide imports into 'used at runtime' and 'only used in annotations'&amp;quot; feels like a start.&lt;/p&gt;
&lt;p&gt;The big thing I should work on is the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;pyproject-build&lt;/span&gt;&lt;/tt&gt; invocation class, and its support structure.
Once I work out how all of that should work together, I can transition to the &lt;tt class="docutils literal"&gt;Package&lt;/tt&gt; paradigm, and focus on bringing existing motrfile code into it.
Once that's done, I can move onto &lt;tt class="docutils literal"&gt;Platform&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;There's a chance I would have gotten more done with this if the fire alarm hadn't gone off for no good reason and around twenty minutes.&lt;/p&gt;
&lt;p&gt;Anyway, I think the thing to do is to take a break from coding for a few days, and really try to write stuff for the worldbuilding doc.&lt;/p&gt;
&lt;p&gt;I'm going to wrap up now and play Monster's Expedition for a bit.
That game is complicated, it's great.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-09-08</title><link href="https://mwchase.neocities.org/coding-2021-09-08" rel="alternate"></link><published>2021-09-08T04:00:00-04:00</published><updated>2021-09-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-09-08:/coding-2021-09-08</id><summary type="html">&lt;p class="first last"&gt;I have no idea what &lt;tt class="docutils literal"&gt;flit build&lt;/tt&gt; was doing when I had uncommitted work, but I extremely did not like it, and it makes me wonder if I can trust &lt;tt class="docutils literal"&gt;flit build&lt;/tt&gt; output in general during development. (Maybe it was because I wasn't bothering to pass &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--wheel&lt;/span&gt;&lt;/tt&gt;, so it was making the wheel from the sdist instead of directly? Eugh.)&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay.
I've updated MOTR and pushed a version that has some problems, but it works.
This also dragged along some half-finished and broken code in the motrfile, but it's dead code and this is pre-1.0, so I don't care too much about that yet.&lt;/p&gt;
&lt;p&gt;Basically, I've cut down on the external logging for now, in order to avoid naming the output files.
This is making the output kind of cluttered, but I can live with that for now, and work on writing pretty-printing code later.&lt;/p&gt;
&lt;p&gt;Working on the code like this made realize that there are a few areas I want to focus on:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;See if I can eliminate or cut down on imports that are only used in annotations.&lt;/li&gt;
&lt;li&gt;Rewrite the remaining imports in some fashion, because I'm finally not liking the whole &amp;quot;import everything by its full path&amp;quot; thing.&lt;/li&gt;
&lt;li&gt;Investigate passing &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt; objects into the &lt;tt class="docutils literal"&gt;cmd&lt;/tt&gt; function.
This would let me avoid some type system weirdness that I patched in in desperation.&lt;/li&gt;
&lt;li&gt;Define exactly what's supposed to be in the sdist.
&lt;tt class="docutils literal"&gt;flit build&lt;/tt&gt; gets nearly everything, and &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;pyproject-build&lt;/span&gt;&lt;/tt&gt; gets a pretty minimal set.
I think the thing to do is figure out how to build up what &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;pyproject-build&lt;/span&gt;&lt;/tt&gt; gets, and look into switching to it for general usage.
This makes sense since I want to use &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;pyproject-build&lt;/span&gt;&lt;/tt&gt; in the motrfile, so I might as well also use it in the publishing workflow.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I &lt;em&gt;should&lt;/em&gt; also be focusing more on the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;pyproject-build&lt;/span&gt;&lt;/tt&gt; &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt;, and writing code to deal with the &lt;tt class="docutils literal"&gt;Package&lt;/tt&gt; classes that are currently half-baked at best.
Anyway, I want to wind down now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2021-09-07</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-09-07" rel="alternate"></link><published>2021-09-07T04:00:00-04:00</published><updated>2021-09-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-09-07:/weekly-roundup-2021-09-07</id><summary type="html">&lt;p class="first last"&gt;A little bit slower work than I would have liked, but there was some stuff in there where I needed to be methodical.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I started working out the precise effects of wedging my existing project structure into MOTR's current workflow assumptions.&lt;/li&gt;
&lt;li&gt;Thursday: I found out that some of the optimizations I wanted to make, do not actually work, and there are documentation bugs against Python about how it should be more obvious that they don't work.&lt;/li&gt;
&lt;li&gt;Friday: I worked on worldbuilding, and by &amp;quot;worked on worldbuilding&amp;quot; I mean &amp;quot;wrestled with the documentation software to get the behavior I want&amp;quot;.&lt;/li&gt;
&lt;li&gt;Saturday: I worked on worldbuilding, and by &amp;quot;worked on worldbuilding&amp;quot; I mean &amp;quot;took some notes on how to make the presentation more interesting&amp;quot;.&lt;/li&gt;
&lt;li&gt;Sunday: I walked through my noxfile for another project, and took notes on what the internal logic would look like as a motrfile.&lt;/li&gt;
&lt;li&gt;Monday: I started trying to put some of my plans for MOTR into practice, noticed an issue that I'm having with it, and then ran into more issues trying to solve that issue.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I've got a plan for a good-enough approach to all of that, and we'll have to see how it shakes out in practice.
It'll take a bit of work to migrate over to the new system.
I also want to try and force myself to work on the worldbuilding a little, but we'll see how that goes.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2021-09-06</title><link href="https://mwchase.neocities.org/coding-2021-09-06" rel="alternate"></link><published>2021-09-06T04:00:00-04:00</published><updated>2021-09-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-09-06:/coding-2021-09-06</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;I cannot think of any problems with this. [shortly thereafter] I have found a problem.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Doing time.
Wait, no...
Eh.&lt;/p&gt;
&lt;p&gt;Anyway, I started adding the basic types that I determined I'll need.
Then I added a utility function that I'll definitely want to put into the MOTR app sooner than later.
But that utility function raised a question for me that I want to look into sooner than later:&lt;/p&gt;
&lt;p&gt;Since I'm using attr's dataclasses to define all of my &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt; implementations, is it worth coming up with a separate name like I am currently?
When it comes to reporting them, can I get by with some form of pretty-printing?&lt;/p&gt;
&lt;p&gt;Looking into the first question...&lt;/p&gt;
&lt;p&gt;Popping open &lt;tt class="docutils literal"&gt;motr.core.registry&lt;/tt&gt;...&lt;/p&gt;
&lt;p&gt;The main things that would need to change are the &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt; class in there would stop existing, as well as the &lt;tt class="docutils literal"&gt;ActionName&lt;/tt&gt; class.
This changes the following attributes and methods on &lt;tt class="docutils literal"&gt;Registry&lt;/tt&gt;:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;_actions&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;_parent_action&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;_last_added&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;action()&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;inputs()&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;parent()&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;Some of the methods used to handle dispatch from &lt;tt class="docutils literal"&gt;require()&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I think the thing to do is just to try it, because I'm not seeing all of the consequences, and I've got source control.&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;log_dir = self.target.log_dir / self.action_name&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Ah.
Right.&lt;/p&gt;
&lt;p&gt;I'm going to need to think about the best way to deal with that.
I'll just leave this as-is for tonight, and see if I come up with anything in the next week.
(I mean, I suppose if I'm lazy, I could use the id and just include that in the output, but that's &lt;em&gt;really&lt;/em&gt; lazy...)&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to wind down now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-09-05</title><link href="https://mwchase.neocities.org/coding-2021-09-05" rel="alternate"></link><published>2021-09-05T04:00:00-04:00</published><updated>2021-09-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-09-05:/coding-2021-09-05</id><summary type="html">&lt;p class="first last"&gt;This does involve a bunch more I/O than the noxfile, but I don't think it's a perceptible difference.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Planning time.&lt;/p&gt;
&lt;p&gt;All right, let's trace the data flows that the current interface to MOTR would require for some of my other noxfiles.&lt;/p&gt;
&lt;p&gt;The first thing it all needs is to gather the package information.
Let's gloss over that.&lt;/p&gt;
&lt;p&gt;So...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Given all of the package roots, build the packages, and write a constraint and per-package requirements files.&lt;/li&gt;
&lt;li&gt;The noxfile I'm looking at also has constraints on third-party packages, so that needs to factor into the constraints somehow.
Could just read a separate file in, or have handling for any number of constraint files.&lt;/li&gt;
&lt;li&gt;Running &lt;tt class="docutils literal"&gt;coverage erase&lt;/tt&gt; doesn't need any package data.&lt;/li&gt;
&lt;li&gt;Running &lt;tt class="docutils literal"&gt;flake8&lt;/tt&gt; requires the command-line to take into account whether or not there's a src directory, so &lt;strong&gt;the package root data needs to specify whether there is a src directory&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Running &lt;tt class="docutils literal"&gt;mypy&lt;/tt&gt; needs the same information.&lt;/li&gt;
&lt;li&gt;Running &lt;tt class="docutils literal"&gt;pytest&lt;/tt&gt; needs to optionally pass additional environment variables based on the package root.&lt;/li&gt;
&lt;li&gt;Running &lt;tt class="docutils literal"&gt;pytest&lt;/tt&gt; &lt;em&gt;under&lt;/em&gt; &lt;tt class="docutils literal"&gt;coverage&lt;/tt&gt; requires a custom configuration file generated from the requirements file.
(The package name has to be processed into an importable module name.)
(Also, the coverage needs to be recorded in a unique data file; I'd say, slugify the package root.)&lt;/li&gt;
&lt;li&gt;One thing I need to keep in mind for actually processing the coverage output is not this data flow, but being able to optionally plug in &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;limit-coverage&lt;/span&gt;&lt;/tt&gt;.
The thing &lt;em&gt;about this data flow&lt;/em&gt;, which I forgot at first, is that &lt;tt class="docutils literal"&gt;coverage combine&lt;/tt&gt; is going to need its own coveragerc, deriving paths directives from the package root, whether there is a src directory, and the module name.&lt;/li&gt;
&lt;li&gt;The next session is about building an executable with &lt;tt class="docutils literal"&gt;shiv&lt;/tt&gt;.
I think the only portable way to accomplish this is to extract the entry point data from the wheel, specifically the &lt;tt class="docutils literal"&gt;console_scripts&lt;/tt&gt; section.
This means that the specific command lines being generated will have to be done at run time instead of graph time.&lt;/li&gt;
&lt;li&gt;Running the profiler doesn't need anything extra here...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, we have:
- the package roots
- whether they use src
- the paths to each requirements file
- the requirements file provides access to the package names&lt;/p&gt;
&lt;p&gt;(The constraints file is also required to get the path to the wheel file for shiv.)&lt;/p&gt;
&lt;p&gt;For some aesthetics purposes, I kind of want to divide the package roots into the common and unique parts.
So the data structure looks something like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;common prefix&lt;/li&gt;
&lt;li&gt;unique suffix&lt;/li&gt;
&lt;li&gt;src bool&lt;/li&gt;
&lt;li&gt;generated path to requirements file, as an &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My inclination is to first have the common prefix be empty, and then process all of the instances together at once to get the common prefix as long as possible.
This could also be accomplished by having two distinct data types.&lt;/p&gt;
&lt;p&gt;I'll have to work on this tomorrow.
For now, I'm just glad to have worked through this analysis.
From this, I can properly write the functions I need.&lt;/p&gt;
&lt;p&gt;But at the moment, I just want to be ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2021-09-04</title><link href="https://mwchase.neocities.org/diary-2021-09-04" rel="alternate"></link><published>2021-09-04T04:00:00-04:00</published><updated>2021-09-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-09-04:/diary-2021-09-04</id><summary type="html">&lt;p class="first last"&gt;After this entry was mostly written, I began to fail to avoid grappling with technology.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I somehow managed to avoid grappling with technology today.&lt;/p&gt;
&lt;p&gt;Instead, I wrote some notes about the direction I want to take the worldbuilding after I discussed it some with my wife last night.&lt;/p&gt;
&lt;p&gt;Basically, I want the first thing the reader sees to be a song about the end of a war.&lt;/p&gt;
&lt;p&gt;I'm not really in a good shape to explain any of this, so instead I'll just note that I'm really out-of-practice with writing, somehow, after writing that giant post a month ago.
So I need to work on reminding myself how to just write stuff.&lt;/p&gt;
&lt;p&gt;Post is late anyway, might as well be late and short.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2021-09-03</title><link href="https://mwchase.neocities.org/diary-2021-09-03" rel="alternate"></link><published>2021-09-03T04:00:00-04:00</published><updated>2021-09-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-09-03:/diary-2021-09-03</id><summary type="html">&lt;p class="first last"&gt;It would seem that I have engaged in some pro ... crastination.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've been working on worldbuilding some more.
Maybe I'll put posts about it somewhere proper on this blog when I've gotten beyond a massively disorganized rough draft.&lt;/p&gt;
&lt;p&gt;This is what I've been working on, but I'm not exactly sure what to say about it.
The basic &amp;quot;organization&amp;quot; I have right now is a &lt;a class="reference external" href="https://www.sphinx-doc.org/"&gt;Sphinx&lt;/a&gt; project that has minimal drafts for a few areas, and a bunch of extensive notes that are extremely disorganized, both internally, and in terms of where they are in my home directory.&lt;/p&gt;
&lt;p&gt;I ended up not getting too far, but I did wrestle a bunch with Sphinx's directives.
I &lt;em&gt;think&lt;/em&gt; I've got what I need to make night mode work properly with the illustrations I want to add, without requiring a server to be spun up, but it's kind of inconvenient to write.
I suspect there's a less cumbersome way to do what I'm doing, but I'm not sure what it is, and I'd like to focus on content for now.&lt;/p&gt;
&lt;p&gt;Anyway.
Late.
Sleepy.
Ending post now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2021-09-02</title><link href="https://mwchase.neocities.org/coding-2021-09-02" rel="alternate"></link><published>2021-09-02T04:00:00-04:00</published><updated>2021-09-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-09-02:/coding-2021-09-02</id><summary type="html">&lt;p class="first last"&gt;A stripped-down, simple core, surrounded by a dozen layers of weird adaptors...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I tried to put the stuff I was talking about yesterday into practice, and it didn't work out.
I think it needs more planning, so I'll once again wait until the weekend.&lt;/p&gt;
&lt;p&gt;The main thing I found out is that &amp;quot;passing &lt;tt class="docutils literal"&gt;IO&lt;/tt&gt; objects into &lt;tt class="docutils literal"&gt;subprocess.run&lt;/tt&gt;&amp;quot; doesn't work, so it's probably not worth trying to do that up-front.&lt;/p&gt;
&lt;p&gt;I started roughing out the pyproject-build and &lt;tt class="docutils literal"&gt;Package&lt;/tt&gt; stuff, and it ended up as a big mess because I didn't plan it properly.&lt;/p&gt;
&lt;p&gt;I'm thinking about the kind of stuff that needs to happen for each phase, and it's pretty confusing.&lt;/p&gt;
&lt;p&gt;At the &lt;em&gt;top level&lt;/em&gt;, it needs a generator that takes an output directory and some kind of aggregated structure combining paths to use.
The return value needs to be an aggregated data structure that associates to the existing data, objects that can be passed into the pip functions to consume the output files created by the action.&lt;/p&gt;
&lt;p&gt;Looking over some of the files I want to put together, I see that it needs the full path as well, but also it needs, say it with me, data that isn't available at graph generation time.
As such, I'm going to end up leaning &lt;em&gt;even more&lt;/em&gt; on generating input files for some of this.
This is... probably fine.&lt;/p&gt;
&lt;p&gt;I think I'm going to have to set up some kind of shared object that has this information and asynchronous communication stuff set up.
Either that, or defined channels associated with the different actions.
I suppose I could kind of cheat and just read some stuff from the files that I'm writing.
Just be like, okay, we &lt;em&gt;know&lt;/em&gt; that this &lt;tt class="docutils literal"&gt;requirements.txt&lt;/tt&gt; file just contains a single project name, so just, like, interpolate that in.&lt;/p&gt;
&lt;p&gt;Eesh, this is going to be so brittle.
I guess I just need really thorough tests.&lt;/p&gt;
&lt;p&gt;And some really thorough planning so I know which steps need what information and what they'll have to do with it...&lt;/p&gt;
&lt;p&gt;This entry went late, so I'm just cutting it off here.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-09-01</title><link href="https://mwchase.neocities.org/coding-2021-09-01" rel="alternate"></link><published>2021-09-01T04:00:00-04:00</published><updated>2021-09-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-09-01:/coding-2021-09-01</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;That simplifies things in a complicated way.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, here's the deal.
I want to work on pulling code from the motrfile into MOTR proper, and part of that is going to be developing two interfaces that the current behavior doesn't need, so this is going to be, a little interesting.
I've talked about these before, but I figure I'll try to just run through them quickly from first-ish principles.&lt;/p&gt;
&lt;p&gt;Let's call these interfaces &lt;tt class="docutils literal"&gt;Package&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Platform&lt;/tt&gt;.
A given repository provides one or more packages, which can run on one or more platforms.
A package is a pip-installable library.
A platform is a particular version of Python running on a particular host system.
This can mean different versions of CPython, or PyPy, Brython, Pyodide, maybe Nuitka, etc.&lt;/p&gt;
&lt;p&gt;Different steps in the Action graph can target different combinations of platforms, but the overall graph should generally work on a consistent set of packages, so we essentially want some way to combine &amp;quot;two functions that convert a set of packages to a sequence of graph operations&amp;quot; into &amp;quot;one function that converts a set of packages to a sequence of graph operations&amp;quot;.&lt;/p&gt;
&lt;p&gt;I'd been considering special-casing the &amp;quot;one-package&amp;quot; case, but it's probably less effort to start with to do the following:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Generate a list of package &amp;quot;roots&amp;quot; (at graph creation time).
These &amp;quot;roots&amp;quot; are the directory that contains the pyproject.toml file.&lt;/li&gt;
&lt;li&gt;From this, pass each project root into &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;pyproject-build&lt;/span&gt;&lt;/tt&gt;, and from that, extract a path and a package name.&lt;/li&gt;
&lt;li&gt;We now have a list of package names, and if I avoid special-casing, then I can just always use that name for the &amp;quot;suffix&amp;quot; purpose.&lt;/li&gt;
&lt;li&gt;From the paths, I generate a constraint file.
This is an output, and it's passed as an input to &lt;tt class="docutils literal"&gt;pip install&lt;/tt&gt; commands, via the constraints &lt;em&gt;environment variable&lt;/em&gt;.
It should be accompanied by one of the names from the list of names.
Which means that list needs to be constructed at graph creation time.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is... a little vexing.
I can avoid relying on the actual name by constructing a requirements.txt file associated with the path to the root for each package.
So, fundamentally, at graph time we're &lt;em&gt;always&lt;/em&gt; working with a path-to-the-root, and only when the graph is executed do we construct the mapping from those paths to the actual packages.&lt;/p&gt;
&lt;p&gt;So, if the &lt;tt class="docutils literal"&gt;Package&lt;/tt&gt; class is only relevant at graph time, then the only information it &lt;em&gt;can&lt;/em&gt; use is path-to-the-root.
That simplifies things in a complicated way.&lt;/p&gt;
&lt;p&gt;Taking it from the top:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Generate a list of roots&lt;/li&gt;
&lt;li&gt;Have a custom action that takes in the list of roots; its helper should produce a constraints file and a mapping from roots to requirements files&lt;/li&gt;
&lt;li&gt;We want to combine these with actions that take multiple roots to create output; to avoid duplicated code, actions should take a single root and requirements file, and there should be a library function to map over these.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(It also occurs to me that I'll probably not be able to rely on any of this for RPython projects, that is, projects using PyPy for Python 2.7.)&lt;/p&gt;
&lt;p&gt;So, the two ways to take multiple packages are, either to dispatch to a function that takes single packages, or to discard the package information entirely, and dispatch a single call to a function that takes no packages.&lt;/p&gt;
&lt;p&gt;Let's see how tasks relate...&lt;/p&gt;
&lt;p&gt;I should switch to requirements + constraints ASAP, and hardcode the root list for now.&lt;/p&gt;
&lt;p&gt;I should replace the &lt;tt class="docutils literal"&gt;Flit&lt;/tt&gt; action with a &lt;tt class="docutils literal"&gt;PyprojectBuild&lt;/tt&gt; action, but maintain the current behavior on the filesystem for the moment.&lt;/p&gt;
&lt;p&gt;At some point I need to rewrite the &lt;tt class="docutils literal"&gt;Pip&lt;/tt&gt; class, but it needs to take an optional root argument, potentially with an associated suffix.&lt;/p&gt;
&lt;p&gt;It may make sense to divide the &lt;tt class="docutils literal"&gt;Pip&lt;/tt&gt; class into a &amp;quot;package&amp;quot; version and a &amp;quot;no-package&amp;quot; version.
That's an open question right now.&lt;/p&gt;
&lt;p&gt;(Because every stage of the pip setup needs to at least know the suffix, then the package information is effectively part of the class, and doesn't need to be passed along with the requirements needed for the associated action.)&lt;/p&gt;
&lt;p&gt;I'm going to need to take some time to work through all of the implications of this, but not right now.
Right now, I need to get ready for bed, &lt;em&gt;maybe&lt;/em&gt; do some writing.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2021-08-31</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-08-31" rel="alternate"></link><published>2021-08-31T04:00:00-04:00</published><updated>2021-08-31T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-08-31:/weekly-roundup-2021-08-31</id><summary type="html">&lt;p class="first last"&gt;This felt vaguely dissatisfying, but I can't really pin down anything to do differently...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I got back to work on MOTR. I come up with some ideas for streamlining the workflows I'm developing.&lt;/li&gt;
&lt;li&gt;Thursday: I reached full test coverage for MOTR, and published another version.&lt;/li&gt;
&lt;li&gt;Friday: I thought about how I want to handle some issues with a worldbuilding project.&lt;/li&gt;
&lt;li&gt;Saturday: I found some improvements I could make to the current workflows I'm prototyping in MOTR, but I didn't try them out yet.&lt;/li&gt;
&lt;li&gt;Sunday: I got sidetracked from working on the worldbuilding and ended up working on basically unimportant technical issues. I tried to pivot from those into future work on MOTR, but... eh...&lt;/li&gt;
&lt;li&gt;Monday: I complained about how my initial setting document draft was so boring, even I can't get through it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to just accept that the beginning of the setting document is a clunker, and try to work on the later parts.
I also need to properly prioritize the stuff I want to work on for MOTR.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Diary 2021-08-30</title><link href="https://mwchase.neocities.org/diary-2021-08-30" rel="alternate"></link><published>2021-08-30T04:00:00-04:00</published><updated>2021-08-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-08-30:/diary-2021-08-30</id><summary type="html">&lt;p class="first last"&gt;Being forced to confront the fact that sometimes my creative output is super boring.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I started writing up the setting document for the worldbuilding.
The first thing I worked on was a short explanation of a few basic facts about the world.&lt;/p&gt;
&lt;p&gt;You know how, sometimes you're writing something, and you get feedback about needing to cut part of it, and maybe you get kind of offended?
Like, come on, it's not that wordy!
People should be grateful to read my words!&lt;/p&gt;
&lt;p&gt;That's not happening here.
It's less than 400 words, and it needs some serious work, because the current version is &lt;em&gt;painfully&lt;/em&gt; dry and boring.
And that's not me grudgingly accepting feedback from someone else.
That's me reading over what I wrote, and nearly falling asleep.&lt;/p&gt;
&lt;p&gt;It's possible that some illustrations could salvage it.&lt;/p&gt;
&lt;p&gt;I'll have to try to come at this from multiple angles to fix it up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2021-08-29</title><link href="https://mwchase.neocities.org/diary-2021-08-29" rel="alternate"></link><published>2021-08-29T04:00:00-04:00</published><updated>2021-08-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-08-29:/diary-2021-08-29</id><summary type="html">&lt;p class="first last"&gt;Time management? What's that?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, uh, funny story.
I made a &lt;em&gt;little&lt;/em&gt; progress on MOTR today, and I may or may not have judged enough SoME1 entries; I'll try to get a few more tomorrow to be sure.
I thought I was going to work on the worldbuilding that I mentioned, for a setting tentatively called Korín, but, um...&lt;/p&gt;
&lt;p&gt;&amp;quot;Hey, I write these blog posts in reStructuredText, and it works out pretty well.
Why don't I write up the worldbuilding using Sphinx instead of just haphazardly jammed into a text file?
... Okay, I've got the basics set up, but, oh yeah, sphinx-quickstart generates makefiles.
And my kneejerk reaction to makefiles is to rewrite them in Python.
Just like I did for the blog.
Welp, I guess I'm doing this.&amp;quot;&lt;/p&gt;
&lt;p&gt;I used &lt;a class="reference external" href="https://www.pyinvoke.org/"&gt;Invoke&lt;/a&gt; instead of MOTR, because Invoke is pretty much always going to be superior to MOTR for replacing Sphinx's makefiles.
(No concurrency machinery, not &lt;em&gt;required&lt;/em&gt; to use dependency specification...)
I mean, unless I created a MOTR builder &lt;em&gt;specifically&lt;/em&gt; to replicate the functionality (which... wouldn't be a terrible thing for me to have around), and even then, there'd be some minor differences.
Anyway, bashing it together with Invoke is quicker for now, but, on reflection, putting this functionality into MOTR might be good as a proof-of-concept/evaluation of the idea of writing high-level code into the app library.
(Plus, I'm going to need a more targeted sphinx-build wrapper later &lt;em&gt;anyway&lt;/em&gt;...)
(Actually, it wouldn't really work that well, because of the concurrency.
MOTR doesn't print command output to its standard output or standard error streams, so it's not really convenient to get information out of these command-line runs.
I judged this to be an acceptable tradeoff for the case of &amp;quot;running as many things at the same time as my computer allows&amp;quot;, but running sphinx-build is... not that.)&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Anyway&lt;/em&gt;, now it's closing in on 11 PM and I'm going &amp;quot;Oh, yeah, I need an outline.&amp;quot;&lt;/p&gt;
&lt;p&gt;So, um, I guess I'm signing off for now and working on that outline.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2021-08-28</title><link href="https://mwchase.neocities.org/coding-2021-08-28" rel="alternate"></link><published>2021-08-28T04:00:00-04:00</published><updated>2021-08-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-08-28:/coding-2021-08-28</id><summary type="html">&lt;p class="first last"&gt;At some point I should come up with a system for archiving or culling old runs, if I'm going to be shoving this much &lt;em&gt;stuff&lt;/em&gt; in the folders...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I just tried out &lt;a class="reference external" href="https://pypa-build.readthedocs.io/"&gt;build&lt;/a&gt; manually, and it looks much better for slotting into the automated workflows for MOTR than &lt;tt class="docutils literal"&gt;flit build&lt;/tt&gt; is.
Besides the fact that it works with any PEP-517-compatible backend (not just flit), there's also the fact that it supports passing input and output directories.
Neither directory is strictly necessary (and flit more-or-less supports the former, I think), but they are convenient.&lt;/p&gt;
&lt;p&gt;I need to figure out how best to do all of this, but I think it would be helpful to isolate the task-runner builds from the &amp;quot;manual&amp;quot; builds.&lt;/p&gt;
&lt;p&gt;Unfortunately, I had a bunch of stuff I had to do today, so I'm mostly just setting this aside for tomorrow.&lt;/p&gt;
&lt;p&gt;Thinking about this is also giving me a few other ideas for changes, like having the ability to express &amp;quot;a path relative to the current run's log directory&amp;quot; in the definition of an &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt;.
This would allow me to get better isolation between runs.
And also, would provide, potentially, a nicer setup for reports than what I have currently.&lt;/p&gt;
&lt;p&gt;I'll have to sleep on this, and I'll get right on that.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2021-08-27</title><link href="https://mwchase.neocities.org/diary-2021-08-27" rel="alternate"></link><published>2021-08-27T04:00:00-04:00</published><updated>2021-08-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-08-27:/diary-2021-08-27</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;But what &lt;em&gt;really&lt;/em&gt; happened?&amp;quot; &amp;quot;Well, I started typing...&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, so, I forgot there was a judging period for SoME1, which gives me an excellent excuse/reason to not touch the entries for the next week or so.
It's only fair.&lt;/p&gt;
&lt;p&gt;Anyway, while I take a break from coding (but not enough of a break that I haven't been researching stuff; I've decided to try replacing &lt;a class="reference external" href="https://flit.readthedocs.io/"&gt;Flit&lt;/a&gt; with &lt;a class="reference external" href="https://pypa-build.readthedocs.io/"&gt;build&lt;/a&gt; to see what happens; if it works, I get every compliant builder &amp;quot;for free&amp;quot;), I'm trying to work on a worldbuilding project.
I forget if I've talked about it in much detail before, but I was all like &amp;quot;here's something I could try doing with a language ... oh no, I have sketched out an entire cosmology and history, albeit in extremely broad strokes, to contextualize this language that I have barely worked on&amp;quot;.
I don't &lt;em&gt;begrudge&lt;/em&gt; all of that for existing, but I'm sensing one of the failure modes I've noticed before in my world-building attempts: focusing on particular areas out of a sense of &amp;quot;obligation&amp;quot; to &amp;quot;shore up&amp;quot; some other part.&lt;/p&gt;
&lt;p&gt;The solution I want to try for dealing with that is to give up control over the focus, by turning what I have now into a very bare-bones RPG setting, and run games in it.
(I'm also trying to find good phonaesthetics for some naming languages, because those should at least take less effort than something fully developed.)
In any case, the next big step I want to take toward that is to put together a setting reference based on the stuff I have currently.
And one of the things I want to have for that is...&lt;/p&gt;
&lt;p&gt;Okay, this is going to take a little explanation.
One idea that I've wanted to apply to a bunch of these attempts at fantasy worldbuilding is not in the worldbuilding itself, but in the presentation.
I'm not sure how to articulate my feelings about the concept of &amp;quot;canon&amp;quot;, but I want to avoid writing stories that present themselves as &amp;quot;this is what &lt;em&gt;definitely actually happened&lt;/em&gt; [in this world that doesn't exist]&amp;quot;.
And I want to achieve this by relying on in-setting authors, unreliable narrators, etc.
And I want this to be reflected in the stories that the setting document supports.&lt;/p&gt;
&lt;p&gt;In practice, I suppose that works out to, among other things, &amp;quot;Well, the dragons did X, Y, and Z &lt;em&gt;in the game&lt;/em&gt;, but that wouldn't happen in 'grounded' stories&amp;quot;&lt;/p&gt;
&lt;p&gt;And to support that, I need some way of augmenting the &amp;quot;grounded&amp;quot; presentation with stuff like &amp;quot;the following simplifications are acceptable in such and such circumstances&amp;quot; or &amp;quot;similar technology takes this more fanciful form in more fanciful settings, and is available sooner&amp;quot;.
And, similarly, if I get to the point of describing possible personal names (which the initial draft of the document &lt;em&gt;will not do&lt;/em&gt;), I'd maybe like to be able to present some spectrum between &amp;quot;just roll on this table to get going&amp;quot;, &amp;quot;here are the phonological constraints on names, to varying degrees of detail&amp;quot;, and maybe &amp;quot;here are the kinds of things the names can &lt;em&gt;mean&lt;/em&gt;, if those sound on the nose, then turn to such-and-such chart to de-Englishify them&amp;quot;.&lt;/p&gt;
&lt;p&gt;Anyway, I need to really think about all of this, but I figured I'd write down what I want to be thinking &lt;em&gt;about&lt;/em&gt;, in order to have a post.
I want to get to bed now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2021-08-26</title><link href="https://mwchase.neocities.org/coding-2021-08-26" rel="alternate"></link><published>2021-08-26T04:00:00-04:00</published><updated>2021-08-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-08-26:/coding-2021-08-26</id><summary type="html">&lt;p class="first last"&gt;So much green...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hah, yes!
Full test coverage, and a few minor bugfixes thanks to those thorough tests.
I've published version 0.1.2 of MOTR, and it's much nicer in a bunch of little ways that don't really fit into &amp;quot;features&amp;quot; per se.&lt;/p&gt;
&lt;p&gt;(I removed an errant newline from the output, and did the previously-mentioned reliability improvements.)&lt;/p&gt;
&lt;p&gt;There are two basic directions to go from here:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Refactor and improve the code&lt;/li&gt;
&lt;li&gt;Revisit my ideas about organization, with an eye towards using limit-coverage.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'll need both before I'm comfortable releasing 1.0.
The refactorings are probably easier, but getting limit-coverage set up is really appealing to me, because it's needed for the mutation testing paradigm that I want to support.&lt;/p&gt;
&lt;p&gt;Here's a thought: maybe if I got the documentation together, I'd have a better idea of how I want to organize the code.
So, I need to do some of the improvements (like exposing the &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; type in the &lt;tt class="docutils literal"&gt;api&lt;/tt&gt; module so that you can &lt;em&gt;actually call a bunch of the functions that the module exposes&lt;/em&gt;) so that the code that I'm documenting is closer to how I want the code to end up.&lt;/p&gt;
&lt;p&gt;Getting documentation soon is good, but I'd like to first try to move code out of the config file and into the application.
That'll allow me to prototype stuff like a high-level &lt;tt class="docutils literal"&gt;Sphinx&lt;/tt&gt; action without the motrfile ending up hopelessly cluttered.&lt;/p&gt;
&lt;p&gt;So, the best course of action is probably:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Add some of the features that would make the high-level &lt;tt class="docutils literal"&gt;Flit&lt;/tt&gt; action more straightforward&lt;/li&gt;
&lt;li&gt;Add the features that I need for my other project layouts&lt;/li&gt;
&lt;li&gt;Adapt the existing high-level code to work with those features&lt;/li&gt;
&lt;li&gt;Start pulling stuff into the application, starting with the &lt;tt class="docutils literal"&gt;Pip&lt;/tt&gt; high-level feature.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This should get me into a state where I can start collapsing the configuration file into a few dozen lines.&lt;/p&gt;
&lt;p&gt;Something else I ought to look into is supporting other build backends.
I think supporting poetry, enscons, and setuptools in addition to Flit would get me most of the way there.
I kind of need to think about each one separately because I need to know where to look for the wheel that it builds.&lt;/p&gt;
&lt;p&gt;Anyway, I think I'll take a bit of a break before getting to work on that.
I'm happy with where I've gotten this so far, but I want to come back to it a little fresher.
For now, I really need to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-08-25</title><link href="https://mwchase.neocities.org/coding-2021-08-25" rel="alternate"></link><published>2021-08-25T04:00:00-04:00</published><updated>2021-08-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-08-25:/coding-2021-08-25</id><summary type="html">&lt;p class="first last"&gt;Some of these tests would have come in handy &lt;em&gt;before&lt;/em&gt; I published version 0.1.0.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;It's good to be back on this.
I did some work on MOTR after I published the Missable Mysteries, because, while those posts took like a month to write, I wasn't working on them &lt;em&gt;the day of&lt;/em&gt;, so I had some free time.
At first, I was focused on iterating on the fixes for replacing &lt;tt class="docutils literal"&gt;pip install .&lt;/tt&gt; with &lt;tt class="docutils literal"&gt;flit build &amp;amp;&amp;amp; pip install &amp;lt;SOMETHING&amp;gt;&lt;/tt&gt;.
That &amp;quot;something&amp;quot; is currently much more straightforward than what I was originally planning, but there are a few changes that can take it further:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Separate the &lt;tt class="docutils literal"&gt;Cmd&lt;/tt&gt; class into a specialized version that takes byte buffers, and a wrapper around that that exposes the general interface.&lt;/li&gt;
&lt;li&gt;With this, I can delegate to the &lt;em&gt;specialized&lt;/em&gt; class instead of the &lt;em&gt;general&lt;/em&gt; one, which will allow me to get the output from &lt;tt class="docutils literal"&gt;flit build&lt;/tt&gt; without relying on the knowledge of where the general class writes its output.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For now, I'm working on increasing the coverage.
Once I get it all the way up, I'll feel comfortable making more changes to the code, such as:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Factoring some repeated code into functions&lt;/li&gt;
&lt;li&gt;Exposing types in the API module that arguably should have been there all along.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There's just a few lines left to cover, so I should be able to get on that soon.
I'll publish a new version first, just to have a version with a non-broken config file, then work on those changes, then start working on some of the interfaces I've been wanting to add for a while.&lt;/p&gt;
&lt;p&gt;Anyway, it's getting way late again, so I should wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2021-08-24</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-08-24" rel="alternate"></link><published>2021-08-24T04:00:00-04:00</published><updated>2021-08-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-08-24:/weekly-roundup-2021-08-24</id><summary type="html">&lt;p class="first last"&gt;I think part of the problem here was that I was freaking out about the SoME1 deadline. Hopefully I'll be able to handle this better with future installments.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I attempted to tease the secret project (discussed below).&lt;/li&gt;
&lt;li&gt;Thursday: I was getting to be &lt;em&gt;done&lt;/em&gt; with the week, which is a little awkward given that I write these the day before they're &amp;quot;officially&amp;quot; published, so this was on a Wednesday night.&lt;/li&gt;
&lt;li&gt;Friday: I started on a final editing pass for the &amp;quot;secret project&amp;quot;, and somehow was so out-of-practice editing that I minorly injured myself.&lt;/li&gt;
&lt;li&gt;Saturday: I finished that editing pass, and then did another one, because I apparently noticed a completely different set of issues than I did the night before?&lt;/li&gt;
&lt;li&gt;Sunday: I introduced a new series of higher-effort blog posts. These &lt;em&gt;might&lt;/em&gt; come out as often as once a month.&lt;/li&gt;
&lt;li&gt;Monday: I posted the first proper entry. It may get revised a bit sometime soon, since it was kind of rushed out after a month of work.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to take a break from thinking &lt;em&gt;too&lt;/em&gt; hard about the Missable Mysteries.
Here's what I'm hoping to do:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Improve test coverage on MOTR&lt;/li&gt;
&lt;li&gt;Make some tweaks to the code once I have improved coverage&lt;/li&gt;
&lt;li&gt;Cut a new release where the main advancement is really just that the motrfile in the source distribution consistently works on more than zero machines&lt;/li&gt;
&lt;li&gt;Do some worldbuilding of some nature&lt;/li&gt;
&lt;li&gt;Plan the overall trajectory for the Missable Mysteries a little better&lt;/li&gt;
&lt;/ul&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Missable Mysteries of Mathematics 2021-08-23 (Group Theory Part 1)</title><link href="https://mwchase.neocities.org/missable-mysteries-2021-08-23" rel="alternate"></link><published>2021-08-23T04:00:00-04:00</published><updated>2021-08-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-08-23:/missable-mysteries-2021-08-23</id><summary type="html">&lt;p class="first last"&gt;I would argue that some of these concepts were not invented, but &lt;em&gt;discovered&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;What does adding numbers together have in common with rotating a square piece of paper?
What does rearranging a deck of cards have in common with rotating and flipping a square piece of paper?
These questions are rhetorical; I know the answers, and if you don't already, I hope to help you learn.&lt;/p&gt;
&lt;p&gt;Let's start with that square piece of paper.
Suppose we have a square piece of paper, and we mark a dot on it, kind of off-center, like this.&lt;/p&gt;
&lt;svg class="centered"&gt;
    &lt;use href="https://mwchase.neocities.org/images/group-theory-1.svg#figure1-01"/&gt;
&lt;/svg&gt;&lt;p&gt;Now, let's think about moving that piece of paper around, making sure (for now) to keep the dot visible.
We can slide the paper around the table,&lt;/p&gt;
&lt;svg class="centered"&gt;
    &lt;use href="https://mwchase.neocities.org/images/group-theory-1.svg#figure1-02"/&gt;
&lt;/svg&gt;&lt;p&gt;Or we can turn it around as we move it.&lt;/p&gt;
&lt;svg class="centered"&gt;
    &lt;use href="https://mwchase.neocities.org/images/group-theory-1.svg#figure1-03"/&gt;
&lt;/svg&gt;&lt;p&gt;Now, there are many ways to move the paper around, so let's simplify things to make it easier to talk about.
Let's add another rule.
We already had &amp;quot;the dot must be visible&amp;quot;.
Let's add &amp;quot;the paper must end up occupying the same area&amp;quot;.
We can think about this as follows: we want to talk about motions where the paper ends up where it started, and if you closed your eyes, you wouldn't be able to tell which motion was done, but if you open your eyes, you can see where the dot moved to.&lt;/p&gt;
&lt;svg class="centered"&gt;
    &lt;use href="https://mwchase.neocities.org/images/group-theory-1.svg#figure1-04"/&gt;
&lt;/svg&gt;&lt;p&gt;Let's look more closely at what I'm saying in that last sentence.
Whatever we do to the paper, we currently only care about how it starts out, and how it ends up.
To see why this makes sense, consider the process of rotating the paper a quarter-turn clockwise.
If you stop halfway through, it's got points where it should have sides, and sides where it should have points!&lt;/p&gt;
&lt;svg class="centered"&gt;
    &lt;use href="https://mwchase.neocities.org/images/group-theory-1.svg#figure1-05"/&gt;
&lt;/svg&gt;&lt;p&gt;You could definitely tell something was different if you felt that with your eyes closed!
So, getting to one of the &amp;quot;allowed&amp;quot; positions means passing through &amp;quot;disallowed&amp;quot; positions.&lt;/p&gt;
&lt;p&gt;Next, let's compare a half-turn clockwise to a half-turn counter-clockwise.
Looking at them, we can't tell the difference between a square that was turned halfway around clockwise, and a square that was turned halfway around counter-clockwise.
In contrast, consider doing &lt;em&gt;these&lt;/em&gt; turns and stopping halfway through the turn.
Each one stops at a quarter-turn.
(A different quarter-turn, no less, but let's come back to that later.)&lt;/p&gt;
&lt;p&gt;Let's look over what we can do to a square piece of paper, following these rules:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;We've seen that we can turn it a quarter-turn clockwise&lt;/li&gt;
&lt;li&gt;We've seen that we can turn it a quarter-turn counter-clockwise&lt;/li&gt;
&lt;li&gt;We've seen that we can turn it a half-turn&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Stopping halfway through the half-turn rotations produced a quarter-turn, which suggests that it's possible to combine these turns into other &amp;quot;things to do to a square piece of paper without flipping it, but making it take up the same space at the end&amp;quot;.
Now, &amp;quot;things&amp;quot; sounds a little weird, and &amp;quot;things to do to a square piece of paper without flipping it, but making it take up the same space at the end&amp;quot; is &lt;em&gt;way&lt;/em&gt; too long.
Let's call them &lt;strong&gt;elements&lt;/strong&gt; instead.&lt;/p&gt;
&lt;p&gt;Here is the result of applying each of these three elements to the same square piece of paper.&lt;/p&gt;
&lt;svg class="centered"&gt;
    &lt;use href="https://mwchase.neocities.org/images/group-theory-1.svg#figure1-06"/&gt;
&lt;/svg&gt;&lt;p&gt;Here are some examples of combining these elements:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;If we do a quarter-turn clockwise followed by a half-turn, we get a quarter-turn counter-clockwise.&lt;/li&gt;
&lt;li&gt;If we do a half turn followed by a quarter-turn counter-clockwise, we get a quarter-turn clockwise.&lt;/li&gt;
&lt;li&gt;If we do two half-turns, we get... hm...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It looks like that list of three elements was missing an entry.
Let's try to fix that.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;We can do nothing to it&lt;/li&gt;
&lt;li&gt;We can turn it a quarter-turn clockwise&lt;/li&gt;
&lt;li&gt;We can turn it a quarter-turn counter-clockwise&lt;/li&gt;
&lt;li&gt;We can turn it a half-turn&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, two half-turns combine into &amp;quot;nothing&amp;quot;, and &amp;quot;nothing&amp;quot; and &amp;quot;something&amp;quot; combine into the same &amp;quot;something&amp;quot;.
When you consider the individual combination of &amp;quot;nothing&amp;quot; and &amp;quot;something&amp;quot;, it doesn't look too impressive (all that work just to get one of the same things you put in?), but it will be useful for more than filling out that list, I promise.
Now, a &amp;quot;do-nothing&amp;quot; element is called an &lt;strong&gt;identity element&lt;/strong&gt;, or &lt;strong&gt;identity&lt;/strong&gt;, for short.&lt;/p&gt;
&lt;p&gt;Speaking of that list, I said there were three elements in it, then I said four!
Is it possible I've missed more elements?&lt;/p&gt;
&lt;p&gt;I'll try to convince you that I haven't.&lt;/p&gt;
&lt;p&gt;To start with, consider the corner of the square next to the dot.
Let's label that corner &lt;tt class="docutils literal"&gt;A&lt;/tt&gt;.
Because we're moving the paper around, not somehow moving the dot around on the paper, the dot and &lt;tt class="docutils literal"&gt;A&lt;/tt&gt; are always the same distance from each other, so by looking at the dot, we can find &lt;tt class="docutils literal"&gt;A&lt;/tt&gt;.&lt;/p&gt;
&lt;svg class="centered"&gt;
    &lt;use href="https://mwchase.neocities.org/images/group-theory-1.svg#figure1-07"/&gt;
&lt;/svg&gt;&lt;p&gt;Now, let's look at these square pieces of paper with &lt;tt class="docutils literal"&gt;A&lt;/tt&gt; labeled.
We see that the list of four elements has one element for each corner that &lt;tt class="docutils literal"&gt;A&lt;/tt&gt; can end up at.
Suppose we label them &lt;tt class="docutils literal"&gt;B&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;C&lt;/tt&gt;, and &lt;tt class="docutils literal"&gt;D&lt;/tt&gt;, clockwise from &lt;tt class="docutils literal"&gt;A&lt;/tt&gt;.&lt;/p&gt;
&lt;svg class="centered"&gt;
    &lt;use href="https://mwchase.neocities.org/images/group-theory-1.svg#figure1-08"/&gt;
&lt;/svg&gt;&lt;p&gt;We can describe the listed elements as follows:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;An element that takes &lt;tt class="docutils literal"&gt;A&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;A&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;An element that takes &lt;tt class="docutils literal"&gt;A&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;B&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;An element that takes &lt;tt class="docutils literal"&gt;A&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;D&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;An element that takes &lt;tt class="docutils literal"&gt;A&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;C&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This shows that we've listed one element for each possible destination corner for &lt;tt class="docutils literal"&gt;A&lt;/tt&gt;.
Is it possible that there are some more elements that I've missed?
Let's take a closer look at how &lt;tt class="docutils literal"&gt;A&lt;/tt&gt; and the dot relate to each other, and the other corners.&lt;/p&gt;
&lt;p&gt;If we go clockwise from &lt;tt class="docutils literal"&gt;A&lt;/tt&gt;, we always see the following things in this order:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;A&lt;/tt&gt; (to start with)&lt;/li&gt;
&lt;li&gt;the dot&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;B&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;C&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;D&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;back to &lt;tt class="docutils literal"&gt;A&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We can't change the relative positions of the corners and the dot.
Therefore, under the constraints that we put on this system, if we know which point &lt;tt class="docutils literal"&gt;A&lt;/tt&gt; has gone to, then we know which point each other point has gone to.
&lt;tt class="docutils literal"&gt;B&lt;/tt&gt; must be the point right after &lt;tt class="docutils literal"&gt;A&lt;/tt&gt;, and so on.&lt;/p&gt;
&lt;p&gt;Now that we know there are just four elements in the list of things to do to this square, let's try figuring out how they combine.&lt;/p&gt;
&lt;p&gt;First off, how many combinations are there?&lt;/p&gt;
&lt;p&gt;Well, there are four elements.
A combination of elements has a first element, and a second element.
There's no way that picking one element narrows down our choices for the other element, so it must be the case that each of the four choices for the &amp;quot;first element&amp;quot; can combine with each of the four choices for the &amp;quot;second element&amp;quot;.
So, there are four groups of four choices.
Four fours.
Four, plus four, plus four, plus four.
You can trust me that that's sixteen, work it out for yourself, or count the little squares in the following diagram.&lt;/p&gt;
&lt;svg class="centered"&gt;
    &lt;use href="https://mwchase.neocities.org/images/group-theory-1.svg#figure1-09"/&gt;
&lt;/svg&gt;&lt;p&gt;In the diagram, I have named each element after the destination of &lt;tt class="docutils literal"&gt;A&lt;/tt&gt;.
Let the left side represent the first element in the combination, and the top, the second element.
The square that is directly to the right of a label on the left, and directly below a label on top, represents the combination of, first the left label, and then the top.
Let's try to fill in the labels for all of the combinations.
To start with, because each element is named after the destination of &lt;tt class="docutils literal"&gt;A&lt;/tt&gt;, we know that &lt;tt class="docutils literal"&gt;A&lt;/tt&gt; is the identity element.
Therefore, if one of the elements in the combination is &lt;tt class="docutils literal"&gt;A&lt;/tt&gt;, then the combination is just the other element.
This gives us the top row and the left column, which you can count up as seven squares.
We're nearly halfway done!&lt;/p&gt;
&lt;svg class="centered"&gt;
    &lt;use href="https://mwchase.neocities.org/images/group-theory-1.svg#figure1-10"/&gt;
&lt;/svg&gt;&lt;p&gt;Let's look at the second column.
The first column is filled in, and indicates that if we turn the square some amount and then do nothing, that is indistinguishable from just turning it that amount.
To go from the first column to the second column, we just have to turn the square a quarter-turn clockwise.
On a quarter-turn, &lt;tt class="docutils literal"&gt;B&lt;/tt&gt; goes to &lt;tt class="docutils literal"&gt;C&lt;/tt&gt;, so moving &lt;tt class="docutils literal"&gt;A&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;B&lt;/tt&gt; twice puts &lt;tt class="docutils literal"&gt;A&lt;/tt&gt; on &lt;tt class="docutils literal"&gt;C&lt;/tt&gt;.
Furthermore, &lt;tt class="docutils literal"&gt;C&lt;/tt&gt; goes to &lt;tt class="docutils literal"&gt;D&lt;/tt&gt;, so moving &lt;tt class="docutils literal"&gt;A&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;C&lt;/tt&gt; and then &lt;tt class="docutils literal"&gt;A&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;B&lt;/tt&gt; moves &lt;tt class="docutils literal"&gt;A&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;D&lt;/tt&gt;.
Finally, &lt;tt class="docutils literal"&gt;D&lt;/tt&gt; goes to &lt;tt class="docutils literal"&gt;A&lt;/tt&gt;, so moving &lt;tt class="docutils literal"&gt;A&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;D&lt;/tt&gt; and then &lt;tt class="docutils literal"&gt;A&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;B&lt;/tt&gt; moves &lt;tt class="docutils literal"&gt;A&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;A&lt;/tt&gt;.&lt;/p&gt;
&lt;svg class="centered"&gt;
    &lt;use href="https://mwchase.neocities.org/images/group-theory-1.svg#figure1-11"/&gt;
&lt;/svg&gt;&lt;p&gt;Notice that every element occurs once in the second column.
This isn't surprising for the first row or column, because one of the elements involved was the identity, but it's worth thinking about what it would mean if a column didn't contain every element.&lt;/p&gt;
&lt;p&gt;First, because there are the same number of elements as rows, an element would have to be repeated.
Now, what would that imply?&lt;/p&gt;
&lt;p&gt;Since we can describe a rotation as taking &lt;tt class="docutils literal"&gt;A&lt;/tt&gt; to some point, we can also think about what point a rotation brings to &lt;tt class="docutils literal"&gt;A&lt;/tt&gt;.
And if we take &lt;tt class="docutils literal"&gt;A&lt;/tt&gt; to a point, and then take that same point to &lt;tt class="docutils literal"&gt;A&lt;/tt&gt;, then we must have taken &lt;tt class="docutils literal"&gt;A&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;A&lt;/tt&gt;, which is the identity element.
So, that means that we could apply the &amp;quot;reverse&amp;quot; element to whatever column has duplicates, and get back to the &lt;tt class="docutils literal"&gt;A&lt;/tt&gt; column.
But the different elements are just end-points, they don't &amp;quot;remember&amp;quot; how they got there.
Therefore, if a column has duplicate elements, then those same rows must be duplicates in the &lt;tt class="docutils literal"&gt;A&lt;/tt&gt; column.
But the &lt;tt class="docutils literal"&gt;A&lt;/tt&gt; column is just the elements, so it can't have duplicates.&lt;/p&gt;
&lt;p&gt;So, we know that all of the columns of this table contain each element exactly once.
In other words, once you've applied one element, then there is some element that takes you to any element you want.&lt;/p&gt;
&lt;p&gt;Before we finish with the rest of the table, let's look at that idea of &amp;quot;taking a point to &lt;tt class="docutils literal"&gt;A&lt;/tt&gt;&amp;quot;.
It's clear that an element must exist for each of the four points we can choose, because every element ends with some point at &lt;tt class="docutils literal"&gt;A&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;So, there is some sense in which every element has an &amp;quot;opposite&amp;quot; element that &amp;quot;undoes&amp;quot; its operation.
We can call this corresponding element the &lt;strong&gt;inverse&lt;/strong&gt; of that element.
So, the inverse of the element that takes &lt;tt class="docutils literal"&gt;A&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;B&lt;/tt&gt; takes &lt;tt class="docutils literal"&gt;B&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;A&lt;/tt&gt; (which is the same thing as taking &lt;tt class="docutils literal"&gt;A&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;D&lt;/tt&gt;) and vice-versa.
And, we can see from the chart that taking &lt;tt class="docutils literal"&gt;A&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;A&lt;/tt&gt; is its own inverse.
(This is generally true of identity elements: the identity applied to the identity produces the identity, so it must be its own inverse.)
The only remaining element on either side is taking &lt;tt class="docutils literal"&gt;A&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;C&lt;/tt&gt;.&lt;/p&gt;
&lt;svg class="centered"&gt;
    &lt;use href="https://mwchase.neocities.org/images/group-theory-1.svg#figure1-12"/&gt;
&lt;/svg&gt;&lt;p&gt;This element is, in fact, its own inverse.&lt;/p&gt;
&lt;p&gt;We may as well add this information to the chart.&lt;/p&gt;
&lt;svg class="centered"&gt;
    &lt;use href="https://mwchase.neocities.org/images/group-theory-1.svg#figure1-13"/&gt;
&lt;/svg&gt;&lt;p&gt;We've already shown that the elements in each column must be unique.
It's a little different in terms of order, but a similar argument shows that the elements in each row must be unique.
If a row has non-unique elements, then there are two possible &amp;quot;second elements&amp;quot; that take that row's element to the same final element.
Let's call these &amp;quot;second elements&amp;quot; the &lt;strong&gt;duplicating elements&lt;/strong&gt; and the result the &lt;strong&gt;duplicated element&lt;/strong&gt;.
Because the columns are different, the duplicating elements must be different from each other.
But suppose we performed the row's inverse element before going through the combination.
So, to start with, we have the combination of &lt;em&gt;first&lt;/em&gt; the inverse of the row, and &lt;em&gt;second&lt;/em&gt; the combination of the row, and the element that leads to a duplicate entry.
Now, it shouldn't matter precisely how we group the elements in the combinations, because we can think of the overall combination as paths made up of smaller paths.
We could choose to break the above combination into three paths: the inverse of the row, the row, and the duplicating element.&lt;/p&gt;
&lt;p&gt;If we set aside the inverse of the row to start with, then we can consider the row and the duplicating element.
Then we can combine them into the duplicated element.
Then, we can bring the inverse of the row element back, and combine it with the duplicated element.
The result should be some element that is independent of the choice of duplicating element.&lt;/p&gt;
&lt;p&gt;If, instead, we set aside the duplicating element, then we can consider the inverse of the row, and the row.
Then, we can combine them into the identity.
Then, we can bring back the duplicating element, and combine it with the identity.
The result should be whatever the duplicating element was.&lt;/p&gt;
&lt;p&gt;All we did was think in different ways about the path that the piece of paper took.
So, that can't change the end result.&lt;/p&gt;
&lt;p&gt;To summarize:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;strong&gt;If&lt;/strong&gt; a row has non-unique elements&lt;/li&gt;
&lt;li&gt;We can choose two columns that have the same entry in the row.&lt;/li&gt;
&lt;li&gt;This gives us two distinct duplicating elements that take the row to a single duplicated element.&lt;/li&gt;
&lt;li&gt;The row must have an inverse element.&lt;/li&gt;
&lt;li&gt;If we combine the inverse of the row, and the row, and a duplicating element, then we can decide &lt;em&gt;mentally&lt;/em&gt; whether to combine the first pair or the second pair first, without changing what happens &lt;em&gt;physically&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Grouping the second pair first tells us that, regardless of the choice of duplicating element, we get the same result.&lt;/li&gt;
&lt;li&gt;Grouping the first pair first tells us that the overall path is equal to the duplicating element.&lt;/li&gt;
&lt;li&gt;So, grouping the first pair first gives us two different results, while grouping the second pair first gives us the same result twice.&lt;/li&gt;
&lt;li&gt;But this is purely mental, and can't change what happens physically, so this situation is impossible.&lt;/li&gt;
&lt;li&gt;We only got into this situation by assuming that rows can have non-unique elements, so that assumption must be false.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Therefore, rows cannot have non-unique elements.&lt;/p&gt;
&lt;p&gt;Because every element in a row must be unique, we can look at the rows with three elements and fill in the remaining element in each row...&lt;/p&gt;
&lt;svg class="centered"&gt;
    &lt;use href="https://mwchase.neocities.org/images/group-theory-1.svg#figure1-14"/&gt;
&lt;/svg&gt;&lt;p&gt;And now all that's left is two squares in the bottom row, but now we can use the uniqueness requirement on the columns again, to fill in the rest of the table.&lt;/p&gt;
&lt;svg class="centered"&gt;
    &lt;use href="https://mwchase.neocities.org/images/group-theory-1.svg#figure1-15"/&gt;
&lt;/svg&gt;&lt;p&gt;The argument I made just now relies on another property that these elements have: that we can &amp;quot;group&amp;quot; them in any way without changing the result of applying them.
This is known as the &lt;strong&gt;associative property&lt;/strong&gt;.
In the context of rotating this piece of paper, saying &amp;quot;the associative property holds&amp;quot; is equivalent to saying &amp;quot;if we have three rotations, not necessarily distinct, called &lt;tt class="docutils literal"&gt;X&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;Y&lt;/tt&gt;, and &lt;tt class="docutils literal"&gt;Z&lt;/tt&gt;, then the results of 'rotating by the combination of &lt;tt class="docutils literal"&gt;X&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Y&lt;/tt&gt;, then by &lt;tt class="docutils literal"&gt;Z&lt;/tt&gt;' and 'rotating by &lt;tt class="docutils literal"&gt;X&lt;/tt&gt;, and then by the combination of &lt;tt class="docutils literal"&gt;Y&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Z&lt;/tt&gt;' should be the same&amp;quot;.&lt;/p&gt;
&lt;p&gt;So, we have a collection of elements, also called a &lt;strong&gt;set&lt;/strong&gt;, and we have an operation that acts on two elements to produce another element, such that:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;one element of the set is the identity element with respect to the operation (the result of combining this element with any other, is the other element)&lt;/li&gt;
&lt;li&gt;every element has an inverse with respect to the operation (for each element, there is exactly one element that, when combined with it, results in the identity element)&lt;/li&gt;
&lt;li&gt;and combining the elements obeys the associative property (we can combine multiple elements, and it doesn't matter whether we combine &amp;quot;left to right&amp;quot; or &amp;quot;right to left&amp;quot;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(And these statements are fundamentally &lt;em&gt;observations&lt;/em&gt; about how the elements behave, not any kind of outside imposition of properties on them.)&lt;/p&gt;
&lt;p&gt;A set and operation with these properties is known as a &lt;strong&gt;group&lt;/strong&gt;.
Because of this group's simplicity, it has an additional property that is not part of the definition of a group.
This property can be argued through informally, like I have done for the other properties, but it can also be established by inspecting the table.&lt;/p&gt;
&lt;svg class="centered"&gt;
    &lt;use href="https://mwchase.neocities.org/images/group-theory-1.svg#figure1-15"/&gt;
&lt;/svg&gt;&lt;p&gt;If we imagine flipping the table across this diagonal...&lt;/p&gt;
&lt;svg class="centered"&gt;
    &lt;use href="https://mwchase.neocities.org/images/group-theory-1.svg#figure1-16"/&gt;
&lt;/svg&gt;&lt;p&gt;The values in the cells don't change!
It doesn't matter which order we combine elements, the result is the same.&lt;/p&gt;
&lt;p&gt;This is known as the &lt;strong&gt;commutative property&lt;/strong&gt;.
A group whose operation obeys the commutative property is called commutative.
(That is, the &lt;em&gt;operation&lt;/em&gt; is commutative, so the &lt;em&gt;group&lt;/em&gt; is also commutative.)
A group that is commutative is sometimes called a &lt;strong&gt;commutative group&lt;/strong&gt;, which is straightforward, and often called an &lt;strong&gt;abelian group&lt;/strong&gt;, which is not.&lt;/p&gt;
&lt;p&gt;Here's a suggestion of a group that is not commutative, and a teaser for next time.&lt;/p&gt;
&lt;svg class="centered"&gt;
    &lt;use href="https://mwchase.neocities.org/images/group-theory-1.svg#figure1-17"/&gt;
&lt;/svg&gt;&lt;p&gt;This entry is done for now, due to a combination of working under a deadline and reaching a good stopping point, but there will be more.
If you want to know more before then, I'm going to mention a bunch of helpful terms you can research.&lt;/p&gt;
&lt;div class="section" id="further-reading"&gt;
&lt;h2&gt;Further reading&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;This was an illustration of basic concepts in &lt;strong&gt;group theory&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The group I was describing is an example of a &lt;strong&gt;cyclic group&lt;/strong&gt;, specifically C&lt;sub&gt;4&lt;/sub&gt;. Cyclic groups whose &lt;strong&gt;order&lt;/strong&gt; (the subscript number) is a &lt;strong&gt;prime number&lt;/strong&gt; (a number that has no factors besides 1 and itself) have even more specialized properties than C&lt;sub&gt;4&lt;/sub&gt;.&lt;/li&gt;
&lt;li&gt;The chart that I spent most of the entry constructing is called a &lt;strong&gt;Cayley table&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The long argument I used to show that rows cannot have non-unique elements is a &lt;strong&gt;proof by contradiction&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See you then!&lt;/p&gt;
&lt;/div&gt;
</content><category term="Missable Mysteries of Mathematics"></category></entry><entry><title>Missable Mysteries of Mathematics 2021-08-22 (Introduction)</title><link href="https://mwchase.neocities.org/missable-mysteries-2021-08-22" rel="alternate"></link><published>2021-08-22T04:00:00-04:00</published><updated>2021-08-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-08-22:/missable-mysteries-2021-08-22</id><summary type="html">&lt;p class="first last"&gt;The Reveal&lt;/p&gt;
</summary><content type="html">&lt;p&gt;This is the secret project I've been... teasing is probably the wrong word; it sort of implies I know what I'm doing with regards to promotion.
Let's go with &amp;quot;admitting exists&amp;quot;.
Anyway, welcome to&lt;/p&gt;
&lt;div class="section" id="missable-mysteries-of-mathematics"&gt;
&lt;h2&gt;Missable Mysteries of Mathematics&lt;/h2&gt;
&lt;div class="section" id="or-the-questions-about-mathematics-which-might-not-occur-to-you"&gt;
&lt;h3&gt;(Or, The Questions About Mathematics Which Might Not Occur To You)&lt;/h3&gt;
&lt;p&gt;Which is a new series of posts I'm working on.
What's new about it?
Well, I intend to have editorial standards rather than just scrawling something at the last minute like a high school student.&lt;/p&gt;
&lt;p&gt;The other thing that's new is the subject matter.
Rather than liveblogging whatever I'm working on at the time, this is an educational series, about mathematics.&lt;/p&gt;
&lt;p&gt;Mathematical education has had a troubled history, at least in the USA, and I'm building up my plan for posts based on a document in my possession, which illustrates that troubledness, even though it doesn't mean to.
Problems with mathematical education include lack of engagement, and lack of conceptual relevance.
(For example: those of you who have graduated from high school, when was the last time you wrote a two-column proof?)&lt;/p&gt;
&lt;p&gt;&amp;quot;The document&amp;quot; reveals a troubled relationship with basic mathematical concepts, and a surface-level knowledge of more advanced ideas.
In an effort to offer some antidote to the conditions that led to that state of mind, I'm writing up the &lt;em&gt;Missable Mysteries&lt;/em&gt;.
A &lt;em&gt;Missable Mystery&lt;/em&gt; is a mathematical question with a deep or useful answer, that it might not occur to someone to ask.
Additionally, they can be explained without requiring too much up-front knowledge.
(I do, however, plan to use earlier lessons to lay the groundwork for later ones.)&lt;/p&gt;
&lt;p&gt;For example, the following questions:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;How does basic arithmetic compare and contrast with shuffling a deck of cards? (deep connection between seemingly different things)&lt;/li&gt;
&lt;li&gt;How do different physical quantities combine and relate? Given a target measurement and some inputs, what kinds of formulas could plausibly let us get from one to the other? (sanity check for physics calculations at any level of complexity)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The first post, which is shorter than I originally planned, because otherwise I would still be writing it, will go up soon.&lt;/p&gt;
&lt;p&gt;See you then!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><category term="Missable Mysteries of Mathematics"></category></entry><entry><title>Diary 2021-08-21</title><link href="https://mwchase.neocities.org/diary-2021-08-21" rel="alternate"></link><published>2021-08-21T04:00:00-04:00</published><updated>2021-08-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-08-21:/diary-2021-08-21</id><summary type="html">&lt;p class="first last"&gt;Looking over what I wrote like &amp;quot;How did I think that was a coherent sentence?&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;This isn't under &amp;quot;sneak peek&amp;quot; because, really, what was I even showing off in there?
But anyway, I did the edits I noted last night, and then a bunch more that I realized I needed on a re-read.
I could probably edit this project indefinitely, but I hope I've taken care of all of the really big or definite issues.&lt;/p&gt;
&lt;p&gt;Anyway, I'm writing this up early because I had a bit of a rough week (hopefully next week will be a little easier), and I want to do stuff like I did last week, but, with, like, an actual post to go up today.
So, those are my plans for tonight, but what do I want to do over the weekend?&lt;/p&gt;
&lt;p&gt;Well, go outside as little as possible on Sunday, to avoid the winds.
But aside from that, I'm going to plan and work on some other projects while I wait for feedback on the latest draft.
In particular, I'm really interested to see whether breaking out flit into its own step will help my MOTR config, and I've got some research and, I guess, experimentation that I want to do for a worldbuilding project that I don't remember whether I've mentioned here.
There's also another project that I'd like to start planning, which is just a silly little thing, but I can probably polish it indefinitely.&lt;/p&gt;
&lt;p&gt;Well, that's all I'm going to get written for now.
I'd better wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2021-08-20</title><link href="https://mwchase.neocities.org/diary-2021-08-20" rel="alternate"></link><published>2021-08-20T04:00:00-04:00</published><updated>2021-08-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-08-20:/diary-2021-08-20</id><summary type="html">&lt;p class="first last"&gt;When you don't do something for a few months, just never do it again in case you hurt yourself trying, I guess.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Things are wrapping up a little; there's only so much more to do before the various deadlines.
So that's good.&lt;/p&gt;
&lt;p&gt;What's not good is that I managed to injure myself editing a document.
See, it's been a while since I wrote &lt;em&gt;a lot&lt;/em&gt; by hand, and apparently taking a few pages of notes on &amp;quot;stuff I did wrong&amp;quot; was enough to mess up my hand a little, possibly giving it a blister.&lt;/p&gt;
&lt;p&gt;We always find some way to suffer for our art.&lt;/p&gt;
&lt;p&gt;Quick thoughts about what's happening in the coming days:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;A few tasks for work&lt;/li&gt;
&lt;li&gt;Next draft of ~secret project~&lt;/li&gt;
&lt;li&gt;Release the ~secret project~&lt;/li&gt;
&lt;li&gt;Get back to work on MOTR&lt;/li&gt;
&lt;li&gt;A few ideas that I've had in the last week or so.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, I'll regret it a lot if I don't start wrapping up, so I'll start wrapping up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2021-08-19</title><link href="https://mwchase.neocities.org/diary-2021-08-19" rel="alternate"></link><published>2021-08-19T04:00:00-04:00</published><updated>2021-08-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-08-19:/diary-2021-08-19</id><summary type="html">&lt;p class="first last"&gt;Just holding on at the moment, would like to do better.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, so.
Work is at least changing around a bit, and there &lt;em&gt;probably&lt;/em&gt; won't be any more early morning meetings.
Those were so unpleasant.&lt;/p&gt;
&lt;p&gt;All of that is none too soon for me, because my nerves are feeling a bit frayed.
I'm going to have to do a good job of relaxing soon, and that probably means planning it some.
I've got some stuff arriving in the mail soon that &lt;em&gt;should&lt;/em&gt; help, and plenty of edibles.
Only caveat there is, next time I do that, I want to make sure I write the blog post &lt;em&gt;first&lt;/em&gt;, for what I assume are obvious reasons.&lt;/p&gt;
&lt;p&gt;And, I guess there isn't anything else I should be working on just now, since I am sleepy and it is getting late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Sneak Peek 2021-08-18</title><link href="https://mwchase.neocities.org/sneak-peek-2021-08-18" rel="alternate"></link><published>2021-08-18T04:00:00-04:00</published><updated>2021-08-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-08-18:/sneak-peek-2021-08-18</id><summary type="html">&lt;p class="first last"&gt;I'm not sure anything in here is interesting, but it is true, so I guess I stand by it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got a bit more feedback on one of the second drafts.
While I work on figuring out how to act on that feedback, I'm looking over the other second draft, which is at least shorter.
I just sent it over for feedback as well.&lt;/p&gt;
&lt;p&gt;The feedback I want is around explaining what this project is, like, for.&lt;/p&gt;
&lt;p&gt;Hopefully, I can get this all wrapped up in the next few days.&lt;/p&gt;
&lt;p&gt;I had a bit of a rough day.
I just want to get enough rest to finish this up, then get back to working on other things.
(... and also, the next part...)&lt;/p&gt;
&lt;p&gt;So, I'll wrap things up here, and take care of a few other things while this publishes.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Sneak Peek"></category></entry><entry><title>Weekly Roundup 2021-08-17</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-08-17" rel="alternate"></link><published>2021-08-17T04:00:00-04:00</published><updated>2021-08-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-08-17:/weekly-roundup-2021-08-17</id><summary type="html">&lt;p class="first last"&gt;Apparently, my body decided I needed a break and didn't take no for an answer.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I didn't do much because I was tired.&lt;/li&gt;
&lt;li&gt;Thursday: I teased, ineffectually, something that should be out in the next week or so.&lt;/li&gt;
&lt;li&gt;Friday: I didn't do much because I was tired.&lt;/li&gt;
&lt;li&gt;Saturday: I didn't do much because I was high.&lt;/li&gt;
&lt;li&gt;Sunday: I started testing out MOTR in earnest. I found some trivial issues in the config file, some major bugs in the actual code, and a vast, screaming maw of insanity in the act of coordinating concurrent file access.&lt;/li&gt;
&lt;li&gt;Monday: I started planning how to mitigate those big issues, which break the current configuration, like, every other run, at minimum.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to get into the home stretch on the secret project in the next few days, hopefully.
After that, I'm going to try to come up with a more reliable MOTR configuration, so I know just what to pull into the application's api library.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2021-08-16</title><link href="https://mwchase.neocities.org/coding-2021-08-16" rel="alternate"></link><published>2021-08-16T04:00:00-04:00</published><updated>2021-08-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-08-16:/coding-2021-08-16</id><summary type="html">&lt;p class="first last"&gt;Representing every interest related to this project is a little confusing, but I think for now I prefer it to the alternatives.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, what did I find yesterday?
I found two issues.
One was around installing the package from the current directory.
Something was going really screwy there as a result of other commands running &lt;em&gt;while&lt;/em&gt; pip was reading the directory contents.
I still feel like there was no call to try to install a package from a SQLite database, but it is what it is.
The other was that &lt;em&gt;something&lt;/em&gt; ended up talking about the paths to &lt;tt class="docutils literal"&gt;~ip&lt;/tt&gt;, which appears to not be a thing.&lt;/p&gt;
&lt;p&gt;I can sort of understand the former, so I'll try to figure out a way around it.&lt;/p&gt;
&lt;p&gt;Okay, let's see what makes the most sense...
If I do a &lt;tt class="docutils literal"&gt;flit build&lt;/tt&gt;, then the build artifacts will be in the &lt;tt class="docutils literal"&gt;dist&lt;/tt&gt; folder, under a name based on the version, which &lt;a class="reference external" href="https://github.com/takluyver/flit/issues/262"&gt;flit currently does not have a command to expose&lt;/a&gt;.
If I'm willing to compromise on my vision for MOTR, I can build the artifacts out of band and use stat data to find the newest wheel.
Are there any alternatives?
Well, I may not know the path to the file, but I know the path to the directory.
Can I create an index to add to the install command, with the caveat that this definitely needs to install third-party packages, and that there is a version on PyPI that I don't want to install...
I mean, it looks like &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--find-links&lt;/span&gt;&lt;/tt&gt; would sort of work with this, except that it would be kind of brittle.
Like, I couldn't run tests against an &lt;em&gt;older&lt;/em&gt; version than the current release, and that's not acceptable from a maintenance perspective.
And there are enough sequencing issues even with just using &lt;tt class="docutils literal"&gt;dist&lt;/tt&gt; that I can't be too comfortable with it.&lt;/p&gt;
&lt;p&gt;So, hm, using a direct path or URL to the archive looks like the only way to handle this.
But I think I can still write this in a way that doesn't require determining the version ahead-of-time.
(I want to avoid this because running &lt;tt class="docutils literal"&gt;flit build&lt;/tt&gt; when I do &lt;tt class="docutils literal"&gt;motr &lt;span class="pre"&gt;--list-targets&lt;/span&gt;&lt;/tt&gt; seems unexpected.)&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Install flit in a venv&lt;/li&gt;
&lt;li&gt;Run &lt;tt class="docutils literal"&gt;flit build &lt;span class="pre"&gt;--format&lt;/span&gt; wheel&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;Inspect &lt;tt class="docutils literal"&gt;dist&lt;/tt&gt; for the newest file, and write the path as a file url in a &lt;tt class="docutils literal"&gt;requirements.txt&lt;/tt&gt; type file (This is a custom &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt;)&lt;/li&gt;
&lt;li&gt;Use the path to the requirements file as an &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; for the various pip installs, instead of &lt;tt class="docutils literal"&gt;.&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I think that should take care of a bunch of issues, but I still don't know what's with the other error.
The way it's talking about &lt;tt class="docutils literal"&gt;__pycache__&lt;/tt&gt; directories under &lt;tt class="docutils literal"&gt;src&lt;/tt&gt; has me hoping that this is somehow also a sequencing issue with running flit through pip, or at least that it has something to do with it.&lt;/p&gt;
&lt;p&gt;(Scaling this solution up to my &amp;quot;monorepo-esque&amp;quot; layout would be interesting.
I think the most reasonable way would be to replace the third step with a custom action that essentially handles some of the sequencing itself.
After every install is completed, then the custom action has to retrieve and collate all of the wheel-related data.
It can then store that information in a &lt;em&gt;constraints&lt;/em&gt; file.
Properly handling this probably also needs a quick parse of the &lt;tt class="docutils literal"&gt;pypyroject.toml&lt;/tt&gt; file for each project.
Or maybe the monorepo-esque layout should just expect the project name to match the package name.)&lt;/p&gt;
&lt;p&gt;Anyway, good plans for when I'm ready to get back into this.
I've got a few other things I want to take care of tonight, so I'm going to wrap this up now and get to work on those.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-08-15</title><link href="https://mwchase.neocities.org/coding-2021-08-15" rel="alternate"></link><published>2021-08-15T04:00:00-04:00</published><updated>2021-08-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-08-15:/coding-2021-08-15</id><summary type="html">&lt;p class="first last"&gt;Discovering exciting new problems that I never imagined solving.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I'm starting on this entry a little earlier than usual, because I couldn't think of a reason not to.
Here's what running MOTR with its repository's prototype file gives me:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;AttributeError: module 'motr.api' has no attribute 'Input'&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Let's start dealing with these errors.&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;/api\.Input&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;[1/14]&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Okay...&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;AttributeError: module 'motr.api' has no attribute 'add_target'&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Uh-huh...&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;/add_target&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;[1/8]&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Cool...&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;TypeError: mkdir() missing 1 required positional argument: 'name'&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Okay, I'm going to need to refresh my memory on that...&lt;/p&gt;
&lt;p&gt;Okay, yeah, I just completely blanked on that part of the API while I was drafting this.&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;TypeError: expected str, bytes or os.PathLike object, not Input&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Wait, is that... is that a bug?
The error message is kind of vague...&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;python &lt;span class="pre"&gt;-m&lt;/span&gt; pdb &lt;span class="pre"&gt;-m&lt;/span&gt; motr&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;That wasn't the right command.&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;python &lt;span class="pre"&gt;-m&lt;/span&gt; pdb (pyenv which motr)&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;c&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;That's better.
Except not much better, because it's not post-mortem-ing when I expect.
So, instead, let's put a breakpoint in the config file (!!!) and run normally...&lt;/p&gt;
&lt;p&gt;Okay, let's see... from experimentation, I see that it's only hitting the breakpoint once, so I just need to inspect the first invocation of this function.
I'm not seeing anything too crazy from poking around, it's probably super obvious...
But anyway, let's see how many times we go through the &lt;tt class="docutils literal"&gt;cmd&lt;/tt&gt; iterator.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;gt; /home/maxchase/Documents/synched/motr/motr/motrfile.py(111)run_pytest()
-&amp;gt; api.cmd(
(Pdb) n
&amp;gt; /home/maxchase/Documents/synched/motr/motr/motrfile.py(112)run_pytest()
-&amp;gt; runner + pytest_suffix(junit_file),
(Pdb) n
&amp;gt; /home/maxchase/Documents/synched/motr/motr/motrfile.py(113)run_pytest()
-&amp;gt; f&amp;quot;pytest-{env_name}&amp;quot;,
(Pdb) n
&amp;gt; /home/maxchase/Documents/synched/motr/motr/motrfile.py(114)run_pytest()
-&amp;gt; report_dir,
(Pdb) n
&amp;gt; /home/maxchase/Documents/synched/motr/motr/motrfile.py(111)run_pytest()
-&amp;gt; api.cmd(
(Pdb) n
&amp;gt; /home/maxchase/Documents/synched/motr/motr/motrfile.py(115)run_pytest()
-&amp;gt; *test_extra_inputs,
(Pdb) n
&amp;gt; /home/maxchase/Documents/synched/motr/motr/motrfile.py(111)run_pytest()
-&amp;gt; api.cmd(
(Pdb) n
&amp;gt; /home/maxchase/Documents/synched/motr/motr/motrfile.py(116)run_pytest()
-&amp;gt; allowed_codes=[1],
(Pdb) n
&amp;gt; /home/maxchase/Documents/synched/motr/motr/motrfile.py(111)run_pytest()
-&amp;gt; api.cmd(
(Pdb) n
&amp;gt; /home/maxchase/Documents/synched/motr/motr/motrfile.py(110)run_pytest()
-&amp;gt; yield from (
(Pdb) n
TypeError: expected str, bytes or os.PathLike object, not Input
&lt;/pre&gt;
&lt;p&gt;All right, let's do that again...&lt;/p&gt;
&lt;p&gt;After far too much effort, I have isolated the value that it's choking on: &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Input(path=PosixPath('reports/pytest'))&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Which allows me to finally narrow it down to an argument type error in the motrfile.
That could have definitely signalled things to me better.
I think my best bet is to wrap the error in the coercion function.
I should probably also have error checking at the top-level code that users are supposed to invoke.&lt;/p&gt;
&lt;p&gt;And, running it again, I got the same error, but from a different line of the config file.&lt;/p&gt;
&lt;p&gt;And, fixing that, I find... this looks like an actual bug.
Got all the way through config, and then something acted up in the &lt;tt class="docutils literal"&gt;Cmd&lt;/tt&gt; class.
Looks like I forgot to make some of the required directories exist.&lt;/p&gt;
&lt;p&gt;So, I fixed that bug, and I'll bundle that into the 0.1.1 release.
Next issues: failed to set up dependencies in the motrfile, and then fixing that broke something else...
Or maybe I didn't fix it...
This is confusing.&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;: No module named venv&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;... What.&lt;/p&gt;
&lt;p&gt;Okay, let's rewrite the references to &lt;tt class="docutils literal"&gt;python&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;sys.executable&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;All right, that worked.
Ish.&lt;/p&gt;
&lt;p&gt;Then, I had to add a message to one of the exceptions I was raising.
I'm not sure what happened in the run after that, I think it might have run into synchronization issues because I never disabled synching on the directory, so, I'll do that in a sec.&lt;/p&gt;
&lt;p&gt;And now it... um... after I fixed a frankly embarrassing bug in uncovered code, now it is... sometimes... failing... because paths to &lt;tt class="docutils literal"&gt;pip&lt;/tt&gt; are sometimes paths to &lt;tt class="docutils literal"&gt;~ip&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;I'd love to know which ghost I angered to make &lt;em&gt;that&lt;/em&gt; happen.&lt;/p&gt;
&lt;p&gt;But anyway, it runs, sometimes.
Unless it does&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;ERROR: Could not install packages due to an OSError: &lt;span class="pre"&gt;[('/home/maxchase/Documents/synched/motr/motr/.coverage',&lt;/span&gt; &lt;span class="pre"&gt;'/tmp/pip-req-build-oeiz90rh/.coverage',&lt;/span&gt; &amp;quot;[Errno 2] No such file or directory: &lt;span class="pre"&gt;'/home/maxchase/Documents/synched/motr/motr/.coverage'&amp;quot;)]&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;That.&lt;/p&gt;
&lt;p&gt;Why is it trying to install the coverage data file?&lt;/p&gt;
&lt;p&gt;Actually, I think I understand, but... really, I don't deserve this synchronization issue.&lt;/p&gt;
&lt;p&gt;Anyway, when it... works, it says it runs sub-20 seconds.
Now, I'm sure it can do better performance-wise, but first it needs to do better correctness-wise.&lt;/p&gt;
&lt;p&gt;But, I'm not going to figure that out tonight.
However, the code technically &lt;em&gt;can&lt;/em&gt; run at this point, at least on my machine, so I pushed out a new version.
Now everyone gets to sort of, sometimes, run this thing's tests against itself.&lt;/p&gt;
&lt;p&gt;I don't want to think about this any more tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2021-08-14</title><link href="https://mwchase.neocities.org/diary-2021-08-14" rel="alternate"></link><published>2021-08-14T04:00:00-04:00</published><updated>2021-08-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-08-14:/diary-2021-08-14</id><summary type="html">&lt;p class="first last"&gt;I don't know, I'm just really relaxed. It's nice :)&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I still don't have much to say about what's going on, but I guess I'm more mellow about it.&lt;/p&gt;
&lt;p&gt;Tomorrow, it's either back to MOTR, or hopefully finally getting another round of feedback on the other project.&lt;/p&gt;
&lt;p&gt;It'll be nice to focus on my own projects, once I have the time and energy.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2021-08-13</title><link href="https://mwchase.neocities.org/diary-2021-08-13" rel="alternate"></link><published>2021-08-13T04:00:00-04:00</published><updated>2021-08-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-08-13:/diary-2021-08-13</id><summary type="html">&lt;p class="first last"&gt;This is a theme.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm once again tired and vaguely sore.&lt;/p&gt;
&lt;p&gt;I thought for sure I was going to come up with something else to put here, in the time between writing that sentence and this one, but I guess not.&lt;/p&gt;
&lt;p&gt;Stuff is definitely going to happen in a week or so, but I've got nothing currently.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Sneak Peek 2021-08-12</title><link href="https://mwchase.neocities.org/sneak-peek-2021-08-12" rel="alternate"></link><published>2021-08-12T04:00:00-04:00</published><updated>2021-08-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-08-12:/sneak-peek-2021-08-12</id><summary type="html">&lt;p class="first last"&gt;Taking it easy until work manages to chill out.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Second draft of the secret project is out for review.
The changes there were around trying to phrase things more clearly, such as by&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Using shorter sentences.&lt;/li&gt;
&lt;li&gt;Breaking up paragraphs.&lt;/li&gt;
&lt;li&gt;Not using unexplained notation.&lt;/li&gt;
&lt;li&gt;Spacing out my ideas over more sentences.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hopefully this should bring the overall level of knowledge required to read this much, much lower.&lt;/p&gt;
&lt;p&gt;I sat around a bunch to see if I had anything more to say on this, and I guess I don't.
I should wrap up for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Sneak Peek"></category></entry><entry><title>Diary 2021-08-11</title><link href="https://mwchase.neocities.org/diary-2021-08-11" rel="alternate"></link><published>2021-08-11T04:00:00-04:00</published><updated>2021-08-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-08-11:/diary-2021-08-11</id><summary type="html">&lt;p class="first last"&gt;Ugh, tired again...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I am tired right now.
I'm going to have to take things easy for a while.&lt;/p&gt;
&lt;p&gt;I'm getting the itch to work on conlanging or worldbuilding again, but I really want to get this other project squared away first.&lt;/p&gt;
&lt;p&gt;With luck, this project should be done in a week, and I think work should finally calm down around then as well, though I seem to remember thinking similar things before...&lt;/p&gt;
&lt;p&gt;Anyway, I should take things easy for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2021-08-10</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-08-10" rel="alternate"></link><published>2021-08-10T04:00:00-04:00</published><updated>2021-08-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-08-10:/weekly-roundup-2021-08-10</id><summary type="html">&lt;p class="first last"&gt;Oh yeah, it's all coming together.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I started planning stylesheet updates to the blog, for an upcoming project.&lt;/li&gt;
&lt;li&gt;Thursday: I talked about the kind of stuff I'll need for the project.&lt;/li&gt;
&lt;li&gt;Friday: I got the first draft of the diagrams done, and planned out the rest of the project.&lt;/li&gt;
&lt;li&gt;Saturday: I reworked the diagrams some as a result of actually trying to use them.&lt;/li&gt;
&lt;li&gt;Sunday: I updated the stylesheet to add night mode and various facilities for interacting with the diagrams. This all went &lt;em&gt;so well&lt;/em&gt; that I updated the stylesheet &lt;em&gt;again&lt;/em&gt; the next day.&lt;/li&gt;
&lt;li&gt;Monday: I released MOTR, which is not currently... good... but having it out there makes it feel more real.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'll hopefully get any required polish for the project, so I can get it in like a week early or so.
Once (or during) that's sorted out, I'll iterate some on MOTR.
There's some other coding stuff that I may work on in the genre of &amp;quot;I can do this, and that is the most compelling reason I have to work on it, apparently&amp;quot;.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2021-08-09</title><link href="https://mwchase.neocities.org/coding-2021-08-09" rel="alternate"></link><published>2021-08-09T04:00:00-04:00</published><updated>2021-08-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-08-09:/coding-2021-08-09</id><summary type="html">&lt;p class="first last"&gt;Not releasing it because I think it's any good yet, but because I want to try actually using it instead of endlessly polishing it beforehand.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, now I'll stop being cagey about the task runner's name.
It is &lt;a class="reference external" href="https://pypi.org/project/motr/"&gt;MOTR&lt;/a&gt;, short for Max's Obvious Task Runner, though I'll probably flip-flop about whether the O should stand for &amp;quot;Obvious&amp;quot; or &amp;quot;Opinionated&amp;quot;.
In any case, the naming is via a slight corruption of the &lt;a class="reference external" href="https://www.boringcactus.com/2021/03/21/coins.html"&gt;COINS&lt;/a&gt; concept, because I wanted it to be as close to &amp;quot;motor&amp;quot; as possible, and I thought &amp;quot;MOOTR, but pronounce it like it's a German web 2.0 startup&amp;quot; was too far.
And I didn't have any good alternative adjectives in mind.&lt;/p&gt;
&lt;p&gt;Now, you'd be forgiven for thinking that, because I released this, I think it has a chance of being useful to anyone in its current state, least of all myself.
My goal here is to get my prototype &amp;quot;motrfile&amp;quot; to a stage where it's capable of running MOTR's own tests and diagnostics.
Then, I'll cut a source release.
At that point, I'll get to work addressing the various issues standing in the way of version 1.0:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Incomplete test coverage.&lt;/li&gt;
&lt;li&gt;Non-existent documentation.&lt;/li&gt;
&lt;li&gt;Features implemented in motrfile instead of the app.&lt;/li&gt;
&lt;li&gt;Features implemented inelegantly.&lt;/li&gt;
&lt;li&gt;Some of the code I wrote is kind of disorganized and tangled-up.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, I'm starting this post early.
I'll take a break for now and come back to it tonight.&lt;/p&gt;
&lt;p&gt;All right, right off the bat it's failing, and the failure looks, I think, more or less how I want it to at this level.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="x"&gt;MOTRError &amp;gt; The MOTRfile at /home/maxchase/Documents/synched/motr/motr/motrfile.py encountered the following exception:&lt;/span&gt;
&lt;span class="gt"&gt;Traceback (most recent call last):&lt;/span&gt;
  File &lt;span class="nb"&gt;&amp;quot;/home/maxchase/.pyenv/versions/3.9.4/envs/motr-dev/lib/python3.9/site-packages/motr/controllers/base.py&amp;quot;&lt;/span&gt;, line &lt;span class="m"&gt;127&lt;/span&gt;, in &lt;span class="n"&gt;_default&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;compiled_code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;motr_globals&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  File &lt;span class="nb"&gt;&amp;quot;/home/maxchase/Documents/synched/motr/motr/motrfile.py&amp;quot;&lt;/span&gt;, line &lt;span class="m"&gt;252&lt;/span&gt;, in &lt;span class="n"&gt;&amp;lt;module&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;MOTR_CONFIG&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;changes&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  File &lt;span class="nb"&gt;&amp;quot;/home/maxchase/.pyenv/versions/3.9.4/envs/motr-dev/lib/python3.9/site-packages/motr/_api/build.py&amp;quot;&lt;/span&gt;, line &lt;span class="m"&gt;9&lt;/span&gt;, in &lt;span class="n"&gt;build&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;requirement&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;requirements&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  File &lt;span class="nb"&gt;&amp;quot;/home/maxchase/Documents/synched/motr/motr/motrfile.py&amp;quot;&lt;/span&gt;, line &lt;span class="m"&gt;133&lt;/span&gt;, in &lt;span class="n"&gt;changes&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;flake8_report_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reports_dir&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;flake8&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gr"&gt;AttributeError&lt;/span&gt;: &lt;span class="n"&gt;module &amp;#39;motr.api&amp;#39; has no attribute &amp;#39;Input&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This error is a consequence of the actual application pulling ahead of the prototype motrfile.
I confess I'm not sure whether I should change the motrfile to retrieve the class from the &amp;quot;correct&amp;quot; module, or re-do the export to make &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; explicitly part of the api surface.&lt;/p&gt;
&lt;p&gt;Thinking about this, I think I want to divide the &lt;tt class="docutils literal"&gt;api&lt;/tt&gt; module into different &amp;quot;levels&amp;quot;.
Like, ideally, you should be able to work with high-level prefab stuff (which... isn't written yet), and have the option to drop down to lower levels of abstraction to write similar but different high-level abstractions.&lt;/p&gt;
&lt;p&gt;I don't want to rush into this, so I'm going to sleep on it for now and get back to the other &amp;quot;secret&amp;quot; project.&lt;/p&gt;
&lt;p&gt;(Probably the right thing to do to start with is to fit the motrfile to the current interfaces, so I can tell which bits most need to change.)
Anyway, that's enough planning for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Site Design 2021-08-08</title><link href="https://mwchase.neocities.org/site-design-2021-08-08" rel="alternate"></link><published>2021-08-08T04:00:00-04:00</published><updated>2021-08-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-08-08:/site-design-2021-08-08</id><summary type="html">&lt;p class="first last"&gt;Planning and research pays off. As well as testing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Stylesheet is updated, and I made a few tweaks to the templates since I'm re-uploading literally every page anyway.
The most obvious change is that the page now queries for dark mode preference.
There are some extremely minor tweaks to navigation templating on the index pages.
Lastly, every change I think I'll need for the secret project is in there.
If you're really curious, you could try to, like, data mine the CSS or the SCSS files.&lt;/p&gt;
&lt;p&gt;I haven't actually checked whether &lt;em&gt;light mode&lt;/em&gt; still works because I'm being lazy, but, like, it's probably fine.
(Please contact me via the Mastodon account below if something is, in fact, not fine, or if you have any suggestions.
Or, questions?
I'm not sure what questions I can field beyond &amp;quot;Why the heck did you do such-and-such thing like &lt;em&gt;that&lt;/em&gt;?&amp;quot;)&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to publish this and then see if there are any show-stopping issues preventing the task runner code from releasing as 0.1.0.
I'll get back to this in a few days.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Blog Setup"></category></entry><entry><title>Sneak Peek 2021-08-07</title><link href="https://mwchase.neocities.org/sneak-peek-2021-08-07" rel="alternate"></link><published>2021-08-07T04:00:00-04:00</published><updated>2021-08-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-08-07:/sneak-peek-2021-08-07</id><summary type="html">&lt;p class="first last"&gt;I'm sorry to anyone who downloads the SVG of the figures, and gets slapped in the face with nonsense.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, slight changes of plans.
I figured out how to make inline svg stuff work with the structure of my figures file, &lt;em&gt;mostly&lt;/em&gt;.
I did have to reorganize and resize the diagrams, because I'm too lazy to specify viewport information (it's the difference between putting the same few numbers into the document and being done with it, and squinting at the arbitrary weirdness that pops out of positioning these elements by hand), but that wasn't too bad.
Thinking about what comes next, it's probably best for me to get a draft put together now, so I can have something to look at while I iterate over the stylesheet changes.&lt;/p&gt;
&lt;p&gt;I'll do that in the morning, because apparently the diagram-rearrangement, while not especially hard, was somewhat time-consuming.&lt;/p&gt;
&lt;p&gt;I'm also planning to release the, like, pre-pre-pre-pre-pre-pre-pre-pre-pre-alpha of the task runner tomorrow, so that'll be... interesting.&lt;/p&gt;
&lt;p&gt;I'd better get some sleep so I can face the tasks I set for myself.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Sneak Peek"></category></entry><entry><title>Sneak Peek 2021-08-06</title><link href="https://mwchase.neocities.org/sneak-peek-2021-08-06" rel="alternate"></link><published>2021-08-06T04:00:00-04:00</published><updated>2021-08-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-08-06:/sneak-peek-2021-08-06</id><summary type="html">&lt;p class="first last"&gt;That was some good zoning-out-in-front-of-Inkscape time.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I believe I have all diagrams basically put together.
They're kind of janky, but it's better to push ahead than to tweak them right now.
If I have time, I'll rework them.
The steps to follow now:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Create files to &lt;tt class="docutils literal"&gt;&amp;lt;use/&amp;gt;&lt;/tt&gt; each diagram. I wanted to believe I could just trivially inline this into the article so I don't need two dozen tiny, nearly-identical files, but I put in the effort testing ways to do that, and I failed, so, again, going to prioritize getting ahead for now.&lt;/li&gt;
&lt;li&gt;Update the stylesheets. Timeboxed to two days. Hopefully done in one.&lt;/li&gt;
&lt;li&gt;Draft the post, spot check any obvious issues.&lt;/li&gt;
&lt;li&gt;Show to my wife for review.&lt;/li&gt;
&lt;li&gt;Frantic editing pass.&lt;/li&gt;
&lt;li&gt;Lock content, renew polish.&lt;/li&gt;
&lt;li&gt;Post intro.&lt;/li&gt;
&lt;li&gt;Post first post proper.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Okay, I want to be done for tonight, and I'm too tired to decide how to end this, so I'm once again going to just slam headlong into the end of the post.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Sneak Peek"></category></entry><entry><title>Sneak Peek 2021-08-05</title><link href="https://mwchase.neocities.org/sneak-peek-2021-08-05" rel="alternate"></link><published>2021-08-05T04:00:00-04:00</published><updated>2021-08-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-08-05:/sneak-peek-2021-08-05</id><summary type="html">&lt;p class="first last"&gt;Hopefully I'll be in a very different place on this in a week or so.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;(I'll link into the new category from the last Sneak Peek for it, once I start posting in it.)&lt;/p&gt;
&lt;p&gt;So, I put together a few more diagrams for the project that I need to finish in... basically two weeks.
This is going to be interesting.&lt;/p&gt;
&lt;p&gt;I wish I'd realized earlier how well Inkscape fits with the kind of visual editing that I've wanted to do.
It's so nice to just drop into the XML and edit it directly, which is probably a sentence that nobody has said before.&lt;/p&gt;
&lt;p&gt;Let's take a quick low-spoiler tour of the diagram elements I still need to make:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;A square with a dashed outline.&lt;/li&gt;
&lt;li&gt;The letters &amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;, and &amp;quot;D&amp;quot;.&lt;/li&gt;
&lt;li&gt;An existing diagram element with those letters attached to the points.&lt;/li&gt;
&lt;li&gt;A gridded square with two sides labeled by those letters.&lt;/li&gt;
&lt;li&gt;A diagonal line&lt;/li&gt;
&lt;li&gt;An existing diagram element, mirrored and with part of it colored differently.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That all should be pretty manageable if I just take an afternoon to work on it rather than doing it literally the last thing before I go to bed.&lt;/p&gt;
&lt;p&gt;Speaking of which...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Sneak Peek"></category></entry><entry><title>Site Design 2021-08-04</title><link href="https://mwchase.neocities.org/site-design-2021-08-04" rel="alternate"></link><published>2021-08-04T04:00:00-04:00</published><updated>2021-08-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-08-04:/site-design-2021-08-04</id><summary type="html">&lt;p class="first last"&gt;How do people feel about BEM at this point? Wait, no, I don't think I actually care.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Oh wow, this is all kinds of a blast from the past.
I used to tell you what was in the post before you read it.
What decadence.&lt;/p&gt;
&lt;p&gt;Anyway, I'm breaking out this old category because I need to touch my CSS definitions again for a few reasons.&lt;/p&gt;
&lt;p&gt;One reason is that I want to support &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;prefers-color-scheme&lt;/span&gt;&lt;/tt&gt; so my wife can look at this site without her night mode extension turning the background a weird brown color.&lt;/p&gt;
&lt;p&gt;The follow-on reason is, one of the projects I'm working on is going to need a bunch of diagrams to illustrate its concepts, and if &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;prefers-color-scheme&lt;/span&gt;&lt;/tt&gt; is in place, those diagrams need to handle that.
And I think the easiest (for some value of &amp;quot;easiest&amp;quot;) way for me to handle that is to use svg files for the diagrams, and add classes to them so I can style them with the site CSS.&lt;/p&gt;
&lt;p&gt;(Get ready for a &lt;tt class="docutils literal"&gt;fun&lt;/tt&gt; time, Neocities!
My site generator forces cache invalidation of stylesheets by changing the link in the generated pages, so I'm going to need to re-upload &lt;em&gt;my entire blog&lt;/em&gt; when I update the style.
As such, I want to make sure I have this &lt;em&gt;right&lt;/em&gt; before I push it.)&lt;/p&gt;
&lt;p&gt;Here are my notes on this so far:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I've got two placeholders to handle different-colored areas of the screen, &lt;tt class="docutils literal"&gt;%light&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;%dark&lt;/tt&gt;. In practice, they aren't accomplishing much, because each one is used just once, and in one case there's a nested modifier style that specifically expects to be under &lt;tt class="docutils literal"&gt;%dark&lt;/tt&gt;. I think a more correct way to handle this would be to have &amp;quot;main&amp;quot;/&amp;quot;inverse&amp;quot;, &amp;quot;&amp;quot;/&amp;quot;emphasized&amp;quot;, &amp;quot;text&amp;quot;/&amp;quot;background&amp;quot; variables that are populated by media selectors.&lt;/li&gt;
&lt;li&gt;I want to add a new &lt;tt class="docutils literal"&gt;figure&lt;/tt&gt; block, with &lt;tt class="docutils literal"&gt;shape&lt;/tt&gt; elements, and modifiers like &lt;tt class="docutils literal"&gt;background&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;fill-red&lt;/span&gt;&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;stroke-blue&lt;/span&gt;&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;emphasized&lt;/tt&gt;. I may rework this scheme a bit, we'll see.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To be honest, I'll probably table this for now and focus on the content for the posts that will need this, because if I finish the post but not the CSS by the deadline, it'll look a little bad but be readable, but if it's the other way around, then the post won't exist.
I think the one thing I want to work out is the division of elements, because I need to mark up the svg file by hand to have the class data.&lt;/p&gt;
&lt;p&gt;I'll think about that for a bit after I publish this.
Which I want to do now, so I don't have an excuse to be up super late.&lt;/p&gt;
&lt;p&gt;(PS: Just decided it should be &lt;tt class="docutils literal"&gt;line&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;fill&lt;/tt&gt; elements, and &lt;tt class="docutils literal"&gt;emphasized&lt;/tt&gt; can only apply to &lt;tt class="docutils literal"&gt;line&lt;/tt&gt; elements.
That doesn't quite nail down everything, but it's a start.)&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Blog Setup"></category></entry><entry><title>Weekly Roundup 2021-08-03</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-08-03" rel="alternate"></link><published>2021-08-03T04:00:00-04:00</published><updated>2021-08-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-08-03:/weekly-roundup-2021-08-03</id><summary type="html">&lt;p class="first last"&gt;If I don't ship this, it basically doesn't exist, so... I'll get on that this week.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I started trying to work out how to support multiple Python versions, and came up with a solution that I didn't quite like.&lt;/li&gt;
&lt;li&gt;Thursday: I took a break from the task runner. Focused on some other projects and code.&lt;/li&gt;
&lt;li&gt;Friday: I described some of code I was messing with. I didn't put the code up because I couldn't convince myself it all works properly.&lt;/li&gt;
&lt;li&gt;Saturday: I started to refactor the task runner internals so the names make more sense.&lt;/li&gt;
&lt;li&gt;Sunday: I finished and explained the refactoring.&lt;/li&gt;
&lt;li&gt;Monday: I looked over the way the config prototype handles virtual environments, and found it lacking.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to keep on focusing on the secret project: creating diagrams and doing editing passes, as well as filling in one last section.
Over the weekend, I'm going to clean up the task runner config prototype, and then publish an 0.1.0 version.
The higher-level interfaces basically don't exist, but I've decided that if I can prove that it's &lt;em&gt;possible&lt;/em&gt; to usefully run this code, that's good enough for an initial release.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2021-08-02</title><link href="https://mwchase.neocities.org/coding-2021-08-02" rel="alternate"></link><published>2021-08-02T04:00:00-04:00</published><updated>2021-08-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-08-02:/coding-2021-08-02</id><summary type="html">&lt;p class="first last"&gt;I could imagine years-long-arguments over some of the stuff I'm deliberating over. Software development does things to people.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I mostly took things easy today, did some work just now on one of my secret-ish projects.&lt;/p&gt;
&lt;p&gt;Anyway, yesterday I mentioned not being happy with the &lt;tt class="docutils literal"&gt;Venv&lt;/tt&gt; class in the configuration prototype.
That is because of its public interface.
It has four functions:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;create()&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;update()&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;install(*args)&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;command(cmd)&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And it only makes sense to call them in that exact order.
(Basically, the filesystem is acting as hidden global state.)
At the same time, there are reasons to want to vary some of these calls.&lt;/p&gt;
&lt;p&gt;Here's what I want for each stage, more or less:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Creation: this should have access to a &lt;tt class="docutils literal"&gt;root&lt;/tt&gt; global, a path value that, in future, should be possible to change for the duration of an app execution; it should have access to a unique name; it should have access to an optional Python version string; these two should be combined into a name that is used for any &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt;s, and this name should combine with the root to create a path object pointing to a bin dir.&lt;/li&gt;
&lt;li&gt;Updating: this needs access to the action name and the bin dir from the previous step; it should produce the path to pip, alongside the action name and bin dir.&lt;/li&gt;
&lt;li&gt;Installation: this uses the action name and the pip path; it should produce the bin dir and the name of its &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Command registration: this uses the bin dir and the name of the installation action.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From this, I can put together a rough sketch of helpful data types:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;CreationResult&lt;/tt&gt; with fields for &amp;quot;action name&amp;quot; and &amp;quot;bin dir&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;UpdateResult&lt;/tt&gt; with fields for &lt;tt class="docutils literal"&gt;CreationResult&lt;/tt&gt; and &amp;quot;pip path&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;InstallationResult&lt;/tt&gt; with fields for, either &amp;quot;bin dir&amp;quot; and specific action name, or specific action name and &lt;tt class="docutils literal"&gt;CreationResult&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm unsure which of those last options makes more sense.
I don't want to move forward on this until I have an answer that I find satisfying.&lt;/p&gt;
&lt;p&gt;Anyway, I don't want to let things go any later, I'm pushing myself as is.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-08-01</title><link href="https://mwchase.neocities.org/coding-2021-08-01" rel="alternate"></link><published>2021-08-01T04:00:00-04:00</published><updated>2021-08-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-08-01:/coding-2021-08-01</id><summary type="html">&lt;p class="first last"&gt;And introducing: Me, but using smilies in a somewhat unsettling manner!&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I finished the refactoring/rewrite from yesterday, and now I'm not quite sure what I want to work on next.
As such, I think I'll take a bit more of a break, and try to review everything that's in the code with fresh eyes when I get back to it.&lt;/p&gt;
&lt;p&gt;Hm, I've got time, I might as well try to describe what I did.&lt;/p&gt;
&lt;p&gt;So, the original interface for the &lt;tt class="docutils literal"&gt;Registry&lt;/tt&gt; objects was a collection of fluent methods that took some set of arguments (with varying aspects of optional and variable arguments).
My goal, which I've stuck to, was to abstract out the &lt;tt class="docutils literal"&gt;Registry&lt;/tt&gt; object from the act of modifying it.
I defined several helper classes that carry minimal amounts of data, and wrote private handler methods to convert instances of helper methods into a modification of the &lt;tt class="docutils literal"&gt;Registry&lt;/tt&gt; object.
I then used &lt;tt class="docutils literal"&gt;singledispatchmethod&lt;/tt&gt; to collapse the private handlers into a single public fluent interface.
However, the existence of this fluent method is an implementation detail, and the intended public interface is to use a &lt;tt class="docutils literal"&gt;build&lt;/tt&gt; function that accepts an iterable of objects that can be passed to the fluent method, and applies them in order.
The private helpers are on the class, because it's their responsibility to maintain the class invariants.
(For example, there can't be cycles, because I'm pretty sure a cycle would deadlock the application.)&lt;/p&gt;
&lt;p&gt;The key thing I changed was to stop talking about the helper classes as &lt;tt class="docutils literal"&gt;Change&lt;/tt&gt;s, and calling the fluent function &lt;tt class="docutils literal"&gt;change&lt;/tt&gt;.
Now, they're &lt;tt class="docutils literal"&gt;Requirement&lt;/tt&gt;s and &lt;tt class="docutils literal"&gt;require&lt;/tt&gt;.
The main problem with the original names was that, to the extent that they communicated anything, what they communicated was kind of wrong.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What are they?&lt;/p&gt;
&lt;p&gt;They're changes to the registry.&lt;/p&gt;
&lt;p&gt;What kind of changes to the registry?&lt;/p&gt;
&lt;p&gt;The kinds of changes that can be made to the registry :)&lt;/p&gt;
&lt;p&gt;So, if I change the registry with a change, then I get a different registry?&lt;/p&gt;
&lt;p&gt;Usually :)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In other words, they're an unspecified kind of change, that doesn't always change things.
The name &lt;tt class="docutils literal"&gt;Requirement&lt;/tt&gt; is somewhat more precise, in that most of them describe some form of dependency link between different types of object.
And the name &lt;tt class="docutils literal"&gt;require&lt;/tt&gt; makes it at least somewhat clear that this is about imposing a requirement, not changing state &lt;em&gt;per se&lt;/em&gt;.
If you need eggs and then you need eggs, then you still need eggs, you know?&lt;/p&gt;
&lt;p&gt;I also renamed the &lt;tt class="docutils literal"&gt;Requirement&lt;/tt&gt; classes to basically be a sequence of nouns describing their fields, rather than a verb phrase.
So, &lt;tt class="docutils literal"&gt;ActionName&lt;/tt&gt; instead of &lt;tt class="docutils literal"&gt;AddAction&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;ActionOutput&lt;/tt&gt; instead of &lt;tt class="docutils literal"&gt;AddTarget&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;ActionInput&lt;/tt&gt; instead of &lt;tt class="docutils literal"&gt;AddInput&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;TargetName&lt;/tt&gt; instead of &lt;tt class="docutils literal"&gt;NameTarget&lt;/tt&gt;, and &lt;tt class="docutils literal"&gt;SkippedName&lt;/tt&gt; instead of &lt;tt class="docutils literal"&gt;SkipName&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Honestly, naming things sucks so much that I'm in no way sure if these new names are &lt;em&gt;good&lt;/em&gt;, but I'm pretty confident they're &lt;em&gt;better&lt;/em&gt;.
There is a bit of weirdness in that, outside of &lt;tt class="docutils literal"&gt;ActionName&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt; refers to the &lt;tt class="docutils literal"&gt;Name&lt;/tt&gt; part of &lt;tt class="docutils literal"&gt;ActionName&lt;/tt&gt;.
Still, they're better than what I had before; maybe I'll come up with some further improvement; we'll see.&lt;/p&gt;
&lt;p&gt;Oh, also, I'm a big fan of the high-level noun and verb being merely morphologically related, rather than just &lt;em&gt;the exact same word&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Anyway, &lt;em&gt;probably&lt;/em&gt; the next thing I should work on is the virtual environment creation primitive.
I'm not quite happy with what the prototype has going on, where I tried to make the individual functions limited in scope, but it honestly only makes sense to call them in one order.
Maybe I can work out some form of chained evaluation that makes things a little clearer.&lt;/p&gt;
&lt;p&gt;I'll come back to this idea later.
For now, I should get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-07-31</title><link href="https://mwchase.neocities.org/coding-2021-07-31" rel="alternate"></link><published>2021-07-31T04:00:00-04:00</published><updated>2021-07-31T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-07-31:/coding-2021-07-31</id><summary type="html">&lt;p class="first last"&gt;At least I'm enjoying myself.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Quick entry today because I got distracted refactoring the task runner internals so the names make more sense.&lt;/p&gt;
&lt;p&gt;What did I do?
Well, I... I refactored the task runner internals so the names make more sense.
To be precise, I &lt;em&gt;started&lt;/em&gt;.
I'm not done fixing the types, and I'll definitely need to tweak the tests to some degree.&lt;/p&gt;
&lt;p&gt;Anyway, I don't want to dawdle, this is already late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2021-07-30</title><link href="https://mwchase.neocities.org/diary-2021-07-30" rel="alternate"></link><published>2021-07-30T04:00:00-04:00</published><updated>2021-07-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-07-30:/diary-2021-07-30</id><summary type="html">&lt;p class="first last"&gt;I don't know if the labels I put on these really mean anything at this point...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Work is a little calmer (&lt;em&gt;for now&lt;/em&gt;), so I'm... doing better.
I need to stand up more, lest I mess up my torso muscles.
Or torso something.
Predictable surface-level chest pains, eugh.&lt;/p&gt;
&lt;p&gt;Anyway, I spent some time today messing with the code I was talking about earlier.
The basic idea was to try to code the &lt;a class="reference external" href="https://marctenbosch.com/quaternions/"&gt;geometric product&lt;/a&gt; concept in Python in a way that used very little code.
I ran into a few issues, which I'll lay out after I explain the basic principle.&lt;/p&gt;
&lt;p&gt;So, something that becomes clear from reading that article is, once you have the basis (uni?)vectors for a space, then the higher- and lower- dimensional bases will either contain a given basis vector or will not, and this partitions the bases in half as many times as there are basis vectors.
One way to act on this division is to divide them into groups of &amp;quot;does not contain the last basis&amp;quot; and &amp;quot;does contain the last basis&amp;quot;.
But this process can be repeated until it's just dividing two numbers from each other, based on whether they're associated with the first basis.&lt;/p&gt;
&lt;p&gt;I represented this in code with a class that represents such a basis division, and therefore contains two objects of identical type, the first being &amp;quot;everything that does not contain the relevant basis vector&amp;quot;, and the second being &amp;quot;everything that does&amp;quot;.
So, the second element is effectively multiplied at the end by a basis that comes after every element it contains, and therefore doesn't need to negate anything.&lt;/p&gt;
&lt;p&gt;Getting this object to multiply requires the definition of a function that negates every sub-element associated with an odd number of basis vectors.
I think.
One of the obstacles I hit was that it's kind of hard to reason, first about what this code should even do for even very basic cases, and second, how to scale it up arbitrarily.
It golfed the code to make it negate the vector component at the same level, then &lt;em&gt;subtract&lt;/em&gt; the result in the actual multiplication.
(So the more dot-product-y part of the multiplication is a &lt;em&gt;difference&lt;/em&gt; of products...)&lt;/p&gt;
&lt;p&gt;I imagine that didn't make too much sense.
Part of the problem with all of this is that, currently, I'm not sure I understand the concepts I'm trying to represent well enough to evaluate my representation.
The 3-vector multiplication example from Marc ten Bosch's article does come through properly, which is encouraging.&lt;/p&gt;
&lt;p&gt;The final issue I have with all of this is how incredibly sparse the general representation is.
A non-generic representation for 3-vectors requires eight &amp;quot;leaves&amp;quot; for all data, while a specialized representation requires three leaves for vectors and four leaves for rotors.
So, this is acceptable for prototyping, though the possibilities of extending it into higher dimensions are kind of slowed down by the exponential blowup in memory consumption.
(Even if the leaves are mostly memoized, there's still the intermediate nodes to contend with, unless those are also memoized.)&lt;/p&gt;
&lt;p&gt;After I said all that, though, I something occurred to me.
It seems to me unreasonable to expect a statically typed, compiled language to specialize a concrete type based on the specific values it contains, but what if the specialized types were user-generated, but delegated their implementations to the generic version?
Then, &lt;em&gt;potentially&lt;/em&gt;, inlining and constant propagation could essentially destructure the generic types into data flows at compile time, generating a correct implementation of geometric algebra operations for the specific types, without needing any specifically-written arithmetic.
This sounds like a neat trick, and I'd imagine someone has already tried something along these lines, and maybe gotten it to work.&lt;/p&gt;
&lt;p&gt;I'll have to poke around with that more later, but I should wrap up for now.
Eh, it's all set, best get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2021-07-29</title><link href="https://mwchase.neocities.org/diary-2021-07-29" rel="alternate"></link><published>2021-07-29T04:00:00-04:00</published><updated>2021-07-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-07-29:/diary-2021-07-29</id><summary type="html">&lt;p class="first last"&gt;Things continue to suck, but maybe some of these external conditions will turn around?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got a definite feeling I should take a break from the task runner stuff.
I don't know where I am in terms of burnout, but some kind of instinct is kicking in, and I'm trying to listen to it.&lt;/p&gt;
&lt;p&gt;I don't know, it's this... feeling of a haze?
I guess?
Somehow, these mental states feel like something.
Like a physical sensation.&lt;/p&gt;
&lt;p&gt;Anyway, to have something to do, I'm focusing on the secret project, which is writing with somewhat of a deadline.
I'm closing in on the end of the rough draft, after which I'll start working on illustrations and start doing editing passes.
It feels so strange to get back into doing this sort of thing, but I'm interested to see where it goes.&lt;/p&gt;
&lt;p&gt;Some of the stuff I was thinking about related to this project inspired me to think about some coding stuff very different from the task runner, so I messed with that a bit, and my initial prototypes completely failed, so that's interesting.
I have some guesses about how I might fix it, but I need to do some working-out on paper before I try anything else.
I'll mess with that after this entry publishes, which I should do ASAP.&lt;/p&gt;
&lt;p&gt;This is the end of the blog post.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2021-07-28</title><link href="https://mwchase.neocities.org/coding-2021-07-28" rel="alternate"></link><published>2021-07-28T04:00:00-04:00</published><updated>2021-07-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-07-28:/coding-2021-07-28</id><summary type="html">&lt;p class="first last"&gt;Software that might end up being situated just because it turns out nobody else feels like trying to learn it...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;As I thought more and more about how to handle multiple Python versions, I realized that I needed a concrete example to really ground things.
So, I'm going to take the previous code, strip the comments out, and try to figure out the &amp;quot;proper&amp;quot; way to extend it for multiple versions.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@attr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataclass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frozen&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Flake8HTML&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;additional_args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tuple&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;python_versions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tuple&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;typing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,)&lt;/span&gt;  &lt;span class="c1"&gt;# For checking syntax changes across Python versions, I guess.&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__call__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;projects&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Project&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ROOT&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ChangeStream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;python_versions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;report_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;REPORTS&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;flake8&amp;quot;&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;report_dir&lt;/span&gt; &lt;span class="o"&gt;/=&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;

            &lt;span class="n"&gt;flake8&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;yield from&lt;/span&gt; &lt;span class="n"&gt;venv_wrapper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;check&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;flake8&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;check&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;projects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
                &lt;span class="n"&gt;project_report_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;suffix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;report_dir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

                &lt;span class="n"&gt;project_report_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;project_report_dir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;index.html&amp;quot;&lt;/span&gt;

                &lt;span class="n"&gt;action_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;check&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

                &lt;span class="k"&gt;yield from&lt;/span&gt; &lt;span class="n"&gt;mkdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;project_report_dir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;yield from&lt;/span&gt; &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="p"&gt;[&lt;/span&gt;
                        &lt;span class="n"&gt;flake8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="s2"&gt;&amp;quot;--format=html&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="s2"&gt;&amp;quot;--htmldir&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="n"&gt;project_report_dir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;additional_args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;src&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                        &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tests&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                    &lt;span class="p"&gt;],&lt;/span&gt;
                    &lt;span class="n"&gt;action_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;allowed_codes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;yield from&lt;/span&gt; &lt;span class="n"&gt;add_target&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;project_report_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;check&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Most of the code is the same, but the differences are instructive.
Because I'm generating a separate set of reports for each Python version, I can't do something like dependency-inject the virtual environment creation step, because then a bunch of registry entries collide.
It's a little unfortunate that there's no &amp;quot;generic&amp;quot; way to specify Python versions, but something like a coverage run is going to invoke different environments at different &amp;quot;stages&amp;quot;, and it's not clear to me how to separate that out, unless...&lt;/p&gt;
&lt;p&gt;I just drew some inspiration from the fact that some of my projects use my &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;limit-coverage&lt;/span&gt;&lt;/tt&gt; tool and some don't.
So, maybe I want to decompose some of these complicated runs into specialized types that nest each other in a carefully chosen way.
If I enforce an idea of one (lexical) environment call per type, then however I specify the Python environment is unambiguous as to what it refers to.
Because the projects should be the same over the course of a call, but each thing handling the call can vary its environments, I think what I want is to standardize on an attribute for everything containing a (lexical) call, or maybe some kind of accessor function?
I'll have to try this out later, when I'm not wiped out from traveling or apprehensive about work.&lt;/p&gt;
&lt;p&gt;It's pretty instructive how many of the ideas I had when I was thinking about &amp;quot;supporting multiple Python versions&amp;quot; in abstract terms, proved too unworkable to bother prototyping, when I took a look at actual (-ish) code.&lt;/p&gt;
&lt;p&gt;I don't know when I'll be up for working on this again, so I think I should make myself take a break, at least until work calms down a little.&lt;/p&gt;
&lt;p&gt;(But wait, if the &amp;quot;correct&amp;quot; implementation at that point is always a big for loop, then it should just be taking a single version, and the for loop should be lifted out to... somewhere.
Or the version should be made part of the call interface, and then there's a wrapper type that composes a list of versions to make it more session-y.
I guess I'm not done thinking about this.)&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2021-07-27</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-07-27" rel="alternate"></link><published>2021-07-27T04:00:00-04:00</published><updated>2021-07-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-07-27:/weekly-roundup-2021-07-27</id><summary type="html">&lt;p class="first last"&gt;Getting into the useful but sometimes-boring bits of this work...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I made the imports in the task runner code consistent. I'm still not sure if I &lt;em&gt;like&lt;/em&gt; the result, but it's consistent. I worked on some further factoring-out to make it easier to rewrite the &lt;tt class="docutils literal"&gt;Registry&lt;/tt&gt; again if I need to.&lt;/li&gt;
&lt;li&gt;Thursday: I did some late night refactoring. I don't actually remember, but I'm pretty sure I regretted it in the morning.&lt;/li&gt;
&lt;li&gt;Friday: I figured out how to separate the codebase into layers.&lt;/li&gt;
&lt;li&gt;Saturday: I was generally tired after a few hours on the road, and then had to deal with, well, rural internet infrastructure.&lt;/li&gt;
&lt;li&gt;Sunday: I didn't get much concrete done, but I did start planning the initial layering.&lt;/li&gt;
&lt;li&gt;Monday: I put together a &amp;quot;basic&amp;quot; class prototype for the higher-level constructs. I don't know what anyone else thinks of it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to push ahead with this, but there are a few other things that might end up being easier for me to work on.
We'll see.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2021-07-26</title><link href="https://mwchase.neocities.org/coding-2021-07-26" rel="alternate"></link><published>2021-07-26T04:00:00-04:00</published><updated>2021-07-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-07-26:/coding-2021-07-26</id><summary type="html">&lt;p class="first last"&gt;Code samples that either cause everything I've been talking about to make much more, or much less, sense.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's try to speedrun this post and go back to playing Understand for a bit.
No touching the code; that's a sucker's game on this network, this late at night.&lt;/p&gt;
&lt;p&gt;Earlier today, I got my &lt;tt class="docutils literal"&gt;cmd&lt;/tt&gt; helper to work, through... somewhat blunt methods.&lt;/p&gt;
&lt;p&gt;In any case, the next layer to bring in is the virtual environments, and I sense I should try a little harder to plan this stuff out, because I've got use cases that I intend for the future that I won't be battle-testing as I work on the runner itself.&lt;/p&gt;
&lt;p&gt;One question I need to answer is whether I want to use the &lt;tt class="docutils literal"&gt;virtualenv&lt;/tt&gt; package &lt;em&gt;exclusively&lt;/em&gt; in the long term, or if I want to provide interfaces to &lt;tt class="docutils literal"&gt;venv&lt;/tt&gt; as well.
Since I definitely want &lt;tt class="docutils literal"&gt;virtualenv&lt;/tt&gt; to be usable, I'm not sure if &lt;tt class="docutils literal"&gt;venv&lt;/tt&gt; offers anything besides &amp;quot;you don't have to install another package&amp;quot;.
I mean, this project already has a few transitive dependencies.&lt;/p&gt;
&lt;p&gt;I think the way forward is to add the dependency, and adapt my &lt;tt class="docutils literal"&gt;Venv&lt;/tt&gt; class from the config prototype with an &lt;tt class="docutils literal"&gt;Optional[str]&lt;/tt&gt; &lt;tt class="docutils literal"&gt;python&lt;/tt&gt; attribute.
Then start cribbing code from Nox or tox to convert that into a usable path in a cross-platform fashion.&lt;/p&gt;
&lt;p&gt;Now, whether a &lt;tt class="docutils literal"&gt;Session&lt;/tt&gt; needs a &lt;tt class="docutils literal"&gt;python&lt;/tt&gt; argument (or multiple &lt;tt class="docutils literal"&gt;python&lt;/tt&gt; arguments) is a function of its semantics, so that shouldn't be a part of the &lt;tt class="docutils literal"&gt;Protocol&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Let's sketch out a &lt;tt class="docutils literal"&gt;Flake8HTML&lt;/tt&gt; class.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@attr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataclass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frozen&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Flake8HTML&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;additional_args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tuple&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="c1"&gt;# I&amp;#39;m using a bad default argument because I don&amp;#39;t want to bring in the machinery needed for an immutable map.&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__call__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;projects&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Project&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ROOT&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ChangeStream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;report_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;REPORTS&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;flake8&amp;quot;&lt;/span&gt;

        &lt;span class="c1"&gt;# This is a higher-level wrapper that is specific to my current preferred project structure.&lt;/span&gt;
        &lt;span class="c1"&gt;# The first argument is the name to use for the various Targets and Actions&lt;/span&gt;
        &lt;span class="c1"&gt;# The second argument is the name of the command to export from the virtualenv&lt;/span&gt;
        &lt;span class="c1"&gt;# The third argument is the name of the requirements file to install&lt;/span&gt;
        &lt;span class="c1"&gt;# I expect this to change by the time all of this code is ready to use, since the concept of&lt;/span&gt;
        &lt;span class="c1"&gt;# &amp;quot;module command plus module runner&amp;quot; better fits a variable number of requirements files&lt;/span&gt;
        &lt;span class="n"&gt;flake8&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;yield from&lt;/span&gt; &lt;span class="n"&gt;venv_wrapper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;check&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;flake8&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;check&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;projects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="n"&gt;project_report_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;suffix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;report_dir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# suffix() probably returns an Input&lt;/span&gt;

            &lt;span class="c1"&gt;# This is a common pattern that I may want a helper function for.&lt;/span&gt;
            &lt;span class="n"&gt;project_report_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;project_report_dir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;index.html&amp;quot;&lt;/span&gt;

            &lt;span class="c1"&gt;# This might not be the right way to handle this&lt;/span&gt;
            &lt;span class="c1"&gt;# (I&amp;#39;m really not sure)&lt;/span&gt;
            &lt;span class="c1"&gt;# But it&amp;#39;s close enough for now&lt;/span&gt;
            &lt;span class="n"&gt;action_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;check&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="k"&gt;yield from&lt;/span&gt; &lt;span class="n"&gt;mkdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;project_report_dir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;yield from&lt;/span&gt; &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="p"&gt;[&lt;/span&gt;
                    &lt;span class="n"&gt;flake8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="s2"&gt;&amp;quot;--format=html&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="s2"&gt;&amp;quot;--htmldir&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;project_report_dir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;additional_args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;src&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                    &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tests&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="n"&gt;action_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;allowed_codes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;yield from&lt;/span&gt; &lt;span class="n"&gt;add_target&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;project_report_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;check&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This all basically provides a basic example of how the interfaces involved should probably work, because this is about the least complicated thing you can do while still leveraging the &lt;tt class="docutils literal"&gt;Project&lt;/tt&gt; interface.
So, whatever I end up with, it should support writing something like this without additional complication.&lt;/p&gt;
&lt;p&gt;Handling stuff like different python versions or commands that need the project installed would add those as arguments to the &lt;tt class="docutils literal"&gt;venv_wrapper&lt;/tt&gt; call and move it into a for loop.&lt;/p&gt;
&lt;p&gt;Maybe it would help things to have some kind of an &amp;quot;environment builder&amp;quot; interface that could be passed into the session to handle the environment creation.
That way, people, such as my future self, wouldn't need to lay out all of their projects in the exact same way.&lt;/p&gt;
&lt;p&gt;So, if I can nail down that interface, then I'll be getting somewhere.&lt;/p&gt;
&lt;p&gt;Anyway, this as supposed to be quick and it... wasn't.
If I don't call this now, I'm pretty much guaranteed to suffer in the morning.
So...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-07-25</title><link href="https://mwchase.neocities.org/coding-2021-07-25" rel="alternate"></link><published>2021-07-25T04:00:00-04:00</published><updated>2021-07-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-07-25:/coding-2021-07-25</id><summary type="html">&lt;p class="first last"&gt;Smashing my modules into tiny pieces.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay.
Lots of stuff today, none of it related to my projects.
I'm not, like, sour or angry about this, but I am &lt;em&gt;exhausted&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Let's see what kind of changes I can make to my code.
I want to create an &lt;tt class="docutils literal"&gt;_api.changes&lt;/tt&gt; directory for holding the five, I mean four, functions for generating state change streams.
That type should probably go next to the other modules for now.&lt;/p&gt;
&lt;p&gt;&amp;quot;But wait, having like one function per module sounds kind of obnoxious.&amp;quot;
Until this hits 1.0, I don't think I'm really writing this code for anyone else, and even then, I can't say for sure.
So, my feelings on this are the only ones that matter, and my feelings are &amp;quot;Let's see what happens!&amp;quot;&lt;/p&gt;
&lt;p&gt;One thing that happens is that I need to think really hard about what gets imported into the &lt;tt class="docutils literal"&gt;api&lt;/tt&gt; module, now that it's all re-exports.&lt;/p&gt;
&lt;p&gt;Another thing that happens is, I start suspecting that I should be applying this pattern elsewhere, because it's a little obnoxious to make the required imports match up with the defining modules.&lt;/p&gt;
&lt;p&gt;It's all kind of a mess right now, and I'll try to get it to make sense tomorrow.
For now, it's late, and this post is going to take forever to publish, so I might as well get started.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2021-07-24</title><link href="https://mwchase.neocities.org/diary-2021-07-24" rel="alternate"></link><published>2021-07-24T04:00:00-04:00</published><updated>2021-07-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-07-24:/diary-2021-07-24</id><summary type="html">&lt;p class="first last"&gt;Five hours on the road. Ugh.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Traveled today, which kind of wiped me out for doing anything else.
I want to try messing around with code, but I'll publish this first, because I don't know if I can really trust the internet out here, and I can't supplement it with my phone; its data connection out here is... faster than residential internet &lt;em&gt;used to&lt;/em&gt; be.
Like 20+ years ago.&lt;/p&gt;
&lt;p&gt;Whatever, I'm not out here for the internet, I'm out here for &lt;strong&gt;family&lt;/strong&gt;.
*explosions or something*
(Did I do it right?)&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to call this post early because I have a headache and I don't want to push myself.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2021-07-23</title><link href="https://mwchase.neocities.org/coding-2021-07-23" rel="alternate"></link><published>2021-07-23T04:00:00-04:00</published><updated>2021-07-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-07-23:/coding-2021-07-23</id><summary type="html">&lt;p class="first last"&gt;Figuring out what the code should be...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Earlier today, I finished up some of the changes I was working on.
So, what can I do next...&lt;/p&gt;
&lt;p&gt;Keeping in mind that I am incredibly tired, let's see which files need to be broken up how.&lt;/p&gt;
&lt;p&gt;The &lt;tt class="docutils literal"&gt;api&lt;/tt&gt; module needs to be broken into several layers of abstraction, which must themselves be divided into smaller units of responsibility.
At the lowest level of abstraction in the module, there are five functions that directly interact with the stream-based interface to &lt;tt class="docutils literal"&gt;Rgistry&lt;/tt&gt; construction.
Two of these functions are somewhat related, but I don't think they're fundamentally more tightly coupled than any other pair.&lt;/p&gt;
&lt;p&gt;The next layer of abstraction is made up of three classes and their corresponding helper functions.
Each class represents a specific &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt;, and the helper function constructs an appropriately detailed change stream around an instance of its corresponding class.
This layer consumes a pair of data classes that represent the production and consumption of &lt;tt class="docutils literal"&gt;Target&lt;/tt&gt;s.&lt;/p&gt;
&lt;p&gt;The next layer on top of that specializes the usage of the above classes into helper classes/functions for setting up isolated execution environments.
Currently, this is just virtual environments via the stdlib &lt;tt class="docutils literal"&gt;venv&lt;/tt&gt;, but my long-term goals basically require a version of this using the pip-installable &lt;tt class="docutils literal"&gt;virtualenv&lt;/tt&gt; module.
Also, I could support other programming languages, probably.
(Possibly have a version that uses &lt;tt class="docutils literal"&gt;conda&lt;/tt&gt; instead of &lt;tt class="docutils literal"&gt;pip&lt;/tt&gt;.
If I come up with a really compelling reason.)&lt;/p&gt;
&lt;p&gt;Above that layer, I have the somewhat-implicit concept of clusters of specific Python packages that provide an executable and may require project code to be installed to work properly.&lt;/p&gt;
&lt;p&gt;Very sketchily above that layer, the idea of different wrappers around &lt;tt class="docutils literal"&gt;pytest&lt;/tt&gt;, to provide different functionality.
It makes sense, I think, to apply a similar structure to other test runners, and ideally the wrappers don't have to care about what code they happen to be wrapping.&lt;/p&gt;
&lt;p&gt;Anyway, that covers the &lt;tt class="docutils literal"&gt;api&lt;/tt&gt; module and the config prototype.
Beyond that, we have...&lt;/p&gt;
&lt;p&gt;The base controller, which has some not-terribly-related helper code in it that should be using plugins or extensions instead of what it's currently doing.&lt;/p&gt;
&lt;p&gt;While the &lt;tt class="docutils literal"&gt;registry&lt;/tt&gt; module is pretty big, I think I've pulled out everything that really makes sense.
I may want to create a &lt;tt class="docutils literal"&gt;Protocol&lt;/tt&gt; for the &lt;tt class="docutils literal"&gt;Registry&lt;/tt&gt; class, because I &lt;em&gt;think&lt;/em&gt; that would let me break some import cycles more elegantly, but that's still not a priority.&lt;/p&gt;
&lt;p&gt;The &lt;tt class="docutils literal"&gt;runner&lt;/tt&gt; module is probably the best place to put that &lt;tt class="docutils literal"&gt;Protocol&lt;/tt&gt; if/when I do make it.
It's got three main classes that are pretty thoroughly coupled together, but it would probably help make it more obvious what was going on if there were a simple helper method that filled in some of the expected values.
There's also a helper method that could easily go either in its own module, or the base controller, but I'm not sure it matters.&lt;/p&gt;
&lt;p&gt;The application defines a single extension module that should probably be split up into two or three.
Some of it deals with conditional formatting, and some of it deals with colored text, and some of it deals with conditionally applying colors to text.&lt;/p&gt;
&lt;p&gt;There are various other modules in the application, but the rest of them look pretty well broken down for now.&lt;/p&gt;
&lt;p&gt;I'm going to call this post here.
I don't know how much of a chance I'm going to get to work on any of this over the weekend, but I can't handle anything else right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-07-22</title><link href="https://mwchase.neocities.org/coding-2021-07-22" rel="alternate"></link><published>2021-07-22T04:00:00-04:00</published><updated>2021-07-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-07-22:/coding-2021-07-22</id><summary type="html">&lt;p class="first last"&gt;Mistakes were made. Not in the code, but with my time.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm having kind of a rough week, so I didn't get much coding done today.
Let's try moving around a type and see if I break everything.&lt;/p&gt;
&lt;p&gt;Hm, everything broke, time for plan B.
Plan B worked fine, at least for now.&lt;/p&gt;
&lt;p&gt;Several rounds of tinkering later, I realize that it's way late and I need to get to bed, but I really want to break out a few more modules.
Time for some bad decisions.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-07-21</title><link href="https://mwchase.neocities.org/coding-2021-07-21" rel="alternate"></link><published>2021-07-21T04:00:00-04:00</published><updated>2021-07-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-07-21:/coding-2021-07-21</id><summary type="html">&lt;p class="first last"&gt;Still figuring out which of my past decisions were bad, actually.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did a bunch of cleanup of the code today.
Mainly, I got all of the imports to be in a consistent format, and I rewrote a bunch of test code that was slightly more complicated than it needed to be, and twice as long.
This should help future rewrites, because I got rid of most &lt;tt class="docutils literal"&gt;from ... import&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;import ... as&lt;/tt&gt; statements, so I can't cause a name collision by adding more modules.&lt;/p&gt;
&lt;p&gt;Now I can ponder deep mysteries, like &amp;quot;The &lt;em&gt;implementation&lt;/em&gt; of the &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt; type is irrelevant to the module that explicitly depends on its existence, but it's not even named in the module that &lt;em&gt;does&lt;/em&gt; care about the implementation&amp;quot;.
I'm not sure how to reconcile that with the &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Single-responsibility_principle"&gt;single-responsibility principle&lt;/a&gt;, unless the solution is to make the classes involved generic and only use one type for their type parameter.
That sounds weird to me.&lt;/p&gt;
&lt;p&gt;I guess I could try moving the type definition, having an import cycle, and trying to make sure it's resolvable, but I'd much rather not have the cycle.&lt;/p&gt;
&lt;p&gt;Thinking about this more, I think what I want to do is convert the stuff I'm currently doing by reaching into the &lt;tt class="docutils literal"&gt;Registry&lt;/tt&gt; class into methods on a &lt;tt class="docutils literal"&gt;Protocol&lt;/tt&gt;, implement those methods on the concrete class, and then rely on the &lt;tt class="docutils literal"&gt;Protocol&lt;/tt&gt; and make the &lt;tt class="docutils literal"&gt;Registry&lt;/tt&gt; class attributes private.&lt;/p&gt;
&lt;p&gt;At the very least, I want to make the attributes private and have accessor methods on the &lt;tt class="docutils literal"&gt;Registry&lt;/tt&gt;; that would have made some previous changes easier.
Setting up the &lt;tt class="docutils literal"&gt;Protocol&lt;/tt&gt; and such is basically a flourish.
(Thinking about it, somehow, having a &lt;tt class="docutils literal"&gt;Protocol&lt;/tt&gt; with type parameters but the only concrete implementation fills all of them in feels less objectionable than a generic concrete class that only uses one parameter value in practice.)&lt;/p&gt;
&lt;p&gt;The methods so far would be:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Given a &lt;tt class="docutils literal"&gt;Target&lt;/tt&gt;, return the name of its parent &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Given the name of an &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt;, return the &lt;tt class="docutils literal"&gt;Target&lt;/tt&gt;s that it relies on.&lt;/li&gt;
&lt;li&gt;Given the name of an &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt;, return that action.&lt;/li&gt;
&lt;li&gt;Given a list of names of &lt;tt class="docutils literal"&gt;Target&lt;/tt&gt;s, return all &lt;tt class="docutils literal"&gt;Target&lt;/tt&gt;s referred to by those names.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, it's super late again, so I need to stop writing this and post it.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2021-07-20</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-07-20" rel="alternate"></link><published>2021-07-20T04:00:00-04:00</published><updated>2021-07-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-07-20:/weekly-roundup-2021-07-20</id><summary type="html">&lt;p class="first last"&gt;Looking over my past decisions and going &amp;quot;Wait, that didn't make any sense. I can just...&amp;quot;, and then, just.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I was unhappy that the prototype configuration file was so long.&lt;/li&gt;
&lt;li&gt;Thursday: I started figuring out why that file was so long, and what I can do about it.&lt;/li&gt;
&lt;li&gt;Friday: I started doing things about it. I don't think the file is much shorter yet, but the groundwork is laid.&lt;/li&gt;
&lt;li&gt;Saturday: I made more plans about classes to define in order to make the configuration file easier to read.&lt;/li&gt;
&lt;li&gt;Sunday: I looked at the &lt;tt class="docutils literal"&gt;api&lt;/tt&gt; module some, and thought about how to break it up.&lt;/li&gt;
&lt;li&gt;Monday: I started splitting out parts of the internal library modules.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'll keep on poking at this, but entries might be even shorter somehow, because I want to put in some work on a Secret Project that I hope to finish in a month or so.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2021-07-19</title><link href="https://mwchase.neocities.org/coding-2021-07-19" rel="alternate"></link><published>2021-07-19T04:00:00-04:00</published><updated>2021-07-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-07-19:/coding-2021-07-19</id><summary type="html">&lt;p class="first last"&gt;Thinking about having some modules where basically one line of code really does anything. We'll see.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Another light day today, but some progress is better than no progress.&lt;/p&gt;
&lt;p&gt;I split out the &lt;tt class="docutils literal"&gt;Result&lt;/tt&gt; type from the &lt;tt class="docutils literal"&gt;registry&lt;/tt&gt; module, because the &lt;tt class="docutils literal"&gt;registry&lt;/tt&gt; module makes no assumptions about the &lt;tt class="docutils literal"&gt;Result&lt;/tt&gt; type beyond &amp;quot;it exists&amp;quot;.
I could (and have) totally rework the implementation of &lt;tt class="docutils literal"&gt;Result&lt;/tt&gt; without affecting the rest of the &lt;tt class="docutils literal"&gt;registry&lt;/tt&gt; module in any way.
So, that was an obvious candidate to give it its own little module.&lt;/p&gt;
&lt;p&gt;I'm trying to decide what I want to go for next.
I think some of the things I could split out based on that reasoning might end up being very small, and at first I was thinking this could be a &lt;em&gt;reductio ad absurdum&lt;/em&gt; kind of situation, but I'm not really sure now.
I think I'm going to have to try it, and see if it really is absurd.&lt;/p&gt;
&lt;p&gt;That won't happen right now, but soon.
Sooner, though, I'm going to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-07-18</title><link href="https://mwchase.neocities.org/coding-2021-07-18" rel="alternate"></link><published>2021-07-18T04:00:00-04:00</published><updated>2021-07-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-07-18:/coding-2021-07-18</id><summary type="html">&lt;p class="first last"&gt;I wonder if there's some way to manually highlight sections of text in vim (like, just change the background color). (Ideally it would also be possible to zoom out for a bird's-eye view.)&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Another light day today, just because some stuff happened that's making it hard to focus.
Nothing important long-term, just... urgent.&lt;/p&gt;
&lt;p&gt;Not dwelling on that, quick notes on dividing up the &lt;tt class="docutils literal"&gt;api&lt;/tt&gt; module before I get back to the other stuff.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The module defines a helper type that many functions return. This type can be grouped with the five most basic helper functions, or separately.&lt;/li&gt;
&lt;li&gt;There's a high-level helper function that nothing else relies on, so that could in theory stay in the module.&lt;/li&gt;
&lt;li&gt;There are three &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt; implementations, that should each get their own module, along with the helpers that instantiate them.&lt;/li&gt;
&lt;li&gt;There is a pair of classes, &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt;, that the &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt; implementations use. Only &lt;tt class="docutils literal"&gt;Input&lt;/tt&gt; needs to be exposed. (Because it has a helper that creates an &lt;tt class="docutils literal"&gt;Output&lt;/tt&gt;.)&lt;/li&gt;
&lt;li&gt;The module re-exports a helper function from inside the library, that it might make sense to move to the &lt;tt class="docutils literal"&gt;_api&lt;/tt&gt; package, since I don't think any of the non-&lt;tt class="docutils literal"&gt;api&lt;/tt&gt; code relies on it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While I'm thinking about breaking stuff up, I'd like to do something about the internal &lt;tt class="docutils literal"&gt;registry&lt;/tt&gt; module, because it's a whole big thing that seems kind of awkward to work with.&lt;/p&gt;
&lt;p&gt;I think it's possible to pull out bits here and there as opaque units with a smaller interface, but I think my best bet is to copy this text into a word processor and start marking it up.
That's how I figured out that the config prototype was about 50% support code.&lt;/p&gt;
&lt;p&gt;Anyway, super late, wrapping up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-07-17</title><link href="https://mwchase.neocities.org/coding-2021-07-17" rel="alternate"></link><published>2021-07-17T04:00:00-04:00</published><updated>2021-07-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-07-17:/coding-2021-07-17</id><summary type="html">&lt;p class="first last"&gt;Doing design work so I don't end up tied into knots.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I didn't touch the code today, so here are some thoughts on what I should be working on after I clean up the &lt;tt class="docutils literal"&gt;api&lt;/tt&gt; module.&lt;/p&gt;
&lt;p&gt;For virtual environments, I'm going to want some way to determine the Python executable to use.
That's going to determine the path it attempts, as well as providing a modification to the virtual environment path &lt;em&gt;and&lt;/em&gt; action name.&lt;/p&gt;
&lt;p&gt;As I said before, for locating files to process or report, I'm going to want a &amp;quot;project&amp;quot; protocol to modify paths specific to a command.&lt;/p&gt;
&lt;p&gt;Thinking about the divisions more, code that needs a &lt;tt class="docutils literal"&gt;Project&lt;/tt&gt; is going to need &lt;tt class="docutils literal"&gt;Python&lt;/tt&gt; information for almost the same reason.&lt;/p&gt;
&lt;p&gt;I hadn't anticipated that, and that feels like it'll be awkward if I rush into it.&lt;/p&gt;
&lt;p&gt;Okay, so, the higher-level abstractions should be constructing their own virtual environments, which means they need an ability to take &lt;tt class="docutils literal"&gt;Python&lt;/tt&gt; objects, &lt;em&gt;but&lt;/em&gt; not all commands should be duplicated by Python version, which means that the interface for getting them in is to set up arbitrary &amp;quot;shapes&amp;quot; of &lt;tt class="docutils literal"&gt;Python&lt;/tt&gt; containers in the constructor.
So, technically, it's not &amp;quot;required&amp;quot;, it's just that you can't actually &lt;em&gt;do&lt;/em&gt; anything if you don't somehow have access to one.&lt;/p&gt;
&lt;p&gt;Good talk.&lt;/p&gt;
&lt;p&gt;Anyway, thinking about the sort-to-medium term plans for this:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Break up the &lt;tt class="docutils literal"&gt;api&lt;/tt&gt; module.&lt;/li&gt;
&lt;li&gt;Create (and test!) abstractions for the two repos I want this working with.&lt;/li&gt;
&lt;li&gt;Cut an initial release.&lt;/li&gt;
&lt;li&gt;(Possibly lower priority) See if I can get this working with a PyPy 2 repo so I can mess with fancy JIT interpreter stuff later. This would be a good proof of concept for &lt;tt class="docutils literal"&gt;Python&lt;/tt&gt; objects, because I'm not at all interested in getting the runner to work with Python 2, so all pytest etc invocations &lt;em&gt;need&lt;/em&gt; a custom path in this scenario.&lt;/li&gt;
&lt;li&gt;Add support for other tools. I have no interest in &amp;quot;mandating&amp;quot; a specific ecosystem for the task runner, so long as the stuff I use works, so I might as well see what is needed to work with, for example, pylint, ward, hammet, mamba, ptr, mutmut, cosmic ray, semgrep, hypothesis...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, I let this go late, so I should wrap up, like, right now right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-07-16</title><link href="https://mwchase.neocities.org/coding-2021-07-16" rel="alternate"></link><published>2021-07-16T04:00:00-04:00</published><updated>2021-07-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-07-16:/coding-2021-07-16</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;This is a 100-line function.&amp;quot; &amp;quot;Oh dear.&amp;quot; &amp;quot;But you should have seen what I had before that!&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay.
I've rewritten the body of the prototype config file so that the business logic is all in a giant generator function.
This is in a temporary state of code smell, in that the generator function is larger than most of the modules that it relies on.
BUT, this rewrite has made it clear how I need to proceed.&lt;/p&gt;
&lt;p&gt;In essence, there are several axes of variation that a command can be subject to, with pytest varying the most.
The axes I've seen so far are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Which subproject the command applies to (this doesn't apply to the task runner repo, at least not currently, but I need it)&lt;/li&gt;
&lt;li&gt;What command is getting applied. In the case of pytest, this effectively gets split into:&lt;ul&gt;
&lt;li&gt;What runs pytest&lt;/li&gt;
&lt;li&gt;What arguments pytest runs with&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The interfaces I want to be able to handle all of this properly are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Project&lt;/tt&gt; This class must provide interfaces to add a prefix to a dirname (which should lead to a path in the repo), or to add a suffix to a dirname (which will be used to generate report directories)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Session&lt;/tt&gt; This interface takes a mapping from &lt;tt class="docutils literal"&gt;str&lt;/tt&gt; names to &lt;tt class="docutils literal"&gt;Project&lt;/tt&gt;s, and yields all necessary changes to the registry.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;PytestCommand&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;PytestRunner&lt;/tt&gt;. These combine together to create a &lt;tt class="docutils literal"&gt;Session&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While all of this should allow me to crunch down the config file pretty aggressively, my main motivation is to extract out reusable components so that all of my config files can be crunched down like this, and also able to get bugfixes.&lt;/p&gt;
&lt;p&gt;I think the next step for me to take is to review the current &lt;tt class="docutils literal"&gt;api&lt;/tt&gt; module, and to start splitting it up into modules in an &lt;tt class="docutils literal"&gt;_api&lt;/tt&gt; sub-package.
Once the application code is tidied up so, I can resume pulling stuff out of the config file prototype into it.&lt;/p&gt;
&lt;p&gt;I have no idea how long it is until an initial release at this point, but the state of the code is much more satisfying than it was a week ago, so that's nice.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-07-15</title><link href="https://mwchase.neocities.org/coding-2021-07-15" rel="alternate"></link><published>2021-07-15T04:00:00-04:00</published><updated>2021-07-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-07-15:/coding-2021-07-15</id><summary type="html">&lt;p class="first last"&gt;It was honestly surprising to me just how much of the prototype file was code that was &amp;quot;supposed to be&amp;quot; in a library.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm not going to try to do anything about it yet, but I've figured out a few things about the prototype task runner file that I was so annoyed about the length of.
First off, the length is mostly due to the fact that it has helper functions that I really want in a library instead of the config files.&lt;/p&gt;
&lt;p&gt;The bigger realization I had is that the interfaces get a lot simpler if I wrap everything in a generator function.
Basically, the template that everything is kind of fitting into is that there are helper functions that return a list of generators and possibly some extra value.
If I relax the idea of &amp;quot;returning multiple generators&amp;quot; (which then get evaluated in sequence), then I can rework these helper functions into generators that expect to be yielded from.&lt;/p&gt;
&lt;p&gt;This would allow me to do some... somewhat questionable things.&lt;/p&gt;
&lt;p&gt;First, background:&lt;/p&gt;
&lt;p&gt;Decomposing the various registry modifications into the smallest units of work made it easier to reason about when they should be idempotent.
By implementing idempotence at the lowest level, I can bubble it up higher without actually doing anything at any intermediate level.
This means, and I have automated tests for this, that playing back the same sequence of modifications, which before was often an error, is now a no-op.
So, this means I don't need to worry about &amp;quot;repeating&amp;quot; modifications, as long as the original modifications are executed in order.
I mean, from a correctness perspective.
From a performance perspective, I am... not quite sure what I'm setting myself up for.&lt;/p&gt;
&lt;p&gt;As far as what this allows me to do, this means that, supposing I make a helper class for representing virtual environments, I can turn the helper method to retrieve the path to a binary into a generator that establishes the link to the pip upgrade command that installed the binary.&lt;/p&gt;
&lt;p&gt;I'm realizing now that I probably want to have some kind of wrapper around the generator to divert exceptions from the for-loop into the generator, so the traceback can bring together the code that hit the error and the code that caused the error to be hit.
This would probably be a bit squirrelly to call, but I only have to call it once.
Or I could not bother, and say that continuing after an exception is undefined behavior.
That's probably a better use of my time for now.&lt;/p&gt;
&lt;p&gt;I don't want to actually touch any of this code for now, but talking through this has given me some good ideas.
And some maybe-good ideas.&lt;/p&gt;
&lt;p&gt;I don't think I have anything else to talk about right now, so I'm going to send this.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-07-14</title><link href="https://mwchase.neocities.org/coding-2021-07-14" rel="alternate"></link><published>2021-07-14T04:00:00-04:00</published><updated>2021-07-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-07-14:/coding-2021-07-14</id><summary type="html">&lt;p class="first last"&gt;It'll be nice when this is in a good enough state that I can at least tell whether it's &lt;em&gt;fast&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't get too much done today.
I started considering how to use the task runner for more complex project structures (structures that I'm already using, so this isn't a YAGNI violation or anything), and that turned out to take more effort than I expected.&lt;/p&gt;
&lt;p&gt;The basic issue is that my current prototype task runner config file, even discounting the code in it that has to be moved into the application itself, is... a lot.
It's around twice the length of the noxfile, and I have to believe this is partially due to the fact that it's surfacing the relationships between different actions.&lt;/p&gt;
&lt;p&gt;Anyway, the point is, I'm going to need to go over this stuff with a pretty fine-toothed comb to get all of this configuration code into the right state.&lt;/p&gt;
&lt;p&gt;I think the right thing to do going forward is to take a break, at least from this, and come back to it when I'm feeling a bit fresher and have more time.
I'd better wrap up for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2021-07-13</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-07-13" rel="alternate"></link><published>2021-07-13T04:00:00-04:00</published><updated>2021-07-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-07-13:/weekly-roundup-2021-07-13</id><summary type="html">&lt;p class="first last"&gt;I've nearly got the high-level interfaces nailed down.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I designed a fancy system for passing state around while constructing the task runner's registry; I haven't actually used it yet.&lt;/li&gt;
&lt;li&gt;Thursday: I started converting the sessions from the noxfile into &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt;s and &lt;tt class="docutils literal"&gt;Target&lt;/tt&gt;s for the task runner.&lt;/li&gt;
&lt;li&gt;Friday: I made a little more progress there, and tried to figure out which part of the current implementation bothers me the most.&lt;/li&gt;
&lt;li&gt;Saturday: I didn't get much done, because I was focusing on making things not hurt.&lt;/li&gt;
&lt;li&gt;Sunday: I touched up parts of the API.&lt;/li&gt;
&lt;li&gt;Monday: I tried to touch up a bit more of the API.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to write a task runner file for one of my other projects, and see how I need to fix up the prototype file before I bring more into the codebase.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2021-07-12</title><link href="https://mwchase.neocities.org/coding-2021-07-12" rel="alternate"></link><published>2021-07-12T04:00:00-04:00</published><updated>2021-07-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-07-12:/coding-2021-07-12</id><summary type="html">&lt;p class="first last"&gt;I can't be expected to manage my time! I have a messed-up toe that hurts sometimes!&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, here's what happened today:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Bunch of Minecraft&lt;/li&gt;
&lt;li&gt;Travel&lt;/li&gt;
&lt;li&gt;Frantic attempts to get code stuff done&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That last one mainly focused around trying to split up the &amp;quot;virtual environment setup&amp;quot; logic into one function per script invocation.
My hope is that I can build on this work in order to port the rest of the noxfile, and from there make sure all of the functions and classes I want to use end up in source control.&lt;/p&gt;
&lt;p&gt;I should probably track the prototype file, as well.&lt;/p&gt;
&lt;p&gt;The basic streams of logic that need to be worked out:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Generic logic for running pytest as a suffix of some command&lt;/li&gt;
&lt;li&gt;Commands for a few coverage invocations. (Generalize existing coverage environment creation.)&lt;/li&gt;
&lt;li&gt;JUnit XML manipulation commands.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'll also want to prototype the task runner file for one of my larger projects, so I can make sure I have functionality for some of the more complicated logic.&lt;/p&gt;
&lt;p&gt;Anyway, it's way too late and I should sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-07-11</title><link href="https://mwchase.neocities.org/coding-2021-07-11" rel="alternate"></link><published>2021-07-11T04:00:00-04:00</published><updated>2021-07-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-07-11:/coding-2021-07-11</id><summary type="html">&lt;p class="first last"&gt;Contorting into weird positions in an attempt to mitigate the soreness from past weird contortions. I foresee no issues with this.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, it's way late because I spent most of the day playing Minecraft, but I want to get &lt;em&gt;something&lt;/em&gt; done with this API stuff.
I'll make one of the changes I was planning, and see how I feel like from there.&lt;/p&gt;
&lt;p&gt;Okay, basically, I made some improvements to the &amp;quot;add command&amp;quot; helper.
I added a class for &amp;quot;paths that a command makes exist&amp;quot;, and generally made the &amp;quot;paths that a command needs to exist&amp;quot; class more helpful.
I moved more code from the task file into the &amp;quot;api&amp;quot; file, which at this point &lt;em&gt;really&lt;/em&gt; needs to be split up.
I also cleaned up the &lt;tt class="docutils literal"&gt;setup_venv&lt;/tt&gt; function a little.&lt;/p&gt;
&lt;p&gt;I'm going to check over the code for correctness while this publishes, then get to bed a bit late.
And next thing I work on probably has to be splitting the code up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2021-07-10</title><link href="https://mwchase.neocities.org/diary-2021-07-10" rel="alternate"></link><published>2021-07-10T04:00:00-04:00</published><updated>2021-07-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-07-10:/diary-2021-07-10</id><summary type="html">&lt;p class="first last"&gt;Pain continues to be stupid.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;My injury isn't &lt;em&gt;currently&lt;/em&gt; bothering me, but I don't trust it.&lt;/p&gt;
&lt;p&gt;I made some progress thinking about coding, but I didn't actually touch it.
Tomorrow, hopefully.&lt;/p&gt;
&lt;p&gt;Anyway, I just feel really thrown off by my various attempts to avoid putting pressure on one foot.
It sucks that messing up one tiny part of my body means I have to contort all of my activities around supporting the healing process, assuming any of what I'm trying is even working.&lt;/p&gt;
&lt;p&gt;Nothing else to say, I guess, so I'll wrap up.
This is me wrapping up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2021-07-09</title><link href="https://mwchase.neocities.org/coding-2021-07-09" rel="alternate"></link><published>2021-07-09T04:00:00-04:00</published><updated>2021-07-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-07-09:/coding-2021-07-09</id><summary type="html">&lt;p class="first last"&gt;Helper functions that call helper functions that construct class instances to pass into helper functions that yield helper class instances that trigger dispatch to internal functions that build up a graph representation that gets traversed according to command-line arguments in order to do... stuff. I &lt;em&gt;totally&lt;/em&gt; had this realistically scoped to start with...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've dealt with some of the soreness, so I'm doing a bit better now.&lt;/p&gt;
&lt;p&gt;Anyway, back to some of the problems I was having with the code yesterday...&lt;/p&gt;
&lt;p&gt;Basically, sometimes the dependencies that &lt;em&gt;should&lt;/em&gt; exist are &amp;quot;obvious&amp;quot;, but as the author of the code, I know they're not going to be picked up unless I include them explicitly.&lt;/p&gt;
&lt;p&gt;I can think of two basic cases: the necessary &lt;tt class="docutils literal"&gt;Target&lt;/tt&gt; is part of the command, or it isn't.
The latter case is handled adequately by the current interface, and must be handled by a few different commands.&lt;/p&gt;
&lt;p&gt;I can imagine a way for this to work, so I guess I'll try it...&lt;/p&gt;
&lt;p&gt;Okay, yeah, I like this.
Basically, the boilerplate was so annoying because, on some level, I knew that the required helper functions were trivial.
Just a few lines of code, but it covers all of the stuff that &amp;quot;obviously&amp;quot; should be handled.&lt;/p&gt;
&lt;p&gt;Right now, some of the helpers are missing full coverage of the interface that they wrap, but I don't want to get too distracted right now.&lt;/p&gt;
&lt;p&gt;Actually, I'm going to need to add that coverage to handle pytest, and that's next to port, so I might as well...&lt;/p&gt;
&lt;p&gt;Okay, I'm looking at this code and &lt;em&gt;knowing&lt;/em&gt; that it's got all sorts of weird deficiencies, but I don't really want to fix it before I bring it into the codebase proper.&lt;/p&gt;
&lt;p&gt;So, here's what I need to consider now:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Am I ever going to use more than one command from a virtual environment? If not, I can simplify my helper functions considerably.&lt;/li&gt;
&lt;li&gt;Which of my internal names do I have the most issues with, and how can I fix them? Two big issues... For one, I named a module after one of the major classes in it, so if I instantiate that class in another module, the obvious name for the variable is... the name of the module that I had to import to instantiate the class. For another, some of the casting/coercion/whatever functions use different naming conventions for no good reason. No useful difference between the functions &lt;tt class="docutils literal"&gt;to_thing&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;as_thing&lt;/tt&gt;. (To be clear, the functions &lt;em&gt;are&lt;/em&gt; different, because &amp;quot;&lt;tt class="docutils literal"&gt;thing&lt;/tt&gt;&amp;quot; is different. But they both perform the same action relative to their specific value of &amp;quot;&lt;tt class="docutils literal"&gt;thing&lt;/tt&gt;&amp;quot;.)&lt;/li&gt;
&lt;li&gt;I need to rewrite some of my helpers to use my other helpers; this will make some future extensions easier.&lt;/li&gt;
&lt;li&gt;Think about the organization of the &lt;tt class="docutils literal"&gt;api&lt;/tt&gt; module. It's getting a little cramped, but, like, what kind of imports should consumers expect to need to do? Maybe I can have, like, an &lt;tt class="docutils literal"&gt;_api&lt;/tt&gt; package inside, and just re-export a bunch of it in the &lt;tt class="docutils literal"&gt;api&lt;/tt&gt; file.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My general feeling is that I can address a lot of this by breaking things up more, so I'll look into that later.&lt;/p&gt;
&lt;p&gt;For now, my take on this is, now that I've gotten through the initial hurdles of &amp;quot;using&amp;quot; this code, it's showing promise, though I need to take some time once I'm done porting my noxfile, to figure out what kind of idioms make sense, since currently it's just kind of a massive stream of top-level statements and global declarations.&lt;/p&gt;
&lt;p&gt;I'm getting tired and a little sore, so I'll start wrapping things up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-07-08</title><link href="https://mwchase.neocities.org/coding-2021-07-08" rel="alternate"></link><published>2021-07-08T04:00:00-04:00</published><updated>2021-07-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-07-08:/coding-2021-07-08</id><summary type="html">&lt;p class="first last"&gt;It feels a little bit like building a house out of popsicle sticks, but whatever.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm kind of sore and cranky right now, but I want to get work done on the task runner, so I'm going to try to do that.&lt;/p&gt;
&lt;p&gt;The first thing I remembered that simplifies things is, I currently don't need the file writing stuff for &lt;em&gt;this&lt;/em&gt; project.
I will need it, though.
The second thing I remembered is, wait, I have a noxfile.
I should just be rewriting that.&lt;/p&gt;
&lt;p&gt;I gave writing a basic command my best shot.
It's... something.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;dot_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.task-runner&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;requirements_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;requirements&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;reports_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;reports&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;coverage_deleted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;deleted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pathlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.coverage&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;


&lt;span class="c1"&gt;# Move this to api&lt;/span&gt;
&lt;span class="c1"&gt;# Add a &amp;quot;freeze data dict&amp;quot; helper&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;make_state&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;changes&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;change&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;changes&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;change&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;setup_venv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;requirements_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;commands&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;changes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;final_targets&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="n"&gt;venv_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dot_dir&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
    &lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;python&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-m&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;venv&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;--clear&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;venv_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;make_venv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;make-venv-&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;bin_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;venv_path&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;bin&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;changes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Cmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;make_venv&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;changes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_target&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bin_dir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;make_venv&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bin_dir&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;pip&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;install&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-U&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;pip&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;update_pip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;update-pip-&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;changes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Cmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;update_pip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bin_dir&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;changes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_target&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;update_pip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;update_pip&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;bin_dir&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;pip&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;install&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;-r&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;requirements_dir&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;requirements_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;,)&lt;/span&gt;
    &lt;span class="n"&gt;install_requirements&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;install-requirements-&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;changes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Cmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;install_requirements&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;update_pip&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;commands&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;command_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bin_dir&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;
        &lt;span class="n"&gt;changes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_target&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;command_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;install_requirements&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;final_targets&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;command_path&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;changes&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;final_targets&lt;/span&gt;


&lt;span class="n"&gt;CLEAN_CHANGES&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CLEAN_COMMANDS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;setup_venv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;clean&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;coverage&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;coverage&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;CLEAN_CHANGES&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Cmd&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;CLEAN_COMMANDS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;coverage&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;erase&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;coverage-erase&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;CLEAN_COMMANDS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;coverage&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_target&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;coverage_deleted&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;coverage-erase&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Takeaways so far:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I'll probably only need to define the &lt;tt class="docutils literal"&gt;setup_venv&lt;/tt&gt; function once, and it should probably be a library function of some kind.&lt;/li&gt;
&lt;li&gt;Specifying required targets for these &lt;tt class="docutils literal"&gt;Cmd&lt;/tt&gt; actions doesn't feel good/obvious/natural, but I'm not exactly sure what to do about that.&lt;/li&gt;
&lt;li&gt;This code probably has at least one bug in it, but I'm not going to guess where.&lt;/li&gt;
&lt;li&gt;Oh wait, found one. The requirements file needs a &lt;tt class="docutils literal"&gt;.txt&lt;/tt&gt; extension. I'll leave that as-is in the post, and fix it in the prototype.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, I'm theoretically ready to test this, but I don't think I'm emotionally ready for whatever weird error it's probably going to throw at me.&lt;/p&gt;
&lt;p&gt;Sudden thought: &amp;quot;skip&amp;quot; is a bad name for what it is in this app, because the meaning doesn't line up.
Suppose I decided I wanted to allow the user to request just erasing the coverage file, but I didn't want that to be considered a default target.
Suppose further that the coverage test runs depend on the coverage erase step, (because they will, when I write them) and their dependent targets are named and not skipped (because they represent data that we want by default).&lt;/p&gt;
&lt;p&gt;This all means that the &amp;quot;erase&amp;quot; step is &lt;em&gt;called&lt;/em&gt; skipped, but it actually runs by default.
This behavior doesn't bother me, so the problem must be with the name.&lt;/p&gt;
&lt;p&gt;At some point I'm going to have to work on strengthening the naming conventions in this project, and making the names make more sense.
Not right now, though.
For now, I'm going to look at the code up there and think about what I've done.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-07-07</title><link href="https://mwchase.neocities.org/coding-2021-07-07" rel="alternate"></link><published>2021-07-07T04:00:00-04:00</published><updated>2021-07-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-07-07:/coding-2021-07-07</id><summary type="html">&lt;p class="first last"&gt;It's like trying to translate an academic paper into production-ready code, but everyone involved is me.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm trying to actually use the code I've spent all of this time on, and I'm coming to the conclusion that it needs a lot of scaffolding built on top of it to be usable.&lt;/p&gt;
&lt;p&gt;I took a break from writing this post for a bit, and I think the problem I was having is that my initial attempts were too low-level.
Instead of writing a helper function per-&lt;tt class="docutils literal"&gt;Action&lt;/tt&gt;, I need, like, one function that:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;creates a virtual environment with a given name&lt;/li&gt;
&lt;li&gt;updates pip&lt;/li&gt;
&lt;li&gt;runs pip with the arguments and environment passed into the function&lt;/li&gt;
&lt;li&gt;creates targets for every script that's supposed to be in the virtual environment&lt;/li&gt;
&lt;li&gt;returns both the resulting &lt;tt class="docutils literal"&gt;State&lt;/tt&gt; and a mapping from script names to script paths; the paths should be &lt;tt class="docutils literal"&gt;Target&lt;/tt&gt;s in the changes on the &lt;tt class="docutils literal"&gt;State&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One of the other things I need for my workflow specifically is a way to create a file that a pip command can read.
This might require changes to the execution model, or maybe there's something simpler I can do.&lt;/p&gt;
&lt;p&gt;The crux of this is that my idiom for doing this in a noxfile involved using a &lt;tt class="docutils literal"&gt;TemporaryDirectory&lt;/tt&gt; to store the file, and thinking about this in the context of the task runner implies to me that I'd need to be essentially running one &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt; &amp;quot;inside&amp;quot; another.&lt;/p&gt;
&lt;p&gt;That would take a lot of effort, and I think a better way would be to put the responsibility for constructing a temporary directory on the application.
At that point, creating the file would be a normal &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt;, and everything could just depend on it straightforwardly.&lt;/p&gt;
&lt;p&gt;Hmm.
I can mostly see how to do this, but it would be somewhat annoying, and I could just as well put the generated file next to the virtual environments, and it would be much quicker to implement.
I'll try that for now, and see if &lt;em&gt;not&lt;/em&gt; using a temporary directory somehow bites me.&lt;/p&gt;
&lt;p&gt;In any case, I'll need an &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt; for &amp;quot;write some data to a file&amp;quot;, and a helper that adds the file path as a &lt;tt class="docutils literal"&gt;Target&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Something else that's becoming clear to me is that the &lt;tt class="docutils literal"&gt;State&lt;/tt&gt; concept doesn't actually pull its weight until I'm running parameterized commands, so I just shouldn't bother to start with.&lt;/p&gt;
&lt;p&gt;Sketching things out, I basically want to create the virtual environment with the virtual environment directory as the target.
I can then have a pip upgrade action that relies on the virtual environment and has, say, the path to pip as the target it exports.
So far, so generic.&lt;/p&gt;
&lt;p&gt;But the next action I want to set up has a bunch of moving parts: it needs to rely on the &lt;em&gt;upgraded&lt;/em&gt; pip, and export an arbitrary set of targets, and also rely on a target that's passed in as part of the environment to this action's pip command.&lt;/p&gt;
&lt;p&gt;That's, like, a lot.&lt;/p&gt;
&lt;p&gt;I'll have to think about this a bunch before I write the helper, but I can at least write the &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt; to write data to a file.&lt;/p&gt;
&lt;p&gt;I'll do that, then get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2021-07-06</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-07-06" rel="alternate"></link><published>2021-07-06T04:00:00-04:00</published><updated>2021-07-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-07-06:/weekly-roundup-2021-07-06</id><summary type="html">&lt;p class="first last"&gt;Head down on this, because I want to be ready when the rest of the tooling I want hits 1.0.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I figured out the design for the non-fluent interface for the task runner, and started implementing it.&lt;/li&gt;
&lt;li&gt;Thursday: I dealt with some failing tests by deleting them.&lt;/li&gt;
&lt;li&gt;Friday: I took the internal error messages from &amp;quot;absent&amp;quot; to &amp;quot;maybe other people can understand this?&amp;quot;&lt;/li&gt;
&lt;li&gt;Saturday: I made a major stride in improving coverage, by writing tests that, um, don't do much, but use a lot of code in the process.&lt;/li&gt;
&lt;li&gt;Sunday: I put together a class for representing a single command-line execution, and then tried to figure out an ergonomic way to use it.&lt;/li&gt;
&lt;li&gt;Monday: I tossed together a class and function for handling &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt;s and &lt;tt class="docutils literal"&gt;Target&lt;/tt&gt;s in sequence. It needs me to try to use it, then write tests.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to either keep on with this, or take a break again.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2021-07-05</title><link href="https://mwchase.neocities.org/coding-2021-07-05" rel="alternate"></link><published>2021-07-05T04:00:00-04:00</published><updated>2021-07-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-07-05:/coding-2021-07-05</id><summary type="html">&lt;p class="first last"&gt;I feel like my Python code might be in a ternary plot with extremes of &amp;quot;pseudo-code&amp;quot;, &amp;quot;Pokémon&amp;quot;, and &amp;quot;speaking in tongues&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I took things easy again today, so the main progress I made was in realizing that the idiom I'm trying to work with requires using &lt;tt class="docutils literal"&gt;Iterator&lt;/tt&gt;s instead of providing a function for iteration.
The point of this is to make it so that if I &amp;quot;reuse&amp;quot; a dataclass instance, its &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt;s and &lt;tt class="docutils literal"&gt;Target&lt;/tt&gt;s only get added to the &lt;tt class="docutils literal"&gt;Registry&lt;/tt&gt; once.&lt;/p&gt;
&lt;p&gt;I don't know if this is the right approach, but I have a gut feeling that I don't want to lean on the type system for really fine-grained stuff, and instead have a few simple types that relate via operations like &amp;quot;compose&amp;quot; and &amp;quot;fan-in&amp;quot;.
So, like, maybe the type would be as simple as the &lt;tt class="docutils literal"&gt;Iterator&lt;/tt&gt; and a mapping from strings to sets of data.&lt;/p&gt;
&lt;p&gt;Something like...&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# It&amp;#39;s a little weird that it&amp;#39;s frozen with mutable state, but meh.&lt;/span&gt;
&lt;span class="nd"&gt;@attr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataclass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frozen&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;State&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;changes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Iterator&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Change&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PMap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PSet&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Union&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;]]]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;changes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;arg&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;changes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;arg&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setdefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;changes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pmap&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;()}))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And then you just have the new state as the last argument.
This code is totally untested and unpolished, but I think it gets the basic idea across.&lt;/p&gt;
&lt;p&gt;I'm doing basic tests on it right now, and I'll try actually using it later, but it's late now and I want to get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-07-04</title><link href="https://mwchase.neocities.org/coding-2021-07-04" rel="alternate"></link><published>2021-07-04T04:00:00-04:00</published><updated>2021-07-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-07-04:/coding-2021-07-04</id><summary type="html">&lt;p class="first last"&gt;Unfocused rambling because I more-or-less took things easy today.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Oh boy...&lt;/p&gt;
&lt;p&gt;I threw together a &lt;tt class="docutils literal"&gt;Cmd&lt;/tt&gt; class, but I don't have any tests or attempts to use it yet.
Let's see what I can come up on the spur of the moment.&lt;/p&gt;
&lt;p&gt;I'm going to want virtualenv creation, which is going to look like:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;python &lt;span class="pre"&gt;-m&lt;/span&gt; venv &lt;span class="pre"&gt;--clear&lt;/span&gt; &amp;lt;path&amp;gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;The generator for that needs to create an action and a target parented to that action, with the target being &amp;lt;path&amp;gt;.&lt;/p&gt;
&lt;p&gt;It should somehow make it easy to create &lt;tt class="docutils literal"&gt;Cmd&lt;/tt&gt;s like&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;&amp;lt;path&amp;gt;/bin/&amp;lt;cmd&amp;gt;&lt;/span&gt; &amp;lt;args&amp;gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;One thing I want to work out is how to deal with commands that parameterize kind of all over the place.
Like, pytest commands need the particular virtualenv they're running under, the top-level executor, the core of the command, and then the testpaths and related arguments.&lt;/p&gt;
&lt;p&gt;I'm thinking maybe something like...&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;def cmd(args: typing.Sequence[str], prefix: typing.Optional[str], env: typing.Optional[typing.Dict[str, &lt;span class="pre"&gt;str]],&lt;/span&gt; allowed_codes: typing.Sequence[int]) &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; Cmd:&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;I think I'm going to need to revisit my sketches of how different commands fit together, and where some of these names should come from.&lt;/p&gt;
&lt;p&gt;Trying to run through the organization some in my head.
The two main axes of difference are &amp;quot;which project is being accessed&amp;quot;, and &amp;quot;what is being done&amp;quot;.
Because whether or not a given task &lt;em&gt;has&lt;/em&gt; project-specific behavior depends on the task, the higher-level organization is the different tasks, and those different tasks should be parameterized by the list of projects.
If I try to come up with a class for everything, it looks like my pytest stuff needs some kind of core pytest command and wrapper classes to annotate it with stuff like extra inputs and outputs.
I think this is the way to go, yeah.
The classes are dataclasses, and they define iterators that produce their relevant changes, and also have attributes and properties representing various things they expose according to interfaces.&lt;/p&gt;
&lt;p&gt;I'm not sure when I'll have the focus to put this together.
Maybe I'll manage it in the next few days, maybe I'll need to take another break and get to it in a week.
We'll see.
Anyway, it is way too late right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-07-03</title><link href="https://mwchase.neocities.org/coding-2021-07-03" rel="alternate"></link><published>2021-07-03T04:00:00-04:00</published><updated>2021-07-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-07-03:/coding-2021-07-03</id><summary type="html">&lt;p class="first last"&gt;I guess it's a good thing I tried writing some of these tests.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I think it was earlier today that I hammered out the tests and formatting of my failure messages.
They're pretty detailed and fairly consistent.
They could maybe do with numeric codes for lookup later, but that's not needed right now, and kind of needs documentation first.&lt;/p&gt;
&lt;p&gt;Anyway, it's time to get some more coverage.
I'm kind of looking at the uncovered lines and thinking &amp;quot;Well, what would happen if I didn't give it any actions to take? That's a valid test.&amp;quot;&lt;/p&gt;
&lt;p&gt;Let's see what happens.&lt;/p&gt;
&lt;p&gt;Well, it worked, but I decided it needed a few behavior changes, so I modified the relevant templates a little.
Things are in a good place now.
There are just a few lines of code left to test, but they're... kind of a doozy.&lt;/p&gt;
&lt;p&gt;I'd gotten this far, see, without writing any legitimate &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt;s.
To finish things up, I need actual &lt;tt class="docutils literal"&gt;Actions&lt;/tt&gt;s that I can invoke from test code.&lt;/p&gt;
&lt;p&gt;Let's see what I've got in mind...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Delete directory tree (cross-platform)&lt;/li&gt;
&lt;li&gt;Run command, with optional statuses to &lt;em&gt;not&lt;/em&gt; abort on.&lt;/li&gt;
&lt;li&gt;Using run command, create a virtual environment&lt;/li&gt;
&lt;li&gt;From a virtual environment, running a command &lt;em&gt;within&lt;/em&gt; that virtual environment&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These tasks should bring in the last of the prototype code.
Once I have this functionality exposed via the API module, I can try running this code against its own repo and see if I actually get the kind of speedup I expected.
Either way, I'll hopefully get some more useful profiling data.&lt;/p&gt;
&lt;p&gt;For now, I want to wind down.
There'll be plenty of time to get this working later.
Maybe tomorrow, maybe in a few days, maybe in a week.
I'll get there when I get there.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-07-02</title><link href="https://mwchase.neocities.org/coding-2021-07-02" rel="alternate"></link><published>2021-07-02T04:00:00-04:00</published><updated>2021-07-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-07-02:/coding-2021-07-02</id><summary type="html">&lt;p class="first last"&gt;Trying to make sure that my failure messages are more detailed than &amp;quot;something broke somewhere.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Here's the deal with coverage misses in the task runner code:
I've got lines missing in three files.
One file corresponds to some templating operations.
One file corresponds to the configuration builder.
And one file is the main logic.&lt;/p&gt;
&lt;p&gt;I'm going to get that last one last.
Let's add the templating first, because that should be easy.
Okay, one of them was easy I think, the rest of that file, I don't want to care about right now.&lt;/p&gt;
&lt;p&gt;For the other, let's see...
There are a bunch of &lt;tt class="docutils literal"&gt;raises&lt;/tt&gt; context managers in the tests, but they're not covering enough cases, and they're not checking messages, which means right now the errors are pretty cryptic.
Let's see what we can do about that.&lt;/p&gt;
&lt;p&gt;Okay, I didn't write tests to exercise the uncovered code, but I did add thorough error messages to everything that looked like it needed one, and added strict checks to the tests that hit those errors.
This will come in handy when I figure out how I want to set up mutation testing.&lt;/p&gt;
&lt;p&gt;I'm kind of too relaxed to think through writing tests to hit these lines right now, so I'll leave that for tomorrow.&lt;/p&gt;
&lt;p&gt;For now, I'm going to wind down a bit early.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-07-01</title><link href="https://mwchase.neocities.org/coding-2021-07-01" rel="alternate"></link><published>2021-07-01T04:00:00-04:00</published><updated>2021-07-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-07-01:/coding-2021-07-01</id><summary type="html">&lt;p class="first last"&gt;I really hope this ends up being worth it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Part of the reason I've been tired lately is that I've stepped my exercise routine up to where it should have been originally, to try to shed some of the pandemic weight.&lt;/p&gt;
&lt;p&gt;Anyway, moving away from that, let's see what it takes to make a little more progress.&lt;/p&gt;
&lt;p&gt;One of the first things I notice is that my naming schemes don't quite feel consistent.
I'll have to look into this later.
First, I want to be assured that I can safely start deleting code, and to do that, it needs to actually be safe to do so.&lt;/p&gt;
&lt;p&gt;Before touching test code, I run it, and see that my coverage has gone all the way down to 90%.
(It's too bad it's not a slightly more useful 90%.)&lt;/p&gt;
&lt;p&gt;When it came time to fix the tests, I couldn't figure out how to fix some of them, so I just deleted them.
We'll see what the damage is once I've deleted the code that shouldn't be covered any more.
But first, I have to fix the tests, because they're failing as I write this.
Oh. I missed a comma somewhere.
Correction, several commas, all in nearly the same place.
Let's see how it goes now.
Better...&lt;/p&gt;
&lt;p&gt;Coverage is still above 90% &lt;em&gt;somehow&lt;/em&gt;.
I'm going to start deleting code and just dare this to fail, then see about getting coverage back up.&lt;/p&gt;
&lt;p&gt;All pass, 93% coverage.
Yeah okay.&lt;/p&gt;
&lt;p&gt;All right, there's work to be done to get the coverage up, but that's going to happen later, because I'm tired now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-06-30</title><link href="https://mwchase.neocities.org/coding-2021-06-30" rel="alternate"></link><published>2021-06-30T04:00:00-04:00</published><updated>2021-06-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-06-30:/coding-2021-06-30</id><summary type="html">&lt;p class="first last"&gt;It's probably a little cursed when there's a block that just starts &lt;tt class="docutils literal"&gt;if not typing.TYPE_CHECKING:&lt;/tt&gt;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got the design I want for updating the configuration worked out, but I spent a lot of today zoning out, so we'll, like, see how far I get.&lt;/p&gt;
&lt;p&gt;Step one: create data classes to represent changes, and create a &lt;tt class="docutils literal"&gt;Union&lt;/tt&gt; combining them.&lt;/p&gt;
&lt;p&gt;Step two: create a function that takes the union and will dispatch to individual implementations.&lt;/p&gt;
&lt;p&gt;Step three: create the individual implementations, and forward the existing functions to them, for ease of testing.&lt;/p&gt;
&lt;p&gt;Step four: set up the dispatches&lt;/p&gt;
&lt;p&gt;Step five: test this intermediate stage&lt;/p&gt;
&lt;p&gt;(Secret step five and a half: fix stuff that I broke, and also contemplate filing a bug against Python for some of the stuff I encountered.)&lt;/p&gt;
&lt;p&gt;Anyway, I'm not getting anything else done tonight, so I'll put off future steps, such as &amp;quot;write helper functions that produce the new classes&amp;quot;, &amp;quot;expose my desired interface through the api module&amp;quot;, and &amp;quot;rewrite the tests to use the new interface&amp;quot;, along with &amp;quot;actually test the main application logic&amp;quot;.&lt;/p&gt;
&lt;p&gt;But yeah, currently exhausted.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2021-06-29</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-06-29" rel="alternate"></link><published>2021-06-29T04:00:00-04:00</published><updated>2021-06-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-06-29:/weekly-roundup-2021-06-29</id><summary type="html">&lt;p class="first last"&gt;The similarities between the previous two summaries were not planned ahead-of-time, or even during-time.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I started reasoning about the things that I'm doing kind of wrong with the task runner. Some of the changes I had in mind had me worried about the efficiency implications.&lt;/li&gt;
&lt;li&gt;Thursday: I made one code change, but it was a good one. I also left myself a note to help with future changes.&lt;/li&gt;
&lt;li&gt;Friday: I tried a truly absurd number of things to make my chest stop hurting as a result of sitting... like... one sec. Sorry, I had to stand up, for... some reason.&lt;/li&gt;
&lt;li&gt;Saturday: More code simplification. Turned some of the types involved &lt;em&gt;dramatically&lt;/em&gt; simpler.&lt;/li&gt;
&lt;li&gt;Sunday: I started outlining the configuration API changes that I want.&lt;/li&gt;
&lt;li&gt;Monday: I came up with an invariant that should more-or-less leave the algorithms involved at about the same level of complexity, which went a long way towards getting me comfortable with the API changes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to get the task runner really for real ready for an initial release.
This requires:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Finish redoing the configuration API&lt;/li&gt;
&lt;li&gt;Full test coverage&lt;/li&gt;
&lt;li&gt;&amp;quot;Self-hosted&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I was poking at this some today, and decided to remove some functionality that I don't have a use for, and this made running the tests much more tractable; it remains to be seen how much overhead will be added when I get full test coverage, but I'd be shocked if the &amp;quot;self-hosted&amp;quot; version takes more than five seconds.
Fingers crossed.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2021-06-28</title><link href="https://mwchase.neocities.org/coding-2021-06-28" rel="alternate"></link><published>2021-06-28T04:00:00-04:00</published><updated>2021-06-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-06-28:/coding-2021-06-28</id><summary type="html">&lt;p class="first last"&gt;Past me telling me &amp;quot;It's okay, you've got this.&amp;quot; and I'm not sure I believe it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, I realized that if I come up with an invariant that enforces similarity to the old workflow, there's a chance that gives similar performance guarantees as well.
I did this by splitting up the functions to add an &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt; and to define inputs for it, but only allowing adding inputs to the last &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt; that was added.
This discards some properties of the old system that I don't think I cared about, but it simplifies cycle checking to the case of &amp;quot;does this &lt;tt class="docutils literal"&gt;Target&lt;/tt&gt; depend on the latest &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt;?&amp;quot; which is constant-time.
This is because, to get cycles longer than a single &lt;tt class="docutils literal"&gt;Action, Target&lt;/tt&gt; pair, we need to do something like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;add &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt; A&lt;/li&gt;
&lt;li&gt;add &lt;tt class="docutils literal"&gt;Target&lt;/tt&gt; 1 as a child of A&lt;/li&gt;
&lt;li&gt;add &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt; B&lt;/li&gt;
&lt;li&gt;make B require 1 (allowed)&lt;/li&gt;
&lt;li&gt;add &lt;tt class="docutils literal"&gt;Target&lt;/tt&gt; 2 as a child of B&lt;/li&gt;
&lt;li&gt;make A require 2 (not allowed)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The last step is not allowed because A is not the most recent &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt;.
I don't think there's any way to arrange these so that all requirements are added at a valid time.&lt;/p&gt;
&lt;p&gt;Anyway, I'll have to see whether I agree with this reasoning later, because I'm kind of sleepy and that took a lot of effort to articulate.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-06-27</title><link href="https://mwchase.neocities.org/coding-2021-06-27" rel="alternate"></link><published>2021-06-27T04:00:00-04:00</published><updated>2021-06-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-06-27:/coding-2021-06-27</id><summary type="html">&lt;p class="first last"&gt;Getting ready to make problems for future me. What did future me ever do for me, anyway?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, getting a late start again.
Let's see what I want...&lt;/p&gt;
&lt;p&gt;The &lt;tt class="docutils literal"&gt;Registry&lt;/tt&gt; defines four methods for updating its contents, though one is normally called by a convenience hook on another.
I think to handle this, I'd like to completely separate them in the actual classes, and make a helper function that combines them in some kind of stream-based way or something.&lt;/p&gt;
&lt;p&gt;Thinking about this, I could put calls to coercion functions into the helper functions, so the objects can contain the coerced strings.&lt;/p&gt;
&lt;p&gt;The other thing I'm thinking about is how small I want to make these objects.
In a few cases, making the objects simpler means I need more validation logic, because I can't offload the invariant maintenance onto the object structure.
Like, if I can add new required &lt;tt class="docutils literal"&gt;Target&lt;/tt&gt;s to an &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt; whenever, then that means that adding a &lt;tt class="docutils literal"&gt;Target&lt;/tt&gt; requires a check for cycles.&lt;/p&gt;
&lt;p&gt;Maybe there's some way to add additional data to the internal representation to convert non-local invariants to local invariants.
I'll just assume I can do that later and write something simpler for now.
What could possibly go wrong?&lt;/p&gt;
&lt;p&gt;I'll probably think about this a bit more before changing the code.&lt;/p&gt;
&lt;p&gt;But anyway, I'll regret my decisions that led to this point &lt;em&gt;even more&lt;/em&gt; if I don't wrap up ASAP.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-06-26</title><link href="https://mwchase.neocities.org/coding-2021-06-26" rel="alternate"></link><published>2021-06-26T04:00:00-04:00</published><updated>2021-06-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-06-26:/coding-2021-06-26</id><summary type="html">&lt;p class="first last"&gt;Polishing the code until it... shines is probably a bit much, yet.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Just working on a bit of polish right now.
I made the changes I mentioned at the end of the last coding entry.
Some of it was a bit rough, because I hope I can just punt on some of the design decisions for now.
Currently, the generated paths are... relatively hardcoded.&lt;/p&gt;
&lt;p&gt;I'm just going to iterate on that a few more times, because every tweak seems like it's opening up additional simplifications, currently.&lt;/p&gt;
&lt;p&gt;Like, I make &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt;s define their own logging interface, and that simplifies &lt;tt class="docutils literal"&gt;Result&lt;/tt&gt;s enough that I can replace them with an enum, which means I should be able to eliminate a loop and convert some conditional logic into a dict lookup.&lt;/p&gt;
&lt;p&gt;I've got a few fixes to make to a few tests, but nothing major.
I can do it while this entry publishes.&lt;/p&gt;
&lt;p&gt;At the same time, it's pretty late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2021-06-25</title><link href="https://mwchase.neocities.org/diary-2021-06-25" rel="alternate"></link><published>2021-06-25T04:00:00-04:00</published><updated>2021-06-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-06-25:/diary-2021-06-25</id><summary type="html">&lt;p class="first last"&gt;Pain is stupid and I hate it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I messed up my posture like two days in a row, and now I have to stand as straight and tall as I can, or &lt;em&gt;the pain&lt;/em&gt; hits.
I hate this.&lt;/p&gt;
&lt;p&gt;I am holding a cold pack on my chest to see if it does anything.
I really can't tell, although I am feeling more conscious of what my neck is doing at any given moment.
Status update: still hate this.&lt;/p&gt;
&lt;p&gt;Ugh, I wanted to be reviewing the design and design changes for the task runner, but I'm busy trying to make my body stop messing with me so I can get to sleep in a few hours.&lt;/p&gt;
&lt;p&gt;I think the only thing I really can do right now is lie down and read for a while, so I guess I'll do that instead of forcing myself to use the computer.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2021-06-24</title><link href="https://mwchase.neocities.org/coding-2021-06-24" rel="alternate"></link><published>2021-06-24T04:00:00-04:00</published><updated>2021-06-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-06-24:/coding-2021-06-24</id><summary type="html">&lt;p class="first last"&gt;It's nice to see convoluted messes get replaced with something simpler.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was doing other stuff today, so I got one thing done: switched &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;ActionName&lt;/tt&gt;.
This simplified code all over the place, although unfortunately some of the code wasn't covered, so I only have Mypy output to work with.&lt;/p&gt;
&lt;p&gt;I guess this was an object lesson in, sometimes you just have to try things, because I don't think I'd have anticipated just how much logic got untangled by slightly changing one data structure.
It's also an illustration of how helpful good type coverage can be, since I would not have felt confident changing the type definition without type coverage; tests can (sometimes) show that there's a problem, but it can be somewhat tricky to discern what the solution is based on a test failure.
When tests failed, I barely looked at the details of what went wrong, and just skipped to looking for API changes that needed to be accounted for.&lt;/p&gt;
&lt;p&gt;Anyway, that was all pretty good, but I still want to work on tweaking the configuration interface.
I'll get on that in the next few days.
For now, as usual, I should get ready for bed.&lt;/p&gt;
&lt;p&gt;(Quick note, it makes more sense to create an output folder and pass the path to &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt;s than it does to create specific file handles outside the &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt;.
That way, a custom &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt; has complete control over how it logs.)&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-06-23</title><link href="https://mwchase.neocities.org/coding-2021-06-23" rel="alternate"></link><published>2021-06-23T04:00:00-04:00</published><updated>2021-06-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-06-23:/coding-2021-06-23</id><summary type="html">&lt;p class="first last"&gt;Fun fact: switching the &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;ActionName&lt;/tt&gt; types should be an optimization, but it's not worth checking.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;As I was thinking about writing actual files for the task runner, I decided I wanted to make some changes to the API.
Those changes have knock-on effects that need to be carefully reasoned through.&lt;/p&gt;
&lt;p&gt;Basically, the current interface uses fluent methods on an immutable &lt;tt class="docutils literal"&gt;Registry&lt;/tt&gt; object to incrementally build up a configuration.
This is somewhat of a mismatch, because the decision of &amp;quot;what to add&amp;quot; should be independent of &amp;quot;what's in there&amp;quot;, so extension packages are burdened by the need to take a &lt;tt class="docutils literal"&gt;Registry&lt;/tt&gt; as input.
They are further burdened by the fact that the fluency constrains the output type: if a helper function wants to output additional target or action information, then its output needs to be explicitly unpacked, which breaks up the fluent chain.&lt;/p&gt;
&lt;p&gt;I believe these issues could be addressed by changing from &amp;quot;here is a method on a &lt;tt class="docutils literal"&gt;Registry&lt;/tt&gt; object&amp;quot; to &amp;quot;here is an object that describes a change to a &lt;tt class="docutils literal"&gt;Registry&lt;/tt&gt;&amp;quot;.
This means that, instead of a fluent chain, the means of change is a &lt;em&gt;sequence of change objects&lt;/em&gt;, which can be manipulated as data.
Instead of chaining methods, just concatenate sequences.&lt;/p&gt;
&lt;p&gt;The question this raises for me is, how free should extension packages be to customize the behavior of change objects?
The &lt;em&gt;most general&lt;/em&gt; interface is &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Callable[[Registry],&lt;/span&gt; Registry]&lt;/tt&gt;, but doing this would discard guarantees like &amp;quot;the output is (loosely speaking) a 'superset' of the input&amp;quot;.
That guarantee could be reclaimed by creating some kind of &amp;quot;delta&amp;quot; object that must be merged with the &lt;tt class="docutils literal"&gt;Registry&lt;/tt&gt;.
This all seems kind of complicated, though.
The easiest sufficient solution is to convert each method to a type, then dispatch from the type to the underlying method.&lt;/p&gt;
&lt;p&gt;Thinking about this suggested some invariants that I might want to code explicit invariants for, once I have proper profiling data:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Target&lt;/tt&gt;s and &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt;s (at least, those reachable from named &lt;tt class="docutils literal"&gt;Target&lt;/tt&gt;s) form a DAG&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Action&lt;/tt&gt; names are unique (for this, I may switch the &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;ActionName&lt;/tt&gt; types in the definition of &lt;tt class="docutils literal"&gt;Registry&lt;/tt&gt;.)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;TargetName&lt;/tt&gt;s that are skipped by default are all mapped to at least one &lt;tt class="docutils literal"&gt;Target&lt;/tt&gt;. (I could see downgrading this to a warning.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thinking about this, the two things to definitely try are to swap &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;ActionName&lt;/tt&gt;, and to make a simple external type so I can work on deprecating the fluent interface.&lt;/p&gt;
&lt;p&gt;I may try moving validator logic out of the update methods, but I don't want to mess with things that have obvious performance implications before I have performance testing that I somewhat trust, and that'll probably be easier to handle once I nail down the interface, so I don't end up needing to rewrite the benchmark.&lt;/p&gt;
&lt;p&gt;None of that is happening tonight, however; this is all planning for the next time I start changing around the code.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2021-06-22</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-06-22" rel="alternate"></link><published>2021-06-22T04:00:00-04:00</published><updated>2021-06-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-06-22:/weekly-roundup-2021-06-22</id><summary type="html">&lt;p class="first last"&gt;Overall some more good progress.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I got a haircut and thought about tests for the task runner.&lt;/li&gt;
&lt;li&gt;Thursday: I thought a little more about the design of the task runner tests that I want.&lt;/li&gt;
&lt;li&gt;Friday: I got the sequencing tests written, and thought &amp;quot;Oh, I'll test the command line. That should be simple.&amp;quot; It was not simple, and I had to spend some time debugging it.&lt;/li&gt;
&lt;li&gt;Saturday: I spent the time to debug the test failures. So many wrong assumptions, so many.&lt;/li&gt;
&lt;li&gt;Sunday: I made a small improvement to testability, then started to consider improvements I want to make to the runner unrelated to &amp;quot;run as quickly as several layers of Python code can manage&amp;quot;&lt;/li&gt;
&lt;li&gt;Monday: I got home at like ten or ten thirty and wasn't up for writing much.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to polish and refine the prototype a bit more, before I take a break from it for a bit.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Diary 2021-06-21</title><link href="https://mwchase.neocities.org/diary-2021-06-21" rel="alternate"></link><published>2021-06-21T04:00:00-04:00</published><updated>2021-06-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-06-21:/diary-2021-06-21</id><summary type="html">&lt;p class="first last"&gt;I don't remember why I thought I'd get anything done today.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I took things easy today, and then we traveled again, so I didn't have a chance to work on anything.&lt;/p&gt;
&lt;p&gt;Right now, I'm just trying to figure out some way to relax and unwind before I go to bed, and I'm not doing a great job currently.&lt;/p&gt;
&lt;p&gt;I think I've just got to publish this, shut things down, maybe put on some music, and zone out.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2021-06-20</title><link href="https://mwchase.neocities.org/coding-2021-06-20" rel="alternate"></link><published>2021-06-20T04:00:00-04:00</published><updated>2021-06-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-06-20:/coding-2021-06-20</id><summary type="html">&lt;p class="first last"&gt;Not resting on my laurels, which may or may not exist.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, there's now control over syntax coloring!
Probably!&lt;/p&gt;
&lt;p&gt;While I think the task runner is close enough to tested that I'd be comfortable trying it out against actual codebases, I want to step back for now and kind of subconsciously consider a few things.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Right now, it gathers up stdout and stderr in memory; I want to convert these to files that get streamed to a generated directory. One thing I want to ponder is having a symlink to the latest run's directory; I don't know whether that would present a significant barrier to anyone developing on Windows.&lt;/li&gt;
&lt;li&gt;Setting that up would also require changing the signature of the &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt; callable type, which isn't currently a big deal. It would be to include file objects of some kind. My current thinking is that I should go for &amp;quot;somewhat slower than idealized performance&amp;quot;, and say, okay, the interface gets an asynchronous file object, then the consumer can unwrap it if a synchronous object is required. (Note that, it looks like there are various good reasons for the task runner to open these files in binary mode.)&lt;/li&gt;
&lt;li&gt;As a further knock-on, I think this gives me a reason to change &amp;quot;&lt;tt class="docutils literal"&gt;Action&lt;/tt&gt;s given the same name&amp;quot; from a warning to an error, because if all action names are unique, it means that action logs can just use the name directly.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm not going to think about this specifically, but I'm also going to want, when I come back to this, to figure out the right project layout for exposing the configuration-side APIs at the project root, or possibly in some low-level submodule.
I'm leaning towards the latter because the configuration side of the Python API is supposed to be a temporary thing that gets stripped out before I'm comfortable moving the version to 1.0.&lt;/p&gt;
&lt;p&gt;Actually, let's think about the different ways this gets consumed...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;em&gt;running&lt;/em&gt; the runner invokes an entry point, which (currently) imports the configuration file and processes it&lt;/li&gt;
&lt;li&gt;&lt;em&gt;writing&lt;/em&gt; the configuration file currently involves importing various functions from inside the app&lt;/li&gt;
&lt;li&gt;I won't have a handle on &lt;em&gt;extending&lt;/em&gt; the app until I try using it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thinking about this, one thing it would be worth doing before I step away is actually writing the configuration file for the app itself, and seeing how that shakes out in practice.
For example, right now the noxfile takes a minute to run, and I believe ten seconds is the realistic lower bound given the current suite, and I want to see which side it's all closer to.&lt;/p&gt;
&lt;p&gt;I'll do that tomorrow; for now I want to clean up and get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-06-19</title><link href="https://mwchase.neocities.org/coding-2021-06-19" rel="alternate"></link><published>2021-06-19T04:00:00-04:00</published><updated>2021-06-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-06-19:/coding-2021-06-19</id><summary type="html">&lt;p class="first last"&gt;Fixing a bunch of trivial errors, to make 100 tests pass.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Summary of the problems I fixed with the task runner:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I misnamed a command-line flag in some of the test variants&lt;/li&gt;
&lt;li&gt;Near as I can tell, I wasn't supposed to be using &lt;tt class="docutils literal"&gt;resolve()&lt;/tt&gt; for what I was using it for&lt;/li&gt;
&lt;li&gt;I had a mismatch between the name passed to a template, and the name referenced in a template&lt;/li&gt;
&lt;li&gt;Minor issue about gobbling newlines.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From looking at some of the test failures before I got this all working, I think an important issue is the fact that I'm not confirming my understanding of the terminal colors.
If I want proper tests in that area, I'll need to create a command-line flag for controlling the coloring behavior, and make some changes to the way coloring is currently handled.&lt;/p&gt;
&lt;p&gt;That seems like a good thing to work on later; I'm already tired right now, so once again I'm not going to push myself.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-06-18</title><link href="https://mwchase.neocities.org/coding-2021-06-18" rel="alternate"></link><published>2021-06-18T04:00:00-04:00</published><updated>2021-06-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-06-18:/coding-2021-06-18</id><summary type="html">&lt;p class="first last"&gt;Catastrophic failure for no obvious reason. Now this is familiar territory.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The sequencing tests were a success, so the core logic looks solid for simple cases.&lt;/p&gt;
&lt;p&gt;However, I also wrote tests to exercise the CLI, and some part of the rendering pipeline outright does not work.&lt;/p&gt;
&lt;p&gt;Let's go through this slowly.
I've defined a pair of tests; the differences between them are not important.
Thanks to Coverage.py's test integration, I can confirm that both tests are registering and calling some custom hooks on the application object.
These hooks resolve the &lt;tt class="docutils literal"&gt;Jinja2TemplateHandler&lt;/tt&gt; associated with the app, and inject custom filters into the environment.&lt;/p&gt;
&lt;p&gt;At this point, I can see two reasons this could fail:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Repeated invocations of the &lt;tt class="docutils literal"&gt;resolve()&lt;/tt&gt; method are returning different handler instances. I assume this possibility doesn't make sense.&lt;/li&gt;
&lt;li&gt;The handler is used for rendering before the hooks can inject the custom filters. This doesn't make sense to me, and would suck, a lot.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I hope there's something else I'm missing, but if there is, I'm not in a state to figure it out.
I just added a bit of exploratory logging, but I'm tired and wasn't thinking clearly and it didn't work.
I think I'm going to need to drop into a debugger to figure this out.
And figuring out the right way to hook that up is probably a whole other thing.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-06-17</title><link href="https://mwchase.neocities.org/coding-2021-06-17" rel="alternate"></link><published>2021-06-17T04:00:00-04:00</published><updated>2021-06-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-06-17:/coding-2021-06-17</id><summary type="html">&lt;p class="first last"&gt;This entry was somewhat truncated by my eyelashes just jamming themselves all over the inside of my eyelids.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, I got &lt;em&gt;a little&lt;/em&gt; distracted souping up the task runner's noxfile.
It's now got another profiler, the output of which &lt;em&gt;mainly&lt;/em&gt; serves to show off how I probably shouldn't be using the test suite to get profiler data.&lt;/p&gt;
&lt;p&gt;Anyway, let's see if I can quickly set up more core tests.
The basic topology I want is a single target that transitively depends on everything, and two pairs of &amp;quot;intermediate&amp;quot; actions that can be sequenced into one of six orders, and possibly a baseline action that sets up the dependencies.&lt;/p&gt;
&lt;p&gt;So, there are four actions with synchronization between them.
At the cost of &amp;quot;excess&amp;quot; synchronization in some cases, this can be handled by having a &lt;tt class="docutils literal"&gt;trio.Event&lt;/tt&gt; that's set in one action and waited for in the next.
To avoid having two cases for the initial action, a baseline action can be defined that takes one &lt;tt class="docutils literal"&gt;trio.Event&lt;/tt&gt; and immediately sets it.
The rest can then two &lt;tt class="docutils literal"&gt;trio.Event&lt;/tt&gt;s, await one, set the other, and return a dummy result.&lt;/p&gt;
&lt;p&gt;Sadly, I'm too sleepy now to execute on this currently, but hopefully that's enough for me to go on a few days from now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2021-06-16</title><link href="https://mwchase.neocities.org/diary-2021-06-16" rel="alternate"></link><published>2021-06-16T04:00:00-04:00</published><updated>2021-06-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-06-16:/diary-2021-06-16</id><summary type="html">&lt;p class="first last"&gt;That's a weight off my shoulders. *finger guns*&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I mostly took things easy again today.
We got haircuts, and it feels absolutely amazing to move my head without my hair following through, and feeling stuff on the back of my neck.
Super excited to get my hair quickly washed, dried and combed, rather than just... basically none of those.&lt;/p&gt;
&lt;p&gt;Thinking about what I want to do for task runner testing later...
I want more core tests, which should use extra synchronization objects (which probably shouldn't be used for non-test purposes) to force identical task graphs into different orders.
I want to test the exact output of the target list flow, and the end of the output for the execution flow.
(Actually, it occurs to me that I probably need better integration between the progress bar library and the app.
I'll research that after I publish this.)
(Actually, on further reading, I'm not sure whether Cement has the kind of tooling I'm used to from Click.
I'm not currently clear on how I'd do something like capture output.
I guess I have to make sure that I use as few &lt;tt class="docutils literal"&gt;render&lt;/tt&gt; calls as possible?)&lt;/p&gt;
&lt;p&gt;Anyway, I'm really tired again; apparently &amp;quot;spacing out&amp;quot; doesn't count as &amp;quot;sleep&amp;quot;, which seems really unfair when you get right down to it.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2021-06-15</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-06-15" rel="alternate"></link><published>2021-06-15T04:00:00-04:00</published><updated>2021-06-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-06-15:/weekly-roundup-2021-06-15</id><summary type="html">&lt;p class="first last"&gt;Writing this entry while fighting off a food coma...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I worked on the core scheduling logic for the task runner. Most of it's easy, but I had trouble with the middle layer that basically soaked up all the complexity.&lt;/li&gt;
&lt;li&gt;Thursday: I got tests for the whole thing, then started planning what to work on next.&lt;/li&gt;
&lt;li&gt;Friday: I decided that, after I published that entry, I would work on designing the output presentation logic, which I did.&lt;/li&gt;
&lt;li&gt;Saturday: We went out and did some stuff, and my pyenv installation broke in subtle and mysterious ways.&lt;/li&gt;
&lt;li&gt;Sunday: I thought about what &amp;quot;a nice organization&amp;quot; for some of the extension and plugin stuff I want would look like. I probably need to think some more.&lt;/li&gt;
&lt;li&gt;Monday: I got the task runner to a point where it's all supposedly more-or-less functional. We'll see.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to polish up the task runner code, and add the one major piece of functionality that's stubbed out: a progress bar.
The main hurdle there is figuring out a clean integration.
I might punt on &amp;quot;clean&amp;quot; and just inject it all into the main flow for now.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2021-06-14</title><link href="https://mwchase.neocities.org/coding-2021-06-14" rel="alternate"></link><published>2021-06-14T04:00:00-04:00</published><updated>2021-06-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-06-14:/coding-2021-06-14</id><summary type="html">&lt;p class="first last"&gt;Getting the easy part done.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right.
I put together first drafts of the filters I want, injected them in a way that doesn't immediately crash Cement (it wants my functions to be &lt;em&gt;functions&lt;/em&gt;? What's up with that? (I joke, but the meaning behind the joke is that it wants at least some of the callables I pass to the API to have &lt;tt class="docutils literal"&gt;__name__&lt;/tt&gt; attributes, which I wasn't expecting.)), and wrote templates that might be valid; I don't have tests for them yet.&lt;/p&gt;
&lt;p&gt;Right now, I'm looking over the main program flow to figure out what I want to tweak next.
Currently, the code errors out &amp;quot;before&amp;quot; it can act on the configuration.
So, that error needs to be moved into a conditional that does a type check, and the next check is for whether to list targets, which, I don't actually have the code for that yet, but that's simple to add.
And, added.
I'm going to try to just muddle my way through all this...&lt;/p&gt;
&lt;p&gt;For some of this, I'm just going to transcribe some of my prototype code, which is self-evidently perfect except for all the bits where I didn't run it and it would have blown up if I'd ever tried.&lt;/p&gt;
&lt;p&gt;Put that all together and...
Now something is failing most of the tests, and the traceback is formidable.
Let's see what I can work out.&lt;/p&gt;
&lt;p&gt;Okay, I just had to let the tests run somewhat to completion.
Turns out I made a bad assumption; I &lt;em&gt;think&lt;/em&gt; the default template from Cement led me astray a little.
I think maybe these kinds of templates should have the output commented to show like &amp;quot;here's a good practice to usually follow&amp;quot; versus &amp;quot;here's something silly that you're supposed to change&amp;quot;.
That might stop stuff like e-readers shipping with ROT13 or cyclic XOR for DRM.&lt;/p&gt;
&lt;p&gt;Anyway, the code is all in, but there are no new tests, and a few static analysis issues.
I'll take care of those after I publish this.
Anyway, this code should be ready for an initial release soon.
All ~0.5 kloc of it.&lt;/p&gt;
&lt;p&gt;Well, I should wrap things up for tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-06-13</title><link href="https://mwchase.neocities.org/coding-2021-06-13" rel="alternate"></link><published>2021-06-13T04:00:00-04:00</published><updated>2021-06-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-06-13:/coding-2021-06-13</id><summary type="html">&lt;p class="first last"&gt;Getting ready to add more features to the application.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got plans for implementing stuff for the task runner, using Cement's facilities.
I want to make at least one extension to handle extending the existing Jinja environment to define additional filters.&lt;/p&gt;
&lt;p&gt;I was thinking about injecting the &lt;tt class="docutils literal"&gt;Terminal&lt;/tt&gt; object from &lt;a class="reference external" href="https://github.com/jquast/blessed"&gt;blessed&lt;/a&gt; into the &lt;tt class="docutils literal"&gt;app&lt;/tt&gt;, but until I determine that I need to reuse it, I think it's fine to just initialize it in the extension's &lt;tt class="docutils literal"&gt;load(app)&lt;/tt&gt; function.
I might also want to customize it according to the app's config.
In that case, I might put it in &lt;tt class="docutils literal"&gt;pre_setup&lt;/tt&gt;, just so I'm sure it's configured before any of the &lt;tt class="docutils literal"&gt;post_setup&lt;/tt&gt; hooks run.&lt;/p&gt;
&lt;p&gt;I didn't want to trying doing all of that before writing up this entry, because I'd like to wrap things up early-ish, and getting this entry in is part of that.
So, after I publish this, I'll mess around a little, then do other stuff to wrap up.&lt;/p&gt;
&lt;p&gt;I might have gotten more stuff done today, but eh, we had plans.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2021-06-12</title><link href="https://mwchase.neocities.org/diary-2021-06-12" rel="alternate"></link><published>2021-06-12T04:00:00-04:00</published><updated>2021-06-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-06-12:/diary-2021-06-12</id><summary type="html">&lt;p class="first last"&gt;Technology out here keeping me on my toes by inventing entirely new problems that it's possible nobody else has.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Two major things prevented me from having much to write about today.
The bigger problem was that I was unable to get to sleep for a good stretch of last night, so I was in a confused haze all day.&lt;/p&gt;
&lt;p&gt;The more recent problem was that something in all the code and scripts related to pyenv is setting my &lt;tt class="docutils literal"&gt;PYENV_VERSION&lt;/tt&gt; environment variable to &lt;tt class="docutils literal"&gt;system&lt;/tt&gt; whenever I start a shell, which is really great if you want &lt;tt class="docutils literal"&gt;pyenv local&lt;/tt&gt; to be useless, and in no other circumstance that I can think of.
I've determined that the problem manifests sometime between the end of &lt;tt class="docutils literal"&gt;.profile&lt;/tt&gt; and the beginning of &lt;tt class="docutils literal"&gt;config.fish&lt;/tt&gt;, which... I don't know what goes between those.
This is a clear case of ignorance on my part, and my Mastodon account is right down there if anyone wants to educate me on this.&lt;/p&gt;
&lt;p&gt;I mean, I'm working around this by including &lt;tt class="docutils literal"&gt;pyenv shell &lt;span class="pre"&gt;--unset&lt;/span&gt;&lt;/tt&gt; in my &lt;tt class="docutils literal"&gt;config.fish&lt;/tt&gt;, but &lt;em&gt;what if I didn't need that line in the first place?&lt;/em&gt;
Wouldn't that be nice?&lt;/p&gt;
&lt;p&gt;Getting this fixed was a priority because Three Dollar Quill has its own virtualenv for installing stuff like the youtube embedding extension, and I didn't want to manually set the pyenv environment to that every time I entered the directory, &lt;em&gt;like some kind of caveman&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I'm really excited to figure out how to put my design ideas for the task runner into practice, but that's not happening until I get a good night's sleep.
Speaking of which.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2021-06-11</title><link href="https://mwchase.neocities.org/coding-2021-06-11" rel="alternate"></link><published>2021-06-11T04:00:00-04:00</published><updated>2021-06-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-06-11:/coding-2021-06-11</id><summary type="html">&lt;p class="first last"&gt;Oops.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I did some other writing, so rather than take about what I accomplished coding, I'm going to give myself a concrete goal for what to work on after I publish.&lt;/p&gt;
&lt;p&gt;So, in my design work for output, I identified a basic unit of presentation that can be applied to the task of output.
There is a list of items to print, separated by newlines.
If there are items in the list, then a specified header is printed, otherwise, nothing is.
The whole thing is wrapped up in terminal formatting codes to change the color.
For each of these sections, the code defines the header and the terminal color, and the input data is the list of items to print.&lt;/p&gt;
&lt;p&gt;I need to figure out which parts of this to represent in Jinja, and how.
I believe I already did a lot of the work, I just don't remember it super well.&lt;/p&gt;
&lt;p&gt;Anyway, this took way too long and I'm just going to be doing some frantic sketching because it's super late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-06-10</title><link href="https://mwchase.neocities.org/coding-2021-06-10" rel="alternate"></link><published>2021-06-10T04:00:00-04:00</published><updated>2021-06-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-06-10:/coding-2021-06-10</id><summary type="html">&lt;p class="first last"&gt;It just worked. That's pretty gratifying.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The code now has full test coverage, and more-or-less makes sense to me.
The tests are... fine.&lt;/p&gt;
&lt;p&gt;So, I guess my next step now is to work on designing the various bits of output logic.
After that, get the required code and templates in and tested.
Then, wire it all together.
Finally, get this all &amp;quot;self-hosted&amp;quot; so I can test the code &lt;em&gt;with&lt;/em&gt; the code, and pull helper functions out of the configuration file into the library as optional helpers.
Then, just iterate adding more advanced forms of testing and analysis.&lt;/p&gt;
&lt;p&gt;I'm going to wrap up now and sketch out output details.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-06-09</title><link href="https://mwchase.neocities.org/coding-2021-06-09" rel="alternate"></link><published>2021-06-09T04:00:00-04:00</published><updated>2021-06-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-06-09:/coding-2021-06-09</id><summary type="html">&lt;p class="first last"&gt;I should probably rework the code that I haven't tested a little.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was working on other stuff today (worldbuilding and some other writing), so I just did some quick work on the task runner in the last hour or so.
I added the easy tests, which confirmed that the very core scheduling logic works as expected under simplified conditions, and made me suspect that I should change around the signature for the high-level helper function.
Yeah, I did that.
I can change it back later if it's a problem.&lt;/p&gt;
&lt;p&gt;What's left to work on now is the kind of middle layer between them, which seems to have soaked up a lot of complexity that I'm not sure what else to do with.
What's in the middle?
A higher-order function that creates a pair of mutually recursive asynchronous closures over its arguments, some of which are mutable.
The closure that is actually returned is pretty simple, but the workhorse closure starts off with a for-loop inside an asynchronous context manager inside a synchronous context manager, delegate execution to its argument, which has to be a nullary asynchronous function, and then checks whether to raise an exception based on the return value of that.&lt;/p&gt;
&lt;p&gt;This is going to be at least another day of work to get tests written for it.
Things to test:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Having stuff in the for-loop or not&lt;/li&gt;
&lt;li&gt;Triggering the exception or not&lt;/li&gt;
&lt;li&gt;Confirming that raising the exception prevents dependent actions from executing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All right, I can see my way to testing that, but I don't want to do it right now.
Soon™.&lt;/p&gt;
&lt;p&gt;Time to wrap up.
At the very least, even if I can't go outside yet because the humidity is seesawing between uncomfortable and dangerous, at least I'm getting overall work done at a pace that I like more.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2021-06-08</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-06-08" rel="alternate"></link><published>2021-06-08T04:00:00-04:00</published><updated>2021-06-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-06-08:/weekly-roundup-2021-06-08</id><summary type="html">&lt;p class="first last"&gt;I do a bunch of things, and then nature laughs at my unrelated hubris.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I wrote Lexurgy definitions for the vowels I'm going to use, and sketched out a plan for consonants. I described an idea for a high-level workflow that uses Lexurgy to power individual steps within it.&lt;/li&gt;
&lt;li&gt;Thursday: I got through consonants, and started thinking about suprasegmentals. I thought some more about the high-level workflow concept.&lt;/li&gt;
&lt;li&gt;Friday: I finished up the first draft of my Lexurgy sound definitions, and posted it, because why not. I considered some alternatives to the high-level flow, and decided I probably wanted to go with pretty much the original concept, &lt;em&gt;but&lt;/em&gt; I want to prototype it against an existing Lexurgy example.&lt;/li&gt;
&lt;li&gt;Saturday: I was kind of out of it, so I talked about the stuff we watched.&lt;/li&gt;
&lt;li&gt;Sunday: I switched gears back to coding, starting with critiquing my task runner prototype. This gave me an idea to try for the next prototype version.&lt;/li&gt;
&lt;li&gt;Monday: I put that idea into practice, and decided I liked it well enough for now.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to take advantage of our fully-developed immunity.
But it's so humid!
The air is so gross!
I don't want to touch it.&lt;/p&gt;
&lt;p&gt;Also, task runner code, fantasy worldbuilding, stuff like that.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2021-06-07</title><link href="https://mwchase.neocities.org/coding-2021-06-07" rel="alternate"></link><published>2021-06-07T04:00:00-04:00</published><updated>2021-06-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-06-07:/coding-2021-06-07</id><summary type="html">&lt;p class="first last"&gt;Just type up the first thing that occurs to me, it's probably fine.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I managed to prototype basically the idea I came up with last night, with a few concessions to mild laziness.
I've confirmed that the code typechecks, and imports fine, but the majority of the logic lives inside closures, because for whatever reason I'm more comfortable sticking a mutable structure into a closure rather than a dataclass-like class.
So, there's a bunch of tests to write, but they shouldn't be particularly hard tests.&lt;/p&gt;
&lt;p&gt;Here's what I think is missing:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Target listing (including formatting)&lt;/li&gt;
&lt;li&gt;Reading target list from the command line&lt;/li&gt;
&lt;li&gt;Calling into the runner code I just wrote&lt;/li&gt;
&lt;li&gt;Updating progress bar code from the prototype&lt;/li&gt;
&lt;li&gt;Extracting output&lt;/li&gt;
&lt;li&gt;Formatting output&lt;/li&gt;
&lt;li&gt;Determining desired return code&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of that comes down to just hooking up the existing components, some of which I've already researched.
In any case, once I've proved out the core runner code, the hard bit is probably going to be getting the Cement integration right; I may cut a few corners at first.&lt;/p&gt;
&lt;p&gt;Anyway, I want to sleep, but I also want to write down some unrelated ideas first, so here we go, wrapping up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-06-06</title><link href="https://mwchase.neocities.org/coding-2021-06-06" rel="alternate"></link><published>2021-06-06T04:00:00-04:00</published><updated>2021-06-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-06-06:/coding-2021-06-06</id><summary type="html">&lt;p class="first last"&gt;Coming up with one (1) idea, then getting to sleep, because I got distracted by other things that seemed unreasonably hard.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got a bit distracted trying to get my computer to be a little more thorough with dark mode.
I was trying all sorts of web searches with the intent to change some of Firefox's color choices with a GTK theme, then I finally gave up and installed Stylish, to redo the coloration only of &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;file://&lt;/span&gt;&lt;/tt&gt; URLs that look like directories.
It's not fully baked yet, but it's a little less blinding.&lt;/p&gt;
&lt;p&gt;Anyway, I'm just going to review where I was with the prototype code, and call it a night.&lt;/p&gt;
&lt;p&gt;One of the key parts of mutable state in the prototype is a pair of mappings from &lt;tt class="docutils literal"&gt;Action&lt;/tt&gt;s to &lt;tt class="docutils literal"&gt;trio.Event&lt;/tt&gt;s.
These are always manipulated together, which implies to me that I should have a wrapper object around two &lt;tt class="docutils literal"&gt;trio.Event&lt;/tt&gt;s.
I'll have to think this over more later, but it makes intuitive sense to me.
It would mean that I'd potentially need to do some gnarly stuff with higher-order functions.
(Basically, it looks to me like I'd need this new wrapper object to expose a method for handling the high-level dispatch, because part of the prototype logic is based around early returns.
That means that the &amp;quot;core logic&amp;quot;, which may or may not run from a given invocation, would need to be passed in as a nullary async function.
(There are other possibilities, but I'm leaning towards nullary.))
Anyway, that's a brand-new idea to me, and I'm going to need to be better-rested to fully evaluate it, so I'd better get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2021-06-05</title><link href="https://mwchase.neocities.org/diary-2021-06-05" rel="alternate"></link><published>2021-06-05T04:00:00-04:00</published><updated>2021-06-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-06-05:/diary-2021-06-05</id><summary type="html">&lt;p class="first last"&gt;Somehow, setting the AC to kick in at a &lt;em&gt;higher&lt;/em&gt; temperature than the air outside did something.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I was kind of out of it today, so I'm not going to push myself to write or do too much.
Just a few more days, and I'll finally be comfortable going outside for reasons besides going to or from the car.&lt;/p&gt;
&lt;p&gt;Today, we watched &lt;em&gt;Zero Hour!&lt;/em&gt;, which is the movie that more-or-less got remade into &lt;em&gt;Airplane!&lt;/em&gt;.
It was kind of weird seeing some of the lines that were used to set up jokes just being said straight and moved on from, but also seeing bits where &lt;em&gt;Airplane!&lt;/em&gt; didn't really have to add anything.
All that said, it's a good disaster movie.&lt;/p&gt;
&lt;p&gt;Like I said, we'll be done building up immunity soon, and we're trying to think of stuff to go out and do.
I don't really know what's going to be available to go to and do stuff at, because of the pandemic, but we'd like to go out and do &lt;em&gt;something&lt;/em&gt;.
Probably get haircuts.
My hair is in pretty sorry shape right now.
Earlier today, I tried to comb it, and it formed into three lobes: one on top, and one on each side.
Not really the look I was going for, but I just have to hold out a little longer.
(It &lt;em&gt;might&lt;/em&gt; have been partly down to the high dew point.
It was too humid for me to really even &lt;em&gt;think&lt;/em&gt; this morning.)&lt;/p&gt;
&lt;p&gt;Anyway, that's everything I can think of to talk about, so I guess I should wrap this up.
I'm now wrapping this up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Conlanging 2021-06-04</title><link href="https://mwchase.neocities.org/conlanging-2021-06-04" rel="alternate"></link><published>2021-06-04T04:00:00-04:00</published><updated>2021-06-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-06-04:/conlanging-2021-06-04</id><summary type="html">&lt;p class="first last"&gt;The first draft is done, time to reflect, and also try to properly learn linguistics.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;My Lexurgy definitions are now syntactically valid, though I'm not sure if they all do what I want.
I'm going to drop the current version at the end of the post, and try to wrap things up quickly.
My plan right now is to take some time to think about how to handle affixation.
One possibility that occurs to me is to do all of the pre-processing ahead-of-time, so there's a metadata-annotated lexicon that gets converted into a wordlist that consists of &lt;em&gt;phrases&lt;/em&gt; that correspond to single words in the modern language.
My gut reaction to that idea is that it's limited in terms of interpolation and extrapolation.
Deriving intermediate or future lexicons requires generating an entirely new wordlist, because the wordlist is only valid for a single chronolect.&lt;/p&gt;
&lt;p&gt;As such, I want to try my initial idea, but not on this conlang.
If this concept works on anything, it should work on the Tpaalha sample in the Lexurgy app.&lt;/p&gt;
&lt;p&gt;One thing that occurs to me about having rules for affixation, is that I'd want to have tests to establish that affixation doesn't happen with words that I'm not expecting it to.
That'll be a neat trick, probably.&lt;/p&gt;
&lt;p&gt;Anyway, here's my current draft.
It has problems, some of which I'm even aware of!&lt;/p&gt;
&lt;p&gt;&amp;quot;Prelude&amp;quot;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
# Length distinctions apply to both vowels and consonants
Feature +long
# These are the major distinctions that can apply to consonants
Feature +aspirated, +prenasalized, voiced
Feature place(labial, dental, palatal, velar, glottal)
Feature manner(stop, fricative, nasal, approximant)
Feature +sibilant
Feature +lateral
# Only for Sj-sound
Feature +labialized
# These features distinguish vowels
Feature openness(open, openmid, closemid, nearclose, close)
Feature front, raised, retracted
Feature round
# Okay, let's work on stress now...
Feature stress(primary, secondary)
Feature +peak
Diacritic ˈ (floating) (before) [primary]
Diacritic ˌ (floating) (before) [secondary]
Diacritic ⁿ (before) [+prenasalized]
Diacritic ʰ [+aspirated]
Diacritic ̂ [+peak]
Diacritic ː [+long]
Symbol i [close +front -raised -retracted -round]
Symbol y [close +front -raised -retracted +round]
Symbol u [close -front +raised -retracted +round]
Symbol ɪ [nearclose +front -raised -retracted -round]
Symbol ʏ [nearclose +front -raised -retracted +round]
Symbol ʊ [nearclose -front +raised -retracted +round]
Symbol e [closemid +front -raised -retracted -round]
Symbol ø [closemid +front -raised -retracted +round]
Symbol o [closemid -front +raised -retracted +round]
Symbol ɛ [openmid +front -raised -retracted -round]
Symbol œ [openmid +front -raised -retracted +round]
Symbol ɔ [openmid -front -raised +retracted +round]
Symbol a [open +front -raised -retracted -round]
Symbol ɑ [open -front -raised +retracted +round]
# Okay, let's work on the consonants
Symbol m [labial nasal +voiced]
Symbol n [dental nasal +voiced]
Symbol ɲ [palatal nasal +voiced]
Symbol ŋ [velar nasal +voiced]
Symbol p [labial stop -voiced]
Symbol b [labial stop +voiced]
Symbol t [dental stop -voiced]
Symbol d [dental stop +voiced]
Symbol c [palatal stop -voiced]
# This *probably* won't appear in the modern version.
Symbol ɟ [palatal stop +voiced]
Symbol k [velar stop -voiced]
Symbol ɡ [velar stop +voiced]
# This *may* appear so some intermediate thing
Symbol ʔ [glottal stop -voiced] # I *guess* it's -voiced? Either that, or absent.
Symbol s [dental fricative +sibilant -voiced]
Symbol z [dental fricative +sibilant +voiced]
# This should appear in the final result
Symbol ɕ [palatal fricative +sibilant -voiced]
# This should not
Symbol ʑ [palatal fricative +sibilant +voiced]
Symbol f [labial fricative -voiced]
Symbol v [labial fricative +voiced]
Symbol θ [dental fricative -voiced]
Symbol ð [dental fricative +voiced]
# This shouldn't appear in the final result
Symbol ç [palatal fricative -voiced]
# This should
Symbol ʝ [palatal fricative +voiced]
# This should always be labialized in the final result; that's *a* way to handle Sj
Symbol x [velar fricative -voiced]
Symbol ɣ [velar fricative +voiced]
# I don't really want to have the voiced version in here
Symbol h [glottal fricative -voiced]
Symbol r [dental approximant +voiced]
Symbol l [+lateral dental approximant +voiced]
Symbol ʎ [+lateral palatal approximant +voiced]
&lt;/pre&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Conlanging 2021-06-03</title><link href="https://mwchase.neocities.org/conlanging-2021-06-03" rel="alternate"></link><published>2021-06-03T04:00:00-04:00</published><updated>2021-06-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-06-03:/conlanging-2021-06-03</id><summary type="html">&lt;p class="first last"&gt;It's annoying that this comes down to dozens of subjective judgement calls at the lowest level, but I guess it shouldn't be &lt;em&gt;surprising&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I've &lt;em&gt;maybe&lt;/em&gt; got every consonant I'll need, and a few I'm not sure about, entered into my sound change file, with just a bit of IPA fudging.&lt;/p&gt;
&lt;p&gt;It wasn't hard to add support for stress on top of that, and now my big issue is, if I want to have &amp;quot;pitch accent&amp;quot; show up in the modern version of the language, then how do I represent that?
Swedish pitch accent appears to be a distinction that reliably stays with words (mostly) regardless of dialect, but the details of the &lt;em&gt;realization&lt;/em&gt; vary by dialect.
The thing that's confusing me in terms of representation, is that the pitch contours for the accents pass through more tones than there are syllables in the words.
So, I can't just cram diacritics onto the syllables.
Can I?
I think what would make the most sense to me would be to have a &amp;quot;peak&amp;quot; diacritic that attaches to the syllable.
That would basically leave the details of the timing to &amp;quot;how many peaks are there?&amp;quot;&lt;/p&gt;
&lt;p&gt;(I should probably also add secondary stress, but I'm going to hope that's not too hard.)&lt;/p&gt;
&lt;p&gt;My plan now is to sleep on this, make sure it all makes sense, then add in &amp;quot;peak&amp;quot; diacritics and secondary stress markers.
From there, the next step is to validate my feature definitions to make sure I didn't use characters that I shouldn't have.
After that, I'll look into specifying the kinds of things I want to validate in the wordlists, and work on a validator for the end state.
At that point, I'll have to make the call on whether to make this some kind of multi-stage thing.
Unless I've missed something, I don't see a way to add and drop lines purely within Lexurgy, so I &lt;em&gt;think&lt;/em&gt; I need to rope in some other form of text processing.
That's something to look into more carefully later, now that I've probably got all but two symbols defined.&lt;/p&gt;
&lt;p&gt;The other &amp;quot;fun&amp;quot; thing is going to be discovering what should have been binary, what should have been univalent, and which contentious and academically-recent debates I managed to accidentally pick a side on, and how that's going to mess with my sound change rules.&lt;/p&gt;
&lt;p&gt;Thinking ahead...
I've got a bunch of simple changes planned, but what I should probably be thinking about more is stress-dependence.&lt;/p&gt;
&lt;p&gt;Anyway, &lt;em&gt;right now&lt;/em&gt; I should be thinking about bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Conlanging 2021-06-02</title><link href="https://mwchase.neocities.org/conlanging-2021-06-02" rel="alternate"></link><published>2021-06-02T04:00:00-04:00</published><updated>2021-06-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-06-02:/conlanging-2021-06-02</id><summary type="html">&lt;p class="first last"&gt;Not committing to setting up a complicated workflow, but not committing &lt;em&gt;not&lt;/em&gt; to.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I got into planning to use Lexurgy, and getting started.
Basically, I have a plan now which &lt;em&gt;may&lt;/em&gt; be too complicated, so I'm not committing to it, and I'm currently working on things that I know I'll need: feature definitions, diacritic definitions, and symbol definitions.&lt;/p&gt;
&lt;p&gt;Currently, I've got enough to define every vowel sound that I currently know to be relevant (there are like 14), and I'm starting on being able to define consonant sounds.
It's basically going to go: simple consonants, slightly less simple consonants, weird consonants, really weird consonants, stress, pitch.&lt;/p&gt;
&lt;p&gt;The possibly-too-complicated plan is to try to invoke Lexurgy from a task runner/build system that will handle stuff like creating affixes, by taking Cartesian products of word list files.
I don't really have a sense for how people are using Lexurgy, so I don't know if that idea is reasonable or not, so, as I said, I'm focusing on the stuff that I can't not need, basically.&lt;/p&gt;
&lt;p&gt;Anyway, I'm not sure how to end this, but I don't want to draw things out.
Hopefully I'll get done with this definitional stuff in the next few days.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Weekly Roundup 2021-06-01</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-06-01" rel="alternate"></link><published>2021-06-01T04:00:00-04:00</published><updated>2021-06-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-06-01:/weekly-roundup-2021-06-01</id><summary type="html">&lt;p class="first last"&gt;What's not reflected here is all the time I put into replaying Hero Core, which probably explains some things.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I went over the first prototype, writing it up and trying to figure out how to relate it to the current prototype.&lt;/li&gt;
&lt;li&gt;Thursday: I made a few decisions about typing in the current prototype.&lt;/li&gt;
&lt;li&gt;Friday: I wrote a lot of the type-level code in the current prototype.&lt;/li&gt;
&lt;li&gt;Saturday: I added a helper function, and then had... technical difficulties.&lt;/li&gt;
&lt;li&gt;Sunday: I improved my test coverage, and added some comments.&lt;/li&gt;
&lt;li&gt;Monday: I got the code coverage up to full, and started thinking about where this project is going.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to either make more progress on the current prototype, or try to learn Lexurgy.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2021-05-31</title><link href="https://mwchase.neocities.org/coding-2021-05-31" rel="alternate"></link><published>2021-05-31T04:00:00-04:00</published><updated>2021-05-31T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-05-31:/coding-2021-05-31</id><summary type="html">&lt;p class="first last"&gt;More rushed, late-night work. I think I'll do better soon, but we'll see.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Didn't do much coding or writing today, since we spent the afternoon visiting family to celebrate &lt;em&gt;almost&lt;/em&gt; being done with immunity.&lt;/p&gt;
&lt;p&gt;Anyway, I was able to get my new code up to full coverage.
That means the next thing to work on is setting up the runner and list-targets flows.
Then, I just need to make sure that this all more-or-less works, which, given the quality of my current tests in some respects, would actually kind of surprise me.&lt;/p&gt;
&lt;p&gt;Taking care of that is just going to involve looking over a few lines of code in the prototype, and figuring out how to adapt some of the hackier bits to Cement.&lt;/p&gt;
&lt;p&gt;The basic timeline once I have this seemingly working is going to go:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Test this on itself&lt;/li&gt;
&lt;li&gt;Release prototype on PyPI&lt;/li&gt;
&lt;li&gt;Host the source code... somewhere. I have some ideas, but I need to make some more decisions about my workflow first.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I can't think of too much more that this code needs.
You know, other than the core logic that will drive the task scheduling.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to quickly look over the prototype code while this publishes, then get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-05-30</title><link href="https://mwchase.neocities.org/coding-2021-05-30" rel="alternate"></link><published>2021-05-30T04:00:00-04:00</published><updated>2021-05-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-05-30:/coding-2021-05-30</id><summary type="html">&lt;p class="first last"&gt;Dealing with cryptic, untested code.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, rebooting fixed my keyboard, so that's good.
This is totally the year of Linux on the desktop, just you wait!&lt;/p&gt;
&lt;p&gt;Anyway, the code I added last night, and tweaked earlier today, outstripped my test code, so now I've got to work on getting my code coverage back up, and making sure that the error cases all make sense.
Speaking as the author of the code, and someone who is pretty careless about commenting my hobby code, I am looking at this code and kind of going &amp;quot;okay, so that means that, so when &lt;strong&gt;this&lt;/strong&gt; condition is true, that means...&amp;quot; and it's just not worth it.&lt;/p&gt;
&lt;p&gt;I hope I'll get my energy up further in a few weeks, when I'll feel comfortable walking around town again.
Anyway, I'm going to wrap this up now so I can do whatever, maybe write those comments.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-05-29</title><link href="https://mwchase.neocities.org/coding-2021-05-29" rel="alternate"></link><published>2021-05-29T04:00:00-04:00</published><updated>2021-05-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-05-29:/coding-2021-05-29</id><summary type="html">&lt;p class="first last"&gt;Going to back up my system overnight in case this persists through reboot.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, this is a late start, and I'm not feeling terribly energetic.
Let's see...
Helper functions.&lt;/p&gt;
&lt;p&gt;Just added a simple one.
I think the rest are going to be a little more involved.
Let's take a look at the prototype...&lt;/p&gt;
&lt;p&gt;Okay, I added some methods from the prototype, and then my keyboard freaked out hard.
I'm typing this on a bluetooth keyboard, and I think I want to be done for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-05-28</title><link href="https://mwchase.neocities.org/coding-2021-05-28" rel="alternate"></link><published>2021-05-28T04:00:00-04:00</published><updated>2021-05-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-05-28:/coding-2021-05-28</id><summary type="html">&lt;p class="first last"&gt;Big shoutout to attrs for writing the vast majority of &lt;tt class="docutils literal"&gt;__init__&lt;/tt&gt; methods in my hobby projects.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm still not feeling particularly energetic, so I didn't work much today, then rushed through working on some of the stuff I was talking about yesterday.
Basically, I've defined a whole bunch of classes and type aliases to be able to reason about Actions and Targets, and now I need to get to work on copying, writing, and testing the various utility functions that the user will have access to.&lt;/p&gt;
&lt;p&gt;I don't think there's much to say about what I've got currently.
The code makes sense, but doesn't currently &amp;quot;do&amp;quot; much, but all of the tests and checks pass, so I'm ready to move onto the helper functions.
In the coming days, because it's late right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-05-27</title><link href="https://mwchase.neocities.org/coding-2021-05-27" rel="alternate"></link><published>2021-05-27T04:00:00-04:00</published><updated>2021-05-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-05-27:/coding-2021-05-27</id><summary type="html">&lt;p class="first last"&gt;Gradually remembering the parts of the prototype I didn't want to think too hard about.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I vegged out a bunch today, so I'm just going to sketch out some quick thoughts for the whole action/target thing:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;It's probably easier to reason about Targets if they have a more restricted type, even if it is convenient to be able to pass in Paths. As such, they should be normalized internally using &lt;tt class="docutils literal"&gt;os.fspath()&lt;/tt&gt; or similar.&lt;/li&gt;
&lt;li&gt;The actual name should just be strings; I think I want to use NewTypes in the definition of the data structures, just to make sure I don't have a type error in my own code, but the API should just use strings.&lt;/li&gt;
&lt;li&gt;Some of the types in the current prototype are going to be simpler than the original, because I'm planning to do more to leverage some, uh, inevitable global state.&lt;/li&gt;
&lt;li&gt;The big uncertainty I remember having in the first prototype revolved around mutable state. I'm generally not a fan, but some of this stuff needed to happen &lt;em&gt;somehow&lt;/em&gt;. Also, some of this stuff is making me realize the appeal of aspect-oriented programming. Maybe this is a sign I should look into how Cement does hooks, and try to fit my desired code into that system.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'll research that last one quickly while this posts, but I should really wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-05-26</title><link href="https://mwchase.neocities.org/coding-2021-05-26" rel="alternate"></link><published>2021-05-26T04:00:00-04:00</published><updated>2021-05-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-05-26:/coding-2021-05-26</id><summary type="html">&lt;p class="first last"&gt;Looking at my code from a few weeks ago and going &amp;quot;Hm, that's not documented well.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I feel like I wasn't really focused today, so instead of trying to write code, I'm going to go over the prototype in more detail, and relate it to the current work-in-progress.
So, the current current work-in-progress is capable of locating a configuration file through various means, and executing it.
The basic details of that are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;In writing tests, I have come to suspect that my design for the location logic is flawed, and tries to do too much, but I'll hold off on messing with it for now. I'll put in an issue for myself to revisit it, though.&lt;/li&gt;
&lt;li&gt;Currently, the configuration file is executed as Python code, and relies on API calls that don't exist yet. My long-term plan is to see what capabilities I require, and switch to a more restricted configuration language that satisfies my requirements.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, it can figure out which directory the configuration file is in, and I'm currently planning to have it change to that directory once it finds it.&lt;/p&gt;
&lt;p&gt;That said, once the configuration is loaded, there are two basic things to be done: either print out various helpful bits of information, or, by default, execute the desired tasks.&lt;/p&gt;
&lt;p&gt;To handle this, the prototype uses a &amp;quot;registry&amp;quot; object that contains various mappings and sets.
These use strings (for several different purposes), and types called &amp;quot;Actions&amp;quot; and &amp;quot;Targets&amp;quot;.
Basically, Actions can have names (for diagnostic purposes) and Targets can have names (for selection/deselection purposes).
Every Target has an associated Action, and an Action can be associated with any number of Targets.
An Action is a Callable with a particular signature, and Target is somewhat less defined.&lt;/p&gt;
&lt;p&gt;Basically, as inspired by various build systems (and to be clear, I do not consider this project a build system), a Target will &lt;em&gt;usually&lt;/em&gt; correspond to a filesystem path, though this is a matter of convenience and convention only.
It does not normalize Targets, or do any kind of filesystem inspection.
Now, a few of the Targets I'll want correspond instead to &lt;em&gt;removing&lt;/em&gt; a file.
I don't need or want much sophistication around handling, so I don't plan to represent &amp;quot;delete this file&amp;quot; in a way the code can explicitly reason about, but I do think it'd be helpful to natively support &lt;tt class="docutils literal"&gt;pathlib&lt;/tt&gt; objects, so I'd maybe like some kind of wrapper.
Might be as simple as &amp;quot;here's a trivial wrapper class around paths, go wild&amp;quot;.&lt;/p&gt;
&lt;p&gt;I don't know if that's enough to start with; maybe I need to think about this some more, but I should be ready to firm up the design soon.&lt;/p&gt;
&lt;p&gt;It somehow got really late while I was writing this, so I should wrap things up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2021-05-25</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-05-25" rel="alternate"></link><published>2021-05-25T04:00:00-04:00</published><updated>2021-05-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-05-25:/weekly-roundup-2021-05-25</id><summary type="html">&lt;p class="first last"&gt;I was in a lot of pain today. Good thing I cleared my schedule.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I wrote the post while the NAS that the blog is mirrored to was updating itself, which is... precarious. So, I took precautions, which fortunately were not needed.&lt;/li&gt;
&lt;li&gt;Thursday: I reworked some of the foundations of my conlang until I liked them better.&lt;/li&gt;
&lt;li&gt;Friday: I concluded that it was time to look into Lexurgy. I haven't tried setting it up yet, but the time is ripe.&lt;/li&gt;
&lt;li&gt;Saturday: I complained about how my body reacts to stress, and did some conlang work.&lt;/li&gt;
&lt;li&gt;Sunday: I complained about the heat, and touched up the task runner code base.&lt;/li&gt;
&lt;li&gt;Monday: I carefully planned out the test implementation for opening files with an informative wrapper. I elected for a somewhat &amp;quot;quick-and-dirty&amp;quot; implementation, because I do not know how, or even if, I'm going to rework the actual implementation's requirements in the future.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm hopefully going to recover from the vaccine side effects, and make more progress on the task runner and conlang stuff.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2021-05-24</title><link href="https://mwchase.neocities.org/coding-2021-05-24" rel="alternate"></link><published>2021-05-24T04:00:00-04:00</published><updated>2021-05-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-05-24:/coding-2021-05-24</id><summary type="html">&lt;p class="first last"&gt;Taking time to carefully plan the minor detail that I want to get right.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was busy getting vaccinated today, and then trying to take it easy.
So, I haven't touched code, but there is something I'm trying to work out.&lt;/p&gt;
&lt;p&gt;I have a helper function that wraps errors, both expected and unexpected, from the &lt;tt class="docutils literal"&gt;open&lt;/tt&gt; function in custom exceptions specific to the application.
I want to be sure to test the branches for &amp;quot;I don't know how this happened, but I should account for it&amp;quot;.
But I can't test those by making the &lt;tt class="docutils literal"&gt;open&lt;/tt&gt; function do stuff, because if I knew how to encounter those errors, then I'd need to write more specific error messages, and then inducing those errors wouldn't trigger the branches I want to test.&lt;/p&gt;
&lt;p&gt;So, if I can't rely on the built-in function to trigger the branches I want to test, then I need to be able to substitute in a different function.
I've thought of a few possible ways:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Parameterize over the function to use. This would require me to figure out a &amp;quot;good-enough&amp;quot; signature for &lt;tt class="docutils literal"&gt;open&lt;/tt&gt;, and I kind of don't want to bother.&lt;/li&gt;
&lt;li&gt;Put the exception handling in a context manager. This completely decouples the business logic from the diagnostic messages, and for all that &amp;quot;decoupling&amp;quot; and &amp;quot;weakly coupled&amp;quot; are popular buzzwords, I don't think that makes sense.&lt;/li&gt;
&lt;li&gt;Mock the &lt;tt class="docutils literal"&gt;open&lt;/tt&gt; function. I'm leaning towards this, because it lets me defer refactorings, and I don't really have a refactoring that I want to do here.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I basically came to that conclusion while I was writing this post in my head, but I figured that was no reason not to write the post on my computer as well.&lt;/p&gt;
&lt;p&gt;Anyway, once I take care of this idea, I should be on-track to properly integrate the prototype code and see how it treats me.
Hopefully, I'll have that done in a week or two.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-05-23</title><link href="https://mwchase.neocities.org/coding-2021-05-23" rel="alternate"></link><published>2021-05-23T04:00:00-04:00</published><updated>2021-05-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-05-23:/coding-2021-05-23</id><summary type="html">&lt;p class="first last"&gt;Slowly baking in the heat and soaking in the humidity, I focus on code quality.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;They brought someone to look at our heating system a few weeks ago, and it was working as intended.
So I'm sure it was &lt;em&gt;supposed&lt;/em&gt; to heat up when we tried turning on the AC earlier.&lt;/p&gt;
&lt;p&gt;That's part of why I didn't get too much done today:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I fixed up some mistakes I'd made with the con-script, and added some consonants I'd forgotten.&lt;/li&gt;
&lt;li&gt;I just now added another test and bit of functionality to the task runner code. To get much further, I'll need to properly plan out the various types involved.&lt;/li&gt;
&lt;li&gt;I also have the option of trying to improve the file opening handling. I'll feel better about the code I have if it can handle all likely error conditions as exceptions, instead of checking for them proactively. Looks like OSError is the way to handle that.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'll probably mess with that after I publish this, then work on other stuff as a palate cleanser.&lt;/p&gt;
&lt;p&gt;Here's hoping things are a bit more pleasant tomorrow, and... vaguely bearable afterwards, since I'm getting my second dose, and my first dose messed me up a little.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2021-05-22</title><link href="https://mwchase.neocities.org/diary-2021-05-22" rel="alternate"></link><published>2021-05-22T04:00:00-04:00</published><updated>2021-05-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-05-22:/diary-2021-05-22</id><summary type="html">&lt;p class="first last"&gt;Betrayed... by my own body... again...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I stressed out too much about work, and it is causing me so much pain now, even as I try to think about anything else.
Why is the human body like this?
&amp;quot;Well, I'm worried about doing a good job, so clearly the helpful thing is to violently dehydrate myself and become physically incapable of looking at bright lights, &lt;em&gt;which is basically my job&lt;/em&gt;.&amp;quot;&lt;/p&gt;
&lt;p&gt;It didn't hit me quite that bad this time, &lt;em&gt;no thanks to my autonomic nervous system&lt;/em&gt;.
Writing that rant did remind me to rehydrate, so, self-care, yay.&lt;/p&gt;
&lt;p&gt;I did some work on a con-script for the conlang I'm working on, but I somehow miscounted the acceptable values in one of the parameters.
(&amp;quot;It's a featural script!&amp;quot; *Booooo* &amp;quot;But &lt;em&gt;only in the protolang&lt;/em&gt;.&amp;quot; *Oooooo*)
Anyway, miscounted, need to rethink this a bit.&lt;/p&gt;
&lt;p&gt;And, I took a break from writing between that sentence and this one, and I think I've got some ideas now.
I'll try them out.&lt;/p&gt;
&lt;p&gt;I've tried out the ideas.
So far, they seem interesting and solid in isolation, but I'm missing a few key components still, so I can't put it all together yet.
(I'd &amp;quot;put it all together&amp;quot; into transcribing English to start with, because I don't have any words in the conlang to work with, and the phonology I'm trying to put an orthography to is, in spite of some oddness, mostly a subset of English phonology.
The hopefully interesting stuff come from the differences, and also the phonotactics.)&lt;/p&gt;
&lt;p&gt;With just a bit more time, I've got a full first draft laid out.
I'll see what I think of it later, because right now I just want to read.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Conlanging 2021-05-21</title><link href="https://mwchase.neocities.org/conlanging-2021-05-21" rel="alternate"></link><published>2021-05-21T04:00:00-04:00</published><updated>2021-05-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-05-21:/conlanging-2021-05-21</id><summary type="html">&lt;p class="first last"&gt;Getting to the point where I need real structure to make progress.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did a little more sketching of sound change dependencies and desired ordering.
I think what I'm missing is an example of how to document them.
I think now it's time for me to look at &lt;a class="reference external" href="https://www.meamoria.com/lexurgy/app/sc"&gt;Lexurgy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Reading over the documentation, I think Lexurgy has most of the stuff I want, I just have to put in the effort to understand it, and get everything to line up with my current ideas.&lt;/p&gt;
&lt;p&gt;I'll be doing that later, because I didn't get enough sleep last night, and I was tired all day, and I'm tired now.
I'll have to try to fix that over the next few days.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Conlanging 2021-05-20</title><link href="https://mwchase.neocities.org/conlanging-2021-05-20" rel="alternate"></link><published>2021-05-20T04:00:00-04:00</published><updated>2021-05-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-05-20:/conlanging-2021-05-20</id><summary type="html">&lt;p class="first last"&gt;Closing in on a sketch of protolanguage phonology and development.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I spent some time trying out different ways to achieve palatalization.
Here's basically what I was thinking:&lt;/p&gt;
&lt;p&gt;&amp;quot;It looks like the development of palatalization was pretty straightforward in Greek, but if I change the phonology to be closer to Swedish, then that changes the available sounds produced by palatalization.
I think that motivates some limited changes in voicing for certain consonants. ...
Okay, it's a little tricky to come up with a satisfying derivation for this that fits with everything else.&amp;quot;&lt;/p&gt;
&lt;p&gt;I've come up with two basic ways to try to resolve this.
The first felt excessively fine-tuned, but I like the second.
I can't guarantee that I won't come up with a third that I like more.
Anyway, I'll stick with this second idea for now, and try to firm things up.&lt;/p&gt;
&lt;p&gt;Here's what's missing from my plans: lots of things relating to stress, such as vowel length.
Beyond that, I basically know how I want stuff to fit together from a phonological perspective.
The biggest unknown is that I'm pretty sure I want some kind of vowel sound to be present in the protolang and get dropped, and I'm still deciding what kind of sound, and when this happens in relation to determining stress.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to publish this, and then try to do some prep work for something else that probably won't have a blog post associated.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Diary 2021-05-19</title><link href="https://mwchase.neocities.org/diary-2021-05-19" rel="alternate"></link><published>2021-05-19T04:00:00-04:00</published><updated>2021-05-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-05-19:/diary-2021-05-19</id><summary type="html">&lt;p class="first last"&gt;Not getting problems from the outside world, so making problems for myself.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I am upgrading some of the software on my home network.
I did not realize I was going to be upgrading some of the software on my home network.
The files I am modifying by writing this post are currently in a somewhat precarious position, so it's a bit difficult to focus on writing the blog.
I am making multiple manual backups in case of corruption.&lt;/p&gt;
&lt;p&gt;All in all, I'm not comfortable working on any projects until the migration is complete.
So, what else is going on?
Well, my allergies left me alone today, even though I forgot to take antihistamines.
I'm not sure how that works, since the tree pollen levels were apparently terrifying.
At some point, I really should work out exactly what I'm allergic to, because all I know at this point is, it's seasonal.
For now, though, I'm not going to poke my head outside and be all &amp;quot;Where's the suffering? I was promised suffering!&amp;quot;
That's only for tabletop games.&lt;/p&gt;
&lt;p&gt;Anyway, that's all I'm up for writing right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2021-05-18</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-05-18" rel="alternate"></link><published>2021-05-18T04:00:00-04:00</published><updated>2021-05-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-05-18:/weekly-roundup-2021-05-18</id><summary type="html">&lt;p class="first last"&gt;It's hard to write much about this stuff, but it feels good, so I like that.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I continued working on allowable onsets for the conlang.&lt;/li&gt;
&lt;li&gt;Thursday: I finished up the first version of the onset chart.&lt;/li&gt;
&lt;li&gt;Friday: I planned out some tests for the task runner.&lt;/li&gt;
&lt;li&gt;Saturday: I was tired, so I just did some planning, and asked for suggestions for Python tooling to introduce. We'll see where that goes.&lt;/li&gt;
&lt;li&gt;Sunday: I evaluated the consonant cluster chart, and started writing new tests for the task runner.&lt;/li&gt;
&lt;li&gt;Monday: I got code written to make the tests pass, and did some conlang planning.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to keep up the mix of projects, probably leaning more on conlanging until the weekend.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2021-05-17</title><link href="https://mwchase.neocities.org/coding-2021-05-17" rel="alternate"></link><published>2021-05-17T04:00:00-04:00</published><updated>2021-05-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-05-17:/coding-2021-05-17</id><summary type="html">&lt;p class="first last"&gt;How many ways can I come up with for the code to refuse to do anything? A lot.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay.
I've written up a bunch of tests for error cases, and soon I'll probably want to factor out the really repetitive stuff, because wow this test code is repetitive, and I messed it up at least once.
A few more iterations, and I'll be forced to come up with actual interfaces to the task runner library.
Right now, it's still just &amp;quot;oh, can't run tasks because of X reason&amp;quot;.&lt;/p&gt;
&lt;p&gt;Not really much to say on that for now, I guess.
It's late, so I'll work on the refactorings later.&lt;/p&gt;
&lt;p&gt;The other thing I want to cover is for the conlang, and it is deriving sound change rules from my initial consonant cluster work to try to derive a protolang phonology and phonotactics.
It's probably going to be a pain, but I expect it to be less bad than the kind of stuff I've tried to do before.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-05-16</title><link href="https://mwchase.neocities.org/coding-2021-05-16" rel="alternate"></link><published>2021-05-16T04:00:00-04:00</published><updated>2021-05-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-05-16:/coding-2021-05-16</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;This is probably impossible, so in a way, it's like I'm already done.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, a few things today:&lt;/p&gt;
&lt;p&gt;In non-coding stuff, I went over the initial consonant clusters for the conlang, and cleaned up the chart and made a few changes.
Going over it made me realize that I'd somehow misinterpreted part of Swedish phonology, but I think I'll stick with my initial interpretation, as a way to make this &lt;em&gt;slightly&lt;/em&gt; more like its own thing.&lt;/p&gt;
&lt;p&gt;In coding, I wrote a bunch of basic tests for handling configuration, focusing for now on some very basic error cases.
Most of the work went into writing test fixtures; I may end up reconsidering these fixtures and cursing my past self later, but for now, I'm just really liking how simple the interfaces and tests are.&lt;/p&gt;
&lt;p&gt;I feel like this initial push has me doing things in a more test-driven-development kind of way; I guess I don't want to overthink things when it comes to the code as I write it.
And to get that, I basically have to be writing a test, then figuring out the lowest-effort way to get it to pass.
Speaking of which, I'll try to make all those failing tests I wrote actually pass.&lt;/p&gt;
&lt;p&gt;(Actually, thinking about the test changes and additions I did, I'm not sure test-driven development can be formalized to the level of strictness required by one of the projects I have back-burnered, so I... maybe won't revisit that project.)&lt;/p&gt;
&lt;p&gt;Anyway, time to do minor rewrites and try to figure out the different between &lt;tt class="docutils literal"&gt;app.args&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;app.pargs&lt;/tt&gt; in Cement.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2021-05-15</title><link href="https://mwchase.neocities.org/diary-2021-05-15" rel="alternate"></link><published>2021-05-15T04:00:00-04:00</published><updated>2021-05-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-05-15:/diary-2021-05-15</id><summary type="html">&lt;p class="first last"&gt;Crowdsourcing my tooling ideas.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I more-or-less took things easy today, because I woke up tired and that never really turned around.
I intend to rewrite the tests for the task runner tomorrow, and also go over some details of conlang phonotactics.
Neither of those will look like much from the perspective of the blog; oh well.&lt;/p&gt;
&lt;p&gt;I don't have anything else to write about right now, I'm just really tired.
Here's an idea: in a few weeks, I should have my task runner in good enough shape to run against its own repository, and that'll give me the freedom to add all kinds of crazy opt-in testing and analysis.&lt;/p&gt;
&lt;p&gt;What I have currently:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Normal tests, code coverage, and profiling&lt;/li&gt;
&lt;li&gt;A variety of lints, including vanilla flake8 and isort (I haven't added black, and I would like to)&lt;/li&gt;
&lt;li&gt;Type checking&lt;/li&gt;
&lt;li&gt;Barebones HTML report generation from xunit results&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What I'm planning to add:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Property-based testing using Hypothesis&lt;/li&gt;
&lt;li&gt;Mutation testing using &lt;em&gt;something&lt;/em&gt;, I haven't thought too hard about it&lt;/li&gt;
&lt;li&gt;Documentation-related lints&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What I might add:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Pylint&lt;/li&gt;
&lt;li&gt;Something like pytest-bdd? I dunno.&lt;/li&gt;
&lt;li&gt;There's something called semgrep? It might help? With something?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What I'm interested in suggestions for:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Literature on developing better workflows for profiling&lt;/li&gt;
&lt;li&gt;Linters besides anything listed above, and also besides wemake-python-styleguide&lt;/li&gt;
&lt;li&gt;Other things that plug into flake8&lt;/li&gt;
&lt;li&gt;Other static or semantic analysis&lt;/li&gt;
&lt;li&gt;Other things that evaluate the code by running it&lt;/li&gt;
&lt;li&gt;Fancier xunit -&amp;gt; html conversion&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Basically, I'm going to want stuff that runs non-interactively from the command line, and can be convinced to output all relevant feedback in a form that, one way or another, ends up as a webpage.
It should also be configurable in terms of what files it writes to, if any, such that I can run multiple processes in parallel in the same directory.&lt;/p&gt;
&lt;p&gt;Anyway, if anyone has any suggestions there, my Mastodon account is right down there, so have at it.
For now, I desperately need more sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2021-05-14</title><link href="https://mwchase.neocities.org/coding-2021-05-14" rel="alternate"></link><published>2021-05-14T04:00:00-04:00</published><updated>2021-05-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-05-14:/coding-2021-05-14</id><summary type="html">&lt;p class="first last"&gt;Most of this post is devoted to figuring out how to test a single command-line argument.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's see what's the minimal configuration I can get set up and tested.
I believe that would be &amp;quot;locate a config file&amp;quot;.
Here's what I have in mind:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;If no configuration file is provided, the program recurses up into parent directories until it locates it, with a default name.&lt;/li&gt;
&lt;li&gt;If an argument is provided, the program will not recurse upward; it will check the exact path given.&lt;/li&gt;
&lt;li&gt;If the path is a directory, it will look for the default name in that directory.&lt;/li&gt;
&lt;li&gt;If the path is a file, it will look for that exact file path.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(Since paths don't inherently have &amp;quot;directory-nature&amp;quot;, I guess this means it needs to check whether the path exists before doing any specific logic to it.)&lt;/p&gt;
&lt;p&gt;Test cases when the path is not given:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Find the file in the directory&lt;/li&gt;
&lt;li&gt;Find the file in a parent directory&lt;/li&gt;
&lt;li&gt;Handle file not existing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Test cases when the path is given:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Absolute/relative&lt;/li&gt;
&lt;li&gt;Current/child/parent/cousin&lt;/li&gt;
&lt;li&gt;File/directory&lt;/li&gt;
&lt;li&gt;File exists/does not exist&lt;/li&gt;
&lt;li&gt;(For the specific case of absolute+cousin, have a test for not cd-ing to a tmpdir first, as well as doing so)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To check when the file exists: that the current directory is the directory that contains the file.
(This is fine to check even with the error case, because it's being set in-process, and will be cleaned up by the test finalizer.)&lt;/p&gt;
&lt;p&gt;Error cases to handle when the file does exist:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;File is not syntactically valid&lt;/li&gt;
&lt;li&gt;File raises a runtime exception&lt;/li&gt;
&lt;li&gt;File does not produce configuration object&lt;/li&gt;
&lt;li&gt;Configuration object is not valid&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I don't want to get as far as actually consuming the configuration object; that's an entire set of extra dimensions to deal with.
And that up there is already plenty to mess around with.&lt;/p&gt;
&lt;p&gt;I think I basically want execution to happen in phases:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Parse command line (handled by Cement); &lt;em&gt;do not&lt;/em&gt; inspect the filesystem at this point&lt;/li&gt;
&lt;li&gt;Resolve the configuration file&lt;/li&gt;
&lt;li&gt;Evaluate the configuration file&lt;/li&gt;
&lt;li&gt;(Update defaults from the configuration file. Not quite a thing to do, because I haven't yet planned config that would do anything)&lt;/li&gt;
&lt;li&gt;Check whether to list targets from configuration, exit early if so&lt;/li&gt;
&lt;li&gt;Determine which targets to include (this has no bearing on the target listing, so can be done after)&lt;/li&gt;
&lt;li&gt;Queue all targets via the runner
- Runner updates progress bar or something&lt;/li&gt;
&lt;li&gt;Report successes, failures, and errors.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm trying to figure out the best order to work on this.
In the first prototype, I focused on the core runner logic, and left the fine details of input and output to the wayside.
I guess the first question I should ask is, does Cement have any opinions germane to this kind of structure?
Let's see...&lt;/p&gt;
&lt;p&gt;Not seeing anything from a kind of superficial look.&lt;/p&gt;
&lt;p&gt;The last thing I want to work out tonight is how to only test the outer layers.
I was imagining some fancy stuff, but as I think about it, I realize the answer is to just stub out the low-level logic with functions that always succeed.
Anyway, when it comes time to test those, I want to either make the tests really fast, or restrict the scope of config file location shenanigans.&lt;/p&gt;
&lt;p&gt;So, that's the kind of stuff that I'll want to test with the external interface.
Good rubber-duck session.
Not sure when I'll be good to start implementing these tests, but at least I have a solid foundation to start from.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Conlanging 2021-05-13</title><link href="https://mwchase.neocities.org/conlanging-2021-05-13" rel="alternate"></link><published>2021-05-13T04:00:00-04:00</published><updated>2021-05-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-05-13:/conlanging-2021-05-13</id><summary type="html">&lt;p class="first last"&gt;Some of the clusters I found were surprising. Sometimes, that was because they were in loan words.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I've got my preliminary version of the consonant clusters for &lt;em&gt;onset&lt;/em&gt; put together.
I'll wait a few days, and then see what I think.
It's possible that I've &amp;quot;missed&amp;quot; some consonant clusters that I'd like to have, but my intuition is that I should be trying to keep things lean.
I think I'd like to evaluate the onsets before I start thinking about what can go in the codas, which is going to be a whole thing, given the current restrictions I want to put on word shape.&lt;/p&gt;
&lt;p&gt;After I publish this entry, I'm going to take things easy, and &lt;em&gt;maybe&lt;/em&gt; get back to work on the task runner prototyping.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Conlanging 2021-05-12</title><link href="https://mwchase.neocities.org/conlanging-2021-05-12" rel="alternate"></link><published>2021-05-12T04:00:00-04:00</published><updated>2021-05-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-05-12:/conlanging-2021-05-12</id><summary type="html">&lt;p class="first last"&gt;Figuring out all the sounds this language can't make, and the surprising ones it can.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Still working on defining allowable consonant clusters.
I'd have made better time if my body hadn't &lt;em&gt;freaked out and betrayed me&lt;/em&gt; two days ago, but oh well.
I'm currently working on onsets, mostly.
I think I've got preliminary rules for all stops, and I'm liking the system I have so far.
(That is, the system for figuring out which combinations to allow.
I haven't gone over the current candidates out loud yet.)
It probably won't work as well for codas, unfortunately, but that's not a pressing concern yet.&lt;/p&gt;
&lt;p&gt;Today, I also updated dependencies in some of my projects, and good thing, too, because I'd somehow missed properly recording some changes that I'm &lt;em&gt;sure&lt;/em&gt; I did the proper legwork for.&lt;/p&gt;
&lt;p&gt;I'm going to wrap up now and try and get some time away from my screens.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Weekly Roundup 2021-05-11</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-05-11" rel="alternate"></link><published>2021-05-11T04:00:00-04:00</published><updated>2021-05-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-05-11:/weekly-roundup-2021-05-11</id><summary type="html">&lt;p class="first last"&gt;Some progress, a little less than I'd have liked, interrupted by minor but unpleasant medical issues.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I started getting really frustrated with the whole quarantine... situation.&lt;/li&gt;
&lt;li&gt;Thursday: I revived the conlanging category with the language I've been messing with recently.&lt;/li&gt;
&lt;li&gt;Friday: I described the language's inspirations, and some of the trouble I was having researching them.&lt;/li&gt;
&lt;li&gt;Saturday: I did a little better digging up sources, and drew up a list of stuff to work on with the conlang, which I haven't really gotten past the first item yet.&lt;/li&gt;
&lt;li&gt;Sunday: Traveling messed up my body.&lt;/li&gt;
&lt;li&gt;Monday: Pollen messed up my body.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'll try to make some more progress on the conlang front, and I might start touching code again.
I understand some of the projects I'm relying on are just a few days out from a major release, so that'll be nice.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Diary 2021-05-10</title><link href="https://mwchase.neocities.org/diary-2021-05-10" rel="alternate"></link><published>2021-05-10T04:00:00-04:00</published><updated>2021-05-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-05-10:/diary-2021-05-10</id><summary type="html">&lt;p class="first last"&gt;I want to get off Mr. Pollen's wild ride.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Not so much luck doing stuff today, because my allergies kicked into overdrive, which was an entirely different issue to what I was dealing with yesterday, but really, I don't like any of these situations.&lt;/p&gt;
&lt;p&gt;I did manage to clean up the conlanging stuff in a way that made a bit more sense to me, but there's still quite a bit of work to be done.
I'm going to make some further improvements after I publish this, but the main thing I'm going to do is lie around and wait for my face to stop leaking.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2021-05-09</title><link href="https://mwchase.neocities.org/diary-2021-05-09" rel="alternate"></link><published>2021-05-09T04:00:00-04:00</published><updated>2021-05-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-05-09:/diary-2021-05-09</id><summary type="html">&lt;p class="first last"&gt;Getting really tired of the predictable, if not fully comprehensible, things my body does.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did a little setup work for conlanging, but not enough to merit putting it in the category.
Bit of a rough day today, so I was mostly just trying to take things easy.
Tomorrow will probably be the same, then it's the work week, then maybe next weekend will go easier on me.
The weekend after that, I'll potentially have difficulty breathing, in preparation for breathing easier two weeks after that.&lt;/p&gt;
&lt;p&gt;For now, though, I want to wrap up and take care of myself.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Conlanging 2021-05-08</title><link href="https://mwchase.neocities.org/conlanging-2021-05-08" rel="alternate"></link><published>2021-05-08T04:00:00-04:00</published><updated>2021-05-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-05-08:/conlanging-2021-05-08</id><summary type="html">&lt;p class="first last"&gt;Seems to me like there's way more stuff available for ancient Greek than modern Greek, but I specifically want modern Greek. Oh well.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I looked into asking for help, and I concluded that there are a few resources I didn't properly search for; I now have candidates for those, and I can use those to be better-informed when I do ask for help.
One thing I'll need to keep in mind, I suppose, is that I'm not &lt;em&gt;obligated&lt;/em&gt; to get the phonotactics to be super-close to any existing language; I just feel like it would help aesthetically.&lt;/p&gt;
&lt;p&gt;Maybe the right approach is to see how far I can get, based on what I've found so far.&lt;/p&gt;
&lt;p&gt;I'll work on that over the weekend, I hope, but what I want to figure out right at this moment, is how much I need to have worked out before I'll show off something.&lt;/p&gt;
&lt;p&gt;So, I'll try to put together a list here, and then post this.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Allowable consonant clusters, and repair strategies&lt;/li&gt;
&lt;li&gt;Details of phonological realization&lt;/li&gt;
&lt;li&gt;Inventory of function words&lt;/li&gt;
&lt;li&gt;Set of basic content words&lt;/li&gt;
&lt;li&gt;Sample text&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Probably more things in between those items.
Anyway, it's late, I'd like to wrap up sooner than I have been.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Conlanging 2021-05-07</title><link href="https://mwchase.neocities.org/conlanging-2021-05-07" rel="alternate"></link><published>2021-05-07T04:00:00-04:00</published><updated>2021-05-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-05-07:/conlanging-2021-05-07</id><summary type="html">&lt;p class="first last"&gt;I felt like I was constantly tripping over weird statements when reading up on this in Wikipedia.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I took a start at describing the intended phonotactics of my current conlang project.
It's probably going to go through a lot of revision still.
I'm going to need to either seek out some seemingly-obscure papers, do actual linguistic legwork, or just wing it, when it comes to basing syllable structure off of the inspirations for this language, though.&lt;/p&gt;
&lt;p&gt;I should probably go through my creative process thus far:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Stative verbs are cool.&lt;/li&gt;
&lt;li&gt;What if I made negation into an aspect marked on a stative verb?&lt;/li&gt;
&lt;li&gt;(months pass)&lt;/li&gt;
&lt;li&gt;I want to pursue this language seriously, and come up with an entire elaborate conworld for it to live in.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At some point in all of this, jan Misali releases their &lt;a class="reference external" href="https://www.youtube.com/watch?v=JICvHFl7W6o"&gt;video on Quenya&lt;/a&gt;, and notes that Quenya did not copy Finnish vowel harmony, I agree that this seems like a shame, and decide to be the change.&lt;/p&gt;
&lt;p&gt;I kind of see this language as having goals at different levels.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Technical level: prove out my ideas about using stative verbs&lt;/li&gt;
&lt;li&gt;Aesthetic level: get some vowel harmony in there, and also draw from languages thematically connected to the speakers in the conworld; this connection is somewhat loose, but I feel like there's some aesthetic potential in trying to draw together the sounds of Greek and Swedish, so I'm sticking with that.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the past, I've tried to put together phonologies in an a-priori kind of way, and that was really unpleasant for me.
At least for now, I prefer the experience of taking natlang phonologies, looking for the distinctive elements, and trying to harmonize them together.
It's possible that, with enough experience, I'll get a sense of which parts can be properly considered as components that can be combined, but I don't want to jump the gun.&lt;/p&gt;
&lt;p&gt;I feel like the main obstacle I'm hitting currently is, I can find some information on Greek and Swedish phonotactics, but it's not quite as much or as clear as I would like.
There are either glaring gaps in the literate I've found, or stuff that I &amp;quot;should be&amp;quot; filling in because it's &amp;quot;obvious&amp;quot; and I don't quite have a sense of it.&lt;/p&gt;
&lt;p&gt;I think at this point, I should be asking people for help rather than shouting into the void like usual.
I'll get on that in the next few days.
For now, it's super late and I should sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Conlanging 2021-05-06</title><link href="https://mwchase.neocities.org/conlanging-2021-05-06" rel="alternate"></link><published>2021-05-06T04:00:00-04:00</published><updated>2021-05-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-05-06:/conlanging-2021-05-06</id><summary type="html">&lt;p class="first last"&gt;I'm going to need to get over my aversion to specifics in talking about this. It's a pretty transparent attempt to deflect potential criticism via obscurity.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I can't tell if I'm feeling any better or not.
Anyway, since I did a decent amount of worldbuilding (nowhere near done, though), I decided to focus on actually getting the language that inspired literally all of this into a decent state.
Right now, I'm trying to shore up the basics of it, figure out stuff I missed.
Here's what I'm seeing so far:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I have a list of most phonemes, but it's missing some phones that arise from interaction between phonemes.&lt;/li&gt;
&lt;li&gt;The relevant interactions aren't fully documented, because I essentially slammed the phonologies of two (technically three) languages together, in a way that turns out to create possibly-novel interactions.&lt;/li&gt;
&lt;li&gt;I haven't properly documented which combinations of sounds are disallowed, and what repair strategies they'll get.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm going to have to get really good about writing this down.
I don't think any of the rules I need to formalize are complicated on their own, but there are a lot of them.&lt;/p&gt;
&lt;p&gt;Anyway, I'm not going to get that done now, so I'm going to need to remember to do that later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Diary 2021-05-05</title><link href="https://mwchase.neocities.org/diary-2021-05-05" rel="alternate"></link><published>2021-05-05T04:00:00-04:00</published><updated>2021-05-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-05-05:/diary-2021-05-05</id><summary type="html">&lt;p class="first last"&gt;I am in a relatively cushy and secure position and this still &lt;em&gt;sucks&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, I did some worldbuilding work this morning, went to work in the exact same place that I do everything else, took a nap because I was losing my edge by the end of all that, and then did my usual afternoon stuff.
I didn't get much more done afterwards.&lt;/p&gt;
&lt;p&gt;I'm feeling a bit frustrated from that, and I don't think it's a case of &amp;quot;I wanted to do more with my projects&amp;quot;, though having more done is always nice.
The fact is, I just did not like how I felt today, and that's that.
In a few weeks, I'll hopefully be confident enough to go outside on the regular, but until then, not only am I waiting for my body to properly dial up its immune responses, but the trees are out there giving me immune responses that I &lt;em&gt;don't&lt;/em&gt; want.&lt;/p&gt;
&lt;p&gt;Oh well, better try to sleep some of this off.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2021-05-04</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-05-04" rel="alternate"></link><published>2021-05-04T04:00:00-04:00</published><updated>2021-05-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-05-04:/weekly-roundup-2021-05-04</id><summary type="html">&lt;p class="first last"&gt;Being tired is no joke.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I worked on understanding how the generated Cement app fits together.&lt;/li&gt;
&lt;li&gt;Thursday: I was extremely tired, so I had to write a short post about how I had to write a short post because I was extremely tired.&lt;/li&gt;
&lt;li&gt;Friday: I did the easy parts of splitting up the entry point module for the cement app.&lt;/li&gt;
&lt;li&gt;Saturday: I did the slightly less easy part of splitting up the code, and started working on the coverage.&lt;/li&gt;
&lt;li&gt;Sunday: I got coverage up as high as I care to for now, and started planning tests for the new code that's going in soon.&lt;/li&gt;
&lt;li&gt;Monday: I was sleepy again, so I did more detailed planning.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to take a break from coding and work on conlang/conworld/conculture stuff.
Maybe touch the code again over the weekend.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2021-05-03</title><link href="https://mwchase.neocities.org/coding-2021-05-03" rel="alternate"></link><published>2021-05-03T04:00:00-04:00</published><updated>2021-05-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-05-03:/coding-2021-05-03</id><summary type="html">&lt;p class="first last"&gt;I would like to offer more constructive criticism of the tests that I'm not sure about, but I don't have the energy right now.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, so, something about today hit me hard and I'm pretty low on energy, so I'm just going to write up the current state of the task runner's tests, and figure out if there's anything to salvage, or if I should just write now tests and delete these.&lt;/p&gt;
&lt;p&gt;So far as the generator-provided tests go, theres:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;With nothing special done, the CLI exits with status code 0. This does not correspond to the behavior I want; the task runner will &lt;em&gt;require&lt;/em&gt; a configuration file, so it should search for one and error out. This gives us two tests: expect an error with no configuration file, and expect minimal output and success given a minimal configuration file.&lt;/li&gt;
&lt;li&gt;The base command accepts a &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--debug&lt;/span&gt;&lt;/tt&gt; flag. I haven't decided whether that fits into the design or not. I'll either drop it, or make it parameter to the test above.&lt;/li&gt;
&lt;li&gt;The final generated test runs the subcommand with various arguments and makes assertions about the resulting render calls. While I want tests against the subcommand, I'm not sure how I feel about the specific things that these tests look for.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I think my plan is to sketch out the code that I want to try to test first, see if there are any dependencies I should work on first, then write tests based on the sketches and work on getting the tests to pass.&lt;/p&gt;
&lt;p&gt;Since I'm kind of out of it right now, I think the smart course of action is to take a break for a few days and work on other things in the meantime.
For now, I'm going to wind down a little earlier than usual, because I'm tired and I might have a rough day ahead of me.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-05-02</title><link href="https://mwchase.neocities.org/coding-2021-05-02" rel="alternate"></link><published>2021-05-02T04:00:00-04:00</published><updated>2021-05-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-05-02:/coding-2021-05-02</id><summary type="html">&lt;p class="first last"&gt;Setting stuff up, and preparing to knock it down and set up something different and more complex.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, source coverage at 100%, missed function in my conftest that came from the template; I don't want to delete it until I understand what the purpose of it was.
Once that was done, I started figuring out what it would take to port the first prototype code into the second prototype.
This is going to take a lot of work to define the relevant tests, since suddenly the code is going to care significantly about the filesystem in a way it doesn't currently.&lt;/p&gt;
&lt;p&gt;I think I want a function-scoped fixture that sets up and tears down a temporary directory, and allows writing files under that directory.
Then, it's just a matter of performing various iterations of, &amp;quot;point the code or the arguments at the directory, and make sure everything resolves as expected&amp;quot;.
Also going to need to make sure that the current directory gets reset at the end of every test, if pytest doesn't handle that already.
Let's see, I guess that could be done by using the monkeypatch fixture and patching its &lt;tt class="docutils literal"&gt;chdir&lt;/tt&gt; method over the &lt;tt class="docutils literal"&gt;os.chdir&lt;/tt&gt; visible to part of the program logic.
Bundle that up in a fixture itself, because I'm going to want to do that a lot, but I don't want to write it a lot.&lt;/p&gt;
&lt;p&gt;Once all of this is written, or at least better planned, I'll need to go over the existing tests and figure out how to fix them, because this logic is probably going to apply to them.&lt;/p&gt;
&lt;p&gt;Kind of pondering making the fixture auto-use and making it consume marks do do stuff like &amp;quot;add a default configuration file&amp;quot;.
This is all interesting and slightly complicated and something I shouldn't work on at this time of night.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-05-01</title><link href="https://mwchase.neocities.org/coding-2021-05-01" rel="alternate"></link><published>2021-05-01T04:00:00-04:00</published><updated>2021-05-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-05-01:/coding-2021-05-01</id><summary type="html">&lt;p class="first last"&gt;Number go up!&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I got the main function into a more testable state, in a low-effort way that I can confirm didn't break the script endpoint.
My plan is to get application code to full coverage, then start translating my plans for interfaces into test updates.
Hopefully, this will all translate to a second prototype within a few weeks.&lt;/p&gt;
&lt;p&gt;Other stuff that's happening...
Well, Pijul's infrastructure is apparently shored up enough now, because it's under active development, as of, like a few days ago, up through a few hours ago.
I've got some interface changes I want to try out, but I think it makes sense to wait for a release; there is all kinds of stuff going on in there.&lt;/p&gt;
&lt;p&gt;Anything else?
Mostly, I need rest, so I'll try to wrap up now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-04-30</title><link href="https://mwchase.neocities.org/coding-2021-04-30" rel="alternate"></link><published>2021-04-30T04:00:00-04:00</published><updated>2021-04-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-04-30:/coding-2021-04-30</id><summary type="html">&lt;p class="first last"&gt;I accidentally reduced my coverage because the tests now have fewer transitive imports.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I'm working on splitting stuff up right now.
I'm pretty tired, so I probably won't get too far tonight, but I have split things up a little.
Right now, I'm trying to decide what to call the module for the test app class.&lt;/p&gt;
&lt;p&gt;This is one of the classes generated by the default Cement template.
It's a modification of the core app class via mixin inheritance, that's more convenient for testing in ways that I haven't really looked into.
The point is, the current tests use this, and I could see an argument for packages that extend the task runner's functionality using it for integration tests.
Will there be such packages?
Well, I intend to put most of the code specific to my use cases into one, in order to keep the core package small.
Point is, even though the definition of the test app class is trivial (in that it is less than ten lines, and anyone who's worked with Cement could write those lines &lt;em&gt;without looking at any part of my code except the app class name&lt;/em&gt;), I'd rather have it defined once than make every downstream package that wants it reimplement it.
I'm leaning towards &lt;tt class="docutils literal"&gt;test_helpers&lt;/tt&gt;.
The only thing I'd need to be sure of there is to make sure to name the fixture I associate with the module a little differently, because last time I tried that kind of naming, I discovered a... behavior that I did not like, in one of Coverage.py's features.
I'll do it, and make sure it all still works.&lt;/p&gt;
&lt;p&gt;And, got it.
It's getting late, and the rest of the changes are somewhat more involved, so I'll leave things here and get back to it over the weekend.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2021-04-29</title><link href="https://mwchase.neocities.org/diary-2021-04-29" rel="alternate"></link><published>2021-04-29T04:00:00-04:00</published><updated>2021-04-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-04-29:/diary-2021-04-29</id><summary type="html">&lt;p class="first last"&gt;Bad habits, bad post.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I wanted to get stuff done today, but I've been slightly wrecking my sleep schedule and now I'm really tired, so I guess I don't get that.&lt;/p&gt;
&lt;p&gt;Honestly, it's really annoying me that I feel like I don't have the focus to even write about anything else for this.&lt;/p&gt;
&lt;p&gt;I'm going to try wrapping up and getting off my laptop, because I don't see any kind of &lt;em&gt;specific&lt;/em&gt; goal that I can &amp;quot;power through&amp;quot; towards, or whatever.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2021-04-28</title><link href="https://mwchase.neocities.org/coding-2021-04-28" rel="alternate"></link><published>2021-04-28T04:00:00-04:00</published><updated>2021-04-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-04-28:/coding-2021-04-28</id><summary type="html">&lt;p class="first last"&gt;Reading up before making a bunch of sweeping changes&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I think I need to try to explain what Cement is doing, to decide if I want to do it any differently.
So, inside the package, we have:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;main.py&lt;/tt&gt; defines the basic App class, a &amp;quot;testable&amp;quot; version of that class, and a harness for running the app. The separation here seems to be that the app's &lt;tt class="docutils literal"&gt;run&lt;/tt&gt; method handles the very high-level happy-path behavior, and the harness handles a few aspects of cleanup that can't really be ignored. Due to the way it's structured, I think the bulk of the &lt;tt class="docutils literal"&gt;main()&lt;/tt&gt; function could be rewritten as a context manager and thereby made testable. I don't know if I want this all in the same module. I have some ideas there that I haven't fully fleshed out.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;templates&lt;/tt&gt; contains a sample template for presenting output. I hadn't thought of using Jinja in a command-line application, but I like the idea. (I mean, I was thinking of using it in the virtual tabletop thing that this is all supposed to make easier to develop, but that was at a higher level of abstraction, and I haven't &lt;em&gt;done it&lt;/em&gt; yet.) I'm looking at the Jinja extension to get some understanding of how this all works. (One thing that occurs to me, is that it would be helpful to define &lt;tt class="docutils literal"&gt;extras_require&lt;/tt&gt; in the setup command so that users can do like &lt;tt class="docutils literal"&gt;pip install &lt;span class="pre"&gt;cement[name-of-optional-plugin]&lt;/span&gt;&lt;/tt&gt; and get exactly the packages required for a plugin, even if the precise details may change.) Anyway, the big thing I'd like to figure out how to do with the Jinja extension is to define custom filters. I think I do that by resolving the app's jinja template handler and messing with its &lt;tt class="docutils literal"&gt;env&lt;/tt&gt; attribute. That has to be done &lt;em&gt;before&lt;/em&gt; rendering anything.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;plugins&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;ext&lt;/tt&gt; are empty, and &lt;tt class="docutils literal"&gt;core&lt;/tt&gt; just defines a custom exception type.&lt;/li&gt;
&lt;li&gt;The main business logic lives in &lt;tt class="docutils literal"&gt;controllers&lt;/tt&gt;, which has a &lt;tt class="docutils literal"&gt;base.py&lt;/tt&gt; module that defines the command-line interface. What I want in here is a default handler that launches the tasks and takes an argument for specifying &amp;quot;targets&amp;quot;, and a handler for listing available targets (default and non-default)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Testing the core logic will require something akin to pytest's helpers that create and populate temporary directories.&lt;/p&gt;
&lt;p&gt;Anyway, here are the tickets I need to put in for myself:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Specify and rework controllers&lt;/li&gt;
&lt;li&gt;Convert the exception handler into a context manager, or just a higher-order function, or setting the app class as a default argument&lt;/li&gt;
&lt;li&gt;Split out the &lt;tt class="docutils literal"&gt;main&lt;/tt&gt; module into modules defining classes, and try having minimal logic in &lt;tt class="docutils literal"&gt;main&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;Write a hook for injecting filters into the template environment&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'll get those in, then publish, then get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2021-04-27</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-04-27" rel="alternate"></link><published>2021-04-27T04:00:00-04:00</published><updated>2021-04-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-04-27:/weekly-roundup-2021-04-27</id><summary type="html">&lt;p class="first last"&gt;So many things are SOON.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Whew, I'm over the hump of initial vaccine symptoms.
That was something.
Just one month until I have to do it again, yaaay.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I mostly tweaked my Mercurial configuration.&lt;/li&gt;
&lt;li&gt;Thursday: I went overboard with topics, and decided the result was basically fine.&lt;/li&gt;
&lt;li&gt;Friday: I did some basic repository maintenance and tried out towncrier against my repo.&lt;/li&gt;
&lt;li&gt;Saturday: I got vaccinated.&lt;/li&gt;
&lt;li&gt;Sunday: I took it easy because I got vaccinated the day before.&lt;/li&gt;
&lt;li&gt;Monday: I got to work on automated analysis and testing of the task runner, which doesn't yet have any task runner code in it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to document some improvements that I made to some of my other noxfiles, and try to regularize and further improve them.
I'm going to work on some of the stuff I mentioned yesterday after I publish this.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2021-04-26</title><link href="https://mwchase.neocities.org/coding-2021-04-26" rel="alternate"></link><published>2021-04-26T04:00:00-04:00</published><updated>2021-04-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-04-26:/coding-2021-04-26</id><summary type="html">&lt;p class="first last"&gt;I'm starting to see the potential here, but I'm still not sold on the entire package.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got my noxfile put together, and now the issue I have left to fix is test coverage.
Fixing test coverage kind of gets into a question of organization (because I prefer to have per-source-module test modules), and I'm not super enthusiastic about the default organization that the Cement generator gave me.
It's hard for me to get a handle on the code, and I still, after quite a bit of investigation, don't understand how some of the values it needs at runtime are getting populated, so I can't be comfortable changing some of the layout.&lt;/p&gt;
&lt;p&gt;I'm going to have to take some time later to get the exact set of behaviors I want for the runner worked out, and figure out how to translate that into Cement concepts.
For now, I need to rest.&lt;/p&gt;
&lt;p&gt;I felt some aches today that I haven't felt in, I think, over a year.
I wasn't missing them.
I think the current round of soreness and pain is ebbing; we'll have to see if my body comes up with a new and unexpected immune response that it hasn't thought of yet.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2021-04-25</title><link href="https://mwchase.neocities.org/diary-2021-04-25" rel="alternate"></link><published>2021-04-25T04:00:00-04:00</published><updated>2021-04-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-04-25:/diary-2021-04-25</id><summary type="html">&lt;p class="first last"&gt;Just got to... hold on until June...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't get much done today.
I think I'm approximately the normal level of tired for me lately, but it feels like I shoulder-checked a wall.&lt;/p&gt;
&lt;p&gt;I did a little bit of conlang work, and started playing Portal Reloaded.
Those are some weird puzzles, I recommend it.&lt;/p&gt;
&lt;p&gt;I understand there's a new Pijul version coming soon really for real now.
If that's landed by tomorrow I'll do template work, and try to put together a repo for conworld info, and if not, I'll get back to my task runner work.&lt;/p&gt;
&lt;p&gt;I read up a bit more on Cement in anticipation of that.
The most interesting thing I hadn't realized before is that the original recommendation that got me looking at Cement was &lt;em&gt;sort of&lt;/em&gt; a non-sequitur, in that its interface to command-line parsing is just an &lt;em&gt;extremely&lt;/em&gt; minimal wrapper over argparse, so, unlike many command-line parsers for Python, it doesn't really have a new or specific thing.
I would describe the idea not as &amp;quot;using Cement for command-line parsing&amp;quot; but &amp;quot;using argparse &lt;em&gt;via Cement&lt;/em&gt; for command-line parsing&amp;quot;.&lt;/p&gt;
&lt;p&gt;That diversion aside, once I have a noxfile set up, I'll be ready to really evaluate Cement.&lt;/p&gt;
&lt;p&gt;For now, I'm feeling extremely tired.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2021-04-24</title><link href="https://mwchase.neocities.org/diary-2021-04-24" rel="alternate"></link><published>2021-04-24T04:00:00-04:00</published><updated>2021-04-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-04-24:/diary-2021-04-24</id><summary type="html">&lt;p class="first last"&gt;My organization and planning game for today was... iffy, but it turned out not to matter.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, that took a while.
Now I just have to wait.
And wait.
And wait.&lt;/p&gt;
&lt;p&gt;It'll be a while, but now I get how this stuff works, and I just need to hang tight for a month, and then, soon.&lt;/p&gt;
&lt;p&gt;I wish I were a little more articulate about this whole vaccination thing, but it was kind of a stressful thing.
Among other things, I'm not sure I saw that many people, overall, in the year before today.&lt;/p&gt;
&lt;p&gt;I'm going to read up on other stuff for a bit, and try to get back into things tomorrow, assuming I don't get any major systemic symptoms from the first dose.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2021-04-23</title><link href="https://mwchase.neocities.org/coding-2021-04-23" rel="alternate"></link><published>2021-04-23T04:00:00-04:00</published><updated>2021-04-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-04-23:/coding-2021-04-23</id><summary type="html">&lt;p class="first last"&gt;I didn't actually release anything, because I haven't changed any of the business logic yet.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did two major things today: converted the generated .gitignore to .hgignore, because I kind of thought Mercurial had code to handle .gitignore files, but I guess whatever I thought was going to happen, didn't happen; and, tried to configure towncrier.&lt;/p&gt;
&lt;p&gt;I found the towncrier documentation a little confusing from the perspective of &amp;quot;someone who wants to get this in a working state ASAP without thinking too hard&amp;quot;, so the current configuration is probably a bit of a gamble.
I think I'm going to have to just try doing this, and that means cutting release v0.1.0.&lt;/p&gt;
&lt;p&gt;Okay, that &lt;em&gt;seems&lt;/em&gt; to have worked.
I'll need to make more advanced changes to check, and the first step there is to replace the Makefile with something that I &lt;em&gt;haven't&lt;/em&gt; deleted most of the files it expects to be there.
Anyway, I got distracted thinking about features and implementation, so now I need to go to bed.
It's kind of a tossup how much I'll get done tomorrow, but hopefully, on the weekend, I'll get somewhere significant.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-04-22</title><link href="https://mwchase.neocities.org/coding-2021-04-22" rel="alternate"></link><published>2021-04-22T04:00:00-04:00</published><updated>2021-04-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-04-22:/coding-2021-04-22</id><summary type="html">&lt;p class="first last"&gt;Can't stop won't stop making guitar hero commit graphs.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&amp;quot;Hm, let's see how using topics works out.
How much should I try using them?&amp;quot;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;@&lt;span class="w"&gt;  &lt;/span&gt;changeset:&lt;span class="w"&gt;   &lt;/span&gt;25:0c6d5e14d382
|&lt;span class="w"&gt;  &lt;/span&gt;tag:&lt;span class="w"&gt;         &lt;/span&gt;tip
|&lt;span class="w"&gt;  &lt;/span&gt;topic:&lt;span class="w"&gt;       &lt;/span&gt;flit
|&lt;span class="w"&gt;  &lt;/span&gt;user:&lt;span class="w"&gt;        &lt;/span&gt;Max&lt;span class="w"&gt; &lt;/span&gt;Chase&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;max.chase@gmail.com&amp;gt;
|&lt;span class="w"&gt;  &lt;/span&gt;date:&lt;span class="w"&gt;        &lt;/span&gt;Wed&lt;span class="w"&gt; &lt;/span&gt;Apr&lt;span class="w"&gt; &lt;/span&gt;21&lt;span class="w"&gt; &lt;/span&gt;22:21:26&lt;span class="w"&gt; &lt;/span&gt;2021&lt;span class="w"&gt; &lt;/span&gt;-0400
|&lt;span class="w"&gt;  &lt;/span&gt;summary:&lt;span class="w"&gt;     &lt;/span&gt;Close&lt;span class="w"&gt; &lt;/span&gt;#13
|
o&lt;span class="w"&gt;  &lt;/span&gt;changeset:&lt;span class="w"&gt;   &lt;/span&gt;24:f77f3b21774c
|&lt;span class="w"&gt;  &lt;/span&gt;topic:&lt;span class="w"&gt;       &lt;/span&gt;flit
|&lt;span class="w"&gt;  &lt;/span&gt;user:&lt;span class="w"&gt;        &lt;/span&gt;Max&lt;span class="w"&gt; &lt;/span&gt;Chase&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;max.chase@gmail.com&amp;gt;
|&lt;span class="w"&gt;  &lt;/span&gt;date:&lt;span class="w"&gt;        &lt;/span&gt;Wed&lt;span class="w"&gt; &lt;/span&gt;Apr&lt;span class="w"&gt; &lt;/span&gt;21&lt;span class="w"&gt; &lt;/span&gt;22:14:32&lt;span class="w"&gt; &lt;/span&gt;2021&lt;span class="w"&gt; &lt;/span&gt;-0400
|&lt;span class="w"&gt;  &lt;/span&gt;summary:&lt;span class="w"&gt;     &lt;/span&gt;Add&lt;span class="w"&gt; &lt;/span&gt;docstring
|
o&lt;span class="w"&gt;  &lt;/span&gt;changeset:&lt;span class="w"&gt;   &lt;/span&gt;23:df820d3835e9
|&lt;span class="w"&gt;  &lt;/span&gt;topic:&lt;span class="w"&gt;       &lt;/span&gt;flit
|&lt;span class="w"&gt;  &lt;/span&gt;user:&lt;span class="w"&gt;        &lt;/span&gt;Max&lt;span class="w"&gt; &lt;/span&gt;Chase&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;max.chase@gmail.com&amp;gt;
|&lt;span class="w"&gt;  &lt;/span&gt;date:&lt;span class="w"&gt;        &lt;/span&gt;Wed&lt;span class="w"&gt; &lt;/span&gt;Apr&lt;span class="w"&gt; &lt;/span&gt;21&lt;span class="w"&gt; &lt;/span&gt;22:13:42&lt;span class="w"&gt; &lt;/span&gt;2021&lt;span class="w"&gt; &lt;/span&gt;-0400
|&lt;span class="w"&gt;  &lt;/span&gt;summary:&lt;span class="w"&gt;     &lt;/span&gt;Oops.
|
o&lt;span class="w"&gt;  &lt;/span&gt;changeset:&lt;span class="w"&gt;   &lt;/span&gt;22:63472dd89bcf
|&lt;span class="w"&gt;  &lt;/span&gt;topic:&lt;span class="w"&gt;       &lt;/span&gt;flit
|&lt;span class="w"&gt;  &lt;/span&gt;user:&lt;span class="w"&gt;        &lt;/span&gt;Max&lt;span class="w"&gt; &lt;/span&gt;Chase&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;max.chase@gmail.com&amp;gt;
|&lt;span class="w"&gt;  &lt;/span&gt;date:&lt;span class="w"&gt;        &lt;/span&gt;Wed&lt;span class="w"&gt; &lt;/span&gt;Apr&lt;span class="w"&gt; &lt;/span&gt;21&lt;span class="w"&gt; &lt;/span&gt;22:12:45&lt;span class="w"&gt; &lt;/span&gt;2021&lt;span class="w"&gt; &lt;/span&gt;-0400
|&lt;span class="w"&gt;  &lt;/span&gt;summary:&lt;span class="w"&gt;     &lt;/span&gt;Remove&lt;span class="w"&gt; &lt;/span&gt;setuptools/distutils/whatever&lt;span class="w"&gt; &lt;/span&gt;code
|
o&lt;span class="w"&gt;  &lt;/span&gt;changeset:&lt;span class="w"&gt;   &lt;/span&gt;21:1b8c7b2d54c9
|&lt;span class="w"&gt;  &lt;/span&gt;topic:&lt;span class="w"&gt;       &lt;/span&gt;flit
|&lt;span class="w"&gt;  &lt;/span&gt;user:&lt;span class="w"&gt;        &lt;/span&gt;Max&lt;span class="w"&gt; &lt;/span&gt;Chase&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;max.chase@gmail.com&amp;gt;
|&lt;span class="w"&gt;  &lt;/span&gt;date:&lt;span class="w"&gt;        &lt;/span&gt;Wed&lt;span class="w"&gt; &lt;/span&gt;Apr&lt;span class="w"&gt; &lt;/span&gt;21&lt;span class="w"&gt; &lt;/span&gt;22:11:34&lt;span class="w"&gt; &lt;/span&gt;2021&lt;span class="w"&gt; &lt;/span&gt;-0400
|&lt;span class="w"&gt;  &lt;/span&gt;summary:&lt;span class="w"&gt;     &lt;/span&gt;Copy&lt;span class="w"&gt; &lt;/span&gt;script&lt;span class="w"&gt; &lt;/span&gt;endpoint&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;pyproject.toml
|
o&lt;span class="w"&gt;  &lt;/span&gt;changeset:&lt;span class="w"&gt;   &lt;/span&gt;20:6914376c18e6
|&lt;span class="w"&gt;  &lt;/span&gt;topic:&lt;span class="w"&gt;       &lt;/span&gt;flit
|&lt;span class="w"&gt;  &lt;/span&gt;user:&lt;span class="w"&gt;        &lt;/span&gt;Max&lt;span class="w"&gt; &lt;/span&gt;Chase&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;max.chase@gmail.com&amp;gt;
|&lt;span class="w"&gt;  &lt;/span&gt;date:&lt;span class="w"&gt;        &lt;/span&gt;Wed&lt;span class="w"&gt; &lt;/span&gt;Apr&lt;span class="w"&gt; &lt;/span&gt;21&lt;span class="w"&gt; &lt;/span&gt;22:08:53&lt;span class="w"&gt; &lt;/span&gt;2021&lt;span class="w"&gt; &lt;/span&gt;-0400
|&lt;span class="w"&gt;  &lt;/span&gt;summary:&lt;span class="w"&gt;     &lt;/span&gt;Move&lt;span class="w"&gt; &lt;/span&gt;requirements&lt;span class="w"&gt; &lt;/span&gt;into&lt;span class="w"&gt; &lt;/span&gt;pyproject&lt;span class="w"&gt; &lt;/span&gt;file
|
o&lt;span class="w"&gt;  &lt;/span&gt;changeset:&lt;span class="w"&gt;   &lt;/span&gt;19:8416b066961b
|&lt;span class="w"&gt;  &lt;/span&gt;topic:&lt;span class="w"&gt;       &lt;/span&gt;flit
|&lt;span class="w"&gt;  &lt;/span&gt;user:&lt;span class="w"&gt;        &lt;/span&gt;Max&lt;span class="w"&gt; &lt;/span&gt;Chase&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;max.chase@gmail.com&amp;gt;
|&lt;span class="w"&gt;  &lt;/span&gt;date:&lt;span class="w"&gt;        &lt;/span&gt;Wed&lt;span class="w"&gt; &lt;/span&gt;Apr&lt;span class="w"&gt; &lt;/span&gt;21&lt;span class="w"&gt; &lt;/span&gt;21:59:56&lt;span class="w"&gt; &lt;/span&gt;2021&lt;span class="w"&gt; &lt;/span&gt;-0400
|&lt;span class="w"&gt;  &lt;/span&gt;summary:&lt;span class="w"&gt;     &lt;/span&gt;Remove&lt;span class="w"&gt; &lt;/span&gt;obsolete&lt;span class="w"&gt; &lt;/span&gt;sections.&lt;span class="w"&gt; &lt;/span&gt;This&lt;span class="w"&gt; &lt;/span&gt;will&lt;span class="w"&gt; &lt;/span&gt;need&lt;span class="w"&gt; &lt;/span&gt;quite&lt;span class="w"&gt; &lt;/span&gt;some&lt;span class="w"&gt; &lt;/span&gt;building-up,&lt;span class="w"&gt; &lt;/span&gt;later.
|
o&lt;span class="w"&gt;    &lt;/span&gt;changeset:&lt;span class="w"&gt;   &lt;/span&gt;18:3966cd21fc9d
|\&lt;span class="w"&gt;   &lt;/span&gt;topic:&lt;span class="w"&gt;       &lt;/span&gt;flit
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;parent:&lt;span class="w"&gt;      &lt;/span&gt;17:10098a6f259e
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;parent:&lt;span class="w"&gt;      &lt;/span&gt;7:6637ac94e33e
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;user:&lt;span class="w"&gt;        &lt;/span&gt;Max&lt;span class="w"&gt; &lt;/span&gt;Chase&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;max.chase@gmail.com&amp;gt;
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;date:&lt;span class="w"&gt;        &lt;/span&gt;Wed&lt;span class="w"&gt; &lt;/span&gt;Apr&lt;span class="w"&gt; &lt;/span&gt;21&lt;span class="w"&gt; &lt;/span&gt;21:49:31&lt;span class="w"&gt; &lt;/span&gt;2021&lt;span class="w"&gt; &lt;/span&gt;-0400
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;summary:&lt;span class="w"&gt;     &lt;/span&gt;Merge&lt;span class="w"&gt; &lt;/span&gt;newsfile
|&lt;span class="w"&gt; &lt;/span&gt;|
|&lt;span class="w"&gt; &lt;/span&gt;o&lt;span class="w"&gt;    &lt;/span&gt;changeset:&lt;span class="w"&gt;   &lt;/span&gt;17:10098a6f259e
|&lt;span class="w"&gt; &lt;/span&gt;|\&lt;span class="w"&gt;   &lt;/span&gt;topic:&lt;span class="w"&gt;       &lt;/span&gt;flit
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;parent:&lt;span class="w"&gt;      &lt;/span&gt;16:d61630e48c1c
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;parent:&lt;span class="w"&gt;      &lt;/span&gt;6:cf3dcc39255e
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;user:&lt;span class="w"&gt;        &lt;/span&gt;Max&lt;span class="w"&gt; &lt;/span&gt;Chase&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;max.chase@gmail.com&amp;gt;
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;date:&lt;span class="w"&gt;        &lt;/span&gt;Wed&lt;span class="w"&gt; &lt;/span&gt;Apr&lt;span class="w"&gt; &lt;/span&gt;21&lt;span class="w"&gt; &lt;/span&gt;21:48:35&lt;span class="w"&gt; &lt;/span&gt;2021&lt;span class="w"&gt; &lt;/span&gt;-0400
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;summary:&lt;span class="w"&gt;     &lt;/span&gt;Merge&lt;span class="w"&gt; &lt;/span&gt;track-version
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;o&lt;span class="w"&gt;    &lt;/span&gt;changeset:&lt;span class="w"&gt;   &lt;/span&gt;16:d61630e48c1c
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|\&lt;span class="w"&gt;   &lt;/span&gt;topic:&lt;span class="w"&gt;       &lt;/span&gt;flit
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;parent:&lt;span class="w"&gt;      &lt;/span&gt;15:437adcfca631
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;parent:&lt;span class="w"&gt;      &lt;/span&gt;10:46f39cc09e70
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;user:&lt;span class="w"&gt;        &lt;/span&gt;Max&lt;span class="w"&gt; &lt;/span&gt;Chase&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;max.chase@gmail.com&amp;gt;
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;date:&lt;span class="w"&gt;        &lt;/span&gt;Wed&lt;span class="w"&gt; &lt;/span&gt;Apr&lt;span class="w"&gt; &lt;/span&gt;21&lt;span class="w"&gt; &lt;/span&gt;21:47:36&lt;span class="w"&gt; &lt;/span&gt;2021&lt;span class="w"&gt; &lt;/span&gt;-0400
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;summary:&lt;span class="w"&gt;     &lt;/span&gt;Merge&lt;span class="w"&gt; &lt;/span&gt;dockerfile
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;o&lt;span class="w"&gt;    &lt;/span&gt;changeset:&lt;span class="w"&gt;   &lt;/span&gt;15:437adcfca631
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|\&lt;span class="w"&gt;   &lt;/span&gt;topic:&lt;span class="w"&gt;       &lt;/span&gt;flit
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;parent:&lt;span class="w"&gt;      &lt;/span&gt;14:f4d28742c686
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;parent:&lt;span class="w"&gt;      &lt;/span&gt;12:07de2c1ad195
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;user:&lt;span class="w"&gt;        &lt;/span&gt;Max&lt;span class="w"&gt; &lt;/span&gt;Chase&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;max.chase@gmail.com&amp;gt;
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;date:&lt;span class="w"&gt;        &lt;/span&gt;Wed&lt;span class="w"&gt; &lt;/span&gt;Apr&lt;span class="w"&gt; &lt;/span&gt;21&lt;span class="w"&gt; &lt;/span&gt;21:47:02&lt;span class="w"&gt; &lt;/span&gt;2021&lt;span class="w"&gt; &lt;/span&gt;-0400
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;summary:&lt;span class="w"&gt;     &lt;/span&gt;Merge&lt;span class="w"&gt; &lt;/span&gt;setup_cfg
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;o&lt;span class="w"&gt;    &lt;/span&gt;changeset:&lt;span class="w"&gt;   &lt;/span&gt;14:f4d28742c686
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|\&lt;span class="w"&gt;   &lt;/span&gt;topic:&lt;span class="w"&gt;       &lt;/span&gt;flit
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;parent:&lt;span class="w"&gt;      &lt;/span&gt;13:66391bb2b27c
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;parent:&lt;span class="w"&gt;      &lt;/span&gt;8:85369dd3de76
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;user:&lt;span class="w"&gt;        &lt;/span&gt;Max&lt;span class="w"&gt; &lt;/span&gt;Chase&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;max.chase@gmail.com&amp;gt;
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;date:&lt;span class="w"&gt;        &lt;/span&gt;Wed&lt;span class="w"&gt; &lt;/span&gt;Apr&lt;span class="w"&gt; &lt;/span&gt;21&lt;span class="w"&gt; &lt;/span&gt;21:46:20&lt;span class="w"&gt; &lt;/span&gt;2021&lt;span class="w"&gt; &lt;/span&gt;-0400
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;summary:&lt;span class="w"&gt;     &lt;/span&gt;Merge&lt;span class="w"&gt; &lt;/span&gt;src
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;o&lt;span class="w"&gt;  &lt;/span&gt;changeset:&lt;span class="w"&gt;   &lt;/span&gt;13:66391bb2b27c
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;topic:&lt;span class="w"&gt;       &lt;/span&gt;flit
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;parent:&lt;span class="w"&gt;      &lt;/span&gt;4:de3dfd17b396
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;user:&lt;span class="w"&gt;        &lt;/span&gt;Max&lt;span class="w"&gt; &lt;/span&gt;Chase&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;max.chase@gmail.com&amp;gt;
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;date:&lt;span class="w"&gt;        &lt;/span&gt;Wed&lt;span class="w"&gt; &lt;/span&gt;Apr&lt;span class="w"&gt; &lt;/span&gt;21&lt;span class="w"&gt; &lt;/span&gt;21:45:10&lt;span class="w"&gt; &lt;/span&gt;2021&lt;span class="w"&gt; &lt;/span&gt;-0400
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;summary:&lt;span class="w"&gt;     &lt;/span&gt;Run&lt;span class="w"&gt; &lt;/span&gt;flit
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;o---+&lt;span class="w"&gt;  &lt;/span&gt;changeset:&lt;span class="w"&gt;   &lt;/span&gt;12:07de2c1ad195
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;   &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;topic:&lt;span class="w"&gt;       &lt;/span&gt;setup_cfg
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt;   &lt;/span&gt;parent:&lt;span class="w"&gt;      &lt;/span&gt;4:de3dfd17b396
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;    &lt;/span&gt;user:&lt;span class="w"&gt;        &lt;/span&gt;Max&lt;span class="w"&gt; &lt;/span&gt;Chase&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;max.chase@gmail.com&amp;gt;
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;    &lt;/span&gt;date:&lt;span class="w"&gt;        &lt;/span&gt;Wed&lt;span class="w"&gt; &lt;/span&gt;Apr&lt;span class="w"&gt; &lt;/span&gt;21&lt;span class="w"&gt; &lt;/span&gt;21:38:15&lt;span class="w"&gt; &lt;/span&gt;2021&lt;span class="w"&gt; &lt;/span&gt;-0400
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;    &lt;/span&gt;summary:&lt;span class="w"&gt;     &lt;/span&gt;For&lt;span class="w"&gt; &lt;/span&gt;now,&lt;span class="w"&gt; &lt;/span&gt;this&lt;span class="w"&gt; &lt;/span&gt;file&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;not&lt;span class="w"&gt; &lt;/span&gt;needed
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;o&lt;span class="w"&gt;  &lt;/span&gt;changeset:&lt;span class="w"&gt;   &lt;/span&gt;11:94562533859a
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|/&lt;span class="w"&gt;   &lt;/span&gt;topic:&lt;span class="w"&gt;       &lt;/span&gt;sphinx
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;    &lt;/span&gt;parent:&lt;span class="w"&gt;      &lt;/span&gt;4:de3dfd17b396
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;    &lt;/span&gt;user:&lt;span class="w"&gt;        &lt;/span&gt;Max&lt;span class="w"&gt; &lt;/span&gt;Chase&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;max.chase@gmail.com&amp;gt;
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;    &lt;/span&gt;date:&lt;span class="w"&gt;        &lt;/span&gt;Wed&lt;span class="w"&gt; &lt;/span&gt;Apr&lt;span class="w"&gt; &lt;/span&gt;21&lt;span class="w"&gt; &lt;/span&gt;21:30:03&lt;span class="w"&gt; &lt;/span&gt;2021&lt;span class="w"&gt; &lt;/span&gt;-0400
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;    &lt;/span&gt;summary:&lt;span class="w"&gt;     &lt;/span&gt;Close&lt;span class="w"&gt; &lt;/span&gt;#1
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;o---+&lt;span class="w"&gt;  &lt;/span&gt;changeset:&lt;span class="w"&gt;   &lt;/span&gt;10:46f39cc09e70
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;   &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;topic:&lt;span class="w"&gt;       &lt;/span&gt;dockerfile
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt;   &lt;/span&gt;parent:&lt;span class="w"&gt;      &lt;/span&gt;4:de3dfd17b396
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;    &lt;/span&gt;user:&lt;span class="w"&gt;        &lt;/span&gt;Max&lt;span class="w"&gt; &lt;/span&gt;Chase&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;max.chase@gmail.com&amp;gt;
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;    &lt;/span&gt;date:&lt;span class="w"&gt;        &lt;/span&gt;Wed&lt;span class="w"&gt; &lt;/span&gt;Apr&lt;span class="w"&gt; &lt;/span&gt;21&lt;span class="w"&gt; &lt;/span&gt;21:35:27&lt;span class="w"&gt; &lt;/span&gt;2021&lt;span class="w"&gt; &lt;/span&gt;-0400
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;    &lt;/span&gt;summary:&lt;span class="w"&gt;     &lt;/span&gt;Close&lt;span class="w"&gt; &lt;/span&gt;#9
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;o&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;changeset:&lt;span class="w"&gt;   &lt;/span&gt;8:85369dd3de76
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|/&lt;span class="w"&gt;   &lt;/span&gt;topic:&lt;span class="w"&gt;       &lt;/span&gt;src
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;    &lt;/span&gt;parent:&lt;span class="w"&gt;      &lt;/span&gt;4:de3dfd17b396
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;    &lt;/span&gt;user:&lt;span class="w"&gt;        &lt;/span&gt;Max&lt;span class="w"&gt; &lt;/span&gt;Chase&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;max.chase@gmail.com&amp;gt;
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;    &lt;/span&gt;date:&lt;span class="w"&gt;        &lt;/span&gt;Wed&lt;span class="w"&gt; &lt;/span&gt;Apr&lt;span class="w"&gt; &lt;/span&gt;21&lt;span class="w"&gt; &lt;/span&gt;21:15:30&lt;span class="w"&gt; &lt;/span&gt;2021&lt;span class="w"&gt; &lt;/span&gt;-0400
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;    &lt;/span&gt;summary:&lt;span class="w"&gt;     &lt;/span&gt;Close&lt;span class="w"&gt; &lt;/span&gt;#2
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|
o&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;changeset:&lt;span class="w"&gt;   &lt;/span&gt;7:6637ac94e33e
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;topic:&lt;span class="w"&gt;       &lt;/span&gt;newsfile
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;parent:&lt;span class="w"&gt;      &lt;/span&gt;5:84a31d17722f
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;user:&lt;span class="w"&gt;        &lt;/span&gt;Max&lt;span class="w"&gt; &lt;/span&gt;Chase&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;max.chase@gmail.com&amp;gt;
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;date:&lt;span class="w"&gt;        &lt;/span&gt;Wed&lt;span class="w"&gt; &lt;/span&gt;Apr&lt;span class="w"&gt; &lt;/span&gt;21&lt;span class="w"&gt; &lt;/span&gt;21:10:31&lt;span class="w"&gt; &lt;/span&gt;2021&lt;span class="w"&gt; &lt;/span&gt;-0400
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;summary:&lt;span class="w"&gt;     &lt;/span&gt;I&lt;span class="w"&gt; &lt;/span&gt;guess&lt;span class="w"&gt; &lt;/span&gt;I&lt;span class="w"&gt; &lt;/span&gt;didn&amp;#39;t&lt;span class="w"&gt; &lt;/span&gt;actually&lt;span class="w"&gt; &lt;/span&gt;need&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;update&lt;span class="w"&gt; &lt;/span&gt;it,&lt;span class="w"&gt; &lt;/span&gt;since&lt;span class="w"&gt; &lt;/span&gt;towncrier&lt;span class="w"&gt; &lt;/span&gt;will&lt;span class="w"&gt; &lt;/span&gt;just&lt;span class="w"&gt; &lt;/span&gt;handle&lt;span class="w"&gt; &lt;/span&gt;it.&lt;span class="w"&gt; &lt;/span&gt;Whoops.
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt; &lt;/span&gt;|
|&lt;span class="w"&gt; &lt;/span&gt;o&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;changeset:&lt;span class="w"&gt;   &lt;/span&gt;6:cf3dcc39255e
|/&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt;   &lt;/span&gt;topic:&lt;span class="w"&gt;       &lt;/span&gt;track-version
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;    &lt;/span&gt;user:&lt;span class="w"&gt;        &lt;/span&gt;Max&lt;span class="w"&gt; &lt;/span&gt;Chase&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;max.chase@gmail.com&amp;gt;
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;    &lt;/span&gt;date:&lt;span class="w"&gt;        &lt;/span&gt;Wed&lt;span class="w"&gt; &lt;/span&gt;Apr&lt;span class="w"&gt; &lt;/span&gt;21&lt;span class="w"&gt; &lt;/span&gt;21:03:10&lt;span class="w"&gt; &lt;/span&gt;2021&lt;span class="w"&gt; &lt;/span&gt;-0400
|&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;    &lt;/span&gt;summary:&lt;span class="w"&gt;     &lt;/span&gt;Close&lt;span class="w"&gt; &lt;/span&gt;#3
|&lt;span class="w"&gt; &lt;/span&gt;|
o&lt;span class="w"&gt; &lt;/span&gt;|&lt;span class="w"&gt;  &lt;/span&gt;changeset:&lt;span class="w"&gt;   &lt;/span&gt;5:84a31d17722f
|/&lt;span class="w"&gt;   &lt;/span&gt;topic:&lt;span class="w"&gt;       &lt;/span&gt;semver
|&lt;span class="w"&gt;    &lt;/span&gt;user:&lt;span class="w"&gt;        &lt;/span&gt;Max&lt;span class="w"&gt; &lt;/span&gt;Chase&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;max.chase@gmail.com&amp;gt;
|&lt;span class="w"&gt;    &lt;/span&gt;date:&lt;span class="w"&gt;        &lt;/span&gt;Wed&lt;span class="w"&gt; &lt;/span&gt;Apr&lt;span class="w"&gt; &lt;/span&gt;21&lt;span class="w"&gt; &lt;/span&gt;20:55:31&lt;span class="w"&gt; &lt;/span&gt;2021&lt;span class="w"&gt; &lt;/span&gt;-0400
|&lt;span class="w"&gt;    &lt;/span&gt;summary:&lt;span class="w"&gt;     &lt;/span&gt;Close&lt;span class="w"&gt; &lt;/span&gt;#4
|
o&lt;span class="w"&gt;  &lt;/span&gt;changeset:&lt;span class="w"&gt;   &lt;/span&gt;4:de3dfd17b396
|&lt;span class="w"&gt;  &lt;/span&gt;topic:&lt;span class="w"&gt;       &lt;/span&gt;towncrier
|&lt;span class="w"&gt;  &lt;/span&gt;parent:&lt;span class="w"&gt;      &lt;/span&gt;0:738930154b75
|&lt;span class="w"&gt;  &lt;/span&gt;user:&lt;span class="w"&gt;        &lt;/span&gt;Max&lt;span class="w"&gt; &lt;/span&gt;Chase&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;max.chase@gmail.com&amp;gt;
|&lt;span class="w"&gt;  &lt;/span&gt;date:&lt;span class="w"&gt;        &lt;/span&gt;Mon&lt;span class="w"&gt; &lt;/span&gt;Apr&lt;span class="w"&gt; &lt;/span&gt;19&lt;span class="w"&gt; &lt;/span&gt;21:35:11&lt;span class="w"&gt; &lt;/span&gt;2021&lt;span class="w"&gt; &lt;/span&gt;-0400
|&lt;span class="w"&gt;  &lt;/span&gt;summary:&lt;span class="w"&gt;     &lt;/span&gt;Close&lt;span class="w"&gt; &lt;/span&gt;#8
|
o&lt;span class="w"&gt;  &lt;/span&gt;changeset:&lt;span class="w"&gt;   &lt;/span&gt;0:738930154b75
&lt;span class="w"&gt;   &lt;/span&gt;user:&lt;span class="w"&gt;        &lt;/span&gt;Max&lt;span class="w"&gt; &lt;/span&gt;Chase&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;max.chase@gmail.com&amp;gt;
&lt;span class="w"&gt;   &lt;/span&gt;date:&lt;span class="w"&gt;        &lt;/span&gt;Fri&lt;span class="w"&gt; &lt;/span&gt;Apr&lt;span class="w"&gt; &lt;/span&gt;16&lt;span class="w"&gt; &lt;/span&gt;22:59:07&lt;span class="w"&gt; &lt;/span&gt;2021&lt;span class="w"&gt; &lt;/span&gt;-0400
&lt;span class="w"&gt;   &lt;/span&gt;summary:&lt;span class="w"&gt;     &lt;/span&gt;[REDACTED]
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;quot;YES&amp;quot;&lt;/p&gt;
&lt;p&gt;My reasoning for going HAM on this was pretty simple: if there are pain points using topics, using them as much as possible should quickly reveal them.&lt;/p&gt;
&lt;p&gt;I did run into two annoyances, but I don't know how serious they really are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I'd like a quick way to see &amp;quot;every topic that is not an ancestor of the current topic&amp;quot;. There's probably already some way to do this, and I'm just not reading the documentation closely enough.&lt;/li&gt;
&lt;li&gt;I couldn't get it to merge from a topic that was technically a descendant of the current topic. I think this might call for rebase instead, but for now I just got around it by making a commit. (&amp;quot;Shouldn't you use rebase in general?&amp;quot; Eh, don't wanna...)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, I've successfully built the template application using Flit.
Once I have towncrier set all the way up, and sphinx merged in, I'll work on replacing the Makefile, and then the tickets I'm closing will get really interesting.
To me.&lt;/p&gt;
&lt;p&gt;I didn't get too much else done today, but this was fun, in a grinding-out-dailies-in-an-MMO kind of way.
I should wrap up now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-04-21</title><link href="https://mwchase.neocities.org/coding-2021-04-21" rel="alternate"></link><published>2021-04-21T04:00:00-04:00</published><updated>2021-04-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-04-21:/coding-2021-04-21</id><summary type="html">&lt;p class="first last"&gt;Don't reward developers by lines of code written.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today, I just focused on getting both old and shiny new Mercurial stuff configured in a way that makes sense to me.
Basically, I'm trying out the Evolve extension, and moving any projects using Mercurial to requiring topic commits.
(With an exemption for this blog, because the blog workflow is very boring, and I'm mainly using Mercurial so I don't have to learn something else.)
We'll see how that treats me as I get back into things.&lt;/p&gt;
&lt;p&gt;I also tweaked the color schemes a bunch, in response to an article or blog post that I read years ago and cannot figure out how to search for.
The basic thesis of the article was that the tendency of most tools that deal with diffs to color code additions as green and deletions as red brings in associations that don't necessarily make sense for software development.
In various domains, including status reporting, green is &amp;quot;good&amp;quot; and red is &amp;quot;bad&amp;quot;, but that doesn't match up with the fact that the big problem with code is often &lt;em&gt;too much of it&lt;/em&gt;.
So, it recommends choosing more neutral colors for representing addition and deletion, to avoid biasing the judgement of whether given aspects of the change are &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;.
We'll see how that works out for me.&lt;/p&gt;
&lt;p&gt;All that, and I didn't touch the code.
Tomorrow night.
For now, I'm going to wrap up early, and try to tweak my color schemes a little bit more.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2021-04-20</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-04-20" rel="alternate"></link><published>2021-04-20T04:00:00-04:00</published><updated>2021-04-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-04-20:/weekly-roundup-2021-04-20</id><summary type="html">&lt;p class="first last"&gt;I need to find a more constructive way to express my feelings about well-meaning but flawed tutorials.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I started getting serious about another conlang.&lt;/li&gt;
&lt;li&gt;Thursday: I thought about romanization systems for the conlang, and talked myself into continuing with my initial impulses there.&lt;/li&gt;
&lt;li&gt;Friday: I did some work on one of my tiny utility packages, to extend it with functionality that helps in a build-system-like environment.&lt;/li&gt;
&lt;li&gt;Saturday: I decided to stop using &amp;quot;Pijul has alpha version weirdness&amp;quot; as an excuse to not commit code, and started working on my build-system-but-not-really concept, using Mercurial. (Mercurial has changed, like, a &lt;em&gt;lot&lt;/em&gt; in the however-many-years it's been since I used it professionally, but backwards compatibility guarantees mean those differences are mostly hidden. I'm going to have to really familiarize myself with it sometime.) I'm also trying out Cement, to see how it compares to other command-line frameworks and libraries in Python.&lt;/li&gt;
&lt;li&gt;Sunday: I put a bow on top of my pip PR. The code is going into the next release, I think. I also did more tooling work, because not only does towncrier call out to Git, but the allowed values for one of the command line arguments are exactly the Git branches in the current repository. This makes things... interesting, if you're like me and don't want to use Git. I haven't tested the functionality yet, because by my standards, the default Cement template is kind of a mess, and until I clean it up, towncrier can't work against the repository.&lt;/li&gt;
&lt;li&gt;Monday: I decided to set up a ticketing system so I can name my news fragments the way towncrier expects.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to be doing a lot of cleanup, now that I have a local trac instance set up.
Probably conlang stuff, and definitely learning about towncrier and the last 5+ years of Mercurial features.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2021-04-19</title><link href="https://mwchase.neocities.org/coding-2021-04-19" rel="alternate"></link><published>2021-04-19T04:00:00-04:00</published><updated>2021-04-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-04-19:/coding-2021-04-19</id><summary type="html">&lt;p class="first last"&gt;I was all set to shave the yak, before I reconsidered whether the thing several layers up would actually provide value.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, here's the deal: I've listed all of the immediate changes I want to make to the initial repo state that Cement generated.
But, I want to track those changes in towncrier.
But, towncrier assumes the existence of some kind of ticketing system.
Since I'm currently developing locally, I'm a little tempted to do something in the vein of the various other issue tracking projects that integrate into the repository.&lt;/p&gt;
&lt;p&gt;Writing that sentence down, though, has convinced me that I probably wouldn't get enough from integrating the issue tracker into the repository to justify the tooling effort (which wouldn't be much, just non-zero).
So, I'll look into better-supported options later; I've got one in mind, but we'll see.&lt;/p&gt;
&lt;p&gt;Anyway, once I can covert my notes into tickets, and start closing out tickets, I'll do that.
Need to finish this entry ASAP because of other things I put off today, that it doesn't make sense to put off any longer.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-04-18</title><link href="https://mwchase.neocities.org/coding-2021-04-18" rel="alternate"></link><published>2021-04-18T04:00:00-04:00</published><updated>2021-04-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-04-18:/coding-2021-04-18</id><summary type="html">&lt;p class="first last"&gt;At least it was a quick diversion. Hopefully it'll stay that way.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today was a little bit all over the place.
I made the last change I can imagine the Pip PR needing.&lt;/p&gt;
&lt;p&gt;I looked into using towncrier, and realized that, in a few places (such as the default argument to one of the commands), it &lt;em&gt;really&lt;/em&gt; assumes you're using Git, so now I have a fork of towncrier that's supposed to handle both Git and Mercurial repositories.
I have not tried this out, or indeed tested it.&lt;/p&gt;
&lt;p&gt;There's a few other things I did, but I'm not sure how best to write them up, so eh.
It'll be interesting when I get into updating the task runner's repository, because, no matter how much I tried to act like it was otherwise, those changes are going to be &lt;em&gt;a lot&lt;/em&gt;.
Anyway, it's late, and I'm tired of pushing things when it comes to late night stuff.
Haha, tired...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-04-17</title><link href="https://mwchase.neocities.org/coding-2021-04-17" rel="alternate"></link><published>2021-04-17T04:00:00-04:00</published><updated>2021-04-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-04-17:/coding-2021-04-17</id><summary type="html">&lt;p class="first last"&gt;My feelings on Git are still about the same: capable of using it, incapable of enjoying it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, here's where things are on the task runner:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I decided that my hangups around the latest Pijul release acting weird were basically procrastination, so I've started the project regardless, but for now it's in a more traditional VCS with a more established user base and maintenance. I am referring, of course, to Mercurial.&lt;/li&gt;
&lt;li&gt;Because I've got all or nearly all of the core logic sketched out in the prototype, I figured I'd experiment a bit with &lt;a class="reference external" href="https://builtoncement.com/"&gt;Cement&lt;/a&gt;, since my complaint from the last time I looked into it (&amp;quot;They're telling me how to start a project, but I already &lt;em&gt;have&lt;/em&gt; a project!&amp;quot;) doesn't apply.&lt;/li&gt;
&lt;li&gt;I started the quickstart, and just filled in my info for the values instead of the todo-list stuff, and committed the results.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It's... probably fine.
There's just a few things I would change...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;It's using setup.py and all that entails, including MANIFEST.in. I'd rather use &lt;a class="reference external" href="https://flit.readthedocs.io/"&gt;Flit&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The runtime requirements don't appear to be specified in the setup.py file, so I don't think this can be packaged &lt;em&gt;and expected to work&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;I don't know what version scheme &amp;quot;0.0.1&amp;quot; is, but it's neither &lt;a class="reference external" href="https://semver.org/"&gt;SemVer&lt;/a&gt; nor &lt;a class="reference external" href="https://calver.org/"&gt;CalVer&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;No &lt;a class="reference external" href="https://hynek.me/articles/testing-packaging/#src"&gt;src directory&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Why do all of these files start with a newline? I don't have any coherent objection to this, because I just don't understand.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And, in stuff that's less certain/defensible...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I had a lot better time using &lt;a class="reference external" href="https://github.com/twisted/towncrier"&gt;towncrier&lt;/a&gt; with Pip than I ever did editing CHANGELOG files.&lt;/li&gt;
&lt;li&gt;I'd generally rather use reStructuredText than Markdown. Not because of anything about the syntax, but because I understand &lt;a class="reference external" href="https://www.sphinx-doc.org/"&gt;Sphinx&lt;/a&gt; just well enough by now.&lt;/li&gt;
&lt;li&gt;Speaking of which, there's a docs directory, but I don't think anything interacts with it? What's up with that?&lt;/li&gt;
&lt;li&gt;Until my task runner is off the ground, I'm going to replace the Makefile with a noxfile, and probably redo the layout of the repository so I can have a separate package for basic extensions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, you know, there are a few tiny changes I'm going to make before I get back to following along with the tutorial.
I'll see about getting on those tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-04-16</title><link href="https://mwchase.neocities.org/coding-2021-04-16" rel="alternate"></link><published>2021-04-16T04:00:00-04:00</published><updated>2021-04-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-04-16:/coding-2021-04-16</id><summary type="html">&lt;p class="first last"&gt;Progress and annoyances.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I got different filename functionality integrated into limit-coverage, and proved it out by testing it against actual code because it has literally no useful tests.
I wasn't able to build pijul myself, oh well.
The more I tinker with prototyping my task runner in Jupyter, the more its editing interface reminds me of the various stumbling blocks that I experienced with Sublime Text.
It's not that I think that there's necessarily such a thing as an editor that manages to follow a simple algorithm that always does what I want, but I think I would be happier with Jupyter if it didn't ever auto-insert tabs, or auto-close delimiters when there's no text selection.&lt;/p&gt;
&lt;p&gt;I think what contributes to this is that I'm writing dataclass-style classes, so I'm &lt;em&gt;maybe&lt;/em&gt; using variable annotations more than most people who use Jupyter?
And on the delimiter side, Jupyter just has the exact same janky behavior as Sublime where, if you delete from the middle of a run of similar end-delimiters, it will delete &amp;quot;too much&amp;quot; and you will end up with missing closing delimiters.
(I'm not sure that's the precise behavior that triggers this condition, but it's something like it.)
Maybe I should put in bugs later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2021-04-15</title><link href="https://mwchase.neocities.org/diary-2021-04-15" rel="alternate"></link><published>2021-04-15T04:00:00-04:00</published><updated>2021-04-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-04-15:/diary-2021-04-15</id><summary type="html">&lt;p class="first last"&gt;Preserving my thought process for, like, some reason.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I have come to the following conclusion on the conlang romanization stuff I was thinking about yesterday:
I have an idea that feels solid to me for my own use, but if I end up wanting to put text in this language in front of other people, romanized, I think I'll want to come up with something that doesn't look like &amp;quot;brē 'klàtró&amp;quot; or whatever, which I'm not totally sure is on the level in terms of phonotactics, but I don't yet understand some of the stuff I want to include well enough to be sure or to explain what I'm doing.
The point is, I guess I'm self-conscious about producing something that looks like stereotypical fantasy names...&lt;/p&gt;
&lt;p&gt;But now that I think about it, do I want to care about people making that kind of aesthetic judgment?
Like, I'm not going to be just sprinkling the diacritics and apostrophes on randomly, and they'll &lt;em&gt;probably&lt;/em&gt; be less frequent because they only go on stressed syllables.&lt;/p&gt;
&lt;p&gt;Anyway, I'm tinkering with that, and code, and feeling good about things.
I think I'll try to focus more properly on coding in the coming days, as follows:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;my task-runner design &lt;em&gt;would really like&lt;/em&gt; limit-coverage to have the ability to specify input and output files&lt;/li&gt;
&lt;li&gt;I feel reluctant to pester open-source maintainers, so I'm going to try doing a source build of pijul and see if that fixes the problems I was seeing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, it is painfully late, so I'm going to wrap up now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2021-04-14</title><link href="https://mwchase.neocities.org/diary-2021-04-14" rel="alternate"></link><published>2021-04-14T04:00:00-04:00</published><updated>2021-04-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-04-14:/diary-2021-04-14</id><summary type="html">&lt;p class="first last"&gt;Maybe I could use diacritics &lt;em&gt;and&lt;/em&gt; apostrophes. Yaaaay...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did some work today on conlanging stuff.
This is a different language from one that I was working on a bunch before.
I don't want to go into too much detail yet, because there are a lot of things that I could see myself changing or abandoning.
Suffice it to say that I'm in the vicinity of halfway through working on phonotactics, and I'm noticing that what I have currently will take some careful effort to get a good romanization for it.&lt;/p&gt;
&lt;p&gt;See, this is one of the things you don't have to worry about with a five vowel system.
There are five vowels.
And here I am going &amp;quot;okay, there are two fundamental axes of variation, so they can't &lt;em&gt;both&lt;/em&gt; be diacritics&amp;quot; (can they?)&lt;/p&gt;
&lt;p&gt;Anyway, I should ponder these questions later, because it is basically midnight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2021-04-13</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-04-13" rel="alternate"></link><published>2021-04-13T04:00:00-04:00</published><updated>2021-04-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-04-13:/weekly-roundup-2021-04-13</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;At last, I can—OH LOOK A DISTRACTION!&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I got back into the hobby project that originally prompted me to write the pip PR, and planned some short-term improvements.&lt;/li&gt;
&lt;li&gt;Thursday: I got a refactor partway done by the time I published, and I &lt;em&gt;think&lt;/em&gt; I finished it later that night.&lt;/li&gt;
&lt;li&gt;Friday: I decided that &amp;quot;my laptop is stupid beefy, my code evaluation tasks are somewhat embarrassingly parallel, and the task runner I'm currently using has no concurrency&amp;quot; was a bottleneck for iteration. I wrote up the feature set that I wanted, and listed a bunch of tools that &lt;em&gt;didn't&lt;/em&gt; satisfy it. I haven't heard back any suggestions, so shortly afterwards, I decided to try rolling my own, even as I suspected that doing so would open me up to all sorts of weird complications. Truly tragic.&lt;/li&gt;
&lt;li&gt;Saturday: I did various bits of housekeeping, of varying levels of consequence.&lt;/li&gt;
&lt;li&gt;Sunday: I prototyped the &amp;quot;fine, I'll do it myself&amp;quot; task runner, and researched the few bits of my current task definitions that were potentially contending for file access.&lt;/li&gt;
&lt;li&gt;Monday: I started getting a little more serious about the task runner, and trying to nail down what it's behavior should be.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I don't quite want to touch code for any of my projects, so I'm going to keep up with planning and prototyping the runner, and doing stuff not related to code.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2021-04-12</title><link href="https://mwchase.neocities.org/coding-2021-04-12" rel="alternate"></link><published>2021-04-12T04:00:00-04:00</published><updated>2021-04-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-04-12:/coding-2021-04-12</id><summary type="html">&lt;p class="first last"&gt;Just working on whatever.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got a bit further in prototyping things for my task runner, to the point where the current design &lt;em&gt;sort of&lt;/em&gt; exists and makes sense.
I think to get any further, I need to look over how other task runners are set up and work on a similar interface.
At this point, I think I've got a small set of options that need to hook into some already-written core logic, but I'm probably missing something.
(Actually, looking over Nox's command-line options, let's see... My runner has a concept of &amp;quot;targets&amp;quot; which should be specifiable, by command line or environment variable, with some degree of fuzzy matching; I can see the utility of backend overrides, but it's not a natural fit to how I'm writing it; I won't be allowing virtualenv reuse, or extra pythons, or customizing fail/abort behavior, or disallowing external programs. A lot of the functionality in Nox won't be core to my runner, so some of this functionality, if I change my mind, might end up being a tad awkward to add, but, eh. Anyway, configuration file. By command line argument or environment variable, path to file or to directory. There's a few more, but the core customization boils down to &amp;quot;where to load the file from, and which targets to try to reach&amp;quot;. I'm thinking I'll work on the command-line first, and think about having a config object like Nox later.)&lt;/p&gt;
&lt;p&gt;While I was messing around, I added a progress bar that, if I got everything coded up the way I think I do, will jump around a bunch and then make a bunch of questionable estimates.&lt;/p&gt;
&lt;p&gt;I also updated the virtual tabletop stuff so the commands that manipulated cache files are now properly reconfigured.&lt;/p&gt;
&lt;p&gt;Anyway, I've got some planning work to do here, but I don't want to try to convert this to code just yet.
Fortunately, I have other stuff to work on afterwards.
Anyway, I let this go way late again, so I should stop now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-04-11</title><link href="https://mwchase.neocities.org/coding-2021-04-11" rel="alternate"></link><published>2021-04-11T04:00:00-04:00</published><updated>2021-04-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-04-11:/coding-2021-04-11</id><summary type="html">&lt;p class="first last"&gt;Not yet seeing how this'll spiral out of control, but I don't trust it not to.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did some work prototyping my task runner concept.
The core logic &lt;em&gt;seems&lt;/em&gt; solid.
What remains now is to write the harness for interpreting command-line input and formatting command-line output, fleshing out some of the auxiliary data types, and writing a bunch of helper methods to properly define the tasks.&lt;/p&gt;
&lt;p&gt;I was able to get the core logic in an apparently-good state just by typing and editing it a bunch, but I think I'm going to need to do some more detailed planning to figure out what the reporting should look like.
I'll also need to make the modifications to the current commands I run, to feel like I can trust the commands to work as expected when run concurrently.
For Mypy, this means targeting the caches to a project-specific directory.
For pytest, this means disabling the cache behavior completely, since I didn't ever use it.&lt;/p&gt;
&lt;p&gt;I'll probably wait to implement this after I've planned it, because I really want a new pijul version first, so I'll go back into working on improving the project I want to use this for.&lt;/p&gt;
&lt;p&gt;Anyway, it's gotten way later than I meant it to, so I'll stop writing now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2021-04-10</title><link href="https://mwchase.neocities.org/diary-2021-04-10" rel="alternate"></link><published>2021-04-10T04:00:00-04:00</published><updated>2021-04-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-04-10:/diary-2021-04-10</id><summary type="html">&lt;p class="first last"&gt;That's all the really onerous adulting out of the way.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I took care of a bunch of obligations today.
Woohoo.
I'm not feeling great physically, but I can see my way to feeling better emotionally.&lt;/p&gt;
&lt;p&gt;On another note, I think I missed updating some timestamps, so this is going to be an interesting publish cycle.
I'll call this here, fix up the timestamps, and try to have something more interesting in the next few days, when I can focus more on the stuff I want to do.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2021-04-09</title><link href="https://mwchase.neocities.org/coding-2021-04-09" rel="alternate"></link><published>2021-04-09T04:00:00-04:00</published><updated>2021-04-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-04-09:/coding-2021-04-09</id><summary type="html">&lt;p class="first last"&gt;This is such a bad idea, even &lt;em&gt;if&lt;/em&gt; it turns out to work.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today, I mostly investigated and tweaked the tasks in my noxfile to make them easier to reason about in the context of parallel execution.
There are just a few tweaks left before I'd be comfortable running all of this code in parallel.
The main thing missing... is a runner.&lt;/p&gt;
&lt;p&gt;I wrote up a short summary of what I want and what I've looked at &lt;a class="reference external" href="https://dev.to/mwchase/looking-beyond-nox-1h5g"&gt;elsewhere&lt;/a&gt;, earlier today, but the shorter summary is that it seems like what I want to do falls just outside the intended usage of every tool I've looked at.
Writing up the specific things I want kind of got me thinking, like, &amp;quot;Hey, these aren't &lt;em&gt;complicated&lt;/em&gt; features! I could make this!&amp;quot;
(I am conveniently eliding the basic plumbing of a task runner, like &amp;quot;finding and loading the configuration file&amp;quot;.)&lt;/p&gt;
&lt;p&gt;In any case, if nobody suggests something that works for me, I will probably roll my own, and suffer in some way that I am completely failing to anticipate.
Anyway, I won't do that right now, because it's getting late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-04-08</title><link href="https://mwchase.neocities.org/coding-2021-04-08" rel="alternate"></link><published>2021-04-08T04:00:00-04:00</published><updated>2021-04-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-04-08:/coding-2021-04-08</id><summary type="html">&lt;p class="first last"&gt;Learning valuable things about my tools, and generating so many metrics. Some of them might even be useful.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today, I managed to put in some time refactoring the punq fork.
It's not perfect yet—there are still some type issues—but, um, huh.
One other issue that seems like it shouldn't have any connection to what I just did.
And, I've just discovered that the HTML report out of mypy is apparently totally orthogonal to its error reporting.
That's... not what I expected, and I hope I can change that.
Aha, looks like I want the --junit-xml option.
I'll keep the other HTML report, as well.&lt;/p&gt;
&lt;p&gt;Anyway, I'll test that out while this publishes.
I'm pushing things late already, I should get to bed as soon as I can.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-04-07</title><link href="https://mwchase.neocities.org/coding-2021-04-07" rel="alternate"></link><published>2021-04-07T04:00:00-04:00</published><updated>2021-04-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-04-07:/coding-2021-04-07</id><summary type="html">&lt;p class="first last"&gt;Hello, you glorious backlog of hobby work!&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm still fighting off a variable-grade migraine, but I really want to &lt;em&gt;do stuff&lt;/em&gt;, so I've been trying.
And wearing sunglasses.
Indoors.
With the lights off.&lt;/p&gt;
&lt;p&gt;Anyway, I'm making some progress on the writing-related front, but I don't want to talk about that yet.
So, anyway anyway, I realized earlier that, with the pip PR out of my hands, and no new version of Pijul yet for committing cookiecutters to, that means there's currently nothing that I can work on &lt;em&gt;instead of&lt;/em&gt; the virtual tabletop stuff, based on the idea that working on the other thing will help virtual tabletop development later.
In other words, I can't shave the yak, so there's no stress from working on the actual project.&lt;/p&gt;
&lt;p&gt;I thought I was going to hop in and make various changes to the punq fork that makes most of the code go, but I decided to pick off some low-hanging fruit in missed coverage first.
Thinking about getting coverage improvements right, though, I have come to the following order of priorities:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Reorganize the punq fork's tests so I can re-enable &lt;a class="reference external" href="https://github.com/mwchase/limit-coverage"&gt;limit-coverage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Improve my coverage metrics&lt;/li&gt;
&lt;li&gt;Convert the punq fork to operate on immutable data structures&lt;/li&gt;
&lt;li&gt;Migrate utility code into the punq fork package&lt;/li&gt;
&lt;li&gt;Specify the punq fork's behavior&lt;/li&gt;
&lt;li&gt;Extend the specification to cover generics&lt;/li&gt;
&lt;li&gt;Improve the algorithmic properties of the punq fork's canonicalization algorithm. (This is low in the list because I think getting it right is really hard, and the current cache-based solution is probably good enough, despite the fact that I feel like it's inelegant.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Probably the first thing to do is move the canonicalization code into its own module; that code is nearly half the package!
So, that's going to be some stuff I need to learn to do that kind of big refactor in vim instead of Sublime Text or TextWrangler.
(Honestly, it's mainly going to be getting used to cut and paste through vim's buffers. The &amp;quot;resolve all of the errors afterwards&amp;quot; step shouldn't be different in any way that matters.)&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to go back to the writing stuff while this posts.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2021-04-06</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-04-06" rel="alternate"></link><published>2021-04-06T04:00:00-04:00</published><updated>2021-04-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-04-06:/weekly-roundup-2021-04-06</id><summary type="html">&lt;p class="first last"&gt;I'm okay, except for when I'm really not.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I made the last adjustments to my pip PR. I think my side of things is actually done now.&lt;/li&gt;
&lt;li&gt;Thursday: I started porting μKanren to Python, because *shrug*.&lt;/li&gt;
&lt;li&gt;Friday: I got a bit further along, and wrote a unifier that works on JSON-like data.&lt;/li&gt;
&lt;li&gt;Saturday: I had a migraine.&lt;/li&gt;
&lt;li&gt;Sunday: I watched a very silly miniseries.&lt;/li&gt;
&lt;li&gt;Monday: I was out of town for part of the day, so eh.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try and do more work on writing.
I've reworked how I'm doing Zettelkasten stuff (I now have a card called &amp;quot;just using TiddlyWiki&amp;quot;), and I want to get used to that and try to get in the habit of using it, so I can enter in actionable stuff from the many, many programming blog posts I read.
But for now, working on writing/worldbuilding.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Diary 2021-04-05</title><link href="https://mwchase.neocities.org/diary-2021-04-05" rel="alternate"></link><published>2021-04-05T04:00:00-04:00</published><updated>2021-04-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-04-05:/diary-2021-04-05</id><summary type="html">&lt;p class="first last"&gt;I've got some really grueling whims in my back pocket I hope I don't end up reaching for.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;We visited family today, so things are lean as far as the kind of stuff I usually write about.
I'm going to try to get some work in on one of my neglected projects while this posts.
See, right now, a lot of the software stuff that I'm hoping to make use of seems to be in a holding pattern, from my perspective, so I'm going to try doing some writing-related stuff.&lt;/p&gt;
&lt;p&gt;(I mean, I suppose there's the whole &amp;quot;I ought to make vim flashcards for myself sometime&amp;quot; thing, but I guess &amp;quot;sometime&amp;quot; doesn't feel like it should be &amp;quot;now&amp;quot;.)&lt;/p&gt;
&lt;p&gt;Let's see, anything else...
Well, I made some progress on the Kanren stuff after the last post.
It's mostly useful as a &amp;quot;teach myself how logic programming works under the covers&amp;quot; kind of thing, and I suppose the next thing I'm curious about is constraint logic programming.&lt;/p&gt;
&lt;p&gt;Anyway, I'll go wherever my whims take me, and right now my whim is to wrap up this post.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2021-04-04</title><link href="https://mwchase.neocities.org/diary-2021-04-04" rel="alternate"></link><published>2021-04-04T04:00:00-04:00</published><updated>2021-04-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-04-04:/diary-2021-04-04</id><summary type="html">&lt;p class="first last"&gt;Ironic that a movie with a theme of worrying about wasting time would pad itself so aggressively.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I spent most of today recovering from the migraine and catching up on stuff that I didn't do earlier, because of the migraine.&lt;/p&gt;
&lt;p&gt;I might have done more after dinner, but we ended up watching all of The Langoliers.
I'd been thinking I'd be up for half of it tonight, but it was so ridiculous we had to see it through to the end.
Extremely silly, and much better without an internet shoutyman edited over it.&lt;/p&gt;
&lt;p&gt;There was some other stuff I did today, but I'd like to give it some more time and see if it pans out.
For now, I'm going to wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2021-04-03</title><link href="https://mwchase.neocities.org/diary-2021-04-03" rel="alternate"></link><published>2021-04-03T04:00:00-04:00</published><updated>2021-04-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-04-03:/diary-2021-04-03</id><summary type="html">&lt;p class="first last"&gt;Really not a fan of my body deciding &amp;quot;Nope nope nope, that's too much light.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I had a migraine coming on as I wrapped up that last entry, and I've spent today cowering from the light and napping.
Like, I'm mostly not &lt;em&gt;still&lt;/em&gt; feeling it, but I've got extremely obvious limits on how much I can do stuff like, look at a screen.&lt;/p&gt;
&lt;p&gt;It looks like there's some movement on some stuff I've worked on; we'll see.&lt;/p&gt;
&lt;p&gt;I'm still thinking about the μKanren stuff.
I've concluded one thing I want for my implementation, as an auxiliary function, is something to convert a variable in the context of a state into a fully realized value.
I've got some ideas for this, but I haven't been able to focus for long enough to put them all together.&lt;/p&gt;
&lt;p&gt;I'm going to try to sketch stuff out for that after I post this, regardless, but I won't try too hard.
I've still got to take things easy.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2021-04-02</title><link href="https://mwchase.neocities.org/coding-2021-04-02" rel="alternate"></link><published>2021-04-02T04:00:00-04:00</published><updated>2021-04-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-04-02:/coding-2021-04-02</id><summary type="html">&lt;p class="first last"&gt;Extremely hard to tell if this code is working, not up for thinking about it right now.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I messed around a bit more with the microKanren thing I started working on yesterday.
I wasn't really sure how it should handle unification, so I abstracted out the unification logic and made it pluggable.
Right now there's just json-inspired unification, but it wouldn't be hard to add other models.&lt;/p&gt;
&lt;p&gt;I tried out a very basic usage of that unifier, and it's a little hard to tell how much it, like, works.
The thing that I can tell is that I don't like the variable introduction function, which is a very close port of the Scheme version.
Requiring a function definition or a lambda for every new variable seems painful to me.
Maybe it won't be as bad if I come up with a use case that justifies having this.
I'm trying to remember, I feel like I was doing something recently-ish that seemed like it would have handled better with unification and backtracking, but I can't remember the details.&lt;/p&gt;
&lt;p&gt;Anyway, I'm feeling really lousy, so I'm not going to worry about it any more, and try and get some rest.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-04-01</title><link href="https://mwchase.neocities.org/coding-2021-04-01" rel="alternate"></link><published>2021-04-01T04:00:00-04:00</published><updated>2021-04-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-04-01:/coding-2021-04-01</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Anyway, I didn't have a specific reason for doing any of this.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got distracted from everything else I was doing, and put together a prototype &lt;a class="reference external" href="http://webyrd.net/scheme-2013/papers/HemannMuKanren2013.pdf"&gt;μKanren&lt;/a&gt; library in Python.
The main functionality I'm missing is the core of the &lt;tt class="docutils literal"&gt;unify&lt;/tt&gt; function, because I haven't decided which data types I want it to be able to handle.
Thinking about that reminded me of the probably-not-well-explained logic at the heart of &lt;a class="reference external" href="https://github.com/mwchase/python-structured-data"&gt;Structured Data&lt;/a&gt;'s matching system, which I'd like to point at more specifically, but it is &lt;em&gt;extremely&lt;/em&gt; decoupled.&lt;/p&gt;
&lt;p&gt;The other thing I'm worried about is the implementation of the &lt;tt class="docutils literal"&gt;bind&lt;/tt&gt; function.
In most parts of the prototype, I was able to rewrite recursion into iteration, but I did not work that out for &lt;tt class="docutils literal"&gt;bind&lt;/tt&gt; yet, due to it's usage of &lt;tt class="docutils literal"&gt;mplus&lt;/tt&gt;, which I'm not totally happy with my implementation of either.
Now that I write this, I have some ideas.&lt;/p&gt;
&lt;p&gt;Well, after thinking about those ideas, the code is different now.
I don't know about better or worse, but it's different.
It's still got some open questions that need to be answered in order to finish the implementation.&lt;/p&gt;
&lt;p&gt;Anyway, I didn't have a specific reason for doing any of this.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Pip 2021-03-31</title><link href="https://mwchase.neocities.org/pip-2021-03-31" rel="alternate"></link><published>2021-03-31T04:00:00-04:00</published><updated>2021-03-31T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-03-31:/pip-2021-03-31</id><summary type="html">&lt;p class="first last"&gt;I just need to keep on coming back to this with a fresh perspective.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I figured I'd try to trim down the tests in my pip PR a bit, and I managed to combine two pairs into two parametrized tests.
I don't have a good sense of whether it makes sense to collapse things more aggressively.
I think if I went much further, I'd end up with tests that have completely opposite assertions depending on a flag, which is a little scary to me.
A little variation is... fine... but I don't know about &amp;quot;If this test flag is set, the installation should succeed, otherwise it should fail&amp;quot;.&lt;/p&gt;
&lt;p&gt;I guess I don't have anything else to say here.
I think there's more work to do, but it's not happening now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Weekly Roundup 2021-03-30</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-03-30" rel="alternate"></link><published>2021-03-30T04:00:00-04:00</published><updated>2021-03-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-03-30:/weekly-roundup-2021-03-30</id><summary type="html">&lt;p class="first last"&gt;New old code.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I did some of the easy work remaining on the pip PR.&lt;/li&gt;
&lt;li&gt;Thursday: I had a tough day.&lt;/li&gt;
&lt;li&gt;Friday: I did some of the slightly-less-easy work remaining on the pip PR.&lt;/li&gt;
&lt;li&gt;Saturday: I dug up some old code and evaluated it as a way to teach myself some new libraries I'm interested in. Python development tooling has come a long way in the past nine years.&lt;/li&gt;
&lt;li&gt;Sunday: I got sidetracked a bit. I started with &amp;quot;let's prototype the updated code&amp;quot; and ended on &amp;quot;There's a bug in pijul, I think.&amp;quot;&lt;/li&gt;
&lt;li&gt;Monday: I pushed on with prototyping. My prototypes didn't scale much in terms of maintainability, so now that I've established &amp;quot;this works, and this works, and this works&amp;quot;, I want to work in a text editor instead of Jupyter.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I think I'll look back over the pip PR and see what else I can consolidate or rewrite to be clearer.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2021-03-29</title><link href="https://mwchase.neocities.org/coding-2021-03-29" rel="alternate"></link><published>2021-03-29T04:00:00-04:00</published><updated>2021-03-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-03-29:/coding-2021-03-29</id><summary type="html">&lt;p class="first last"&gt;Sometimes hitting mystery issues...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've done enough prototyping for the solvers to basically understand how to use Numba in a way that at least doesn't raise errors.
I'm not totally happy with how I've written the prototype code.
It feels like there ought to be a clearer way to express the core algorithms, and I say that even though this code is a relatively straightforward port of the previous version.
It was never particularly well-explained, and that's only going to get worse as I get together the stuff I need for more numerically sophisticated algorithms.
I've currently prototyped the &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Euler_method"&gt;Euler method&lt;/a&gt;, &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Heun%27s_method"&gt;Heun's method&lt;/a&gt; &lt;em&gt;I think&lt;/em&gt;, and &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Runge%E2%80%93Kutta_methods"&gt;classic Runge-Kutta&lt;/a&gt;.
I've only really tested the Euler prototype because effort, but I'm planning some more things to implement.&lt;/p&gt;
&lt;p&gt;I think at this point, I either have to commit to using the cruft clone in &lt;em&gt;some&lt;/em&gt; capacity, or just manually set up the repo again.&lt;/p&gt;
&lt;p&gt;Things I have in mind once I have a repo together:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;A variety of helper functions to un-clutter the current prototype definitions.&lt;/li&gt;
&lt;li&gt;Simple harmonic motion system.&lt;/li&gt;
&lt;li&gt;Basic invariant checks for the harmonic system.&lt;/li&gt;
&lt;li&gt;Port over more complicated code, like the variable-step methods, and some other things that I &lt;em&gt;did not&lt;/em&gt; document well. Also, other systems and their associated checks.&lt;/li&gt;
&lt;li&gt;Other methods.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, I'm going to try to prototype some of those helper functions while this posts.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-03-28</title><link href="https://mwchase.neocities.org/coding-2021-03-28" rel="alternate"></link><published>2021-03-28T04:00:00-04:00</published><updated>2021-03-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-03-28:/coding-2021-03-28</id><summary type="html">&lt;p class="first last"&gt;What does it look like I'm doing‽&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&amp;quot;Well, I did some planning for the update, it'd be nice to have a solid foundation for experimenting with code.&amp;quot;&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;&amp;quot;I'd like to base this off of my current preferred repository layout, and ideally I'd use the cruft clone, but the cruft clone doesn't exist yet. Well, I can at least start making the cookiecutters.&amp;quot;&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;&amp;quot;Okay, let's see what kind of response the bug report I just filed against Pijul gets.&amp;quot;&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;So, I'm a few layers deep here.
To try to get around all of this, I'm going to set up a quick prototype in Jupyter.
Then, later, I can transfer it to regular python files.&lt;/p&gt;
&lt;p&gt;I just tossed together the basic requirements for messing around with Numba, and I'll try that out later.
I don't want to draw this out too much, so I'll just drop this context for the summary.&lt;/p&gt;
&lt;div class="youtube youtube-16x9"&gt;&lt;iframe src="https://www.youtube.com/embed/_UZFI-8D5uA" allowfullscreen seamless frameBorder="0"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-03-27</title><link href="https://mwchase.neocities.org/coding-2021-03-27" rel="alternate"></link><published>2021-03-27T04:00:00-04:00</published><updated>2021-03-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-03-27:/coding-2021-03-27</id><summary type="html">&lt;p class="first last"&gt;Finding some code I wrote in college, and getting it into a shape where I can tell it &amp;quot;Welcome... to the &lt;strong&gt;future&lt;/strong&gt;! *jazz hands*&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today, I followed a whim, and dug up some of my academic code from nearly a decade ago.
It's meant to evaluate differential equation solvers in a way that I assume other people have thought of, but I haven't looked very hard.
Basically, if you're modeling a physical system, then that system will have associated invariants that you know about, but it is unlikely that the differential equation solver specifically optimizes for them.
So, given a system and an invariant, you can compare different solvers by their error metrics with that invariant.&lt;/p&gt;
&lt;p&gt;I don't have any particular usage in mind for this, I just think it's neat.&lt;/p&gt;
&lt;p&gt;Today, I just took some basic notes on the modules I wrote about nine years ago.
I can't use them directly because of... reasons.&lt;/p&gt;
&lt;p&gt;Closer to nine years ago, I wrote the initial implementation in pure Python, no support from libraries like &lt;a class="reference external" href="https://numpy.org/"&gt;NumPy&lt;/a&gt;.
Performance was... painful.
For a project in another course, I rewrote the code to use NumPy, which took things all the way to &amp;quot;sort of reasonable&amp;quot;, but was still a lot of Python code firing per simulation step, with some truly questionable attempts at optimization.&lt;/p&gt;
&lt;p&gt;Now, that wrapped up in the summer of 2012.
Back then, Python packaging was a serious chore, so I kind of... didn't do it for this.
No real tests either.
(I'm sure some people are still unhappy with the state of Python packaging today, and to them I say &amp;quot;MANIFEST.in&amp;quot;. Whatever you think of it now, now I'm using &lt;a class="reference external" href="https://flit.readthedocs.io/"&gt;Flit&lt;/a&gt;, and it's just a completely different experience from back then. Huh, this code also appears to just barely predate the first public release of the &lt;a class="reference external" href="https://github.com/pypa/wheel"&gt;wheel&lt;/a&gt; package. Sounds about right.)
And it was in Python 2, because Python 3.3 wasn't out yet, and I'm pretty sure the narrative didn't start shifting on Python 3 until Python 3.4.&lt;/p&gt;
&lt;p&gt;So, what do I want now?
Well, I'm curious about &lt;a class="reference external" href="https://numba.pydata.org/"&gt;Numba&lt;/a&gt;, and I think this code is the best candidate I have, in terms of code I've written, for &amp;quot;let's rewrite this to use Numba and see how it works&amp;quot;.
I'll have to be pretty careful about this effort, because this is not a simple rewrite.
Among other things, it appears that I was in the middle of a rewrite effort eight years ago that left the codebase in a slightly nonsensical state.
So, I have to work to figure out the spirit of the code, rather than the letter, as it were.
Plus, I'm not writing the same style of code I was nine years ago, so I've got some choices to unravel that I &lt;em&gt;would not&lt;/em&gt;, and &lt;em&gt;will not&lt;/em&gt;, make the same way today.&lt;/p&gt;
&lt;p&gt;All of that is for tomorrow.
Today, I took inventory of the modules, and next, I need to plan how the different bits of data and functions relate to each other.
It's going to be a whole thing, and the best thing to do for now to handle it right, is to get some sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Pip 2021-03-26</title><link href="https://mwchase.neocities.org/pip-2021-03-26" rel="alternate"></link><published>2021-03-26T04:00:00-04:00</published><updated>2021-03-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-03-26:/pip-2021-03-26</id><summary type="html">&lt;p class="first last"&gt;Better than it was...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I started consolidating the rest of the tests tonight.
I got the really obvious, low-hanging fruit.
There's probably more to be done, but I'm not going to strain too hard to see it just yet.&lt;/p&gt;
&lt;p&gt;It's kind of a pain how long the tests take to run, and how sometimes I missed something that turned my changes from rewrite into breakage, but I should be one or two cycles away from wrapping up for the night.&lt;/p&gt;
&lt;p&gt;Okay, I see I fixed one test, but not the other.
Time to debug... in a few minutes...&lt;/p&gt;
&lt;p&gt;And after one more cycle, it's done for now.
I pushed what I have, even though I think I need to do more.
I just felt like updating the public view of my fork.
(And checking that I didn't manage to break an earlier version of Python.)&lt;/p&gt;
&lt;p&gt;Anyway, I'll get back to this whenever.
Work has calmed down a bit, but that's not an excuse to immediately use up all the slack on something else.
So, I should get to bed soon.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Diary 2021-03-25</title><link href="https://mwchase.neocities.org/diary-2021-03-25" rel="alternate"></link><published>2021-03-25T04:00:00-04:00</published><updated>2021-03-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-03-25:/diary-2021-03-25</id><summary type="html">&lt;p class="first last"&gt;So many things happening &lt;em&gt;to&lt;/em&gt; me mean not many things happening &lt;em&gt;from&lt;/em&gt; me.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Work has been rough lately, and because of that, today I took a nap and played video games.
No work on pip, and some minimal work on other projects.&lt;/p&gt;
&lt;p&gt;I knew this week was going to be rough, but I was not prepared for the specific ways that it was rough.&lt;/p&gt;
&lt;p&gt;I cannot think of anything to add.
I should get things wrapped up asap, so I will.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Pip 2021-03-24</title><link href="https://mwchase.neocities.org/pip-2021-03-24" rel="alternate"></link><published>2021-03-24T04:00:00-04:00</published><updated>2021-03-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-03-24:/pip-2021-03-24</id><summary type="html">&lt;p class="first last"&gt;Way out on the asymptote...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Started working on enhancing and cleaning up tests for the pip PR.
Tonight, I'm doing the easy bit: adding marks and another version of a test.
The rest of the tests though...&lt;/p&gt;
&lt;p&gt;The reason I'm putting those tests off is, there are a number of inconsistencies in the tests that I wrote, and also tests that should almost certainly be collapsed together via the parametrize decorator.
Those tests constitute the majority of the work I have to do currently to refine the PR.&lt;/p&gt;
&lt;p&gt;For the rest of the night, though, I want to focus on other stuff, so I'll be tinkering with enhancing the reporting from my other projects.&lt;/p&gt;
&lt;p&gt;In a few days, I should be ready to update the PR; I don't see the point in doing so now, when I know what more work there is to be done.
Anyway, I want to wrap this up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Weekly Roundup 2021-03-23</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-03-23" rel="alternate"></link><published>2021-03-23T04:00:00-04:00</published><updated>2021-03-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-03-23:/weekly-roundup-2021-03-23</id><summary type="html">&lt;p class="first last"&gt;Much prefer just being responsible to myself. Eesh.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I found more work to do on pip.&lt;/li&gt;
&lt;li&gt;Thursday: I finished with the PR for the time being (but see below), and hoped to work on other stuff to unwind.&lt;/li&gt;
&lt;li&gt;Friday: I was tired.&lt;/li&gt;
&lt;li&gt;Saturday: I rang in spring by complaining about how the winter had been.&lt;/li&gt;
&lt;li&gt;Sunday: I did sudoku.&lt;/li&gt;
&lt;li&gt;Monday: I redid some of the diagnostic reporting for the CI on my hobby projects, which will be handy when I write some cookiecutters. I did have to fork one of the plugins I installed to make it work properly with one of the &lt;em&gt;other&lt;/em&gt; plugins. Will I open a PR to that project? ... I will &lt;em&gt;think&lt;/em&gt; about it, eventually.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I've got more work to do on the pip PR, this time around tests.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2021-03-22</title><link href="https://mwchase.neocities.org/coding-2021-03-22" rel="alternate"></link><published>2021-03-22T04:00:00-04:00</published><updated>2021-03-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-03-22:/coding-2021-03-22</id><summary type="html">&lt;p class="first last"&gt;At least it's a minor fork.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Quick entry:&lt;/p&gt;
&lt;p&gt;I've made some progress moving the reporting from one of my projects from the command line to generated HTML.
This should reduce the amount that I have to scroll back to deal with failures.
I can push this further, but I only got so far tonight, in part because I ended up forking one of the libraries I added, in order to tweak the output formatting to my taste.
I guess I can think about opening a PR to see what other people think, but I should probably try to get some more real-world usage out of my fork.
Anyway, I'll work more on such things later.
For now, I need to wrap up and get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2021-03-21</title><link href="https://mwchase.neocities.org/diary-2021-03-21" rel="alternate"></link><published>2021-03-21T04:00:00-04:00</published><updated>2021-03-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-03-21:/diary-2021-03-21</id><summary type="html">&lt;p class="first last"&gt;Extremely difficult youtube videos.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today, I basically tried to get through a backlog of youtube videos. ...
Put that way, it sounds kind of ridiculous, but, come on, it's Cracking the Cryptic.
I may have solved some of the hunts, but some of the puzzles from the last few weeks have been vicious, but even so, I don't want to give up without feeling like I gave it a fair shot.&lt;/p&gt;
&lt;p&gt;I can't think of anything else to really note.
Super excited for the weather to stop being like it has been, and to get more daylight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2021-03-20</title><link href="https://mwchase.neocities.org/diary-2021-03-20" rel="alternate"></link><published>2021-03-20T04:00:00-04:00</published><updated>2021-03-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-03-20:/diary-2021-03-20</id><summary type="html">&lt;p class="first last"&gt;I'm ready to be done with so many things...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Work is still kind of obnoxious.
I've been trying to pick hobby stuff back up in the past week, and it's a little eh.
At some point, I'm going to have to look into paying for lessons for some of this stuff.&lt;/p&gt;
&lt;p&gt;I'll try to ramp stuff up a bit more tomorrow, but honestly, what I'm most looking forward to is mild weather.
This winter hit me pretty hard, and I'm glad to see it go.&lt;/p&gt;
&lt;p&gt;I can't think of anything else to say, and things won't work out well if I try hard to come up with more, so, I'm wrapping up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2021-03-19</title><link href="https://mwchase.neocities.org/diary-2021-03-19" rel="alternate"></link><published>2021-03-19T04:00:00-04:00</published><updated>2021-03-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-03-19:/diary-2021-03-19</id><summary type="html">&lt;p class="first last"&gt;Well, I'm tired. Again.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm feeling pretty beat right now, and I think that means I should be taking things easier.&lt;/p&gt;
&lt;p&gt;Things might just be like this until it calms down at work, which might be a while.&lt;/p&gt;
&lt;p&gt;I'd be much happier if it felt like I had the time to do all the things I want to do, but it doesn't feel like that.
Oh well.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Pip 2021-03-18</title><link href="https://mwchase.neocities.org/pip-2021-03-18" rel="alternate"></link><published>2021-03-18T04:00:00-04:00</published><updated>2021-03-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-03-18:/pip-2021-03-18</id><summary type="html">&lt;p class="first last"&gt;I revised the code for the PR while on a treadmill. &lt;em&gt;Probably&lt;/em&gt; not a good idea...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've gotten the tests against the pip PR passing again.
There's still some discussion to be had, I think, but currently things are looking good.&lt;/p&gt;
&lt;p&gt;I'm hoping I can switch to diary stuff for a bit, to take a break, and then get back into the various bits of software I want to work on.
(Part of getting back into things is probably going to be getting through a massive backlog of CtC videos...)&lt;/p&gt;
&lt;p&gt;Anyway, I don't have much more to say right now, so I'm not going to.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Pip 2021-03-17</title><link href="https://mwchase.neocities.org/pip-2021-03-17" rel="alternate"></link><published>2021-03-17T04:00:00-04:00</published><updated>2021-03-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-03-17:/pip-2021-03-17</id><summary type="html">&lt;p class="first last"&gt;Closing in... again...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The pip PR has been in review long enough that &lt;em&gt;I've&lt;/em&gt; started noticing more problems with it.
Hopefully, I can get those taken care of eventually, probably with help.&lt;/p&gt;
&lt;p&gt;Okay, several test iterations later, I've determined that the code was doing what it should, and my initial test was wrong.
So, there's no more work to be done around the missing test coverage, because now it's not missing, and it passes.&lt;/p&gt;
&lt;p&gt;Anyway, that's enough messing with pip for tonight.&lt;/p&gt;
&lt;p&gt;In the future, I'm going to have to work out a better way to structure my time, because I feel like I &lt;em&gt;could&lt;/em&gt; have done more, but for now, the best thing to do, is sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Weekly Roundup 2021-03-16</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-03-16" rel="alternate"></link><published>2021-03-16T04:00:00-04:00</published><updated>2021-03-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-03-16:/weekly-roundup-2021-03-16</id><summary type="html">&lt;p class="first last"&gt;Not sure if this is forward momentum...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I sketched out enough concerns with my initial plan for the complicated clone of cruft, that I realized the basic premise was flawed, and what I had to do to fix it.&lt;/li&gt;
&lt;li&gt;Thursday: I started relating those ideas to Jinja's design, and settled on a new plan.&lt;/li&gt;
&lt;li&gt;Friday: I stepped back momentarily, to think about the ends that this kind of tooling is supposed to be a means to.&lt;/li&gt;
&lt;li&gt;Saturday: It turns out I'm not quite done with pip.&lt;/li&gt;
&lt;li&gt;Sunday: I figured out &lt;em&gt;a&lt;/em&gt; way to deal with the pip issue, but I don't like it. Either I'll change my mind, or I'll find something better.&lt;/li&gt;
&lt;li&gt;Monday: I didn't do much, but I did mention my latest plan to get myself organized. We'll see how that plans out; I plan to work on it some after I publish the roundup.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I don't know.
Pip?
Organization?
Publishing a Python package that's an extremely divergent fork of an existing package?
I haven't thought about it too hard.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Diary 2021-03-15</title><link href="https://mwchase.neocities.org/diary-2021-03-15" rel="alternate"></link><published>2021-03-15T04:00:00-04:00</published><updated>2021-03-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-03-15:/diary-2021-03-15</id><summary type="html">&lt;p class="first last"&gt;This would have gone slightly better if I'd made a decision beforehand and committed to it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I mostly took today off.
I can't tell if that was the &amp;quot;right&amp;quot; decision, but I'm hoping taking things easy helps in the long run.&lt;/p&gt;
&lt;p&gt;Here's what's most important to get back to:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I still need to fix up my pip PR, but I'm also still not sure what the best way to do that is.&lt;/li&gt;
&lt;li&gt;I'm trying out &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Zettelkasten"&gt;Zettelkasten&lt;/a&gt;. It's just gotten started, but I assume it'll get much more momentum once I start documenting my projects in it. My hope is that it'll give me a centralized place to reason about my projects, and not turn into a one-person instance of &lt;a class="reference external" href="https://xkcd.com/927/"&gt;this xkcd&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The clock change is doing all sorts of stuff to my body, so for some reason I'm sleepy when it's objectively earlier, but rather than question this situation, I'm going to wrap up ASAP and stop staring at a screen.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Pip 2021-03-14</title><link href="https://mwchase.neocities.org/pip-2021-03-14" rel="alternate"></link><published>2021-03-14T05:00:00-04:00</published><updated>2021-03-14T05:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-03-14:/pip-2021-03-14</id><summary type="html">&lt;p class="first last"&gt;Not yet ready to do the easy thing if it seems like it's not the right thing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Figuring out what was going on with pip took a little longer than I would have liked, because I wrote the test wrong.
Once I figured out the correct test, I was able to put together an extremely simple fix that I don't like because it seems to me like it breaks reasonable assumptions about how the code works.
The alternatives I looked into, I either couldn't figure out how to do, or they simply didn't work.
All the same, I'm not yet comfortable committing to the way I've found that does work.&lt;/p&gt;
&lt;p&gt;Hopefully, I'll decide on something in the next few days.
I won't focus completely on that; I've got some other projects that I want to see how they shake out.
I've got some other other stuff I want to take care of soon, so I'll call this entry here.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Pip 2021-03-13</title><link href="https://mwchase.neocities.org/pip-2021-03-13" rel="alternate"></link><published>2021-03-13T05:00:00-05:00</published><updated>2021-03-13T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-03-13:/pip-2021-03-13</id><summary type="html">&lt;p class="first last"&gt;Not quite done...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;One of the reviews on my pip PR pointed out that it doesn't properly set up the distribution, at least under some circumstances.
That's bad, because it breaks &lt;tt class="docutils literal"&gt;pip freeze&lt;/tt&gt; output, which is both bad in general, and also works against one of the specific use cases of the feature.
So, someone needs to figure out how to fix that.
I'm trying, but it's slow going.
The current assumption is that somewhere, an attribute isn't being set, which sounds to me like a case of more missing code.
Either there's some call not happening that should be, or an existing call is missing a necessary argument.&lt;/p&gt;
&lt;p&gt;So, right now I'm trying to get more information experimentally, because I managed to basically ignore this part of the code in my initial implementation.&lt;/p&gt;
&lt;p&gt;For the rest of tonight and however long, I'll be iterating on that and trying to get it to make sense to me, but I also want to get in some stuff that I was considering for the projects I want to pick up soon.
Small quality improvements, nothing earthshaking.
I'll get on that now, while I rerun pip's tests, unless those finish as I type this sentence...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Diary 2021-03-12</title><link href="https://mwchase.neocities.org/diary-2021-03-12" rel="alternate"></link><published>2021-03-12T05:00:00-05:00</published><updated>2021-03-12T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-03-12:/diary-2021-03-12</id><summary type="html">&lt;p class="first last"&gt;It's hard for me to get excited about the tooling I want, when I focus on it completely and don't work on the projects it's supposed to be for.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Not much coding work today.
I think tomorrow has some potential.&lt;/p&gt;
&lt;p&gt;Thinking about the different things I want to work on, I think I need to work on prioritizing the different projects.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;For the Cruft clone, I basically know what I need to do, but I don't know how long it'll take me, besides &amp;quot;probably a while&amp;quot;.&lt;/li&gt;
&lt;li&gt;Related to the Cruft clone, I need a pair of cookiecutters and some helper scripts to generate my preferred repo structure.&lt;/li&gt;
&lt;li&gt;But to figure out what goes in those cookiecutters, I need to work on the tooling for what were my active projects, before I decided to Be The Change with pip.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm not really sure how to translate that into development priorities.
I guess I need to take stock of my active projects.
Then, it probably makes sense to focus on them instead of the Cruft clone, and work on deriving requirements for the clone and the cookiecutters from my experiences.&lt;/p&gt;
&lt;p&gt;Anyway, it's later than I planned to let it be, so I'm going to wrap things up now, and hopefully make some progress on &lt;em&gt;something&lt;/em&gt; tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2021-03-11</title><link href="https://mwchase.neocities.org/coding-2021-03-11" rel="alternate"></link><published>2021-03-11T05:00:00-05:00</published><updated>2021-03-11T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-03-11:/coding-2021-03-11</id><summary type="html">&lt;p class="first last"&gt;Working on a plan for this whole &amp;quot;translating diffs between formats&amp;quot; thing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I now know more about how Jinja works.
It's not helping with the implementation yet.
Basically, Jinja templates are converted to Python source code and compiled to functions.
This means that I can't do some kind of side-channel tagging, because any metadata will be discarded by the time it does the compilation.
So, if I want to have subsequence metadata, I have to make it explicit.
And I probably want to include the actual data to make sure I don't lose it.
At the very least, this is necessary for tagging expressions.
But I want to make sure that the generated text can't masquerade as metadata.
So there needs to be some unambiguous way of distinguishing them.
Escaping, or perhaps length-prefixing the data.
I'm a little worried about stuff like call blocks, insofar as I don't want the template expansion machinery to see the metadata.&lt;/p&gt;
&lt;p&gt;But all of this does suggest a way forward to me:
Define a macro that takes a &amp;quot;tag&amp;quot; argument.
Wrap calls to the macro around each identifiable output text in each version, tagging the calls with a &amp;quot;sequence id&amp;quot;.
In the macro itself, output metadata and data.
In applying the macro, do not go inside expressions or other call statements.
This does mean that some precision will be lost.
This will be the biggest problem when dealing with call blocks that take large blocks of text and pass them back verbatim, because that represents a loss of data that can be reasoned about.&lt;/p&gt;
&lt;p&gt;My inclination currently is to wonder how much this case will be hit.
Searching github reveals that two cookiecutter repos use call blocks, over a total of 18 files.
This is few enough results that there's a chance the numbers are being swamped by miscounting, but I'm just trying to get a ballpark figure.
So, 18 cookiecutter files with call blocks, vs ~140,000 cookiecutter files.
(I dropped 10,000 files from consideration because some of them are config files for cookiecutter itself, I think.)
Anyway, at 0.01% of all cookiecutter files, I am fine with considering emitting a warning, but not actually bothering.&lt;/p&gt;
&lt;p&gt;So, now I've got a plan for coordinating the metadata, and the next big step is to figure out how to inject it into the templates.
Next step after that, derive the metadata from diff information.
This is feeling good.
I'll probably get serious about planning this stuff over the weekend.
For now, I should wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-03-10</title><link href="https://mwchase.neocities.org/coding-2021-03-10" rel="alternate"></link><published>2021-03-10T05:00:00-05:00</published><updated>2021-03-10T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-03-10:/coding-2021-03-10</id><summary type="html">&lt;p class="first last"&gt;If I weren't blogging about how I'm not sure what I'm doing, I &lt;em&gt;really&lt;/em&gt; wouldn't know.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I haven't thought too hard about this cruft-related project, but there's something bothering me about my first iteration on the design.
Basically, if there are changes that overlap in just the right way, the current design will lose information by taking the changes as a whole, rather than by applying them one by one.&lt;/p&gt;
&lt;p&gt;For a simple example, consider an if block:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;condition_a&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
&lt;span class="x"&gt;    Non-trivial content&lt;/span&gt;
&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;endif&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And imagine changing it to:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;condition_b&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
&lt;span class="x"&gt;    Content with a non-trivial diff&lt;/span&gt;
&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;endif&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now, there's nothing stopping the source from being more elaborate in the conditions, but this is less distracting and was less effort to type.
The situation here is that there's a non-trivial diff between the contents of the if blocks, and we'd like that diff to be preserved if &lt;em&gt;both&lt;/em&gt; condition_a and condition_b are true.
The more branches either version has, the more complicated this can potentially be.&lt;/p&gt;
&lt;p&gt;The current design would see the diff inside the condition expression, and just put each version completely separately, but that loses information about the diff when the condition bodies overlap.&lt;/p&gt;
&lt;p&gt;This might seem like a bit of an edge case, but I cannot trust edge cases to not become critical functionality.
So, I'm trying to figure out how to represent this.&lt;/p&gt;
&lt;p&gt;One way I could think about this would be to try to bring the correspondences of the diffs into the higher-level representations.
Do it with lexing, and you've got a token stream that sometimes bifurcates and rejoins.
Do it with the AST, and I guess the result is some kind of double-tree.
I've got this vague idea that maybe I could ignore how Jinja implements... everything, and try to do something with Huffman coding, but, like, not for compression.
It's not a well-developed idea currently.&lt;/p&gt;
&lt;p&gt;Taking another swing at this...
The structure I care about involves the sequences that are &lt;em&gt;the same&lt;/em&gt; in each version of the template.
In that sense, looking at what changed is kind of the complement to what I want to accomplish.
To figure out my priorities and what the implementation should do, I need a concept of &amp;quot;the same&amp;quot; that handles stuff like for loops.&lt;/p&gt;
&lt;p&gt;It's kind of daunting to imagine carrying this out for everything that a template &lt;em&gt;could&lt;/em&gt; do.
Ideally, I'd like to annotate specific sequences within the source and see where they end up.
If it were possible to get that data from running Jinja more-or-less as normal, then I could apply established diff algorithms to handle any alignment issues that get introduced (somehow...), and then the diff would be basically ready.
I don't know if it's possible to fake out Jinja's internals that extensively, but I'll look into it tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2021-03-09</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-03-09" rel="alternate"></link><published>2021-03-09T05:00:00-05:00</published><updated>2021-03-09T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-03-09:/weekly-roundup-2021-03-09</id><summary type="html">&lt;p class="first last"&gt;It's done! (On my end.)&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I mostly worked on the latest sudoku hunt from Cracking the Cryptic.&lt;/li&gt;
&lt;li&gt;Thursday: I tried and failed to replicate the Windows failures of my new tests. It turns out I had all the information I needed to figure out what was wrong; I just wasn't putting it together. (Basically, Windows doesn't really handle command-line parsing like any other OS I know of, so pip's test script runner can't escape things as scrupulously. So, some version specifiers can't be cleanly specified on the command line.)&lt;/li&gt;
&lt;li&gt;Friday: I put the recommended fixes to the tests into practice, then took things easy.&lt;/li&gt;
&lt;li&gt;Saturday: With my changes to pip &lt;em&gt;mostly&lt;/em&gt; ready, I started planning other things. Such as a pijul-based clone of Cruft that has a more complicated (I think) implementation, but hopefully that delivers enhanced functionality. Hopefully.&lt;/li&gt;
&lt;li&gt;Sunday: I did a bit more work on that. Didn't say much.&lt;/li&gt;
&lt;li&gt;Monday: I did a bit more work on the pip PR.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, so far as I know, the pip PR is good enough that it's out of my hands now, which is a really liberating experience.
I don't know what kind of timeframe for implementation anyone else was expecting, but that was a few months that I suspect other people could have gotten through quicker, if they'd had the time.
Which is a weird counterfactual.&lt;/p&gt;
&lt;p&gt;Anyway, it's time for me to take things easy, and work on things beholden only to me.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Pip 2021-03-08</title><link href="https://mwchase.neocities.org/pip-2021-03-08" rel="alternate"></link><published>2021-03-08T05:00:00-05:00</published><updated>2021-03-08T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-03-08:/pip-2021-03-08</id><summary type="html">&lt;p class="first last"&gt;Closing in...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Took some feedback on pip to clear stuff up.
There's a little more work for me or someone else to do, and probably some other changes to be made, but hopefully I made some improvements to it today.&lt;/p&gt;
&lt;p&gt;I did some other stuff today that hit me kind of heavy.
Not any kind of problem, but I'm a bit winded.&lt;/p&gt;
&lt;p&gt;I'm going to wind down for now and sketch stuff on paper.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Coding 2021-03-07</title><link href="https://mwchase.neocities.org/coding-2021-03-07" rel="alternate"></link><published>2021-03-07T05:00:00-05:00</published><updated>2021-03-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-03-07:/coding-2021-03-07</id><summary type="html">&lt;p class="first last"&gt;Cycling through half a dozen different design concepts.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did some planning and prototyping for my cruft-alike.
I think I understand enough of Jinja's structure to handle the whole &amp;quot;diff of template into template of diff&amp;quot; concept, though testing it will be... interesting.&lt;/p&gt;
&lt;p&gt;I think I'm going to need to put more work into this before it's in a state for me to say more about it.
For now, I really should wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2021-03-06</title><link href="https://mwchase.neocities.org/diary-2021-03-06" rel="alternate"></link><published>2021-03-06T05:00:00-05:00</published><updated>2021-03-06T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-03-06:/diary-2021-03-06</id><summary type="html">&lt;p class="first last"&gt;Laying out a rather ambitious scope of implementation for a relatively humble scope of functionality. I'd say &amp;quot;go big or go home&amp;quot;, but I have been home for nearly a year now.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I kind of took it easy today, mostly because I was pretty tired.
Not much to show off, but I figured I'd work through what I want to accomplish with a project that I'm not sure when I'll be able to get it to a working state.&lt;/p&gt;
&lt;p&gt;The basic idea is similar to &lt;a class="reference external" href="https://github.com/cruft/cruft"&gt;Cruft&lt;/a&gt;, but trying to leverage Pijul instead of Git.
One thing that's different is, &lt;em&gt;if I'm understanding the documentatation correctly&lt;/em&gt;, Cruft is most meant to overwrite and add files that don't get edited during the course of development.
What I want from my tool is, a few things:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Handling changes of the template&lt;/li&gt;
&lt;li&gt;Handling changes of the values&lt;/li&gt;
&lt;li&gt;Expanding a template anywhere in a repository; in particular, having a root templated directory, with arbitrarily many templated directories directly underneath it.&lt;/li&gt;
&lt;li&gt;Automatically running commands after all templated directories are updated. (It might be possible to bootstrap this from post-generate hooks)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These requirements suggest a few things:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I need a flexible in-memory representation of a diff between strings. In particular, it must be possible to grow and shrink the diff sections by moving unchanged characters across the boundary.&lt;/li&gt;
&lt;li&gt;I need custom Jinja filters for rendering diff data. (Alternatively, maybe it's possible to pass template data incrementally, and assign the output directly into an in-memory diff, but I don't know if Jinja would let me do that.)&lt;/li&gt;
&lt;li&gt;I need to be able to introspect Jinja syntax enough to convert a diff of a template into a template of a diff, by growing the diff the minimum amount needed.&lt;/li&gt;
&lt;li&gt;I need to be able to write Pijul diffs. I believe the format isn't fully documented, but I'm not sure.&lt;/li&gt;
&lt;li&gt;Tool-specific data about a templated directory should be stored relative to the repository, not relative to the templated directory.&lt;/li&gt;
&lt;li&gt;Maybe something vaguely make-like.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm not sure if Pijul is ready to have this tool targeting it, but I'm a ways off from implementing all the parts that don't depend on Pijul, so it basically evens out.
I'll be researching some of the Jinja stuff while I publish this.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Pip 2021-03-05</title><link href="https://mwchase.neocities.org/pip-2021-03-05" rel="alternate"></link><published>2021-03-05T05:00:00-05:00</published><updated>2021-03-05T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-03-05:/pip-2021-03-05</id><summary type="html">&lt;p class="first last"&gt;It's nearly over.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, the Windows issues are addressed, and I'm taking feedback now.
Pip work is in good shape, then, and I'm going to focus on other things as I can.&lt;/p&gt;
&lt;p&gt;I don't see too much interesting here to talk about, and I was kind of sleepy today, so I'll wrap up early again.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Pip 2021-03-04</title><link href="https://mwchase.neocities.org/pip-2021-03-04" rel="alternate"></link><published>2021-03-04T05:00:00-05:00</published><updated>2021-03-04T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-03-04:/pip-2021-03-04</id><summary type="html">&lt;p class="first last"&gt;I now have genuine questions that I cannot ask without sounding horribly elitist.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I &lt;em&gt;tried&lt;/em&gt; to replicate the PR's Windows failures.
I really did.
But I barely got &lt;em&gt;anything&lt;/em&gt; working when I tried.
If anyone out there knows about running tox on Windows and wants to help me out with this, then please take a look at &lt;a class="reference external" href="https://github.com/pypa/pip/pull/9673"&gt;my PR&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For now, I'm going to stop thinking about this, because it just makes me confused and angry.&lt;/p&gt;
&lt;p&gt;In happier news, I finished the puzzle hunt earlier today.
I'm going to finish this entry, because it's actually bothering me to look at my own account of trying to replicate the failures.&lt;/p&gt;
&lt;p&gt;EDIT: The problem with my tests was obvious in retrospect, given my Windows knowledge, and is now fixed.
Now to act on the various bits of feedback, in a few hours.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Diary 2021-03-03</title><link href="https://mwchase.neocities.org/diary-2021-03-03" rel="alternate"></link><published>2021-03-03T05:00:00-05:00</published><updated>2021-03-03T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-03-03:/diary-2021-03-03</id><summary type="html">&lt;p class="first last"&gt;Just decompressing for a while.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I decided to keep focusing on sudoku hunt stuff today.
I'm getting close to finishing, but I'm going to need to ask for help, since I don't think I've done a puzzle like Petra before, and I'm not sure where to start.
Also, I'm curious what the intended solution path was for Machu Picchu, because what I did worked, and was not bifurcation, but it still felt icky.&lt;/p&gt;
&lt;p&gt;Other stuff that's happening...
The linting plugin I'm using seems to handle deleting text in normal mode really weirdly/poorly.
Stuff persists way longer than it should.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to take it easy: random other stuff after I publish this, and focus on Petra and finishing the hunt tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2021-03-02</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-03-02" rel="alternate"></link><published>2021-03-02T05:00:00-05:00</published><updated>2021-03-02T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-03-02:/weekly-roundup-2021-03-02</id><summary type="html">&lt;p class="first last"&gt;So close to being finished!&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: Took a break from pip stuff, did puzzles.&lt;/li&gt;
&lt;li&gt;Thursday: Worked on the details of logic related to the pip PR.&lt;/li&gt;
&lt;li&gt;Friday: Following those discussions, and some thought, I simplified my design for the pip changes some.&lt;/li&gt;
&lt;li&gt;Saturday: I got the pip code ready to merge so far as the Python package itself, but it still needed documentation updates.&lt;/li&gt;
&lt;li&gt;Sunday: I took a break from pip, and worked on stuff for vim.&lt;/li&gt;
&lt;li&gt;Monday: I put in the PR, at last, and it immediately failed in the Windows pipelines, so that's a bummer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to work on running those tests locally, and hopefully figure out why they can fail.
Besides that, more casual stuff.
I'm also working on the Cracking the Cryptic puzzle hunt for March.
I think I'm making good time on it.
Feels like I'll be done in a few days at most, even if I did hit a rough patch in the middle of Machu Picchu.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Diary 2021-03-01</title><link href="https://mwchase.neocities.org/diary-2021-03-01" rel="alternate"></link><published>2021-03-01T05:00:00-05:00</published><updated>2021-03-01T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-03-01:/diary-2021-03-01</id><summary type="html">&lt;p class="first last"&gt;Bit of a rough day that I wouldn't want to relate to anyone online who &lt;em&gt;wants&lt;/em&gt; to know.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I published my pip PR today, and... it failed on Windows.
The error doesn't make any sense to me, but I guess this means I need to run the tests locally on Windows.
I'll do that in a few days; I just want to relax for a bit, and wait for feedback first.&lt;/p&gt;
&lt;p&gt;(For that, I'll need git and (want) pyenv-win or similar, probably through Chocolatey.
I'm not really familiar with Windows packaging, but I think I've indirectly used Chocolatey via &lt;a class="reference external" href="https://github.com/ionelmc/cookiecutter-pylibrary"&gt;cookiecutter-pylibrary&lt;/a&gt; and its AppVeyor integrations.)&lt;/p&gt;
&lt;p&gt;I think I'll look for something inconsequential to work on while I psych myself up for spinning up a Windows environment for Pip development.
I might get a post out of that when I get to it; I should probably try to.&lt;/p&gt;
&lt;p&gt;I think I'll work on some silly stuff I've had in mind for a while, right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2021-02-28</title><link href="https://mwchase.neocities.org/diary-2021-02-28" rel="alternate"></link><published>2021-02-28T05:00:00-05:00</published><updated>2021-02-28T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-02-28:/diary-2021-02-28</id><summary type="html">&lt;p class="first last"&gt;I blame my keyboard.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I took a break from pip today, and just focused on improving my editor setup.
I've finally got somewhat reliable spellcheck, which should cut down on instances of editing posts a few days later, or worse, not doing so.&lt;/p&gt;
&lt;p&gt;I feel like I'd like to say more, but I guess I was just reading stuff when I wasn't tinkering with vim.
I'll need to devote more time to a thorough look at vim sometime.
Right now, I'm scratching the surface, I think.
pyenv-fallback really proved itself with some of the stuff I was setting up.
I should look into publishing it sometime.&lt;/p&gt;
&lt;p&gt;For now, though, I should wrap up again.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Pip 2021-02-27</title><link href="https://mwchase.neocities.org/pip-2021-02-27" rel="alternate"></link><published>2021-02-27T05:00:00-05:00</published><updated>2021-02-27T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-02-27:/pip-2021-02-27</id><summary type="html">&lt;p class="first last"&gt;Trying to figure out the correct level of editorializing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was kind of tired today, so I didn't get much done.
I retested after rebasing, and there was some breakage, around more detailed error messages, and some stuff that I'm sure used to work with pip, but was never supposed to, now not working.
It was all test-side, though, which is nice.&lt;/p&gt;
&lt;p&gt;I also started working on the news fragment for the change.
It looks like that doesn't have to be too extravagant, so I'll focus on the documentation now.&lt;/p&gt;
&lt;p&gt;I am... not sure how best to add this in.
The solidest reasoning for this feature is constraining to &lt;tt class="docutils literal"&gt;pip freeze&lt;/tt&gt; output, but that isn't made &lt;em&gt;easy&lt;/em&gt; in all cases by this change, just &lt;em&gt;possible&lt;/em&gt; in some instances where it currently isn't.&lt;/p&gt;
&lt;p&gt;I'm going to need to think about this some.
At least overnight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Pip 2021-02-26</title><link href="https://mwchase.neocities.org/pip-2021-02-26" rel="alternate"></link><published>2021-02-26T05:00:00-05:00</published><updated>2021-02-26T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-02-26:/pip-2021-02-26</id><summary type="html">&lt;p class="first last"&gt;Don't hold onto something just because you put effort into it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Scaling back some of the future-proofing I attempted, because I don't seem to need it, and it's going to make the stuff that people are asking for harder.
So, it goes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Remove complicated logic we don't want.&lt;/li&gt;
&lt;li&gt;Update tests that that broke.&lt;/li&gt;
&lt;li&gt;Move simplified utility function to the proper place.&lt;/li&gt;
&lt;li&gt;Note the future-proofing that I undid, and the probable work required when the future comes.&lt;/li&gt;
&lt;li&gt;Wire the utility function into the existing code to avoid duplicate logic drifting.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That'll be a bit of effort, but I should be able to get through that part tonight.
Of course, the tests do take a while, and I'm not ready to switch gears to something else while it goes.&lt;/p&gt;
&lt;p&gt;Earlier today, I was planning out some of the stuff I want to work on after this is done.
My initial ideas seem kind of out-there, but I'm willing to do whatever to make this work.&lt;/p&gt;
&lt;p&gt;All right, it's taken some time, but that part is all together.
Now, I'll wind down for the night, because it would be a bad idea to commit to anything for the next fifteen minutes.&lt;/p&gt;
&lt;p&gt;Things to work on later: update my fork again, rebase my branches, update documentation, write news.
Things are looking good for this.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Pip 2021-02-25</title><link href="https://mwchase.neocities.org/pip-2021-02-25" rel="alternate"></link><published>2021-02-25T05:00:00-05:00</published><updated>2021-02-25T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-02-25:/pip-2021-02-25</id><summary type="html">&lt;p class="first last"&gt;The day was taken up with other stuff, so the progress, while definite, makes for a short post.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Had some discussion of how URL constraints should compare links.
The word is &amp;quot;they should act the same as URL requirements, but with an eye towards changing both behaviors in the same way later&amp;quot;.
That's going to take some thought, because part of what I'm trying to do, is have comparisons between two different data types.
I believe this is necessary for future-proofing, but I could be convinced otherwise.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to be dividing my time between implementing these updates to my draft, and planning projects I want to work on.
For now, it's late, I should wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Diary 2021-02-24</title><link href="https://mwchase.neocities.org/diary-2021-02-24" rel="alternate"></link><published>2021-02-24T05:00:00-05:00</published><updated>2021-02-24T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-02-24:/diary-2021-02-24</id><summary type="html">&lt;p class="first last"&gt;Taking a break, dealing with stress&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got stuff to do for pip, but for today, I took care of some more urgent things, and then just took it easy for a bit.
I'm working on the latest puzzle hunt from Cracking the Cryptic.
I'm kind of wondering what the proper way to solve the first part was, because I honestly ended up guessing and checking.&lt;/p&gt;
&lt;p&gt;In any case, I'm going to have to step things up to finish by the end of the month.
The other parts seem pretty tricky.&lt;/p&gt;
&lt;p&gt;Going to call things here because I don't think I can spin anything I did today into a longer entry, and it doesn't make sense to try.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2021-02-23</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-02-23" rel="alternate"></link><published>2021-02-23T05:00:00-05:00</published><updated>2021-02-23T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-02-23:/weekly-roundup-2021-02-23</id><summary type="html">&lt;p class="first last"&gt;Oops, all pip!&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I fixed some brokenness in the link comparison logic. (Some of pip's internal classes don't implement &lt;tt class="docutils literal"&gt;__eq__&lt;/tt&gt;.)&lt;/li&gt;
&lt;li&gt;Thursday: I changed up the link comparison logic. I may change it again.&lt;/li&gt;
&lt;li&gt;Friday: I discovered that I'd forgotten to code the wheel tag logic, so I implemented part of it.&lt;/li&gt;
&lt;li&gt;Saturday: I made progress getting rid of invalid tests.&lt;/li&gt;
&lt;li&gt;Sunday: I tried to figure out why the final test was failing, and ended up mostly confused.&lt;/li&gt;
&lt;li&gt;Monday: I figured out what was going wrong with the last test, and implemented the rest of the wheel tag logic.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I want to take a short break, then work on getting my changes ready for review.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Pip 2021-02-22</title><link href="https://mwchase.neocities.org/pip-2021-02-22" rel="alternate"></link><published>2021-02-22T05:00:00-05:00</published><updated>2021-02-22T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-02-22:/pip-2021-02-22</id><summary type="html">&lt;p class="first last"&gt;No weird magic, just some code I forgot to write.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Success!&lt;/p&gt;
&lt;p&gt;The problem with my code was that it was missing a bit that I'd previously realized I'd need, but that I'd forgotten about.
It's a pretty subtle omission.&lt;/p&gt;
&lt;p&gt;So, where am I now?&lt;/p&gt;
&lt;p&gt;Well, every valid test that I have thought of is passing.
For all I know, I'm missing some edge case functionality still.
There are some implementation decisions that I've punted on, and I want to circle back to them now.
Specifically, what fields of a URL should be considered, when it comes to determining equality?
I think it would be a bad idea to just pick an answer here myself and just go ahead, because it's much easier to change this feature now, than it will be after it's merged.&lt;/p&gt;
&lt;p&gt;Anyway, I've also got to, let's see...
NEWS entry, update documentation, what are other PRs like...
Not seeing anything else that it looks like I should add, but I do still need to work on those.&lt;/p&gt;
&lt;p&gt;Now that it feels like I'm over the hump, in terms of implementation, I'm going to touch base in the issue.
In the coming days, I'm going to work on improving the code organization and style; what I have now is kind of just &amp;quot;the minimum required to make the things I've thought of work&amp;quot;, and the result is some unprincipled additions to the codebase.
For now, though, I want to cool off a bit.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Pip 2021-02-21</title><link href="https://mwchase.neocities.org/pip-2021-02-21" rel="alternate"></link><published>2021-02-21T05:00:00-05:00</published><updated>2021-02-21T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-02-21:/pip-2021-02-21</id><summary type="html">&lt;p class="first last"&gt;I wouldn't say my use of italics is &lt;em&gt;excessive&lt;/em&gt;...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I haven't made any dramatic breakthroughs on the last test I have.
I'm just going to try to lay out what I know.&lt;/p&gt;
&lt;p&gt;I am creating a wheel at... wait.
I have a suspicion about what's going wrong.
If I'm failing to properly replace the wheel tags...&lt;/p&gt;
&lt;p&gt;Okay, I've done something less brittle.
Wish me luck!
Or don't, the test will run &lt;em&gt;well&lt;/em&gt; before I need to publish this.&lt;/p&gt;
&lt;p&gt;Hm, didn't work, let's see what happened...&lt;/p&gt;
&lt;p&gt;It's still hard to figure out what's going wrong.
It looks clear that it's possible for the URL constraint code I added to &lt;em&gt;just not fire&lt;/em&gt;.
Which is troubling.
The way that this would happen that makes the &lt;em&gt;most&lt;/em&gt; sense to me is that the constraint isn't being added.
Why could that be...&lt;/p&gt;
&lt;p&gt;Okay, there's a bunch of code that I added, and all of the &lt;em&gt;other&lt;/em&gt; tests pass, so the problem is either specific to what the test is asserting, or how the test is written.
I'm going to go over the test in excruciating detail.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I create a wheel for &amp;quot;dep&amp;quot; at version 0.1.0.&lt;/li&gt;
&lt;li&gt;I attempt to change the wheel tags. I'm not sure that I'm doing this correctly, but I'm not seeing the expected failure from doing this wrong. Nevertheless, I should work on doing it right.&lt;/li&gt;
&lt;li&gt;I create a constraint file that points to the changed(?) wheel.&lt;/li&gt;
&lt;li&gt;I create a subfolder for use as the find-links target, because I'm unsure of the behavior of find-links, and I can work around that uncertainty like this.&lt;/li&gt;
&lt;li&gt;In that sub-folder, I create wheels for &amp;quot;dep&amp;quot; at 0.2.0, and &amp;quot;base&amp;quot; (I know these names aren't good) at 0.1.0 and 0.2.0. 0.2.0 of &amp;quot;base&amp;quot; depends on &amp;quot;dep&amp;quot;.&lt;/li&gt;
&lt;li&gt;I attempt to install &amp;quot;base&amp;quot; using the constraints file.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The buggy behavior that results is kind of special, because instead of just &amp;quot;what I expected&amp;quot; and &amp;quot;what happened&amp;quot;, there's:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;What I expected: version 0.1.0 of &amp;quot;base&amp;quot; is installed, and &amp;quot;dep&amp;quot; is not installed&lt;/li&gt;
&lt;li&gt;How I expected it to break: 0.2.0 of &amp;quot;base&amp;quot; and 0.1.0 of &amp;quot;dep&amp;quot; are installed&lt;/li&gt;
&lt;li&gt;How it actually breaks: 0.2.0 of &amp;quot;base&amp;quot; and &amp;quot;dep&amp;quot; are installed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, the first version corresponds to &amp;quot;knew about the constraint, generated no candidates because it didn't match the installation platform, backtracked to lower version of base&amp;quot;.
The second version corresponds to &amp;quot;knew about the constraint, generated a candidate because I didn't set the wheel tags properly, installed latest base&amp;quot;.
The third version, I can't be as sure of, because it happened outside my head, but it looks like either the constraint didn't get populated, or the constraint &lt;em&gt;failed to reject a completely different path&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The latter option, I'll try to check, because I wrote the rejection code and it's not &lt;em&gt;completely&lt;/em&gt; trivial.
...
It is pretty close to trivial, though, and it sure &lt;em&gt;looks&lt;/em&gt; like it should be capable of distinguishing the paths at issue.&lt;/p&gt;
&lt;p&gt;All the same, the only way I can see to pin this outside my code is to suppose some form of filtering step that's stopping the constraint from populating, and that doesn't seem to exist.&lt;/p&gt;
&lt;p&gt;At the same time, I have tests passing that &lt;em&gt;require&lt;/em&gt; the constraint logic to fire under some conditions.&lt;/p&gt;
&lt;p&gt;So, I'm going to want to fix my wheel generation just because it's &lt;em&gt;really&lt;/em&gt; doubtful that what I'm doing currently works.
However, once I'm satisfied with that, I'm going to have to ask for help, because I don't think that's going to fix it, and &lt;em&gt;something&lt;/em&gt; is really wrong.
I'll try to work on the first part while this publishes.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Pip 2021-02-20</title><link href="https://mwchase.neocities.org/pip-2021-02-20" rel="alternate"></link><published>2021-02-20T05:00:00-05:00</published><updated>2021-02-20T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-02-20:/pip-2021-02-20</id><summary type="html">&lt;p class="first last"&gt;Don't have to fix the test if it's testing a behavior that doesn't actually exist.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've been polishing the tests, and now I'm down to four failures:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;One that looks like I either have no idea how to use pip, or I've messed up the implementation. I'll take either, frankly, but the implementation &lt;em&gt;looks&lt;/em&gt; reasonable.&lt;/li&gt;
&lt;li&gt;Three that look about the same, all having to do with &lt;tt class="docutils literal"&gt;_DistInfoDistribution__dep_map&lt;/tt&gt;. The bulk of the traceback makes it look a lot like a test issue, so I'm going to take another look. Hm, yes, I think these are invalid. I'll get rid of them.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, that's one troublesome test left.
I'll try to take care of it tomorrow, and then, at last, I can work on stuff aside from code for this.
I'm just going to make super sure that I have just the one failure left, and then post this and wrap up for the night.
Okay, cool, it's as good as I can manage for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Pip 2021-02-19</title><link href="https://mwchase.neocities.org/pip-2021-02-19" rel="alternate"></link><published>2021-02-19T05:00:00-05:00</published><updated>2021-02-19T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-02-19:/pip-2021-02-19</id><summary type="html">&lt;p class="first last"&gt;I may take a break at some point to write some of the most ridiculous code I can manage, for fun.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Haha, I'm nowhere close to done implementing this stuff.
It turns out I just straight-up &lt;em&gt;forgot&lt;/em&gt; about the wheel tag checks, so it's an &lt;em&gt;extremely&lt;/em&gt; good thing I wrote all these tests to fail when it installs incompatible wheels.&lt;/p&gt;
&lt;p&gt;A bunch of my other tests were pretty half-baked, so I'm finishing them up.
Better now than never.&lt;/p&gt;
&lt;p&gt;Anyway, I'm feeling kind of tired already, so I'm going to call this here and go over the compatibility checks, figure out how best to add them.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Pip 2021-02-18</title><link href="https://mwchase.neocities.org/pip-2021-02-18" rel="alternate"></link><published>2021-02-18T05:00:00-05:00</published><updated>2021-02-18T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-02-18:/pip-2021-02-18</id><summary type="html">&lt;p class="first last"&gt;Somewhat slow progress, but I think it was faster than when I was just constantly planning and rehearsing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;There are a few fronts on the pip development.
One is that there's an easily-correctable bug in my test changes.
(Probably understating it; really, it's just the latest thing I've found.)
The other is, we're running into &amp;quot;exactly what parts of the Link object should be compared when testing for equality?&amp;quot;&lt;/p&gt;
&lt;p&gt;My initial &amp;quot;don't think too hard&amp;quot; implementation compared the entire link, but the legacy resolver ignores at least some of the fields on the link.
The wheel cache only considers particular fields, and ignores every field that I &lt;em&gt;know&lt;/em&gt; the legacy resolver ignores.
At the same time, the new resolver apparently considers the whole Link.
(For the purposes of requirements, I think.)&lt;/p&gt;
&lt;p&gt;My take on this is, there needs to be a decision, and I shouldn't make it unilaterally, so I'm going to fix the tests I know I can fix, then, kind of... sit on this.
Maybe work on the documentation and changelog.
We'll have to see how fast things move.&lt;/p&gt;
&lt;p&gt;Hm, I tried to fix that test, and it failed with the same error.
I suspect the answer may be to delete the test, but I'm not sure.
Okay, got it.
Should be a simple edit, we'll see.
I'm actually not totally sure it's possible to hit the code path I've added.
Weird.&lt;/p&gt;
&lt;p&gt;Okay, I still don't understand what's happening, because there are clearly tests that hit this, but it's seemingly weirdly difficult for me to get &lt;em&gt;one particular&lt;/em&gt; test to hit it.&lt;/p&gt;
&lt;p&gt;Okay, let's review.
I want to have a &lt;em&gt;named&lt;/em&gt;, &lt;em&gt;editable&lt;/em&gt; install requirement.
Okay, I think I got it.&lt;/p&gt;
&lt;p&gt;I'm going to publish this entry &lt;em&gt;probably&lt;/em&gt; before the test I'm interested in for now actually runs, but it was relatively simple to see what was happening, once I just looked at the source code.
I think there's more for me to try to do before getting into discussions about how stuff &lt;em&gt;should&lt;/em&gt; work.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to wrap up while the tests go.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Pip 2021-02-17</title><link href="https://mwchase.neocities.org/pip-2021-02-17" rel="alternate"></link><published>2021-02-17T05:00:00-05:00</published><updated>2021-02-17T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-02-17:/pip-2021-02-17</id><summary type="html">&lt;p class="first last"&gt;I've got a good feeling about this, but that's not new.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Following some question and answers on the pip issue, I've got a first pass at improved link comparison logic for constraints.
The organization seems kind of bad, but I'm hoping that'll get hammered out in the PR process, since I'm still not really familiar with the code.
In any case, I like what these changes do to the code.
It makes the interpretation of the link data much more consistent, so I think this code would be less buggy even if it hadn't originally had a show-stopper bug.
I anticipate that this will fix several test failures, but I let this all go late, so I don't want to run the tests tonight.&lt;/p&gt;
&lt;p&gt;I'll get to them sometime tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Weekly Roundup 2021-02-16</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-02-16" rel="alternate"></link><published>2021-02-16T05:00:00-05:00</published><updated>2021-02-16T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-02-16:/weekly-roundup-2021-02-16</id><summary type="html">&lt;p class="first last"&gt;Will it be done soon?&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I talked about the changes I made to my environment, and complained a little about some software I tried to use just because.&lt;/li&gt;
&lt;li&gt;Thursday: I tweaked said software a little more, and then started working on a pyenv plugin. It's not yak shaving if there's no top-level goal.&lt;/li&gt;
&lt;li&gt;Friday: I figured out what I can and can't do with a pyenv plugin, and got my desired plugin written well enough. I did a somewht bad job of showing off the functionality.&lt;/li&gt;
&lt;li&gt;Saturday: I wrote a short entry because I'm trying to get to bed sooner, and I have to start sometime.&lt;/li&gt;
&lt;li&gt;Sunday: At long last, I started trying to implement my desired changes to pip. I got the initial draft partway done.&lt;/li&gt;
&lt;li&gt;Monday: I got the rest of the way through the initial draft, and started testing it. The tests failed for many reasons some of which I've addressed, and some which I still need to.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'd like to see if I can keep up this pip momentum and get things over with.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Pip 2021-02-15</title><link href="https://mwchase.neocities.org/pip-2021-02-15" rel="alternate"></link><published>2021-02-15T05:00:00-05:00</published><updated>2021-02-15T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-02-15:/pip-2021-02-15</id><summary type="html">&lt;p class="first last"&gt;Looks like it wasn't quite as easy as I was hoping.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got pip's code updated to my own satisfaction.
And, the tests failed.
Some of these were due to existing tests that I hadn't updated, so I started on those because they're easy, and test failures are &lt;em&gt;extremely&lt;/em&gt; noisy.&lt;/p&gt;
&lt;p&gt;Anyway, those are running, and here's how I see things:
Either I fixed all of the tests I tried to fix, or I didn't.
(Note from slightly in the future: there are still failures outside of the modules I added tests to, so, probably didn't?)
Regardless, there's a bunch of tests I didn't go over that need work, and I don't want t give up sleep for that, so I'll take the progress I made today, for today, and do the rest of this stuff later, maybe tomorrow, maybe not.&lt;/p&gt;
&lt;p&gt;The tests are still running, let's hope I don't get any more failures.
I really wouldn't like that.&lt;/p&gt;
&lt;p&gt;And, no more failures, but I don't fully understand the ones I got.
Oh well, that's a problem for another day.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Pip 2021-02-14</title><link href="https://mwchase.neocities.org/pip-2021-02-14" rel="alternate"></link><published>2021-02-14T05:00:00-05:00</published><updated>2021-02-14T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-02-14:/pip-2021-02-14</id><summary type="html">&lt;p class="first last"&gt;Finally yelled at myself to just do the thing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I took it easy for a bit, but now I want to see if I can just get things over with, at least enough that I feel comfortable getting feedback.
So, I did a bunch of waffling on whether I understood things well enough, and at this point, I'm just going to try.&lt;/p&gt;
&lt;p&gt;So, step one is to add a field to the constraint object...&lt;/p&gt;
&lt;p&gt;Okay, I didn't really delineate that well, but I added a field, updated the methods, added a helper function, and changed one of the helper functions for install requirements.
Next up is going over the find_candidates method in the Factory class.&lt;/p&gt;
&lt;p&gt;Honestly, I think that's another day's work, so I'm going to call this now and try to get wrapped up at a reasonable time.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Diary 2021-02-13</title><link href="https://mwchase.neocities.org/diary-2021-02-13" rel="alternate"></link><published>2021-02-13T05:00:00-05:00</published><updated>2021-02-13T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-02-13:/diary-2021-02-13</id><summary type="html">&lt;p class="first last"&gt;Not the shortest entry I've put out, but down there. Oh well.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Trying to get today's entry out of the way early, because I feel like I should be cutting down my screen time at night.
This is inspired by my ongoing state of being &lt;em&gt;extremely tired&lt;/em&gt; and having trouble focusing, so I'm shaking things up in various ways.
For example, this entry is being written standing up.
Anyway, I'm calling it now.&lt;/p&gt;
&lt;p&gt;I'll try to work on pip stuff during the day tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2021-02-12</title><link href="https://mwchase.neocities.org/coding-2021-02-12" rel="alternate"></link><published>2021-02-12T05:00:00-05:00</published><updated>2021-02-12T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-02-12:/coding-2021-02-12</id><summary type="html">&lt;p class="first last"&gt;The bad news is, some of the things I wanted were impossible. The good news is, I didn't have to do them.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got my pyenv plugin working about as well as it can.
I wasn't able to do everything I wanted, because it turns out pyenv runs the relevant hook code &lt;em&gt;after&lt;/em&gt; it performs some of the logic I wanted to mess with.
So, that's unfortunate, but on the bright side, I was able to delete a bunch of code from my plugin because it wasn't doing anything.&lt;/p&gt;
&lt;p&gt;The integration between pyenv and its plugins is really nice.
Aside from my self-inflicted bash bugs, working on this was so enjoyable, it's kind of a shame I can't think of any other reason to write a pyenv plugin.&lt;/p&gt;
&lt;p&gt;Oh yes, and it does work.
Take a look:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;↪ pyenv fallback
3.9.1
3.8.7
3.7.9
3.6.12
pypy3.7-7.3.3

↪ pypy
Python 3.7.9 &lt;span class="o"&gt;(&lt;/span&gt;7e6e2bb30ac5, Nov &lt;span class="m"&gt;18&lt;/span&gt; 2020, 10:55:52&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Not the best example, I know, but I don't want to fiddle with my fallbacks now that I've got them working, aside from the fact that 3.8.7 is shadowed by the system Python.
It'll probably be more impressive if I end up thinking of things that I want pyenv-implicit-style behavior for.
Like, here's something that I want to install in a virtualenv, but run wherever.
I've kind of moved away from that kind of thing for now, but now I have the option to move back.&lt;/p&gt;
&lt;p&gt;And slightly more concretely, now I have the ability to write standalone scripts or shivs against Python versions besides 3.8, without hardcoding my home directory into the shebang.&lt;/p&gt;
&lt;p&gt;Just to reiterate, this is different from pyenv-implicit because I control which environments it looks at.
So, earlier versions don't shadow newer ones unless I want them to, and virtualenvs don't get considered unless I want them to be.
I think it's worse, in terms of time complexity, but I don't &lt;em&gt;think&lt;/em&gt; the difference is perceptible.&lt;/p&gt;
&lt;p&gt;Anyway, I guess I'm working on something else next, because this is all set, near as I can tell.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-02-11</title><link href="https://mwchase.neocities.org/coding-2021-02-11" rel="alternate"></link><published>2021-02-11T05:00:00-05:00</published><updated>2021-02-11T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-02-11:/coding-2021-02-11</id><summary type="html">&lt;p class="first last"&gt;Honestly, I don't even know what it looks like I'm trying to do, at this point.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Minor hiccup yesterday, because I forgot to add 1 to the date when dating the entry.
It's fixed now.&lt;/p&gt;
&lt;p&gt;Anyway, today I put together one of the utility things that helps me, but I don't know how generally useful it is.
It's a wrapper around &lt;tt class="docutils literal"&gt;zip &lt;span class="pre"&gt;-sf&lt;/span&gt;&lt;/tt&gt; that looks for a shebang line and prints it first, if it finds it.
This way, I can look at the shiv files I'm writing, see my pyenv root in the shebang, go &amp;quot;&lt;em&gt;That's&lt;/em&gt; probably not portable.&amp;quot;, and, honestly, I'm not sure what the next step is.
Don't give those shiv files to anyone else, because they literally only work on my machine?&lt;/p&gt;
&lt;p&gt;Maybe I can put every version of python I care about in pyenv global and change the shebang to, like &lt;tt class="docutils literal"&gt;/usr/bin/env &lt;span class="pre"&gt;python3.&amp;lt;version-I-want&amp;gt;&lt;/span&gt;&lt;/tt&gt;.
That's probably the cleanest option.
And, it doesn't really work.
What I want is something like pyenv-implicit, but with some additional tweaks to the logic.&lt;/p&gt;
&lt;p&gt;It's surprisingly comfy out in the weeds, all right?&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to research how to accomplish what I want.&lt;/p&gt;
&lt;p&gt;Hm...
You know, I could try to do a bunch of weird special casing and elaborate sequence manipulations, or I could just figure out how to implement what I &lt;em&gt;wanted&lt;/em&gt; setting &amp;quot;global&amp;quot; to do.
It honestly doesn't look too hard.
I'll try to remember to do it tomorrow.
It'd be a bad idea right now, because I'm not focusing the greatest.
That zip wrapper I mentioned earlier, it took me a while to get it right because I was making a basic mistake, and I was so sure the code was right, I couldn't actually see it.
So, I should probably wrap up, in any case.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2021-02-10</title><link href="https://mwchase.neocities.org/diary-2021-02-10" rel="alternate"></link><published>2021-02-10T05:00:00-05:00</published><updated>2021-02-10T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-02-10:/diary-2021-02-10</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;It's just a quick entry.&amp;quot; ha ha ha ha&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't do much worth writing about today, but I've got a few minutes...
I think I mentioned before that I was messing around with my environment.
At this point, I'm running &lt;a class="reference external" href="https://fishshell.com/"&gt;fish&lt;/a&gt; under &lt;a class="reference external" href="https://sw.kovidgoyal.net/kitty/"&gt;kitty&lt;/a&gt;.
I've pretty well replaced Sublime Text with &lt;a class="reference external" href="https://neovim.io/"&gt;neovim&lt;/a&gt;, with the two caveats that I'll probably go back to Sublime Text for the purpose of working on pip, and I don't have a good workflow yet for replacing my old somewhat dysfunctional pattern of &amp;quot;just stuff in an unsaved Sublime Text window and leave it there for months&amp;quot;.&lt;/p&gt;
&lt;p&gt;Let me see if I can throw together a replacement quickly.
Well, having another dedicated folder for saving these things is... something.
It's probably more useful and sustainable than having such data who-knows-where inside Sublime Text's appdata.&lt;/p&gt;
&lt;p&gt;Anyway, after getting all of that working, and getting past a few weird hurdles (I know I had to change my neovim color scheme to get the background to go from &amp;quot;unusably bright&amp;quot; to &amp;quot;noticeably brighter than under any other circumstance, but it's fine&amp;quot;. I don't remember if there was anything else in particular.), I'm now seeing about taking advantage of some of the features this setup gives me.
Shell-based visual filebrowsers seem like an interesting novelty, so I've been messing with them in particular.
I don't want to go into too many specifics, because my general experience was that they didn't quite work the way I wanted, but it was hard for me to figure out why.
The main sticking point is image previews, which is really a nice-to-have, but, I mean, it &lt;em&gt;would&lt;/em&gt; be nice...
I've seen the following behaviors:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&amp;quot;In terminal emulators besides kitty, the preview is low-res, but in kitty, it's full-resolution&amp;quot; -&amp;gt; In kitty, the low-res preview is rendered with pixels instead of cells, resulting in what could generously be called a postage stamp.&lt;/li&gt;
&lt;li&gt;&amp;quot;If you do all of these extra steps, a full-size preview renders&amp;quot; -&amp;gt; I never get it to work.&lt;/li&gt;
&lt;li&gt;&amp;quot;Supports kitty's graphics protocol&amp;quot; -&amp;gt; Doesn't actually render previews, just runs a loading animation.&lt;/li&gt;
&lt;li&gt;&amp;quot;Scales the image down if needed&amp;quot; -&amp;gt; Does not scale the image down, resulting in the screen doing all kinds of bizarre nonsense.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the end, I took the one that I liked the most (due to other aspects &lt;em&gt;almost&lt;/em&gt; working excellently by default), and went through the tweaks required to make it work for me.
I think there's a bit more customization to be done, but it's definitely in &amp;quot;conform the tools to my preferences&amp;quot; territory at this point.&lt;/p&gt;
&lt;p&gt;Anyway, that's quite enough writing.
This went on way longer than I meant it to, but at least I fixed up some of the tools.
In the future, I should try to get this all done sooner, if I'm not going to get useful work done until I start writing about it.&lt;/p&gt;
&lt;p&gt;EDIT: At least three of the issues above were due to a bug in fish that is fixed in the latest release.
I think this vindicates my decision not to name the tools I was having trouble with.
Because it wasn't their fault.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2021-02-09</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-02-09" rel="alternate"></link><published>2021-02-09T05:00:00-05:00</published><updated>2021-02-09T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-02-09:/weekly-roundup-2021-02-09</id><summary type="html">&lt;p class="first last"&gt;Things seemed to be going well, and then the weekend just totally wrecked me for some reason.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I started messing with algorithmic composition. First day: some helper code, some of which turned out not to work.&lt;/li&gt;
&lt;li&gt;Thursday: I started figuring out what I'd been doing wrong, and making plans to move forward.&lt;/li&gt;
&lt;li&gt;Friday: I started executing on those plans, and it went great.&lt;/li&gt;
&lt;li&gt;Saturday: I took a quick entry to figure out that some of the high-level ideas I had didn't make sense, and I should move in a somewhat different direction.&lt;/li&gt;
&lt;li&gt;Sunday: Not the most productive start to a weekend. [Standard spiel about how the way I name the days on the blog in general, and in these posts in particular, is sometimes unintuitive.] Oh well.&lt;/li&gt;
&lt;li&gt;Monday: Even less productive. Wrote this entry as fast as I could, just to have &lt;em&gt;something&lt;/em&gt;. So, there's nothing else to say about it, and this summary is about as long as everything I wrote for that post now. Maybe longer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm not sure what I'll be writing about.
I'm feeling like taking a break from coding, and continuing to tweak my environment.
At some point, I'm going to have to put together a vim cheatsheet, just so I remember things more clearly.
Maybe I could make a deck for Anki.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Diary 2021-02-08</title><link href="https://mwchase.neocities.org/diary-2021-02-08" rel="alternate"></link><published>2021-02-08T05:00:00-05:00</published><updated>2021-02-08T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-02-08:/diary-2021-02-08</id><summary type="html">&lt;p class="first last"&gt;Typing too much here would be a mistake.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Took things really easy today.
I want to get to bed as soon as possible, so this entry is really only this long.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2021-02-07</title><link href="https://mwchase.neocities.org/diary-2021-02-07" rel="alternate"></link><published>2021-02-07T05:00:00-05:00</published><updated>2021-02-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-02-07:/diary-2021-02-07</id><summary type="html">&lt;p class="first last"&gt;I feel like my efforts to get more sleep might be getting sabotaged by the fact that I've gotten more sleep.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Didn't really touch code today.
The ideas I had for music stuff are going to be pretty intimidating to put together.
(I should probably try sequencing a song entirely manually first, then iterate on abstracting stuff out.)
Anyway, I'm going to try taking things easy for a bit, then getting back into pip so I can hopefully get it over with.&lt;/p&gt;
&lt;p&gt;Anyway, I got distracted and let this go late, so I'm going to have to cut this off here.
We'll see if I have more to write tomorrow, but I'm not going to push myself.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2021-02-06</title><link href="https://mwchase.neocities.org/coding-2021-02-06" rel="alternate"></link><published>2021-02-06T05:00:00-05:00</published><updated>2021-02-06T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-02-06:/coding-2021-02-06</id><summary type="html">&lt;p class="first last"&gt;Also, I updated my blog publishing pipeline, and had to work around some dumb bugs, but that's all not very interesting.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, work went a bit late and I watched some long videos, so it's too late already.&lt;/p&gt;
&lt;p&gt;As such, I'm going to just jot down some thoughts on representing chords.
There are a few different things that &amp;quot;a chord&amp;quot; can mean, and a few different ways that those realizations could reasonably be represented in MIDI.&lt;/p&gt;
&lt;p&gt;Classically speaking, if I remember my lessons from ten years ago correctly, the important aspects of a chord are the root, the third, and the tone that the bass is playing/singing.
Considering a cord in isolation, it can either be several tones that start and end simultaneously, relatively stable in the lower voices but more elaborate in the upper voices, or stable in the middle voices but elaborate in the outer voices.
This stability can last across multiple chords.
What this means is... &amp;quot;how should I represent a bunch of notes in complete lockstep&amp;quot; is probably not a question I should try to answer, because there usually isn't a reason to do that &lt;em&gt;a lot&lt;/em&gt;.
(Unless I decide to bring back Theory by Exhaustion or whatever it was called. (Wait, did I make that post, or just think about it? I'm not seeing it when I search...))&lt;/p&gt;
&lt;p&gt;So, the &amp;quot;right thing&amp;quot;, I think, is to figure out how to represent a framework of timing events, and then have my code subscribe to that framework.
I could then do stuff like coordinate tempo changes through that framework, and have a bunch of things &amp;quot;just work&amp;quot;.&lt;/p&gt;
&lt;p&gt;Thought on how to do that, relatively unpolished: awaiting a synchronization object produces a new object representing the &amp;quot;final time&amp;quot;, and that provides an async method that takes a note length.
It should also be possible to wait for events like &amp;quot;the next bar after this time point&amp;quot; or &amp;quot;a named section&amp;quot;.&lt;/p&gt;
&lt;p&gt;The way to tell whether that's workable or painful: transcribe music into that framework, and see what I think.&lt;/p&gt;
&lt;p&gt;Anyway, I've taken way too much time on this.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-02-05</title><link href="https://mwchase.neocities.org/coding-2021-02-05" rel="alternate"></link><published>2021-02-05T05:00:00-05:00</published><updated>2021-02-05T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-02-05:/coding-2021-02-05</id><summary type="html">&lt;p class="first last"&gt;It's also nice when you think doing something will immediately improve things, &lt;em&gt;and it does&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I ended up not working on the music stuff much today, because I reworked a bit of my environment for the heck of it.
As far as I know, only like one thing is broken currently, and it's not a big deal for now.
(Update from the end of the post: the issue is... fixed... I guess...)&lt;/p&gt;
&lt;p&gt;So, to get something done fast, I did the note wrapper class, and rewrote my current example to use it.
It's a good abstraction so far.
A bit of obvious boilerplate confined to a single class, and then everything using it becomes shorter and easier to understand.&lt;/p&gt;
&lt;p&gt;It's way too late right now, so I'm cutting myself off now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-02-04</title><link href="https://mwchase.neocities.org/coding-2021-02-04" rel="alternate"></link><published>2021-02-04T05:00:00-05:00</published><updated>2021-02-04T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-02-04:/coding-2021-02-04</id><summary type="html">&lt;p class="first last"&gt;Nice to be working with something that's more intuitive and tractable.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I did some basic stuff with the code I wrote around Mido.
Basically, just proved things out, and got some hands-on experience with the code.
From there, I've got a few quick conclusions.&lt;/p&gt;
&lt;p&gt;First off, the stuff that I thought through and completely understood worked well.
On the other hand, there are some areas where I'm going to need to add abstractions.
Currently, the &amp;quot;play a note&amp;quot; function expects a note-on message object, which it derives a note-off message from, somewhat haphazardly.
I believe I should write a higher-level class that constructs the relevant messages as needed.&lt;/p&gt;
&lt;p&gt;This class should probably be pretty minimal, to start with, because I don't know what capabilities I'll want.
But it only makes sense that the types should be what is expected, and the note and channel values should match.&lt;/p&gt;
&lt;p&gt;My basic proof-of-concept tested out the play-note function with a simple scale.
Here's where I want to go next:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Higher-level &amp;quot;Note&amp;quot; object&lt;/li&gt;
&lt;li&gt;Recreate current poc with Trio primitives&lt;/li&gt;
&lt;li&gt;Play a chord&lt;/li&gt;
&lt;li&gt;Figure out what I want to change next&lt;/li&gt;
&lt;li&gt;Then start transcribing various songs to code, and refactor the code.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One thing I'll probably want in there is to put together something I've thought about: a port-like object that transcribes messages to a MIDI file.
There are a few steps and procedures I'd need to get right for that, but it's the logical thing for me to want to add, now that I can do real-time playback.&lt;/p&gt;
&lt;p&gt;Anyway, it's pretty late, I should wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-02-03</title><link href="https://mwchase.neocities.org/coding-2021-02-03" rel="alternate"></link><published>2021-02-03T05:00:00-05:00</published><updated>2021-02-03T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-02-03:/coding-2021-02-03</id><summary type="html">&lt;p class="first last"&gt;Pleasantly surprised to have gotten anything done here.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I wanted to get some stuff done tonight, but I let things go too late, and I'm liking this whole &amp;quot;get to bed earlier&amp;quot; thing I've been doing.
So, I'll describe what I'm planning to work on.&lt;/p&gt;
&lt;p&gt;Basically, I want to try using &lt;a class="reference external" href="https://trio.readthedocs.io/"&gt;Trio&lt;/a&gt;, &lt;a class="reference external" href="https://mido.readthedocs.io/"&gt;Mido&lt;/a&gt;, and &lt;a class="reference external" href="https://tytel.org/helm/"&gt;Helm&lt;/a&gt; together.
I've proven to myself that Mido and Helm seem to work together pretty much automatically, at least on my laptop.
To start with, I want to focus on the compositional side of things, and not tweak Helm's settings much.
Where does Trio come in?
Well, in western music tradition, you've got the concept of a note that has a specific duration, and that is a higher-level concept than MIDI works at.
I need to be sending events to start and stop the notes playing, and I want to be interleaving those somehow.
Now, I could try to manually sequence this stuff, &lt;em&gt;or&lt;/em&gt; I could lean on an existing concurrency framework.
Threading is also an option, but I'd much rather use almost anything else, at least in Python.&lt;/p&gt;
&lt;p&gt;I'll just sum up what I already have written, since there's no way I'm getting anything further in the next ten minutes.
I've got some Protocol classes that are basically a typed wrapper around Mido classes.
I should probably write stubs for Mido and re-evaluate the usefulness of the wrappers.
I've got one more class, and it implements the concept of &amp;quot;playing a note&amp;quot; as a context manager.
Most urgent question about this code: should that class continue to be a class, or should I rewrite it (pretty trivially) into a top-level context manager with just the play-a-note functionality?
Right now, I think that would make sense.
My gut feeling is that there isn't enough of a reason for this to be a class.
It doesn't offer any potential for polymorphism, and it's not aggregating multiple data structures.
I'll make the change while this post publishes, then get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2021-02-02</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-02-02" rel="alternate"></link><published>2021-02-02T05:00:00-05:00</published><updated>2021-02-02T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-02-02:/weekly-roundup-2021-02-02</id><summary type="html">&lt;p class="first last"&gt;In which I do a bad job of relaxing.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I started making plans for changes to pip's code.&lt;/li&gt;
&lt;li&gt;Thursday: I tried to find potential gotchas with my approach.&lt;/li&gt;
&lt;li&gt;Friday: I started taking a break from pip, and filed a bug against another project (since fixed).&lt;/li&gt;
&lt;li&gt;Saturday: I was tired.&lt;/li&gt;
&lt;li&gt;Sunday: I was still tired.&lt;/li&gt;
&lt;li&gt;Monday: I was &lt;em&gt;still&lt;/em&gt; tired, but I was able to plan ahead a bit.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to keep on with non-pip stuff for a bit.
I want to spend some time with stuff that I can more-or-less fit in my head and make my way around.
When I write PRs against open-source projects, I spend a lot of time just trying to figure out what the different parts &lt;em&gt;do&lt;/em&gt;, and it's a little exhausting.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Diary 2021-02-01</title><link href="https://mwchase.neocities.org/diary-2021-02-01" rel="alternate"></link><published>2021-02-01T05:00:00-05:00</published><updated>2021-02-01T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-02-01:/diary-2021-02-01</id><summary type="html">&lt;p class="first last"&gt;Ugh, so &lt;em&gt;tired&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;In terms of what happened today, things are about the same.
I've decided to try and turn some things around, which is mostly going to be stuff I do in the coming days, but I did also get some stuff that I've been procrastinating on ordering, and it should all help.&lt;/p&gt;
&lt;p&gt;Still not ready to get back to pip.
I might try to get back up to speed by messing around more with non-pip stuff.&lt;/p&gt;
&lt;p&gt;I don't have anything else to talk about for now, so I'm going to wrap up ASAP.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2021-01-31</title><link href="https://mwchase.neocities.org/diary-2021-01-31" rel="alternate"></link><published>2021-01-31T05:00:00-05:00</published><updated>2021-01-31T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-01-31:/diary-2021-01-31</id><summary type="html">&lt;p class="first last"&gt;About the same.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Still tired, still late.
I knew this was going to go down more or less like this, so I'm just resigned to it.
I'll try to scrape things together in the coming week.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2021-01-30</title><link href="https://mwchase.neocities.org/diary-2021-01-30" rel="alternate"></link><published>2021-01-30T05:00:00-05:00</published><updated>2021-01-30T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-01-30:/diary-2021-01-30</id><summary type="html">&lt;p class="first last"&gt;Get sleep. Don't let whatever the hell this is happen to you.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I am extremely tired right now.
I messed around some with writing, but I 100% recognize that I'm in no condition to make serious progress right now, and in a few minutes, I'm going to sleep for what will probably be an alarmingly long time.
This is the future I made for myself.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2021-01-29</title><link href="https://mwchase.neocities.org/coding-2021-01-29" rel="alternate"></link><published>2021-01-29T05:00:00-05:00</published><updated>2021-01-29T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-01-29:/coding-2021-01-29</id><summary type="html">&lt;p class="first last"&gt;Writing code to accomplish even weirder things than usual.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm letting pip stuff just kind of stew in the back of my mind, so it feels less like I'm going in circles for a bit.&lt;/p&gt;
&lt;p&gt;I did a few things that I'll want for the virtual tabletop stuff, like putting in a bug against another Python implementation, basically asking &amp;quot;Here is a thing that does not work like in CPython, is this desired/acceptable?&amp;quot;
I also put together a tiny cursèd shim that should make trio compatible with Python 3.7+ implementations besides CPython and PyPy.
It's &lt;em&gt;extremely&lt;/em&gt; sketchy.&lt;/p&gt;
&lt;p&gt;Anyway, I'm still looking for a balance between &amp;quot;I'm having trouble focusing on stuff&amp;quot; and &amp;quot;I just want to get this done&amp;quot;.
I'm not going to come up with answers to that, or anything else to talk about, in the next few minutes, so time to wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Pip 2021-01-28</title><link href="https://mwchase.neocities.org/pip-2021-01-28" rel="alternate"></link><published>2021-01-28T05:00:00-05:00</published><updated>2021-01-28T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-01-28:/pip-2021-01-28</id><summary type="html">&lt;p class="first last"&gt;Just one guy going &amp;quot;Does not!&amp;quot; &amp;quot;Does too!&amp;quot; over and over.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The multiple-pip invocation tests I wrote appear to be currently valid, but I honestly didn't remember.&lt;/p&gt;
&lt;p&gt;Anyway, time to pin down my concerns with AlreadyInstalledCandidates.&lt;/p&gt;
&lt;p&gt;There are five leaf classes of Candidate.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;LinkCandidate and EditableCandidate are basically the same for my purposes, and I think I know how I'm going to work with them.&lt;/li&gt;
&lt;li&gt;If I understand their use cases correctly, the correct course of action when any code I touch encounters an ExtrasCandidate or a RequiresPythonCandidate is to do whatever it does &lt;em&gt;currently&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;An AlreadyInstalledCandidate can come from a few sources, and in any case, I need to be able to tell where it was installed from, in a way that's compatible with the Link field I'm adding to Constraints.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(It has to be a Link, because it's required to &lt;em&gt;generate&lt;/em&gt; the corresponding candidate.)&lt;/p&gt;
&lt;p&gt;So, what I need to move forward on this is a generic way to determine where a Candidate is/will be installed from, keeping in mind that it's not possible to generate a sensible answer for some candidates.&lt;/p&gt;
&lt;p&gt;Now, one factor common to the Candidates that I care about is the Distribution.
And it's possible for a Distribution to allow for the generation of a DirectUrl object, but this appears to only be possible, from some quick inspection of one of my projects, if the local candidate was in fact installed from a URL.
Let's see if I can track down the issue I'm worried about complicating.&lt;/p&gt;
&lt;p&gt;Thinking about this, it's probably sensible to treat &amp;quot;a resolved package that was installed from an index&amp;quot; differently from &amp;quot;a package that was installed via direct link into an index, for some reason&amp;quot;.&lt;/p&gt;
&lt;p&gt;So, I think I know what needs to be done.
I'm not going to rush into it.
I want to confirm my ideas here with the maintainers, and I'll be taking things easy for unrelated reasons this weekend, so it could be a little while before I actually touch the code.&lt;/p&gt;
&lt;p&gt;Actually, I'll wait to confirm, because something about the flow here still confuses me.
I'm going to have to study this, and perhaps experiment...&lt;/p&gt;
&lt;p&gt;Hm, looking at this, I wouldn't be surprised if it turns out I was wrong about ExtrasCandidate, since it certainly exposes enough information currently to get checked by a constraint.
This is so confusing, but I guess I've given myself plenty of time to figure it out.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Pip 2021-01-27</title><link href="https://mwchase.neocities.org/pip-2021-01-27" rel="alternate"></link><published>2021-01-27T05:00:00-05:00</published><updated>2021-01-27T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-01-27:/pip-2021-01-27</id><summary type="html">&lt;p class="first last"&gt;Feeling a little overwhelmed from nothing worth talking about here...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I want to go over my test code to make sure the tests with multiple pip invocations make sense (they probably don't), but I believe I now know which areas of the code need to change.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Factory.find_candidates needs to attempt to construct a candidate from the constraint, and add it to explicit_candidates. (For this, it will use the first Link, if it exists, and the first ireq, if it exists.)&lt;/li&gt;
&lt;li&gt;It also needs to pass the url constraint info to Factory._iter_found_candidates.&lt;/li&gt;
&lt;li&gt;The Constraint class needs to track and handle Link data.&lt;/li&gt;
&lt;li&gt;check_invalid_constraint_type needs to allow Link data, but specifically disallow the editable flag. The error message should probably be updated, and it'd be nice if I could update the issue number, but I don't think I can...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One major hurdle is handling AlreadyInstalledCandidates.
I'll need to investigate that specific area more.&lt;/p&gt;
&lt;p&gt;I'll dig into that a bit while this entry publishes.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Weekly Roundup 2021-01-26</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-01-26" rel="alternate"></link><published>2021-01-26T05:00:00-05:00</published><updated>2021-01-26T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-01-26:/weekly-roundup-2021-01-26</id><summary type="html">&lt;p class="first last"&gt;Feeling a bit rough. I want to make some tangible progress on pip, then take a break.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I took a closer look at what needs to be done to get the changes I want to make to pip done.&lt;/li&gt;
&lt;li&gt;Thursday: I updated my clone, and complained about what I perceive as a mismatch between git's behavior and documentation.&lt;/li&gt;
&lt;li&gt;Friday: I took it easy, apparently.&lt;/li&gt;
&lt;li&gt;Saturday: I took it easy again, but it didn't quite take.&lt;/li&gt;
&lt;li&gt;Sunday: I took a first look at another part of pip's codebase, and things didn't look good.&lt;/li&gt;
&lt;li&gt;Monday: On my second look, things look much better, and I've got a plan that might work, I just need to evaluate it to make sure it really makes sense. At a quick glance just now, I'm definitely more confident in all of this.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'll get back to pip at some point.
One thing I'll have to do is add marks to some of my tests that rely on features that I assumed were implemented, but are not yet.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Pip 2021-01-25</title><link href="https://mwchase.neocities.org/pip-2021-01-25" rel="alternate"></link><published>2021-01-25T05:00:00-05:00</published><updated>2021-01-25T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-01-25:/pip-2021-01-25</id><summary type="html">&lt;p class="first last"&gt;Still not sure how some of this works.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;On closer inspection of stuff I probably should have noticed in the first place, I've concluded that some of the stuff I want to do with pip is probably easier than I thought.&lt;/p&gt;
&lt;p&gt;Here's the deal.
find_candidates constructs a set of Candidates and a list of InstallRequirements.
I'm trying to figure out if I can rely on those always having &lt;em&gt;some&lt;/em&gt; value when I want them to.
The kinds of requirements that need to be processed are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;ExplicitRequirement. I'll come back to this. (provides candidate)&lt;/li&gt;
&lt;li&gt;SpecifierRequirement. I think this is the kind of requirement I'll most want to have working. (provides ireq)&lt;/li&gt;
&lt;li&gt;RequiresPythonRequirement. I don't... think this should ever be relevant? (never provides ireq)&lt;/li&gt;
&lt;li&gt;UnsatisfiableRequirement. I can hardly improve on this situation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Okay, so, the Factory makes ExplicitRequirements that contain candidates with a link, but either the link matches, in which case there's no work to do, or the link doesn't match, in which case it's unsatisfiable and I don't need to do anything.
The other source of ExplicitRequirements is ExtrasCandidates.&lt;/p&gt;
&lt;p&gt;I've got a hypothesis about how this works, but I'm not confident:
ExtrasCandidates wrap specific existing Candidates (because otherwise how could you determine the extras requirements), so ExtrasCandidates shouldn't come into play when generating candidates in the first place.
Let's keep that in mind as something that might go wrong.&lt;/p&gt;
&lt;p&gt;So, for the normal case of taking a SpecifierRequirement and creating a candidate from a Link, we have the following flow:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;If there isn't an ireq, skip the rest of these steps and continue with _iter_found_candidates, which may need to be changed some.&lt;/li&gt;
&lt;li&gt;If there aren't URL constraints, skip the rest of these steps, as above.&lt;/li&gt;
&lt;li&gt;If the first URL constraint points to an incompatible wheel, skip as above.&lt;/li&gt;
&lt;li&gt;Use the first of each (in the case of ireqs, for consistency, in the case of links, because multiple links break it anyway) with _make_candidate_from_link, doing the full due diligence to populate all of the arguments correctly.&lt;/li&gt;
&lt;li&gt;Add the candidate to explicit_candidates.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'll need to re-evaluate whether _iter_found_candidates needs to change any.
Also, I'm not sure whether to pass extras to _make_candidate_from_link.
On the one hand, &amp;quot;project with extras&amp;quot; is a different node from &amp;quot;project&amp;quot;, so their candidates are not interchangeable.
On the other hand, if not there, then where?&lt;/p&gt;
&lt;p&gt;I think I'm misunderstanding something, but I'm not sure what.
I think I need to review the documentation for how pip's resolver works.&lt;/p&gt;
&lt;p&gt;Wait, if the loop lives in the vendored resolvelib, that would mean that the extras could be built up across multiple invocations.
I'll have to see if that works out, and if that actually helps.&lt;/p&gt;
&lt;p&gt;Thinking about this more, I'm slightly more confident.&lt;/p&gt;
&lt;p&gt;I'm also tired.
I'm going to wrap up now, because there's no point in drawing this out.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Diary 2021-01-24</title><link href="https://mwchase.neocities.org/diary-2021-01-24" rel="alternate"></link><published>2021-01-24T05:00:00-05:00</published><updated>2021-01-24T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-01-24:/diary-2021-01-24</id><summary type="html">&lt;p class="first last"&gt;Too tired to decide whether I have the category right.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Turns out I'm taking more of a break than I expected.&lt;/p&gt;
&lt;p&gt;The basic issue I'm having with adding functionality to pip, is that it &lt;em&gt;looks like&lt;/em&gt; I need to have enough information in the Constraint values to generate a Candidate later, but it also &lt;em&gt;looks like&lt;/em&gt; the Candidate should be patterned off of an InstallRequirement, and it also &lt;em&gt;looks like&lt;/em&gt; that InstallReqirement should come from the non-constraint side of things, to be able to include stuff like the editable flag, and extras.&lt;/p&gt;
&lt;p&gt;Thinking about it like that, it's like I need a function that translates existing Candidates to have the desired URL.&lt;/p&gt;
&lt;p&gt;Okay, talking about this has pointed me at some functions that might be useful here.
I'll look into this more tomorrow, or next week.
Whenever.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2021-01-23</title><link href="https://mwchase.neocities.org/diary-2021-01-23" rel="alternate"></link><published>2021-01-23T05:00:00-05:00</published><updated>2021-01-23T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-01-23:/diary-2021-01-23</id><summary type="html">&lt;p class="first last"&gt;Second verse, same as the first.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I tried to take it easy again today.
I'm a little keyed up currently, so that didn't work out well for whatever reason.&lt;/p&gt;
&lt;p&gt;Need to sleep now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2021-01-22</title><link href="https://mwchase.neocities.org/diary-2021-01-22" rel="alternate"></link><published>2021-01-22T05:00:00-05:00</published><updated>2021-01-22T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-01-22:/diary-2021-01-22</id><summary type="html">&lt;p class="first last"&gt;Another light day, I guess.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I poked a little at the pip PR stuff today, but I didn't really make any changes.
I've got some extremely useful information for when I get back to it, though.&lt;/p&gt;
&lt;p&gt;Aside from that, I can't really remember what I did today.
Read, I guess.&lt;/p&gt;
&lt;p&gt;I should wrap up; I've been getting to bed too late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Pip 2021-01-21</title><link href="https://mwchase.neocities.org/pip-2021-01-21" rel="alternate"></link><published>2021-01-21T05:00:00-05:00</published><updated>2021-01-21T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-01-21:/pip-2021-01-21</id><summary type="html">&lt;p class="first last"&gt;I refuse to accept this situation with grace.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I updated my checkout of pip, because it should be a lot easier to work with now, on account of the lack of Python 2 compatibility requirement.
Yes, I forked it that long ago, and just studied it for months.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to complain about git for a sec.&lt;/p&gt;
&lt;p&gt;I had some unstaged changes on top of the commit that introduces the tests I wrote.
I wanted those out of the way while I rebased, so I used &lt;tt class="docutils literal"&gt;git stash&lt;/tt&gt;, and got everything updated.
Far and away not the worst rebase I've done.
Anyway, the documentation of &lt;tt class="docutils literal"&gt;git stash pop&lt;/tt&gt; states &amp;quot;do the inverse operation of &lt;tt class="docutils literal"&gt;git stash push&lt;/tt&gt;&amp;quot;.
&lt;tt class="docutils literal"&gt;git stash push&lt;/tt&gt; is the interpretation of &lt;tt class="docutils literal"&gt;git stash&lt;/tt&gt; on its own.
So, I pop my stash of &lt;em&gt;unstaged modifications&lt;/em&gt;, and it stages them‽
What kind of inverse is that?
The documentation goes and builds up a small mental model that &lt;em&gt;immediately&lt;/em&gt; breaks down when confronted by reality.&lt;/p&gt;
&lt;p&gt;I haven't used Mercurial's Shelve extension, but I feel confident in stating that it &lt;em&gt;can't&lt;/em&gt; be confusing in that particular way, because staging changes isn't a thing in Mercurial.&lt;/p&gt;
&lt;p&gt;Anyway, I'm thinking again about how to compare Candidates against Link data.
I think I was wrong yesterday about constructing the ExplicitRequirements, because the Constraint object lacks the context required to do that.
The more I think about this, the more I think it needs to be a new method added to the Candidate interface.&lt;/p&gt;
&lt;p&gt;Here's how I think this should work:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;A RequiresPythonCandidate does not match any Link.&lt;/li&gt;
&lt;li&gt;An ExtrasCandidate must defer to its BaseCandidate.&lt;/li&gt;
&lt;li&gt;The remaining questions are, how to deal with the other types.&lt;/li&gt;
&lt;li&gt;It seems to me that the constraint level shouldn't be mandating editable or not, so it should be possible to just define the implementation in the base class, so the only question that remains is:&lt;/li&gt;
&lt;li&gt;How to test this for an AlreadyInstalledCandidate, which doesn't have a link field, and has source_link as None by design. It does have a Distribution value, which has a location field, which appears to be a URL. It might not be the URL I want; I'm not sure, and I'll need to investigate.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'll get on that within the next few days.
For now, it's too late at night, again.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Pip 2021-01-20</title><link href="https://mwchase.neocities.org/pip-2021-01-20" rel="alternate"></link><published>2021-01-20T05:00:00-05:00</published><updated>2021-01-20T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-01-20:/pip-2021-01-20</id><summary type="html">&lt;p class="first last"&gt;Finding all of the stuff I glossed over in earlier planning.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I started trying to nail down exactly what needs to be done to implement URL constraints.
Some of it's straightforward (add this field, here's how to handle it in various circumstances), and some of it is not (how do I check whether a candidate matches a URL constraint? I'm almost tempted to translate the link field into an ExplicitRequirement, which... might actually make the most sene. That's not a judgment call I feel comfortable making at midnight.)&lt;/p&gt;
&lt;p&gt;I wrote another test as future-proofing, because I noticed a potential issue, given planned changes to the code.&lt;/p&gt;
&lt;p&gt;Speaking of changes to the code, I probably should have pulled and rebased before I started making changes, even if those changes are just taking notes on what needs to happen.
Oh well, I'll try to remember to do it tomorrow.
I can muddle my way into a good state one way or another.&lt;/p&gt;
&lt;p&gt;Anyway, I have to wrap up several minutes ago.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Weekly Roundup 2021-01-19</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-01-19" rel="alternate"></link><published>2021-01-19T05:00:00-05:00</published><updated>2021-01-19T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-01-19:/weekly-roundup-2021-01-19</id><summary type="html">&lt;p class="first last"&gt;Racking up distractions in the background.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I tried to untangle which bits of code are relevant to compatibility tags, and figured out the implementation, more or less.&lt;/li&gt;
&lt;li&gt;Thursday: I found some of pip's features that I absolutely need for writing those tests.&lt;/li&gt;
&lt;li&gt;Friday: I took a break and poked at midi libraries for Python.&lt;/li&gt;
&lt;li&gt;Saturday: I started figuring out what I can and can't have from vim.&lt;/li&gt;
&lt;li&gt;Sunday: I planned the compatibility tag tests.&lt;/li&gt;
&lt;li&gt;Monday: I wrote the compatibility tag tests, and I thought I was totally done, but I just realized they need linting, so I'm doing that now.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to get some more work done on pip.
There's a chance I'll leave that for the weekend and mess with other stuff until then.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Pip 2021-01-18</title><link href="https://mwchase.neocities.org/pip-2021-01-18" rel="alternate"></link><published>2021-01-18T05:00:00-05:00</published><updated>2021-01-18T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-01-18:/pip-2021-01-18</id><summary type="html">&lt;p class="first last"&gt;Wrote three more tests, now I'm ready to do the rest of the damn PR.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The last of the tests should be good to go.
I'm running them now to make sure there aren't any howlers of problems with them.
While I wait, let's check...&lt;/p&gt;
&lt;p&gt;&amp;quot;This branch is 134 commits behind pypa:master.&amp;quot;&lt;/p&gt;
&lt;p&gt;Yeah, sounds about right.&lt;/p&gt;
&lt;p&gt;For now, I'm just going to commit the changes and take it easy for the rest of tonight.
I'll do pulls and rebases and such later.&lt;/p&gt;
&lt;p&gt;For now, the best thing for me to do, as usual at the end of these entries (no matter how long/short) is to relax.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Pip 2021-01-17</title><link href="https://mwchase.neocities.org/pip-2021-01-17" rel="alternate"></link><published>2021-01-17T05:00:00-05:00</published><updated>2021-01-17T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-01-17:/pip-2021-01-17</id><summary type="html">&lt;p class="first last"&gt;Easy does it...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I had way too much fun(?) today configuring vim and filing bugs against plugins.
Let's see about pip.&lt;/p&gt;
&lt;p&gt;I basically have three tests in mind.
All of them relate to what happens when a constraint URL points at a wheel with compatibility tags.
The first two tests are simple; they just relate to making sure that compatibility tags are respected for an attempted install.
The third test is more elaborate.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;There is a &amp;quot;dependency&amp;quot; package. It has two wheels, one of which has compatibility tags incompatible with a specified platform. That wheel has a known URL, the other is just in the index.&lt;/li&gt;
&lt;li&gt;There is a &amp;quot;base&amp;quot; package. Version 0.1.0 does not rely on &amp;quot;dependency&amp;quot;. Version 0.2.0 does rely on &amp;quot;dependency&amp;quot;, but uses no specifiers.&lt;/li&gt;
&lt;li&gt;The test is that, given a URL constraint to the incompatible wheel, version 0.1.0 of &amp;quot;base&amp;quot; should be installed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I will put these tests with the other new non-hash tests.&lt;/p&gt;
&lt;p&gt;I sketched out the tests, but thanks to the fun(?) I had taking up most of the day, I'm not going to fill them in for now.
I'll try to do that tomorrow.
Then, commit, pull, rebase, whatever I have to do to get stuff up-to-date before I start on the rest of the work.
For now, I'm going to wind down.
(And maybe tinker with vim some more.)&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Diary 2021-01-16</title><link href="https://mwchase.neocities.org/diary-2021-01-16" rel="alternate"></link><published>2021-01-16T05:00:00-05:00</published><updated>2021-01-16T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-01-16:/diary-2021-01-16</id><summary type="html">&lt;p class="first last"&gt;Relaxed a little too hard.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, this entry is a little late.
I took things easy today, and started messing more with vim.
It's not going to be a drop-in replacement for Sublime Text in the ways I care about, especially not after the effort I put into customizing the syntax files.
From initial looks over this stuff, I'm not at all sure it'll be possible to port over all of the stuff I want to have.
For example, in my custom color scheme for Sublime Text, the &lt;em&gt;contents&lt;/em&gt; of a string are slightly emphasized, but the &lt;em&gt;delimiters&lt;/em&gt; are not.
(Modulo various bits of special-casing, like that interpolated expressions are not emphasized, and neither are Python docstrings, which instead are internally highlighted as ReStructuredText.)&lt;/p&gt;
&lt;p&gt;I tried getting hashed syntax highlighting working, and that was a disaster.
I have some complaints for myself about how I configured it in Sublime Text, but the plugin I found for vim just has so much it does wrong, and I couldn't figure out how to mitigate it.&lt;/p&gt;
&lt;p&gt;On reflection, I'm not extremely attached to the hashed syntax highlighting (I mostly don't mind either its presence or its absence, which implies to me that it would be a net good if I can fix some of the bad color choices I made), but the lack of emphasis stuff makes me mildly anxious.
(I mean, I suppose I'm not using that on my work computer either, but...)&lt;/p&gt;
&lt;p&gt;I should probably get more experience with this stuff before I toss myself onto VimScript, or translating VimScript tutorials to use Lua instead.&lt;/p&gt;
&lt;p&gt;Anyway, it is way too late, I need to end this post half an hour ago.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2021-01-15</title><link href="https://mwchase.neocities.org/diary-2021-01-15" rel="alternate"></link><published>2021-01-15T05:00:00-05:00</published><updated>2021-01-15T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-01-15:/diary-2021-01-15</id><summary type="html">&lt;p class="first last"&gt;Trying to relax.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I took things easy today, like I said.
I mostly focused on dealing with a backlog of Cracking the Cryptic videos/puzzles.&lt;/p&gt;
&lt;p&gt;I also recently started messing with midi software.
Instead of piano-roll/sheet music composition, I'm going to try writing stuff in Python.
I've got what I need to handle real-time midi output, at a very primitive level, though ideally I'd like to have a little better idea of how to transcribe the midi, given the system that I have in mind currently.
I think I've figured out something that can work, but I'll need to sketch things out a bit more.&lt;/p&gt;
&lt;p&gt;Anyway, if I don't wrap things up promptly, that'll cancel out the relaxation, so...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Pip 2021-01-14</title><link href="https://mwchase.neocities.org/pip-2021-01-14" rel="alternate"></link><published>2021-01-14T05:00:00-05:00</published><updated>2021-01-14T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-01-14:/pip-2021-01-14</id><summary type="html">&lt;p class="first last"&gt;I found the tests I need to pattern off of, so things are going great.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Earlier today, I stumbled across the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--platform&lt;/span&gt;&lt;/tt&gt; option to &lt;tt class="docutils literal"&gt;pip install&lt;/tt&gt;.
I believe that's the major missing piece of the puzzle for me.
Now, I know how to structure tests so as to be guaranteed to be able to install, or not able to install, a test wheel file.&lt;/p&gt;
&lt;p&gt;It's going to be a bit more effort to make use of this, because I need to either wrap the low-level wheel-creation code that doesn't actually write a file, or I need to rename the output of the higher-level helpers.
I hope the latter works, because that sounds like way less effort.
(It... looks like it should?
I'll need to test this some.)&lt;/p&gt;
&lt;p&gt;Anyway, I don't want to work on this during the week any more, so I'm going to take things easy for the next two days, then start writing the tests.&lt;/p&gt;
&lt;p&gt;I'm going to start on that break now, and try to relax before getting to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Pip 2021-01-13</title><link href="https://mwchase.neocities.org/pip-2021-01-13" rel="alternate"></link><published>2021-01-13T05:00:00-05:00</published><updated>2021-01-13T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-01-13:/pip-2021-01-13</id><summary type="html">&lt;p class="first last"&gt;Pip's codebase still feels really big.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Woohoo, I got a shoutout from Cracking the Cryptic.&lt;/p&gt;
&lt;p&gt;Anyway, I'm looking over pip's internals again, and I'm going to need to take notes.
This is kind of starting in the middle, but &lt;tt class="docutils literal"&gt;collector:LinkCollector.collect_links&lt;/tt&gt; seems promising.
I'll put a pin in that, and see if I can hit it the other way by passing a URL &lt;em&gt;requirement&lt;/em&gt; to the new resolver.
Or maybe I should be looking at &lt;tt class="docutils literal"&gt;package_finder:PackageFinder.find_all_candidates&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Okay, looking from the middle isn't working for me.
Let's trace this from the start.
First, let's see what kind of errors I can get by forcing incompatible requirements.&lt;/p&gt;
&lt;p&gt;Okay, a requirement leads to an error from &lt;tt class="docutils literal"&gt;factory:Factory.make_requirement_from_install_req&lt;/tt&gt;, which was called from &lt;tt class="docutils literal"&gt;resolver:Resolver.resolve&lt;/tt&gt;.
Now, a &lt;em&gt;valid&lt;/em&gt; URL requirement is propagated by adding it to the requirements list.
Constraints are added to the constraints dict, which is fed into the &lt;tt class="docutils literal"&gt;PipProvider&lt;/tt&gt;.
The lower-effort option at this level would be to somehow change the &lt;tt class="docutils literal"&gt;PipProvider&lt;/tt&gt; behavior, but first I should look at the resolve method being used here...
Okay, I've gotten to, &lt;tt class="docutils literal"&gt;provider:PipProvider.find_matches&lt;/tt&gt; looks like it should be relevant, and its behavior depends on &lt;tt class="docutils literal"&gt;factory:Factory.find_candidates&lt;/tt&gt;, which takes a constraint!
We know that the constraint is activated if it gets this far, so what it needs to do is convert the link/url/whatever information from the constraint, into a &lt;tt class="docutils literal"&gt;Candidate&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Now, that part is just the implementation of the feature.
The requirement that I need to satisfy, is that installation should fail if the candidate generated points to an incompatible wheel.
So far, I see two basic ways to accomplish that.
One is to avoid generating the candidate, and waiting for resolution to fail.
The other is to error out immediately.
I was going to say that erroring out made more sense because there's no way to recover, but then I realized that there is: look for a version that doesn't rely on the dependency!
So, the correct answer has to be to avoid generating the candidate, and that gives us some test cases.&lt;/p&gt;
&lt;p&gt;We want to make sure that wheel tags are properly matched, that an install attempt that requires an incompatible wheel will fail (as opposed to, say, nonterminating), and that, if a constraint points to an incompatible wheel, the selected versions do not depend on that package.&lt;/p&gt;
&lt;p&gt;To implement this, I need a helper that converts the data that will be stored on constraints into a &lt;tt class="docutils literal"&gt;Candidate&lt;/tt&gt;.
It should check what the URL points to, and, if it's a wheel, whether it's compatible.
My initial inclination is to implement this as a generator that takes the constraint argument and iterates over the field, producing valid candidates.
(This would end up deferring obviously broken situations, but we're delegating to the resolver, because it can backtrack.)&lt;/p&gt;
&lt;p&gt;I'm still not sure how to test this, but at least I have test cases.
I also might need to adjust some of my ideas about what gets stored on the constraint, if it's getting converted into a &lt;tt class="docutils literal"&gt;Candidate&lt;/tt&gt;, but we'll see.&lt;/p&gt;
&lt;p&gt;Okay, that was a productive hour or two, time to wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Weekly Roundup 2021-01-12</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-01-12" rel="alternate"></link><published>2021-01-12T05:00:00-05:00</published><updated>2021-01-12T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-01-12:/weekly-roundup-2021-01-12</id><summary type="html">&lt;p class="first last"&gt;Closing in on getting a PR ready.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I refreshed my memory on how hash tests should work for URL constraints.&lt;/li&gt;
&lt;li&gt;Thursday: I wrote a few tests, and said a tiny bit about the insurrection.&lt;/li&gt;
&lt;li&gt;Friday: I checked over my test code to make sure that it wasn't too broken. (It was still pretty broken at the time, in ways I didn't grasp.)&lt;/li&gt;
&lt;li&gt;Saturday: I took a nap. Then, right after publishing that post, I slept for twelve hours.&lt;/li&gt;
&lt;li&gt;Sunday: I finished up the obvious tests, and started really putting them through their paces.&lt;/li&gt;
&lt;li&gt;Monday: I started contemplating the wheel compatibility logic, and convinced myself that my earlier reasons for thinking it would &amp;quot;just work&amp;quot; probably weren't valid.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to get back to figuring out what wheel compatibility code/tests should look like.
If I don't get this worked out quickly, I'll have to take another break, but it's fine.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Pip 2021-01-11</title><link href="https://mwchase.neocities.org/pip-2021-01-11" rel="alternate"></link><published>2021-01-11T05:00:00-05:00</published><updated>2021-01-11T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-01-11:/pip-2021-01-11</id><summary type="html">&lt;p class="first last"&gt;I thought this would &amp;quot;just work&amp;quot;. Now, I'm not so sure.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was kind of taking it easy today, so I haven't started on pip, so I'm not going to do much.
For now, I just want to figure out what tests of wheel compatibility tags would look like.&lt;/p&gt;
&lt;p&gt;I'm not seeing an example of an end-to-end test I could copy and rewrite for this, so let's head back into the code to see if there's a smaller section of code I can isolate.&lt;/p&gt;
&lt;p&gt;Okay, I'm going to need to start over at understanding the code, because I've gotten myself confused again.&lt;/p&gt;
&lt;p&gt;Like, okay, adding a URL constraint makes a new wheel available to download, but if the platform doesn't match, the wheel shouldn't be considered as a candidate, I think.&lt;/p&gt;
&lt;p&gt;I think I need to be looking in &lt;tt class="docutils literal"&gt;factory:Factory.find_candidates&lt;/tt&gt;.
That delegates to some other functions that hopefully filter stuff out...&lt;/p&gt;
&lt;p&gt;Okay, there's a &lt;tt class="docutils literal"&gt;make_requirement_from_install_req&lt;/tt&gt; function that freaks out if it's given a link requirement that links to an unsupported wheel, but I don't think it makes sense to go down that path unless the constrained package is required.&lt;/p&gt;
&lt;p&gt;I'm going to have to try again to undertand this later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Pip 2021-01-10</title><link href="https://mwchase.neocities.org/pip-2021-01-10" rel="alternate"></link><published>2021-01-10T05:00:00-05:00</published><updated>2021-01-10T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-01-10:/pip-2021-01-10</id><summary type="html">&lt;p class="first last"&gt;Shockingly close to done, even though I've only touched test code so far.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I slept for twelve hours after the last post, and now I'm fine(?).&lt;/p&gt;
&lt;p&gt;I've finished roughing out the tests that I know how to do.
I should maybe try to figure out how to write tests for wheel compatibility tags, but I'd rather get the tests I have to be valid.
Looking over the utility function definitions, it's... probably fine to copy and paste between files.&lt;/p&gt;
&lt;p&gt;I did that, and filled in the details.
I've got an hour, let's goooooo.
Okay, it took a quarter of an hour, and all of the tests failed as expected.
Let's remove the xfail marks and see if any of them are failing for bad reasons.&lt;/p&gt;
&lt;p&gt;And some of them are.
Let's see about patching this up.
I'll rerun them tomorrow.&lt;/p&gt;
&lt;p&gt;I think the next thing I need to fix up is to add some expect_errors to a bunch of the calls.
That should make some of the twenty tests I've added pass, but that's fine.&lt;/p&gt;
&lt;p&gt;Anyway, I'm drifting off, so I should wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Diary 2021-01-09</title><link href="https://mwchase.neocities.org/diary-2021-01-09" rel="alternate"></link><published>2021-01-09T05:00:00-05:00</published><updated>2021-01-09T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-01-09:/diary-2021-01-09</id><summary type="html">&lt;p class="first last"&gt;Done napping, time to go to bed.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;zzzz&lt;/p&gt;
&lt;p&gt;No progress, only naps.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Pip 2021-01-08</title><link href="https://mwchase.neocities.org/pip-2021-01-08" rel="alternate"></link><published>2021-01-08T05:00:00-05:00</published><updated>2021-01-08T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-01-08:/pip-2021-01-08</id><summary type="html">&lt;p class="first last"&gt;Kind of tired today, &lt;em&gt;for some reason&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't do too much with pip today, because I was doing other stuff, like sleeping.&lt;/p&gt;
&lt;p&gt;I did quickly look over the tests I put in earlier, because I was worried they might be somewhat broken.
On closer inspection, they're not broken for the reason I thought they might be, but I can't be sure they don't have many other problems.&lt;/p&gt;
&lt;p&gt;I'll see if I'm up for writing the next tests tomorrow, but I'm going to assume it'll be the weekend.&lt;/p&gt;
&lt;p&gt;It's late, I should wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Pip 2021-01-07</title><link href="https://mwchase.neocities.org/pip-2021-01-07" rel="alternate"></link><published>2021-01-07T05:00:00-05:00</published><updated>2021-01-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-01-07:/pip-2021-01-07</id><summary type="html">&lt;p class="first last"&gt;I hope nobody was thinking of me as &amp;quot;apolitical&amp;quot;, especially not like it was a good thing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got a few basic hash+url constraint tests mostly written.
I need to figure out the best way to assert about what pip actually did.
I think the easy way is to just copy some utility functions between test files.&lt;/p&gt;
&lt;p&gt;Anyway, it's a little hard to concentrate on this right now, for reasons that I trust are obvious.
I want to keep on making progress on this, that's heartening, but what's happening in Washington DC right now...&lt;/p&gt;
&lt;p&gt;I don't often talk about political issues that affect me, and I do not think I have a principled reason for that.
I sometimes find myself fixating on the worst possible outcome of an event or action.
(On reflection, a lot of really bad outcomes have come as a surprise to me at the time, so it's not like I can even call myself a &amp;quot;realist&amp;quot; here.)
But, if I can say something here that reaches someone, anyone, from this little blog, then I think the good that does will outweigh any negative consequences that my brain can imagine.&lt;/p&gt;
&lt;p&gt;Today, in the Capitol, there were innocent bystanders who didn't deserve what happened to them.
There were heroes.
There were, and are, reprehensible people who are likely to face far less consequences than their words and deeds merit.
I do not intend to forget this day, the violence, the lies, the distaste for democracy.
Everyone who was in the Capitol today deserves to have their actions memorialized, &lt;em&gt;especially&lt;/em&gt; those who will, soon enough, be trying to deny and minimize them.&lt;/p&gt;
&lt;p&gt;I want to believe the worst is over, but I cannot bring myself to relax just yet.
I hope we make it through the next two weeks, and that we can finally start getting the leadership we needed a year ago.&lt;/p&gt;
&lt;p&gt;Fuck Trump.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Pip 2021-01-06</title><link href="https://mwchase.neocities.org/pip-2021-01-06" rel="alternate"></link><published>2021-01-06T05:00:00-05:00</published><updated>2021-01-06T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-01-06:/pip-2021-01-06</id><summary type="html">&lt;p class="first last"&gt;It's good to be back on this.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm reminding myself what I want for the hash tests.&lt;/p&gt;
&lt;p&gt;Basic tests:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Hash requirement plus constraint to matching URL succeeds&lt;/li&gt;
&lt;li&gt;Hash requirement plus constraint to differing URL fails&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;More advanced:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Hash requirement in dependency plus matching URL constraint succeeds&lt;/li&gt;
&lt;li&gt;Hash requirement in dependency plus differing URL fails&lt;/li&gt;
&lt;li&gt;Two versions of dependent, with dependencies on different hashes, always select the version compatible with the URL constraint. In particular, if the constraint matches the hash requested by the lesser version of the dependent, those versions are what get installed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Probably want to try these with extra hashes or overlapping sets to look for something really tricky.&lt;/p&gt;
&lt;p&gt;I'll try to get on that tomorrow.
I've decided to try to be okay with taking things a little at a time.&lt;/p&gt;
&lt;p&gt;Oof, I just realized that I hadn't twigged that hashes are supported in constraints.
That's going to mildly increase the number of test cases, but it should be fine.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Weekly Roundup 2021-01-05</title><link href="https://mwchase.neocities.org/weekly-roundup-2021-01-05" rel="alternate"></link><published>2021-01-05T05:00:00-05:00</published><updated>2021-01-05T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-01-05:/weekly-roundup-2021-01-05</id><summary type="html">&lt;p class="first last"&gt;I did not have a good time last week. I seem to be doing a little better now that it's over.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I felt gross and decided to take a break from the then-current projects.&lt;/li&gt;
&lt;li&gt;Thursday: I started trying to solve old Advent of Code puzzles using a programming language that did't exist at the time.&lt;/li&gt;
&lt;li&gt;Friday: I focused on learning more about the language itself.&lt;/li&gt;
&lt;li&gt;Saturday: I started to get more proficient with the language, BQN, but I'm not totally used to it yet.&lt;/li&gt;
&lt;li&gt;Sunday: I made some improvements to my Advent of Code solution.&lt;/li&gt;
&lt;li&gt;Monday: I made more headway, and realized I was getting frustrated with a whole bunch of things.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to make some progress on the pip PR, and then, if there's time left in the week, try to switch over to using Vim or some other open-source text editor.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2021-01-04</title><link href="https://mwchase.neocities.org/coding-2021-01-04" rel="alternate"></link><published>2021-01-04T05:00:00-05:00</published><updated>2021-01-04T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-01-04:/coding-2021-01-04</id><summary type="html">&lt;p class="first last"&gt;Getting quicker at putting this stuff together.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;BQN program for part one of the second day complete, and it shouldn't be too hard to do part two, I just don't want to right now.&lt;/p&gt;
&lt;p&gt;I'm starting to get really bothered by the fact that it's not convenient to type the symbols.
Since I'm still using Sublime Text, my inclination would be to add nice syntax highlighting and snippets through that mechanism.&lt;/p&gt;
&lt;p&gt;(I'm not currently considering switching text editors, but it's starting to seem like something that would make sense.
I mean, I could go outside whenever I felt like it without freaking out around the time the last updates dropped...
Since all I'm doing currently really is plain text, ReStructuredText, Python, TOML, todo.txt sometimes and now BQN...)&lt;/p&gt;
&lt;p&gt;(Well, I wasn't considering switching, but now I am.
I'll look into it more after I get back to work on the pip PR.
Which, maybe I'll get back to next week, since now I feel way more relaxed now than I have in weeks.)&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-01-03</title><link href="https://mwchase.neocities.org/coding-2021-01-03" rel="alternate"></link><published>2021-01-03T05:00:00-05:00</published><updated>2021-01-03T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-01-03:/coding-2021-01-03</id><summary type="html">&lt;p class="first last"&gt;I need to get better at internalizing the vocabulary that points to the relevant concepts.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;And with a bit of investigation and fiddling, I managed to write a BQN program for both parts of the first AoC challenge, and the result looks somewhat idiomatic.
I don't think I would have managed it without having looked at the interpreter source code first, though.
Hopefully, I won't hit any huge barriers.
BQN has a small set of primitives, so the challenge is always going to be figuring out how to combine them in a useful fashion.&lt;/p&gt;
&lt;p&gt;Having to type all of the fancy symbols does kind of make me ponder some kind of &lt;a class="reference external" href="https://web.eecs.umich.edu/~imarkov/Perligata.html"&gt;Perligata&lt;/a&gt;-esque asciification, but that's probably a bad idea, if only because taking cues from an esolang should be a red flag.&lt;/p&gt;
&lt;p&gt;Anyway, I was doing... other stuff, so I just now put together this short entry, late, and I don't want to draw things out any more.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-01-02</title><link href="https://mwchase.neocities.org/coding-2021-01-02" rel="alternate"></link><published>2021-01-02T05:00:00-05:00</published><updated>2021-01-02T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-01-02:/coding-2021-01-02</id><summary type="html">&lt;p class="first last"&gt;This stuff is still pretty weird.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I think I've got all I need from the JavaScript BQN interpreter (not the compiler).
So, once I'm ready to mess around with stuff again, it's time to get serious about learning BQN.
First thing I did: aggressively bump up the magnification on the web site so I can reliably tell the difference between, say, &lt;tt class="docutils literal"&gt;⊐&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;⊒&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Thinking about the problem I want to use this for... I think I need &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;⊐⟜(-1)&lt;/span&gt; something&lt;/tt&gt; to start with.&lt;/p&gt;
&lt;p&gt;With that, and some searching on &lt;a class="reference external" href="https://mlochbaum.github.io/bqncrate/"&gt;BQNCrate&lt;/a&gt;, I've made some improvements to my solution, and it's closer to supporting part two.
At least, I think they're improvements?
I really need a better sense of idiomatic style for APL-like languages.&lt;/p&gt;
&lt;p&gt;Anyway, I spent enough time trying to figure out array manipulation, better wrap up for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2021-01-01</title><link href="https://mwchase.neocities.org/coding-2021-01-01" rel="alternate"></link><published>2021-01-01T05:00:00-05:00</published><updated>2021-01-01T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2021-01-01:/coding-2021-01-01</id><summary type="html">&lt;p class="first last"&gt;No links in this post because I'm tiiiired.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Did a little work on a Python interpreter for BQN.
My basic plan is to work from the JavaScript interpreter, then get bugfixes by looking at the JavaScript &lt;em&gt;compiler&lt;/em&gt;, work on feature parity with the JavaScript version, then see if I can get feature parity with the Java version.
This will all be in Python 3 to start with.
Once I have feature parity with the Java version, I want to see about benchmarks.
For kicks, I'll then see about backporting to the latest PyPy2 release and generally structuring it more like an RPython-based interpreter.
(Somewhat curious if getting a successful nojit compilation would allow me to use emscripten to make a JavaScript version that has feature parity with the Java version.
Also note that &amp;quot;feature parity with the Java version&amp;quot; might be asking some stuff of the self-hosted compiler that it can't actually do, so there's a chance this last part isn't possible currently; I'm not sure.)&lt;/p&gt;
&lt;p&gt;However, what I want to do is, finish up the initial JavaScript interpreter work, then get back into teaching myself the language.&lt;/p&gt;
&lt;p&gt;This entry was a few minutes late because I was focusing on the port, and other stuff.
I'd like to be done with it now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-12-31</title><link href="https://mwchase.neocities.org/coding-2020-12-31" rel="alternate"></link><published>2020-12-31T05:00:00-05:00</published><updated>2020-12-31T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-12-31:/coding-2020-12-31</id><summary type="html">&lt;p class="first last"&gt;Area nerd still cannot do anything remotely the easy way.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, what do I do for a change of pace?
Try to learn a seven-month-old programming language in a paradigm that I sort of know about, by looking over some language-agnostic coding challenges.
I don't know, either.&lt;/p&gt;
&lt;p&gt;So, here's some background.
&lt;a class="reference external" href="https://en.wikipedia.org/wiki/APL_(programming_language)"&gt;APL&lt;/a&gt; was a programming language focused on manipulating arrays and having incredibly terse syntax.
While it has influenced several programming languages that I have experience with (of... varying quality), I haven't really tried to use any language with its combination of terseness and power before.
APL inspired several other languages to that degree, such as &lt;a class="reference external" href="https://en.wikipedia.org/wiki/J_(programming_language)"&gt;J&lt;/a&gt;, which I &lt;em&gt;believe&lt;/em&gt; is the APL-like that I first saw actual syntax of, on &lt;a class="reference external" href="https://hillelwayne.com/tags/j/"&gt;Hillel Wayne's blog&lt;/a&gt;.
(That category should get a new entry that functions as a gentler introduction to J at some point.)&lt;/p&gt;
&lt;p&gt;I am not trying to learn J.&lt;/p&gt;
&lt;p&gt;Now, I don't even remember how I heard of the language I am trying to learn, whether Hillel mentioned it on his twitter or if I saw it somewhere else or what, but I've vaguely had my eye on a language called &lt;a class="reference external" href="https://mlochbaum.github.io/BQN/index.html"&gt;BQN&lt;/a&gt;, which is like APL, but with some fundamental differences, that, to the degree I understand them, seem to address some of the minor niggles I encountered with NumPy.
The documentation, tutorials, and interpreters are by now at the point where, through trial and a lot of error, I can bash out a solution to basic coding challenges, sometimes.&lt;/p&gt;
&lt;p&gt;Here's a solution to the first &lt;a class="reference external" href="https://adventofcode.com/"&gt;Advent of Code&lt;/a&gt; puzzle: &lt;tt class="docutils literal"&gt;•Out &lt;span class="pre"&gt;-´&lt;/span&gt; ⥊ &lt;span class="pre"&gt;=⌜⟜&amp;quot;()&amp;quot;&lt;/span&gt; •FChars &amp;quot;day_1.txt&amp;quot;&lt;/tt&gt;.
To be clear, that's the first &lt;em&gt;ever&lt;/em&gt;, near as I can tell.
Also to be clear, I don't know if that's the idiomatic way to do that.
And I'm going to have to rewrite it some to be able to handle the second part of the challenge.&lt;/p&gt;
&lt;p&gt;Anyway, I'm also looking at the BQN VM implementations, and vaguely wondering how well an &lt;a class="reference external" href="https://rpython.readthedocs.io/en/latest/"&gt;RPython&lt;/a&gt; VM would work.
The BQN VM is not &lt;em&gt;the most&lt;/em&gt; minimal non-esolang that I've considered porting to RPython, but the interpreter version looks pretty small, so I'd be interested in taking some time to get a Python port, then finesse it into RPython, then give the compiler a few hours to chew on it.&lt;/p&gt;
&lt;p&gt;Anyway, this took way longer to write than I intended, so it has to be done now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2020-12-30</title><link href="https://mwchase.neocities.org/diary-2020-12-30" rel="alternate"></link><published>2020-12-30T05:00:00-05:00</published><updated>2020-12-30T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-12-30:/diary-2020-12-30</id><summary type="html">&lt;p class="first last"&gt;Uuuuugh.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&amp;quot;once I feel a little better&amp;quot;
Well, that's not right now, that's for sure.
I was fine all day, and now I feel gross and tired.&lt;/p&gt;
&lt;p&gt;I think I might actually deliberately take a break for a bit and work on some other stuff.&lt;/p&gt;
&lt;p&gt;For now, though, I'm just going to lie down and keep feeling gross until my body decides to stop doing that.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2020-12-29</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-12-29" rel="alternate"></link><published>2020-12-29T05:00:00-05:00</published><updated>2020-12-29T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-12-29:/weekly-roundup-2020-12-29</id><summary type="html">&lt;p class="first last"&gt;Open source work OR My body continues to let me down&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I started writing tests for pip.&lt;/li&gt;
&lt;li&gt;Thursday: I wrote a bunch more tests.&lt;/li&gt;
&lt;li&gt;Friday: I focused on other things, but got a few tests written.&lt;/li&gt;
&lt;li&gt;Saturday: I started planning the tests for interacting with other features.&lt;/li&gt;
&lt;li&gt;Sunday: I remembered and wrote a few other tests.&lt;/li&gt;
&lt;li&gt;Monday: I focused mostly on puzzle stuff and didn't touch pip.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, the fifth TtC puzzle looks too daunting.
I think I'll just wait for the next hunt or monthly puzzle.
In the meantime, I'll try to get back to working on pip, once I feel a little better.
(I've got some kind of illness again.
I'm not having a good time with this.)&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Diary 2020-12-28</title><link href="https://mwchase.neocities.org/diary-2020-12-28" rel="alternate"></link><published>2020-12-28T05:00:00-05:00</published><updated>2020-12-28T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-12-28:/diary-2020-12-28</id><summary type="html">&lt;p class="first last"&gt;Hoping to get in only a few days after one of my classmates from highschool.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Took things easy-ish again today.&lt;/p&gt;
&lt;p&gt;I'm trying to finish up Tracking the Cryptid.
It turns out I'd badly misunderstood the fourth puzzle.
I at least understand the fifth puzzle, but it's hard to keep a handle on the rules, and I think I might have already messed up and need to start over.&lt;/p&gt;
&lt;p&gt;Anyway, I guess I don't have more to say.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Pip 2020-12-27</title><link href="https://mwchase.neocities.org/pip-2020-12-27" rel="alternate"></link><published>2020-12-27T05:00:00-05:00</published><updated>2020-12-27T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-12-27:/pip-2020-12-27</id><summary type="html">&lt;p class="first last"&gt;Soon...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I actually remembered a few other tests that I wanted, so I added them.&lt;/p&gt;
&lt;p&gt;I was doing other stuff for most of the day, again, so I don't have anything else to say.&lt;/p&gt;
&lt;p&gt;I'll try to put the hash tests together tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Pip 2020-12-26</title><link href="https://mwchase.neocities.org/pip-2020-12-26" rel="alternate"></link><published>2020-12-26T05:00:00-05:00</published><updated>2020-12-26T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-12-26:/pip-2020-12-26</id><summary type="html">&lt;p class="first last"&gt;Almost ready...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, next tests to write: hash checking, and then wheel compatibility tags.&lt;/p&gt;
&lt;p&gt;Tonight, I'm just going to figure out what's required for these tests.&lt;/p&gt;
&lt;p&gt;So, the hash tests consist of the interactions between an explicit requirement that includes a hash specification, and a constraint that points to a URL.
The candidate from the URL should be checked against the hash list.&lt;/p&gt;
&lt;p&gt;The compatibility tags tests... I'm not sure.
It looks like the desired behavior (fail if wheel is incompatible with system) should just happen if everything is wired up properly, but I'm not sure how to test it.
I might just be failing to see tests around that area.&lt;/p&gt;
&lt;p&gt;Anyway, once the small tests are out of the way, I think it would be good to have a &amp;quot;lifecycle&amp;quot; kind of test that explicitly runs through one of the use cases for the URL constraints feature:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Starting from a requirements file, set up a consistent environment&lt;/li&gt;
&lt;li&gt;Write the output of &lt;tt class="docutils literal"&gt;pip freeze&lt;/tt&gt; to a constraint file&lt;/li&gt;
&lt;li&gt;Pare down the requirements file, and install in a fresh environment (or first uninstall everything) using the new requirements file constrained against the &lt;tt class="docutils literal"&gt;pip freeze&lt;/tt&gt; output.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My plan is to spec these out in more detail, write the tests, then remove the xfail marks to make sure the tests are all failing for the right reasons.
For now, I'm going to wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Pip 2020-12-25</title><link href="https://mwchase.neocities.org/pip-2020-12-25" rel="alternate"></link><published>2020-12-25T05:00:00-05:00</published><updated>2020-12-25T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-12-25:/pip-2020-12-25</id><summary type="html">&lt;p class="first last"&gt;Not much to say, because I was focusing on other things again.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I let things go too late.
Let's see...
I want to write a test that confirms that URL constraints apply to packages required as dependencies.&lt;/p&gt;
&lt;p&gt;Okay, did that.
I think some of the more elaborate tests I had in mind might have been overkill.
I'm going to figure out the hash tests later.&lt;/p&gt;
&lt;p&gt;For now, I'm going to plug my laptop back in and get ready for bed.
Okay, yeah, the new test looks good so far.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Pip 2020-12-24</title><link href="https://mwchase.neocities.org/pip-2020-12-24" rel="alternate"></link><published>2020-12-24T05:00:00-05:00</published><updated>2020-12-24T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-12-24:/pip-2020-12-24</id><summary type="html">&lt;p class="first last"&gt;Moving much faster now that I've moved at all.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I think I've got most of the basic tests I want written, and I'm going through them now.
Some of them might pass because the default behavior is to always fail, so I think I'll want to tweak some of them, and—Nope, nevermind, they're all good.&lt;/p&gt;
&lt;p&gt;Anyway, in the coming days, I'm going to work on more advanced tests that have more complex packages.&lt;/p&gt;
&lt;p&gt;For now, I'm going to let these tests run, and try working on some other stuff while I wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Pip 2020-12-23</title><link href="https://mwchase.neocities.org/pip-2020-12-23" rel="alternate"></link><published>2020-12-23T05:00:00-05:00</published><updated>2020-12-23T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-12-23:/pip-2020-12-23</id><summary type="html">&lt;p class="first last"&gt;Hooray, definite progress!&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I just wrote two basic tests for URL constraints.
I'll run them later, since it's late, but it's nice to have gotten started, and gotten a little hands-on experience with test writing.
I'm marking these as strict xfail, under the assumption that I'd really like to know if these already pass somehow.&lt;/p&gt;
&lt;p&gt;Not much to say on this, since I spent most of today trying to get through &lt;a class="reference external" href="https://www.patreon.com/posts/december-reward-44546753"&gt;Tracking the Cryptid&lt;/a&gt;.
I made a few mistakes at first on the first three puzzles, but the fourth puzzle...
I think I understand the rules, but I don't know how to convert that into a solve.&lt;/p&gt;
&lt;p&gt;Hopefully I make more progress on various things in the coming days.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Weekly Roundup 2020-12-22</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-12-22" rel="alternate"></link><published>2020-12-22T05:00:00-05:00</published><updated>2020-12-22T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-12-22:/weekly-roundup-2020-12-22</id><summary type="html">&lt;p class="first last"&gt;The Kingdom Hearts 3 model of software development.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I started laying out what packages will be necessary for testing URL constraints.&lt;/li&gt;
&lt;li&gt;Thursday: I made that slightly more concrete.&lt;/li&gt;
&lt;li&gt;Friday: I tried to figure out what was already covered by the existing test index folders.&lt;/li&gt;
&lt;li&gt;Saturday: I wrote up the stuff I'd been doing on the side, the &amp;quot;coding abominations&amp;quot;. Just so we're clear, I'm laying the &amp;quot;abomination&amp;quot; part squarely at my feet. Anyway, even though the post was pretty long as posts have been here lately, I feel like it was pretty high-level and abstract, so I might want to work my way up to revisiting this at some point.&lt;/li&gt;
&lt;li&gt;Sunday: I cleared up some misunderstandings on my part about the test code, and started planning out tests to add.&lt;/li&gt;
&lt;li&gt;Monday: I noticed that there's a workflow I should be going through for PRs, so I get to work on following it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm hopefully going to start writing tests.
As well, I've got a few other things I want to do, and &lt;em&gt;maybe&lt;/em&gt; write about.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Pip 2020-12-21</title><link href="https://mwchase.neocities.org/pip-2020-12-21" rel="alternate"></link><published>2020-12-21T05:00:00-05:00</published><updated>2020-12-21T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-12-21:/pip-2020-12-21</id><summary type="html">&lt;p class="first last"&gt;Asymptotically approaching starting...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, I'm about ready in terms of knowing what to write for tests.
Now, I need to make sure that I get my changes in right, to avoid wasting effort.&lt;/p&gt;
&lt;p&gt;Folowing along with the documentation, I've got to:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Fork the pypa/pip repository&lt;/li&gt;
&lt;li&gt;Clone it&lt;/li&gt;
&lt;li&gt;Create a branch called something like &amp;quot;url-constraints&amp;quot;&lt;/li&gt;
&lt;li&gt;Add tests&lt;/li&gt;
&lt;li&gt;Update code&lt;/li&gt;
&lt;li&gt;Update documentation&lt;/li&gt;
&lt;li&gt;Add a 8253.feature.rst news fragment? I'm not really familiar with towncrier&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I think that's it.&lt;/p&gt;
&lt;p&gt;I just now got up through the third bullet.
I'll try to get stuff done in earnest tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Pip 2020-12-20</title><link href="https://mwchase.neocities.org/pip-2020-12-20" rel="alternate"></link><published>2020-12-20T05:00:00-05:00</published><updated>2020-12-20T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-12-20:/pip-2020-12-20</id><summary type="html">&lt;p class="first last"&gt;Refining test descriptions. Soon, they should be as far along as pseudocode.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I do want to do a bit of pip work today.
It's going to be pretty minor.&lt;/p&gt;
&lt;p&gt;Thing to note: generated packages don't have hashes (I think), which means...
Actually, looking into this, I'm now kind of confused.
The &lt;tt class="docutils literal"&gt;create_basic_wheel_for_package&lt;/tt&gt; helper function contains the following comment: &lt;tt class="docutils literal"&gt;# Have an empty RECORD because we don't want to be checking hashes.&lt;/tt&gt;.
But the &lt;tt class="docutils literal"&gt;test_new_resolver_hashes&lt;/tt&gt; module defines a &lt;tt class="docutils literal"&gt;_create_find_links&lt;/tt&gt; helper that calls these other helpers and associates hashes with the result...&lt;/p&gt;
&lt;p&gt;OH.
I was confused.
The comment was talking about checking hashes of individual files in a package, while the hashes that matter to testing constraints are of the package as a whole.
So, we're good.&lt;/p&gt;
&lt;p&gt;So, I'm going to try to sketch out what the basic tests should be doing:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Create a scratch package&lt;/li&gt;
&lt;li&gt;Generate a &lt;a class="reference external" href="file://"&gt;file://&lt;/a&gt; URL to the package&lt;/li&gt;
&lt;li&gt;Constrain installation of that package to that URL, while installing an unrelated package (either another scratch package, or a data index package)&lt;/li&gt;
&lt;li&gt;Assert that the installation succeeded, and the first package was not installed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Have another test for having an unused constraint to example.com, though I'm not sure what that should do.&lt;/p&gt;
&lt;p&gt;Another test:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Create a scratch package&lt;/li&gt;
&lt;li&gt;Generate a &lt;a class="reference external" href="file://"&gt;file://&lt;/a&gt; URL to the package&lt;/li&gt;
&lt;li&gt;Constrain installation, and install the package&lt;/li&gt;
&lt;li&gt;The constrained URL should have been used.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Another:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Create a scratch package with the same name as a package in the data index, but an intermediate version.&lt;/li&gt;
&lt;li&gt;Generate a &lt;a class="reference external" href="file://"&gt;file://&lt;/a&gt; URL to the package&lt;/li&gt;
&lt;li&gt;Constrain installation of that package to that URL, and install the package, while using the data index.&lt;/li&gt;
&lt;li&gt;The constrained URL should have been used.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As above, but either the constraint or the installation includes a version range incompatible with the scratch package; expect failure.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Create two scratch packages with the same name and different versions&lt;/li&gt;
&lt;li&gt;Generate &lt;a class="reference external" href="file://"&gt;file://&lt;/a&gt; URLs to each&lt;/li&gt;
&lt;li&gt;Constrain installation to both&lt;/li&gt;
&lt;li&gt;If installing an unrelated package, installation should succeed&lt;/li&gt;
&lt;li&gt;If installing the scratch package, installation should fail&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As the second case above, but with a constraint and a requirement, instead of two constraints.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Create a scratch package&lt;/li&gt;
&lt;li&gt;Generate a &lt;a class="reference external" href="file://"&gt;file://&lt;/a&gt; URL to the package&lt;/li&gt;
&lt;li&gt;Constrain the installation to the URL&lt;/li&gt;
&lt;li&gt;Require the package by URL along with the constraint&lt;/li&gt;
&lt;li&gt;Installation should succeed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There's more to outline, but I'm getting tired.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Coding 2020-12-19</title><link href="https://mwchase.neocities.org/coding-2020-12-19" rel="alternate"></link><published>2020-12-19T05:00:00-05:00</published><updated>2020-12-19T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-12-19:/coding-2020-12-19</id><summary type="html">&lt;p class="first last"&gt;Links are supposed to have helpful, descriptive names. Supposed to.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't touch pip today, and I don't want to force myself through it, so I think I'll finally start talking about the side project I was putting in some time on.&lt;/p&gt;
&lt;p&gt;I found out about &lt;a class="reference external" href="https://clojure.org/reference/transducers"&gt;transducers&lt;/a&gt; a few months ago from &lt;a class="reference external" href="https://buttondown.email/hillelwayne/archive/d93e4e7e-2334-45a9-aaf3-3909fa6df775"&gt;Hillel Wayne's newsletter&lt;/a&gt; and twitter.
I found it extremely hard to reconstruct some aspects of the Discourse™ several years down the line (in particular, I don't think I've tracked down any specific examples of Rich Hickey calling something &amp;quot;not transducers&amp;quot;), but the basic concept seems pretty intuitive to me by now.
Consider a section of code that operates on discrete pieces of data one at a time.
We can reify the operation into a function that takes a value representing a state or &amp;quot;accumulator&amp;quot;, and one item to operate on, and returns a new value for the accumulator, that can then be passed back in.
Such a function is called a &amp;quot;reducing function&amp;quot;.
&amp;quot;Transducers&amp;quot; is the new name for &amp;quot;reducing function transformers&amp;quot;, functions that take a reducing function, and return a new one that does some additional operation to the input before passing it to the wrapped function.
The contracts of transducers in Clojure are somewhat more complex, to handle early termination and resource cleanup.&lt;/p&gt;
&lt;p&gt;(People who know Haskell better than I do: apparently this is a special or &amp;quot;perverse&amp;quot; case of something called a &amp;quot;&lt;a class="reference external" href="https://www.reddit.com/r/haskell/comments/2cv6l4/clojures_transducers_are_perverse_lenses/"&gt;lens&lt;/a&gt;&amp;quot;.)&lt;/p&gt;
&lt;p&gt;I'm going to talk now about why anyone went to all of this trouble, and to do that, I'm going to switch programming languages, since my Lisp is &lt;em&gt;extremely&lt;/em&gt; rusty.
(Nothing to do with any of &lt;a class="reference external" href="https://github.com/murarth/ketos"&gt;the&lt;/a&gt; &lt;a class="reference external" href="https://github.com/swgillespie/rust-lisp"&gt;three&lt;/a&gt; &lt;a class="reference external" href="https://stopa.io/post/222"&gt;projects&lt;/a&gt; I just found trying to combine Rust and Lisp.)&lt;/p&gt;
&lt;p&gt;When functions like &lt;tt class="docutils literal"&gt;map&lt;/tt&gt; were added to Python, they took lists, and returned lists.
Since Python is eagerly evaluated, compared to languages like Haskell, this meant that both the input and the output lists had to exist in memory simultaneously, but &lt;em&gt;so did any intermediate lists&lt;/em&gt;.
These operations would build up each intermediate list in memory, then discard it.
As such the memory consumed by such an operation would be several times that of the only lists that the user specifically cared about: the input and the output.&lt;/p&gt;
&lt;p&gt;Various additions and reforms were made to the standard library to combat this.
The builtin functions were given the ability to accept iterable values, which could produce values one-at-a-time, but they could not change their output type until the Python 3 compatibility break.
Until then, Python 2.3 and onward had the itertools library, which provided versions of builtin functions that return iterable values, and still provides additional functions for working with iterables, that did not make it into the builtins module.&lt;/p&gt;
&lt;p&gt;Until Python 3, we see this kind of tabular relation, where one axis is &lt;em&gt;what we're doing to the data&lt;/em&gt;, and the other axis is &lt;em&gt;how we're passing data in and out&lt;/em&gt;.
&lt;tt class="docutils literal"&gt;map&lt;/tt&gt; corresponds to &lt;tt class="docutils literal"&gt;imap&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;filter&lt;/tt&gt; corresponds to &lt;tt class="docutils literal"&gt;ifilter&lt;/tt&gt;, and so on.
With Python 3, the standard library took the general approach of using iterables where possible; if the old behavior was desired, the output could be wrapped in a call to &lt;tt class="docutils literal"&gt;list&lt;/tt&gt;.
So, the duplication of effort was resolved.
Except.
Several years later, the &lt;tt class="docutils literal"&gt;async&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;await&lt;/tt&gt; keywords were added to Python 3.5.
In particular, the &lt;tt class="docutils literal"&gt;async for&lt;/tt&gt; statement was added, which operates over &lt;em&gt;asynchronous&lt;/em&gt; iterables.
There have been &lt;a class="reference external" href="https://pypi.org/project/aitertools/"&gt;efforts to make async versions of itertools functions&lt;/a&gt;, and I can't say for sure that the builtin functions won't somehow adapt to support both kinds of iterable, but any such efforts are not guaranteed to extend cleanly to third-party libraries, and the more of these functions we care about, the more effort it is to get every version of them up to the same level of functionality, the more raw code there is, and thefore the greater risk of bugs.
With functions written like &lt;tt class="docutils literal"&gt;map&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;filter&lt;/tt&gt;, we're stuck with the tabular relation between &lt;em&gt;what we're doing to the data&lt;/em&gt; and &lt;em&gt;how we're passing data in and out&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;What if we could abstract those concerns apart, so that, if we have m stream operations, and n stream sources, we have m + n functions, rather than m * n?
That's the motivation for rewriting these functions as reducing functions!
That way, we can have &amp;quot;a reducing function that maps&amp;quot; and &amp;quot;a function that calls a reducing function in a for loop&amp;quot; and recover Python 3's &lt;tt class="docutils literal"&gt;map&lt;/tt&gt;.
More interestingly, if the interfaces involved are solid enough, two different projects can define these functions independently, and another project could put them together, and have it just work.&lt;/p&gt;
&lt;p&gt;Now, that motivation is for reducing functions.
It doesn't touch on transducers.
The idea of transducers is to make it easier to write a desired reducing function, by applying a sequence of transformations to the input data.
That way, the function to drive the reducer only needs to be called once, and the data doesn't have to constantly round-trip through different formats.
It's the difference between &lt;tt class="docutils literal"&gt;the_same_driver_every_time(reducer_1, the_same_driver_every_time(reducer_2, source))&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;the_same_driver_every_time(transducer_1(transducer_2(base_reducer)),&lt;/span&gt; source)&lt;/tt&gt;.
The difference can add up as you add more operations.&lt;/p&gt;
&lt;p&gt;So, transducers seem pretty cool to me.
On their own, they haven't yet convinced me to pick up Clojure, so I've been looking into transducers implementations for Python.
There's &lt;a class="reference external" href="https://github.com/sixty-north/python-transducers"&gt;an existing project&lt;/a&gt;, but it hasn't been updated in years, and the code style is... not what I would write.&lt;/p&gt;
&lt;p&gt;(&amp;quot;Oh boy, here we go again.&amp;quot;)&lt;/p&gt;
&lt;p&gt;There are many decisions I could disagree with, but the biggest issue for me is the lack of type annotations.
I've had trouble in the past articulating why I think people should use type analysis tools for Python, because the gains in documentation quality and confidence were just so, so obvious to me once I tried it.
Now, &lt;a class="reference external" href="https://rakhim.org/summary-of-transducers-a-talk-by-rich-hickey/#transducer-types"&gt;typed transducers&lt;/a&gt; (ignoring the Haskellers going &amp;quot;They're lenses!&amp;quot;) is apparently a contentious topic.
For my part, I find the argument of &amp;quot;the type of the accumulator can change between steps, so you can't assign it a static type&amp;quot; unpersuasive.
Just use a union.
(&amp;quot;Sum!&amp;quot; &amp;quot;Enum!&amp;quot;)
It's true that using unions obscures runtime relations between input and output types, but I don't know where the implicit requirement that the static types have such detailed knowledge of the runtime relations &lt;em&gt;comes from&lt;/em&gt;.
What would the type system even do with that information?
Unless the length of the input is known statically (which seems like a dubious assumption when potentially infinite streams are involved), the final value has to collapse into a union anyway, and if it &lt;em&gt;is&lt;/em&gt; known statically, then we're getting into &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Dependent_type"&gt;dependent types&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To put it another way, this sounds to me like rejecting typing systems in general, because there exist typing systems that cannot handle function definitions like &lt;tt class="docutils literal"&gt;double: Int &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; EvenInt&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;increment: EvenInt &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; OddInt; increment: OddInt &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; EvenInt&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;All this is to say that I'm not going to let Rich Hickey's opinions stop me from trying to add type annotations to the python-transducers package.
I &lt;em&gt;will&lt;/em&gt; let the code itself stop me, though.
In my efforts, I ran across code that I couldn't properly annotate because, considering what it actually does, I couldn't convince myself it was correct.
As a result of this, I attempted a from-scratch rewrite with types from the beginning, rather than forced in afterwards.
This effort failed, because I hadn't looked at the provided reducing functions, some of which do things that surprised me, and which defeated my first attempt at typing.&lt;/p&gt;
&lt;p&gt;After I had some time to think, I began my second rewrite, in which I used my intuitions about types to guide changes to the interfaces.
As such, even though the code I have fulfills the same goals as transducers, as I understand them, I actually wouldn't mind if anyone looked at them and said &amp;quot;those aren't transducers!&amp;quot;
There are obvious differences, that exist for possibly-subtle reasons.
This is entirely hypothetical, for now, because I'm not currently in the habit of shoving out half-finished projects that aren't even used anywhere.
(Do I want to do anything about my current slate of half-finished, unused projects?
Eeehhh, effort.)&lt;/p&gt;
&lt;p&gt;Maybe later I'll go into more detail about the code I actually wrote, but first I'd like to confirm that it's usable, and that, um, has kind of a stumbling block, because my rewrites are in the genre of &amp;quot;writing a bunch of code because the structure of the code provides an intellectual challenge&amp;quot;.
I'm not writing a standard library, or any generally-useful extensions.
I don't have any projects where I see myself explicitly being generic in how a reducing function is to be called.
I've done a bunch of these kinds of solutions-in-search-of-problems over the years, and they're probably educational, but they eventually stop being &lt;em&gt;satisfying&lt;/em&gt;, which is why I'm leaning towards putting this rewrite on the back burner.&lt;/p&gt;
&lt;p&gt;Anyway, it's late, and I want to be done with this.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Pip 2020-12-18</title><link href="https://mwchase.neocities.org/pip-2020-12-18" rel="alternate"></link><published>2020-12-18T05:00:00-05:00</published><updated>2020-12-18T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-12-18:/pip-2020-12-18</id><summary type="html">&lt;p class="first last"&gt;Still in a holding pattern while I try to gather my strength.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've gotten to a point with the abomination code where I need to just, consider what I'll do with it, if anything.
I'd like a proper project to mess with it in if I go any further, which means this all comes back to the pip stuff.&lt;/p&gt;
&lt;p&gt;For now, I'm going to try to add some context to what I was saying yesterday, because as far as I'm concerned, I'm missing it.&lt;/p&gt;
&lt;p&gt;One thing I need is a package that doesn't depend on anything I care about.
That way, I can install it along with a constraint, to make sure that the constraint is correctly ignored.
For the bulk of the tests, I need packages I can refer to via a URL constraint, which means packages somewhere in the data directory.
The most complicated thing I want is URL-referable packages that refer to a requirement by URL.
For that, I basically want to throw together various combinations of URL requirement and constraint, and confirm they behave as expected.
For that, I need to somehow generate those packages...&lt;/p&gt;
&lt;p&gt;So, the first two have plenty of packages in the test index already that look perfect for that.&lt;/p&gt;
&lt;p&gt;So, I just need to figure out how to generate a package (check) and refer to it by file URL rather than by name (I'll get back to you).
Ah, got it, I just need to &lt;em&gt;not&lt;/em&gt; use the scratch path as an index, and instead generate file URLs to its contents.
With this, I can also more cleanly create packages that aren't in the index being used.
This system is... still a little magic, to be honest, but not quite as magic as I thought.&lt;/p&gt;
&lt;p&gt;I think I understand it well enough now to actually write tests, once I collect my thoughts.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to wrap up now and take it easy for a bit.
Easy-easy, not &amp;quot;borderline incomprehensible higher-level functions&amp;quot; easy.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Pip 2020-12-17</title><link href="https://mwchase.neocities.org/pip-2020-12-17" rel="alternate"></link><published>2020-12-17T05:00:00-05:00</published><updated>2020-12-17T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-12-17:/pip-2020-12-17</id><summary type="html">&lt;p class="first last"&gt;Incremental progress.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I spent a bunch of today playing Nova Drift (new high score on my current profile), and refining my code abominations.&lt;/p&gt;
&lt;p&gt;Let's see if I can't do some quick planning, though.&lt;/p&gt;
&lt;p&gt;I need packages something like:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&amp;quot;standalone&amp;quot;, say version 1.0.0&lt;/li&gt;
&lt;li&gt;&amp;quot;forked&amp;quot;, version 1.0.0, with URL versions 2.0.0 and 3.0.0&lt;/li&gt;
&lt;li&gt;&amp;quot;forked_again&amp;quot;, with URL versions 1.0.0 and 2.0.0 (relate to &amp;quot;forked&amp;quot;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It occurs to me that I may want tests involving packages where the fork has an identical version.
It should be sufficient to have this as a variant of the second bullet, but with no relation to the third bullet.&lt;/p&gt;
&lt;p&gt;I'll try to work on these over the weekend.
For now, I just want to focus on relaxing.
Which is something that I'll have to accept I might have a strange definition of.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Pip 2020-12-16</title><link href="https://mwchase.neocities.org/pip-2020-12-16" rel="alternate"></link><published>2020-12-16T05:00:00-05:00</published><updated>2020-12-16T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-12-16:/pip-2020-12-16</id><summary type="html">&lt;p class="first last"&gt;I don't need much, but I do need to figure out how much I need.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, let's see about an inventory of the packages I'll need.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;A package that can be referred to by URL. It should be well-formed, and I need to be able to check whether it is installed.&lt;/li&gt;
&lt;li&gt;A package with multiple versions, which can be referred to by URLs.&lt;/li&gt;
&lt;li&gt;A package with a version in the index, and a different version that can be referred to by URL.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That covers most of the tests, and can be accomplished with a single package that has one indexed version and two URL versions.&lt;/p&gt;
&lt;p&gt;In case I want more elaborate tests, I could have stuff like, a package that depends explicitly on one of the URL packages.
Then, constraining to the other version should fail.&lt;/p&gt;
&lt;p&gt;And, for something more elaborate, having two versions of a package that each depend on different URLs.
That raises a few questions that probably apply more generally.
Suppose the latest version of the dependent is installed (no constraints), and either the dependent, or an unrelated package, is installed unqualified, but constraining the URL dependency.&lt;/p&gt;
&lt;p&gt;So, the minimal kind of set for that is:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Package with no relations&lt;/li&gt;
&lt;li&gt;Package with one version in index, and two versions that need URLs to locate&lt;/li&gt;
&lt;li&gt;Package with one version in index (depends on one URL version), and one version in another index (depends on the other URL version)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As long as usable hashes can be generated for any of these packages, I think that should be enough for a start.&lt;/p&gt;
&lt;p&gt;Okay, that's some solid planning.
I'm going to unwind by coding some abominations.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Weekly Roundup 2020-12-15</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-12-15" rel="alternate"></link><published>2020-12-15T05:00:00-05:00</published><updated>2020-12-15T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-12-15:/weekly-roundup-2020-12-15</id><summary type="html">&lt;p class="first last"&gt;Drawn to software projects with no clear purpose like a moth to a flame.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I worked on getting pip's tests to pass. In part, this involved reworking my vcs setup.&lt;/li&gt;
&lt;li&gt;Thursday: I started sketching out tests for the new functionality.&lt;/li&gt;
&lt;li&gt;Friday: I mostly did other stuff, but also started familiarizing myself with pip's test layout. And sketched out a few more tests.&lt;/li&gt;
&lt;li&gt;Saturday: I worked on understanding the existing tests  little better.&lt;/li&gt;
&lt;li&gt;Sunday: I messed with some other coding stuff that didn't really work out. I &lt;em&gt;might&lt;/em&gt; be able to wring something out of it.&lt;/li&gt;
&lt;li&gt;Monday: I played Nova Drift, and did a little more investigation and thinking about how to test URL constraints with pip.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I might take another crack at the side project I gave up on, but I definitely want to start writing tests for pip.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Pip 2020-12-14</title><link href="https://mwchase.neocities.org/pip-2020-12-14" rel="alternate"></link><published>2020-12-14T05:00:00-05:00</published><updated>2020-12-14T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-12-14:/pip-2020-12-14</id><summary type="html">&lt;p class="first last"&gt;I think I've figured out where everything I need is.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I mean, for most of today, I was playing Nova Drift.
But I did just now make some key progress on planning tests for pip.&lt;/p&gt;
&lt;p&gt;Since the feature I'm adding is all about installing packages from URLs, I'll need URLs of packages, and I'd rather not rely on external resources for new tests, so that means leveraging the test data directory.
There are plenty of packages in there; I just have to figure out which ones make sense to install, since some of them are deliberately broken for the sake of particular tests.&lt;/p&gt;
&lt;p&gt;I'm thinking I should probably add and document new packages for it, so there aren't conflicting requirements or concerns for packages.&lt;/p&gt;
&lt;p&gt;I think that was the last piece of the puzzle, for me.
With that, I can convert my brief sketches of tests to a more detailed description, then convert those to tests.&lt;/p&gt;
&lt;p&gt;Anyway, I should wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Diary 2020-12-13</title><link href="https://mwchase.neocities.org/diary-2020-12-13" rel="alternate"></link><published>2020-12-13T05:00:00-05:00</published><updated>2020-12-13T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-12-13:/diary-2020-12-13</id><summary type="html">&lt;p class="first last"&gt;Sort of a frustrating day, in retrospect. Oh well.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't touch pip today.
I messed some more with the coding stuff I was trying to do on the side.
I'm not writing that up yet because I need to either find a language that's a better fit for it than Python, or psych myself up to do a postmortem.
Either that, or really go in on changing how it works...
This wasn't really &lt;em&gt;for&lt;/em&gt; anything, so I think it's best to just drop it.&lt;/p&gt;
&lt;p&gt;It would have been nice if I'd had the the focus left over to work on new tests for pip, but oh well.&lt;/p&gt;
&lt;p&gt;I think maybe I need to commit myself to relaxing a bit, then get back into this.&lt;/p&gt;
&lt;p&gt;Anyway, no point in trying to grind out a longer post now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Pip 2020-12-12</title><link href="https://mwchase.neocities.org/pip-2020-12-12" rel="alternate"></link><published>2020-12-12T05:00:00-05:00</published><updated>2020-12-12T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-12-12:/pip-2020-12-12</id><summary type="html">&lt;p class="first last"&gt;Trying to balance recovering my focus with wanting to do stuff...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, I have to &lt;em&gt;understand&lt;/em&gt; the tests of the new resolver before I can write new ones.&lt;/p&gt;
&lt;p&gt;Looks like there are various helpers.
There's the &lt;tt class="docutils literal"&gt;script&lt;/tt&gt; fixture, which is a &lt;tt class="docutils literal"&gt;PipTestEnvironment&lt;/tt&gt;.
That's going to be what ends up executing the various pip commands.
It looks to me like the kind of tests I want are a pretty straightforward translation into the existing idioms.&lt;/p&gt;
&lt;p&gt;I don't know when I'll be up for actually doing the translation, but I'll try to get started in the next few days.&lt;/p&gt;
&lt;p&gt;I'll also need to get rid of some of the existing tests, but that shouldn't be too difficult.&lt;/p&gt;
&lt;p&gt;I'm going to try to wrap up, and by try to wrap up, I mean put in some more work on the other thing I've been messng with.&lt;/p&gt;
&lt;p&gt;(Also, since I took a break from the virtual tabletop stuff, I've had some time to think, and concluded that I've pushed nox too far, so I'm looking into alternatives that would give me stuff like, parallel execution, and dependencies between stages. I've got some plans sketched out, and the migration should be an interesting couple of days, week, month...)&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Pip 2020-12-11</title><link href="https://mwchase.neocities.org/pip-2020-12-11" rel="alternate"></link><published>2020-12-11T05:00:00-05:00</published><updated>2020-12-11T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-12-11:/pip-2020-12-11</id><summary type="html">&lt;p class="first last"&gt;I might write up the other thing later.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I more-or-less took today off so far as working on pip goes, but what I mostly did would require a really extensive explanation, so I'm going to do like ten minutes of work now and write up that instead.&lt;/p&gt;
&lt;p&gt;Looks like the &amp;quot;functional&amp;quot; test directory is a good place to start, since it has two files that mention the new resolver, and constraints.
One of them is specifically for tests involving hashes, which is something I forgot about when I was writing up tests yesterday.&lt;/p&gt;
&lt;p&gt;The basic test cases I think I need to cover are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;URL in constraints, hash in requirements&lt;/li&gt;
&lt;li&gt;URL and hash in constraints (I think hashes in constraints are supported)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In both cases, resolution should succeed (absent other conflicts) if the hash matches the URL payload (I &lt;em&gt;think&lt;/em&gt; that's the proper interpretation), and always fail if they don't match and the package is required.
I think the behavior should basically match what happens if it's all in requirements, so that's a good reference point.&lt;/p&gt;
&lt;p&gt;Anyway, that's some good stuff to have in mind when I get my focus back.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Pip 2020-12-10</title><link href="https://mwchase.neocities.org/pip-2020-12-10" rel="alternate"></link><published>2020-12-10T05:00:00-05:00</published><updated>2020-12-10T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-12-10:/pip-2020-12-10</id><summary type="html">&lt;p class="first last"&gt;I probably missed something.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Status of getting pip's tests running on tox: it turns out that some of the remaining failures are because those test sessions are running in a virtualenv, which... I don't know what to do about that for local development, so I'll just push it off onto PyPA's CI.&lt;/p&gt;
&lt;p&gt;So, now I need to start working on tests for a few different cases:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Specifying a URL constraint but not requiring the package &lt;em&gt;does not&lt;/em&gt; install the package.&lt;/li&gt;
&lt;li&gt;Specifying a URL constraint and installing the package installs the package&lt;/li&gt;
&lt;li&gt;Specifying multiple URL constraints causes resolution to fail&lt;/li&gt;
&lt;li&gt;Specifying one URL constraint and requiring the same URL installs the package&lt;/li&gt;
&lt;li&gt;Specifying one URL constraint and requiring a different URL causes resolution to fail&lt;/li&gt;
&lt;li&gt;Specifying a URL constraint and constraining/requiring a compatible version range installs the package (in the case of constraining, assuming there's a requirement)&lt;/li&gt;
&lt;li&gt;Specifying a URL constraint and constraining/requiring an incompatible version range causes resolution to fail (in the case of constraining, assuming there's a requirement)&lt;/li&gt;
&lt;li&gt;Should probably test that constraints properly do and don't apply when python_version is constrained, but that should Just Work.&lt;/li&gt;
&lt;li&gt;Specifying a URL constraint that is satisfied by an existing installation succeeds&lt;/li&gt;
&lt;li&gt;Specifying a URL constraint that is not satisfied by an existing installation attempts to satisfy the constraint by updating&lt;/li&gt;
&lt;li&gt;Test different URL protocols&lt;/li&gt;
&lt;li&gt;Confirm that &lt;tt class="docutils literal"&gt;pip freeze&lt;/tt&gt; output can be used as a constraint file.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I spaced out and did other stuff, so compiling the list will have to do for now.
I'll look over the existing tests later to see where these fit and what they'd look like.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Pip 2020-12-09</title><link href="https://mwchase.neocities.org/pip-2020-12-09" rel="alternate"></link><published>2020-12-09T05:00:00-05:00</published><updated>2020-12-09T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-12-09:/pip-2020-12-09</id><summary type="html">&lt;p class="first last"&gt;Too old, too new, the important thing is that people can call me a hipster.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The first step in getting tests to pass was to fix up the Mercurial-related tests.
It appears those were broken for me because I was doing something at least somewhat peculiar to have Mercurial available everywhere, but I realized, I don't really use it except for publishing this blog.
(So, the fact that you're reading this means I got everything working well enough.)
Now, Mercurial &lt;em&gt;itself&lt;/em&gt; is not trapped on Python 2, but the latest PyPI release of the extension that is the &lt;em&gt;other&lt;/em&gt; reason I ever use Mercurial nowadays &lt;em&gt;is&lt;/em&gt;, so I undid the global-ish install.
(To an extent.)
I have to stop clinging obnoxiously to the past...&lt;/p&gt;
&lt;p&gt;And start clinging obnoxiously to the future!
The new Pijul alpha is super confusing after versions 0.12 and 0.11, but I don't care!
You hear that, world‽
You can make me use git, but you can't make me like it, and I will gladly use experimental software for my own stuff!&lt;/p&gt;
&lt;p&gt;Anyway, making it so the tests don't hit the wrong Mercurial script fixed some of the tests, but it looks like some tests failed for other reasons.
Those other reasons include &amp;quot;I'm hitting the rate limits that broke pip's CI a few months ago. But this isn't CI. This is a laptop. Oh well.&amp;quot;&lt;/p&gt;
&lt;p&gt;If I can just use the same workaround, I'm happy.&lt;/p&gt;
&lt;p&gt;So, I'm rerunning the tests with the &amp;quot;CI&amp;quot; logic activated, and we'll see how that does.
The next step is getting it to run on every version of Python that isn't EOL.&lt;/p&gt;
&lt;p&gt;Looks like all that is enough to get some of the Pythons to pass.
I'm going to take it easy for the rest of the night while that runs.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Weekly Roundup 2020-12-08</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-12-08" rel="alternate"></link><published>2020-12-08T05:00:00-05:00</published><updated>2020-12-08T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-12-08:/weekly-roundup-2020-12-08</id><summary type="html">&lt;p class="first last"&gt;Trying to imagine how badly this would have gone if I'd just jumped in and started changing code. It would not have been pretty.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I laid out what I knew about pip's new resolver, and what I want to change. (This is in line with an existing issue.)&lt;/li&gt;
&lt;li&gt;Thursday: I did a little research on pip, while sick with... something.&lt;/li&gt;
&lt;li&gt;Friday: I started sketching out what needs to happen for the feature I want to add to pip.&lt;/li&gt;
&lt;li&gt;Saturday: I went into more detail, and asked and answered some new (to me) questions.&lt;/li&gt;
&lt;li&gt;Sunday: I didn't write up much, just posted on the GitHub issue.&lt;/li&gt;
&lt;li&gt;Monday: I got a response on GitHub, which has given me a full initial plan for the changes I want to make to pip.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to work on asking as many questions up-front as I can think of, and converting them to tests before doing work on pip itself.&lt;/p&gt;
&lt;p&gt;Before that, I should probably figure out how to get all of the tests to pass in the first place.
That'll be... interesting.
Good thing I don't have to do that right now!&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Pip 2020-12-07</title><link href="https://mwchase.neocities.org/pip-2020-12-07" rel="alternate"></link><published>2020-12-07T05:00:00-05:00</published><updated>2020-12-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-12-07:/pip-2020-12-07</id><summary type="html">&lt;p class="first last"&gt;Still not sure what form some of the data should be stored in.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, here's what I want to have a plan for currently.
Right now, I can expect that the &lt;tt class="docutils literal"&gt;Candidate&lt;/tt&gt; generated from a URL &lt;tt class="docutils literal"&gt;InstallRequirement&lt;/tt&gt; will have a usable &lt;tt class="docutils literal"&gt;source_link&lt;/tt&gt; field, but I believe I should not rely on that, and be able to generate relevant information from one with that field set to &lt;tt class="docutils literal"&gt;None&lt;/tt&gt;, such as an &lt;tt class="docutils literal"&gt;AlreadyInstalledCandidate&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Per discussion on GitHub, I should get the equivalent information from &lt;tt class="docutils literal"&gt;direct_url_helpers.dist_get_direct_url()&lt;/tt&gt;.
That function takes a &lt;tt class="docutils literal"&gt;Distribution&lt;/tt&gt; and returns an &lt;tt class="docutils literal"&gt;Optional[DirectUrl]&lt;/tt&gt;.
If need be, I can convert a &lt;tt class="docutils literal"&gt;Link&lt;/tt&gt; to a &lt;tt class="docutils literal"&gt;DirectUrl&lt;/tt&gt; using an adjacent function, so that part should be workable.
My next issue is generating a &lt;tt class="docutils literal"&gt;Distribution&lt;/tt&gt; from an &lt;tt class="docutils literal"&gt;AlreadyInstalledCandidate&lt;/tt&gt;.
That's just the &lt;tt class="docutils literal"&gt;dist&lt;/tt&gt; field.
Glad that part was easy.
That field is part of the &lt;tt class="docutils literal"&gt;Candidate&lt;/tt&gt; interface, so it's possible it'd be more stable to always use it.&lt;/p&gt;
&lt;p&gt;Not sure what the preferred way to compare &lt;tt class="docutils literal"&gt;DirectUrl&lt;/tt&gt; instances is, since there's no comparison methods defined on the class.
I'm pretty sure converting them to a &lt;tt class="docutils literal"&gt;dict&lt;/tt&gt; would work, since the tests do something similar.&lt;/p&gt;
&lt;p&gt;Since I've now got a plan for implementing this stuff, I think next I should be putting together tests so I can have some confidence in all of this when I start putting it together.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Pip 2020-12-06</title><link href="https://mwchase.neocities.org/pip-2020-12-06" rel="alternate"></link><published>2020-12-06T05:00:00-05:00</published><updated>2020-12-06T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-12-06:/pip-2020-12-06</id><summary type="html">&lt;p class="first last"&gt;Some minor concerns, nothing too worrying.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Not much done with pip, a little research into potential issues.
I got distracted by that and spaced out, so I'm going to post this, post an update in the GitHub issue, and wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Pip 2020-12-05</title><link href="https://mwchase.neocities.org/pip-2020-12-05" rel="alternate"></link><published>2020-12-05T05:00:00-05:00</published><updated>2020-12-05T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-12-05:/pip-2020-12-05</id><summary type="html">&lt;p class="first last"&gt;Doing a lot of work to figure out how much extra work I need to do, and it turns out it's &amp;quot;none&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I just did some cursory research on usage of URL constraints, and didn't find anything new.&lt;/p&gt;
&lt;p&gt;Here's what I'm thinking so far.&lt;/p&gt;
&lt;p&gt;Per pfmoore's thoughts on the behavior, each URL constraint should apply to all candidates, which means that, in practice, two URL constraints together should always fail, though the logic shouldn't be frontloaded.
So, the Constraint object can build up a set of Link objects; the empty constraint has an empty set, and the &lt;tt class="docutils literal"&gt;__bool__&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;__and__&lt;/tt&gt; methods behave accordingly.
To check whether a Candidate satisfies the Link objects, every Link must be compared against the Candidate's &lt;tt class="docutils literal"&gt;source_link&lt;/tt&gt;, and they all have to match.&lt;/p&gt;
&lt;p&gt;As I was typing this up, some questions occurred to me:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;It looks like python_version constraints are not rejected by the same code that rejects URL constraints. Are they possible, and, if so, how do they act on their own? How do they act in conjunction with any given implementation of URL constraints?&lt;/li&gt;
&lt;li&gt;What happens when the requirement is already installed? Is it guaranteed that a LinkCandidate will be generated? What behavior does the AlreadyInstalledCandidate have? Are there any inconsistencies between this and requiring the URL directly? (I think I've noticed that URL requirements always reinstall, while requiring the bare name just succeeds, so the behavior I think it'll have should be acceptable.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Okay, looking into the first, this looks a little gnarly.
&lt;tt class="docutils literal"&gt;requires_python&lt;/tt&gt; is evidently a &lt;em&gt;Link&lt;/em&gt; field, which means it'll definitely be associated with Links, but it seems to me that the only sensible interpretation of it is to consider the Link to match all candidates if the Python version &lt;em&gt;doesn't&lt;/em&gt; line up.
The other option I see is to evaluate Links as they come in, which I'm really not sure how to do.&lt;/p&gt;
&lt;p&gt;I'll need to figure out what the current implementation does for non-URL constraints/requirements, because it looks like it does treat them as I expected.
I'm not sure if I need to do anything then...
Okay, got it.
There's logic that runs for constraints, which I'm not sure how it filters out non-satisfying Python version constraints, but experimentally, it does.
That means only relevant constraints will be added, and I don't have to do any extra legwork on them once they show up.&lt;/p&gt;
&lt;p&gt;Random bit of advice for anyone taking the same approach as me to figuring out how pip works: the attrs package has a bunch of versions, and no dependencies.
I haven't touched dependencies-of-dependencies, or anything like that, yet.
That's going to be a whole thing.&lt;/p&gt;
&lt;p&gt;Okay, so setting up the initial prototype for this should be relatively straightforward.
We shall see.
Later.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Pip 2020-12-04</title><link href="https://mwchase.neocities.org/pip-2020-12-04" rel="alternate"></link><published>2020-12-04T05:00:00-05:00</published><updated>2020-12-04T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-12-04:/pip-2020-12-04</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;I don't get it I don't get it I don't get it I... sort of get it.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I searched through pip's source code enough that I've worked out approximately what needs to change.
I'll probably run up against something horrible, but we'll see.&lt;/p&gt;
&lt;p&gt;Anyway, I should make sure I know about the use cases so I can make sure that things work:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Redirect installation of a package to a fork hosted on a website. (Useful for projects with common overrides, but many environments that may not need everything installed.)&lt;/li&gt;
&lt;li&gt;Redirect installation of a package to a local file (I'm not sure if people besides me do this)&lt;/li&gt;
&lt;li&gt;Run &lt;tt class="docutils literal"&gt;pip freeze&lt;/tt&gt; against an environment. Use the result as a constraint file when recreating it. This means that the packages installed in the recreated environment will be a subset of the original environment (provided the project didn't add requirements), but if the project has dropped some requirements, it will be a smaller subset. This workflow requires URL constraints because &lt;tt class="docutils literal"&gt;pip freeze&lt;/tt&gt; will output URL requirements, if applicable. (In any case, this works out to controlling the evolution of a project over time.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To be honest, my use case is probably the weakest, since it works out to &amp;quot;basically a devpi index with less steps&amp;quot;.
But I think all of these use cases require the same basic functionality, so it works out.&lt;/p&gt;
&lt;p&gt;Anyway, I should probably do a broader survey of use cases before moving on, just to make sure I'm not missing something.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Pip 2020-12-03</title><link href="https://mwchase.neocities.org/pip-2020-12-03" rel="alternate"></link><published>2020-12-03T05:00:00-05:00</published><updated>2020-12-03T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-12-03:/pip-2020-12-03</id><summary type="html">&lt;p class="first last"&gt;Bit of a slow day. It happens.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was distracted today, and now I feel a little sick.
(If my sense of smell goes away, I'll mention it.
Right now, it's extremely present.)&lt;/p&gt;
&lt;p&gt;Point is, I got just a little work done researching how pip works.
What I concluded is, there doesn't seem to be much documentation (at least, on what I want to know) anywhere obvious, so to make progress, I'm going to have to formulate a bunch of basic questions, then work on answering them, and possibly write stuff up to flesh out the documentation.&lt;/p&gt;
&lt;p&gt;I'll hopefully make progress there by the end of the week.
Right now, I just want to work on not feeling gross.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Pip 2020-12-02</title><link href="https://mwchase.neocities.org/pip-2020-12-02" rel="alternate"></link><published>2020-12-02T05:00:00-05:00</published><updated>2020-12-02T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-12-02:/pip-2020-12-02</id><summary type="html">&lt;p class="first last"&gt;Getting ready to put in a lot of effort, to avoid... probably less effort, but eeeeh.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;What I know about pip's new resolver:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;People wrote stuff about how pip isn't a proper package manager, and I think the new resolver is supposed to address that.&lt;/li&gt;
&lt;li&gt;Supposed to make it harder to end up in an inconsistent state. In my own code, I mostly work with small virtualenvs, but at work, we addressed our various packaging woes by pinning every single package version, which &lt;em&gt;sort of&lt;/em&gt; worked.&lt;/li&gt;
&lt;li&gt;Everything I've read about the new resolver makes it sound like it's a pretty pervasive rewrite.&lt;/li&gt;
&lt;li&gt;In particular, some functionality that was &lt;em&gt;officially&lt;/em&gt; never supported was removed.&lt;/li&gt;
&lt;li&gt;That last sentence is salty because I got the idea for using said functionality from the documentation introducing one component of it; that documentation has been unchanged since the feature was introduced, so I'd &lt;em&gt;sure as heck&lt;/em&gt; like to know what the original intention was supposed to be.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Okay, here's the deal.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I'm developing groups of related packages in concert, and for testing and packaging purposes, I need to be able to install these packages, which depend on each other, through pip (or some other PEP 517 frontend, which I don't think really exists yet).&lt;/li&gt;
&lt;li&gt;I want to install my copy of a package, even if it's also available on PyPI, and I don't want to have to think about whether it is.&lt;/li&gt;
&lt;li&gt;I've attempted various ways to accomplish this, but the easiest way I found to do it with the old resolver is to dynamically define constraints files that use absolute file URLs to point to the project paths. (I could potentially make this faster by building wheels, but I'm not feeling bottlenecked by pip currently.) (I also added normal constraints on the third-party packages so I don't have to duplicate those in all of the pyproject files, but those constraints could live in a separate static file.)&lt;/li&gt;
&lt;li&gt;Currently, this doesn't work with the new resolver, because constraints &amp;quot;were never supposed to work like that&amp;quot;.&lt;/li&gt;
&lt;li&gt;But there's enough demand for the feature that there's a design sketched out, and it'll happen when...&lt;/li&gt;
&lt;li&gt;When they get a PR.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, if I try to write that PR, that's a lot of effort on my part, and it could be pretty complicated.
But consider: my alternative is something like devpi, which I would have to commit to setting up on every machine I do personal projects on.
If I can manage to implement this (or help someone else do it; I just want it done), then I don't have to change my workflow, and it'll continue to just work, with only the bare minimum required setup.
(Like, this current project's code is just... not going to work without Python 3.8 or later.)&lt;/p&gt;
&lt;p&gt;So, what do I think I know about what has to change?&lt;/p&gt;
&lt;p&gt;Well, old-style constraints are basically old-style requirements in a funny hat, and new-style constraints are their own specific thing.
I &lt;em&gt;believe&lt;/em&gt; that getting URL constraints to work requires the creation of a new kind of constraint, so the first thing I want to look at is how new-style constraints are defined, and used.&lt;/p&gt;
&lt;p&gt;So, let's get into it.&lt;/p&gt;
&lt;p&gt;Okay, some of the logic lives in pip itself, and some of it lives in resolvelib.
Or is resolvelib vendored? Not sure the modules match up.
Okay, looks like any changes I make need to be in resolvelib (or packaging? Looks more likely to be packaging) first, then the vendored copies need to be updated.&lt;/p&gt;
&lt;p&gt;Okay, I confused myself several times looking into that.
Here's what I've got currently:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Some of the logic that is relevant to this lives outside the vendored packages, so doing this will involve some non-trivial changes to pip's code.&lt;/li&gt;
&lt;li&gt;I don't know how flexible the vendored packages are, so they might need some changes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To get started, I decided to just follow along with the development documentation.
I've got pip cloned, and tox is running tests.
There are a few failures so far; I'll have to see later if those are expected, or something I need to fix in my environment.
It's also probably going to yell at me about missing Python versions, since I didn't try to reach parity with what pip supports.&lt;/p&gt;
&lt;p&gt;I don't know how much more I'm going to get done tonight; I want to just see the baseline state of the fresh clone.
I should probably also mention this in the GitHub issue, make sure to communicate, like, basic things.&lt;/p&gt;
&lt;p&gt;Update from running tox: it is, in fact, complaining to me about missing pythons.
Including some that I see installed under pyenv.
Oh dear, this could get messy.&lt;/p&gt;
&lt;p&gt;Well, I'll work things out tomorrow.
For now, I'd like to wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Pip"></category></entry><entry><title>Weekly Roundup 2020-12-01</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-12-01" rel="alternate"></link><published>2020-12-01T05:00:00-05:00</published><updated>2020-12-01T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-12-01:/weekly-roundup-2020-12-01</id><summary type="html">&lt;p class="first last"&gt;I am on &lt;em&gt;many&lt;/em&gt; cutting edges.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I investigated browser-based Python stuff a little more, and found more bugs. (I found even more today; we'll see what comes of them.) I also did some work on the punq fork.&lt;/li&gt;
&lt;li&gt;Thursday: I rewrote my AST visitor code to use eval instead.&lt;/li&gt;
&lt;li&gt;Friday: I got the eval code working. The resulting code is significantly slower under test, I think because of the greater amount of work required by this approach. I think it'll be worth it, though.&lt;/li&gt;
&lt;li&gt;Saturday: I set up profiling for all of the test suites, and determined that I can mitigate the slowdown using an LRU cache, so I'm doing that. I started pondering refinements and changes to the rough interface that I... &amp;quot;designed&amp;quot; is the wrong word.&lt;/li&gt;
&lt;li&gt;Sunday: I made some progress on the Mythic CLI, and found other things that I'd like to do differently.&lt;/li&gt;
&lt;li&gt;Monday: I wasn't up for much, so I just got the test suite to basically pass again.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm working on actually planning this stuff, both in terms of what to refactor, and what I'm going to implement.
I've got a big list of stuff that I'm going to flesh out with more and more information, including my plans for localization, and what I want to implement, from each of the seven systems.&lt;/p&gt;
&lt;p&gt;One other thing that I apparently have to work out if I ever want to upgrade pip again for these projects, is how to replicate my old constraints-based flow, which is &lt;em&gt;totally&lt;/em&gt; not &lt;a class="reference external" href="https://github.com/pypa/pip/pull/2857/files#diff-4b46e99840eeda55b0a1d8078707997092936e42dcc8804f25f165b6abe2a90f"&gt;how constraints files were meant to be used&lt;/a&gt;.
The cleanest way is probably devpi, but... effort.
The quickstart tells me to set up supervisord, and the first time I tried that, it didn't feel quick &lt;em&gt;at all&lt;/em&gt;.
I'll try again later, I guess.
Or, I can try reimplementing URL constraints myself.
PRs welcome, and all.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2020-11-30</title><link href="https://mwchase.neocities.org/coding-2020-11-30" rel="alternate"></link><published>2020-11-30T05:00:00-05:00</published><updated>2020-11-30T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-11-30:/coding-2020-11-30</id><summary type="html">&lt;p class="first last"&gt;Short post because I don't feel like trying to write a lot.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I made some tweaks to the Mythic CLI so the tests pass, even though I'm pretty sure at least some of the code just doesn't work.&lt;/p&gt;
&lt;p&gt;I've got two broad categories of thing I want to work on: improvements to existing code, along various axes, and planning out the large amount of code that remains to be added.&lt;/p&gt;
&lt;p&gt;I'm feeling about done for tonight, so I'll leave this post there and think about what I want to work on next.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-11-29</title><link href="https://mwchase.neocities.org/coding-2020-11-29" rel="alternate"></link><published>2020-11-29T05:00:00-05:00</published><updated>2020-11-29T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-11-29:/coding-2020-11-29</id><summary type="html">&lt;p class="first last"&gt;Thinking of tinkering with some other unrelated bits of this project.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The big things missing currently from my prototype Mythic CLI (besides rolls &lt;em&gt;not&lt;/em&gt; based on the Fate Chart), are working converters to generate the types required by the endpoints.&lt;/p&gt;
&lt;p&gt;Other things I noticed:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I ended up writing a small amount of formatting logic that I'd rather push off on a localization system, which raises the question for me of how I want to handle localization. Like, okay, each library is going to have a set of messages that it generates, and will presumably provide localizations for them, so I guess I need to have my libraries define functions that'll load a set of locale roots into a set, and recurse into other libraries to make sure they're covered? Maybe?&lt;/li&gt;
&lt;li&gt;I messed around with the roll implementation some more, and it is so disorganized in there. So disorganized. I think I need to take a break from this code for a bit, then come back to it later with an eye on simplifying things a lot.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I spaced out a bit writing that up and researching localization, so I guess I'm done for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-11-28</title><link href="https://mwchase.neocities.org/coding-2020-11-28" rel="alternate"></link><published>2020-11-28T05:00:00-05:00</published><updated>2020-11-28T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-11-28:/coding-2020-11-28</id><summary type="html">&lt;p class="first last"&gt;Discovering some pretty severe tech debt.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got nearly all the components of Mythic's fate roll put together.
The sheer volume of code I've written for this makes me kind of question my approach here, but I'm hoping this is just kind of a reflection of the underying complexity of the full rules.&lt;/p&gt;
&lt;p&gt;I'm kind of reeling from all of that.&lt;/p&gt;
&lt;p&gt;Anyway, I also put together &lt;a class="reference external" href="https://github.com/joerick/pyinstrument"&gt;Pyinstrument&lt;/a&gt; profiling for all of the packages.
Right now, it only works on the test suites, so it's not really representative, although it does confirm that my very newest code in the punq fork takes up a huge portion of execution time.
I'm not up for much more tonight, but I will try slapping an LRU cache on the top-level function and see if that does anything.
Okay, that makes the tests up to ten times faster, which is helpful.
It's unlikely that the shiv will benefit as much, since the cache gets thrown away at the end, but this will probably be extemely helpful once I start putting together larger apps using this same code.&lt;/p&gt;
&lt;p&gt;One thing I realized from putting together the Mythic stuff, and I'll have to do something about this later, is that I picked the wrong signature for prompting the user for input.
When using Tk, this is going to be, like, a modal popup with generated widgets.
Currently, the interface is &amp;quot;give user string, receive string from user&amp;quot;, which can't work with that generically, unless I write a parser to parse out the string that I &lt;em&gt;just&lt;/em&gt; generated, which I'm not going to do.
I'm going to need to make the interface something like &amp;quot;provide a &lt;tt class="docutils literal"&gt;Question[T]&lt;/tt&gt;, receive a &lt;tt class="docutils literal"&gt;T&lt;/tt&gt;&amp;quot;, where the &lt;tt class="docutils literal"&gt;Question&lt;/tt&gt; type does not exist yet.
To figure out what kind of range it needs to allow, I'm going to have to review all of the systems I want to port.&lt;/p&gt;
&lt;p&gt;None of that is going to happen today, because it is almost midnight now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-11-27</title><link href="https://mwchase.neocities.org/coding-2020-11-27" rel="alternate"></link><published>2020-11-27T05:00:00-05:00</published><updated>2020-11-27T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-11-27:/coding-2020-11-27</id><summary type="html">&lt;p class="first last"&gt;I'm skilled enough to answer my own questions that are such that, if I put them on StackOverflow, everyone would say &amp;quot;You shouldn't do that&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I wired in the eval logic.
It required some minor changes to the supporting types.
Basically, I needed a custom str-stype function that renders &lt;tt class="docutils literal"&gt;Ellipsis&lt;/tt&gt; as &lt;tt class="docutils literal"&gt;...&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;With that in place, and a few iterations on the updated code, I've got the new version up and running.
It's... somewhat easier to understand than the old code, I think.
It might be slower—I didn't actually measure it, since I'm more concerned about getting the code working and correct, than I am about blazing performance.
Subjectively, the Risus shiv has fine performance.&lt;/p&gt;
&lt;p&gt;There are still some minor coverage holes, but I think tomorrow I'll switch back to Mythic.
My current design for (parts of) Mythic will stress the punq fork a little harder, but honestly not much so.&lt;/p&gt;
&lt;p&gt;So, stuff to look into:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Cleaning up my scattered prototype code for Mythic.&lt;/li&gt;
&lt;li&gt;Creating a toy build setup for Brython; not sure what kind of metadata I'd need to add to get this to, like, work, from my end.&lt;/li&gt;
&lt;li&gt;Setting up profiling so I know where the hot code paths are.&lt;/li&gt;
&lt;li&gt;Not really relevant to this yet, but I wonder if Trio's scheduler can be used to implement causal profiling. That might come in handy when I have a lot of code hooked into GUI libraries.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, it's late, so I guess I'm done.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-11-26</title><link href="https://mwchase.neocities.org/coding-2020-11-26" rel="alternate"></link><published>2020-11-26T05:00:00-05:00</published><updated>2020-11-26T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-11-26:/coding-2020-11-26</id><summary type="html">&lt;p class="first last"&gt;I'm not sure metaprogramming in Python is ever chill. It's always some horrible hack or some 2kewl trick. Kind of a shame.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've attempted a rewrite from AST parse-and-process stuff to a version based on doing horrible things with the &lt;tt class="docutils literal"&gt;eval&lt;/tt&gt; builtin.
Fortunately, if I'm understanding my own code correctly, most of the logic lives outside the code I'm replacing, which essentially acts as glue code for moving around a bunch of data types.&lt;/p&gt;
&lt;p&gt;If this doesn't work out, and maybe even if it does, I think I should try to be a little more rigorous in my requirements, because the way I'm doing this now, basically creating a weird sandbox interpreter that sort of operates solely on the outermost representation of the program data, it's, um, weird and uncomfortable.&lt;/p&gt;
&lt;p&gt;As per usual, I'm getting this highly complicated code put together pretty late at night, so my plan is to publish this entry, set up the code paths, run the tests, and call it a night.&lt;/p&gt;
&lt;p&gt;And I'm just about ready to do that.
Wrapping up now...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-11-25</title><link href="https://mwchase.neocities.org/coding-2020-11-25" rel="alternate"></link><published>2020-11-25T05:00:00-05:00</published><updated>2020-11-25T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-11-25:/coding-2020-11-25</id><summary type="html">&lt;p class="first last"&gt;Multi-yak shaving&lt;/p&gt;
</summary><content type="html">&lt;p&gt;It looks like Pyodide has some level of incompatibility with Trio, which will go away, or I can roll a weird messed-up shim library to paper over it, and either way, I'll see what's broken next.
I want to get Trio working under Pyodide in the event that I try to port to it, because I went all in on async, and I'm fairly sure Trio's guest mode can act as an adaptor between async and Pyodide's promises API.
The other possibility is trying to build some sort of minimal wrapper to do the translation.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Anyway&lt;/em&gt;, what I actually did today was work on improving the punq fork coverage.
It's not fully covered, but it's much better.
I'm just now adding a test for one bit of functionality that I'm not sure it's implemented.
Once I've got that passing, I'm honestly tempted to just do the rewrite to get rid of the &lt;tt class="docutils literal"&gt;ast&lt;/tt&gt; module.
And the test passed.
Slightly freaky, given that I don't remember what I did to make it pass, but I'll take it.&lt;/p&gt;
&lt;p&gt;Anyway, the rewrite is desirable to me because it should actually make it more obvious what's happening, because my first plan should be expressible in terms of documented runtime behavior, rather than solely in terms of syntax properties, so it should also be more stable, and more obvious if I miss something.&lt;/p&gt;
&lt;p&gt;Okay, that's enough spacing out before hitting &amp;quot;publish&amp;quot;.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2020-11-24</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-11-24" rel="alternate"></link><published>2020-11-24T05:00:00-05:00</published><updated>2020-11-24T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-11-24:/weekly-roundup-2020-11-24</id><summary type="html">&lt;p class="first last"&gt;Final evaluation of whatever the heck I had/still kind of have: not covid, not as bad as covid; I'm not a fan of the various things it did to my face. I only worked as hard as I did last week, because one of the effects of being sick was &lt;em&gt;not realizing how sick I was&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I started working on the Gilded Rose Kata and trying out Ward.&lt;/li&gt;
&lt;li&gt;Thursday: I made good progress on the kata, and worked to understand Ward better.&lt;/li&gt;
&lt;li&gt;Friday: I started noticing how sick I was all week, and worked on refactoring the kata code.&lt;/li&gt;
&lt;li&gt;Saturday: I got tired of the kata, so I got some stuff &amp;quot;done enough&amp;quot; for it, and changed gears. I started thinking about bits of tooling I'll need for my other projects.&lt;/li&gt;
&lt;li&gt;Sunday: I got shiv working with the virtual tabletop stuff, which means now I get automated building of command-line utilities. The one I have so far is about 700 kB.&lt;/li&gt;
&lt;li&gt;Monday: I approached things from a few angles. I evaluated various ways I could run this code in the browser, mostly out of curiosity. I determined that Pyodide would work, but require a somewhat involved build process, and Brython should work, if I rewrite some of my code to be more portable. I thought a little bit about those changes. I also tried to make some progress porting Mythic over, and developed a plan, which I was too tired to execute on last night, and I'm too tired now.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to clean up the Mythic code, which got really disorganized because I wasn't sure what I was doing, add test coverage to the punq fork, and then try rewriting the punq fork's type alias canonicalization code to avoid using the &lt;tt class="docutils literal"&gt;ast&lt;/tt&gt; module.
My plan for this is cursed, yet it should be portable.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2020-11-23</title><link href="https://mwchase.neocities.org/coding-2020-11-23" rel="alternate"></link><published>2020-11-23T05:00:00-05:00</published><updated>2020-11-23T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-11-23:/coding-2020-11-23</id><summary type="html">&lt;p class="first last"&gt;Developing plans to, among other things, replace horrifying metaprogramming nonsense with more portable metaprogramming nonsense.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Status of thinking about getting this working in the browser: my two big constraints are from my punq fork, which uses Python 3.8 syntax and the stdlib &lt;tt class="docutils literal"&gt;ast&lt;/tt&gt; module.
The syntax constraint narrows the choices I have, out of everything I know about, to &lt;a class="reference external" href="https://brython.info/"&gt;Brython&lt;/a&gt; and &lt;a class="reference external" href="https://pyodide.readthedocs.io/en/latest/"&gt;Pyodide&lt;/a&gt;.
(Python 3.8 eliminates for now, I think, &lt;a class="reference external" href="https://www.transcrypt.org/"&gt;transcrypt&lt;/a&gt;, &lt;a class="reference external" href="https://github.com/beeware/batavia"&gt;Batavia&lt;/a&gt;, &lt;a class="reference external" href="http://pyjs.org/"&gt;pyjs&lt;/a&gt;, &lt;a class="reference external" href="https://skulpt.org/"&gt;Skulpt&lt;/a&gt;, and &lt;a class="reference external" href="https://pypyjs.org/"&gt;PyPy.js&lt;/a&gt;)
Using either one would take some work from where I am now:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Brython doesn't provide the &lt;tt class="docutils literal"&gt;ast&lt;/tt&gt; module, which the fork currently uses to parse and partially evaluate type annotations. I believe there are several ways I could attempt to work around this.&lt;/li&gt;
&lt;li&gt;Because I'd be bundling several un-published packages with Pyodide, I'd need to install the wheels from a URL, which means it won't do dependency resolution, and I need to calculate the installation order at build time with some kind of topological sort.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Either of these could be worth working on, but I think I'm ready to get back to Mythic for now.&lt;/p&gt;
&lt;p&gt;I'll catch up on that, and later work on finally getting the coverage up, as well as patching some holes I noticed.&lt;/p&gt;
&lt;p&gt;Okay, there are various difficulties with implementing the Fate roll from base Mythic.
One is the choice of focus table.
There's just one focus table in base Mythic, but Variations does a bunch of stuff, and The Adventure Crafter has a different way of handling focus tables as well.
Separating out concerns...
The different parts of a Fate roll are as follows:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Determine the &lt;tt class="docutils literal"&gt;target&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;Roll d100, to produce the &lt;tt class="docutils literal"&gt;result&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;If the &lt;tt class="docutils literal"&gt;result&lt;/tt&gt; is divisible by 11, MAYBE produce a random event, given the focus table and chaos factor. (The choice of whether to generate one is influenced by the dominant theme, which may not be the theme whose focus table to being rolled against.) (Since I'm trying to make each package standalone to start with, this implies to me that I should drop some of the logic and classes I have currently.)&lt;/li&gt;
&lt;li&gt;Given the &lt;tt class="docutils literal"&gt;target&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;result&lt;/tt&gt;, produce a set of &lt;tt class="docutils literal"&gt;outcomes&lt;/tt&gt; accessible by spending up to 25 favor points&lt;/li&gt;
&lt;li&gt;Present the &lt;tt class="docutils literal"&gt;outcomes&lt;/tt&gt;, and wait for input to determine if a different outcome was taken&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Deduct spent favor points&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;The previous three bullets assume that there is an available pool of favor points. The answer to that should be consistent, or at least possible to determine ahead of time. So... write a factory that determines it, maybe? Still need to be able to line up the types, though. If I want to be a stickler, I could just have two high-level functions that package up the different flows. The question then, is what to return from the version that prompts to spend favor points.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thinking about this has made me decide that these functions should make as few decisions about the context they're used in as possible, so I should avoid making them rely on sheets.
That means the favor point version has to take a favor point count, and return a new total, along with everything else.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;And the classes are ballooning out of control.
I'm going to try to sketch out exactly what the sequence of events is supposed to be:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Determine the target number (this relies on varying factors and should be abstracted away; just expect a target)&lt;/li&gt;
&lt;li&gt;Roll against the target number&lt;/li&gt;
&lt;li&gt;Determine the outcome&lt;/li&gt;
&lt;li&gt;Optionally apply favor points to shift the outcome&lt;/li&gt;
&lt;li&gt;Use the roll result, among other inputs, to determine whether a random event occurred.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm kind of tempted to try using punq for this, at kind of a higher level.
Just, like, pass in stuff from the broader container, as well as volatile arguments.&lt;/p&gt;
&lt;p&gt;Okay, I've sketched some stuff out on paper, and I think I have a solid plan for this.
However, I'm tired, and I don't want to mess with the code any more while I'm tired.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-11-22</title><link href="https://mwchase.neocities.org/coding-2020-11-22" rel="alternate"></link><published>2020-11-22T05:00:00-05:00</published><updated>2020-11-22T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-11-22:/coding-2020-11-22</id><summary type="html">&lt;p class="first last"&gt;I guess if I try to support Brython, I'll need to, like, port my mypy and test sessions to Brython. Try to figure out how to get coverage data out of a headless Selenium session where Coverage can't use the C extension, among other things...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I ended up deciding that devpi was too heavy-weight for me to set up currently.
I kind of wonder what it would take to spin up a temporary index that just does what I want.
(I mean, it would basically just have to take a mapping from package names to file urls, and forward all other requests to another index.)
The main imposition from doing such a thing is that there'd need to be an explicit build step which... might make things faster?&lt;/p&gt;
&lt;p&gt;Anyway, I got shiv working, after some confusing stuff that was not its fault.
Here's how my noxfile looks currently:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt;  1&lt;/span&gt;
&lt;span class="normal"&gt;  2&lt;/span&gt;
&lt;span class="normal"&gt;  3&lt;/span&gt;
&lt;span class="normal"&gt;  4&lt;/span&gt;
&lt;span class="normal"&gt;  5&lt;/span&gt;
&lt;span class="normal"&gt;  6&lt;/span&gt;
&lt;span class="normal"&gt;  7&lt;/span&gt;
&lt;span class="normal"&gt;  8&lt;/span&gt;
&lt;span class="normal"&gt;  9&lt;/span&gt;
&lt;span class="normal"&gt; 10&lt;/span&gt;
&lt;span class="normal"&gt; 11&lt;/span&gt;
&lt;span class="normal"&gt; 12&lt;/span&gt;
&lt;span class="normal"&gt; 13&lt;/span&gt;
&lt;span class="normal"&gt; 14&lt;/span&gt;
&lt;span class="normal"&gt; 15&lt;/span&gt;
&lt;span class="normal"&gt; 16&lt;/span&gt;
&lt;span class="normal"&gt; 17&lt;/span&gt;
&lt;span class="normal"&gt; 18&lt;/span&gt;
&lt;span class="normal"&gt; 19&lt;/span&gt;
&lt;span class="normal"&gt; 20&lt;/span&gt;
&lt;span class="normal"&gt; 21&lt;/span&gt;
&lt;span class="normal"&gt; 22&lt;/span&gt;
&lt;span class="normal"&gt; 23&lt;/span&gt;
&lt;span class="normal"&gt; 24&lt;/span&gt;
&lt;span class="normal"&gt; 25&lt;/span&gt;
&lt;span class="normal"&gt; 26&lt;/span&gt;
&lt;span class="normal"&gt; 27&lt;/span&gt;
&lt;span class="normal"&gt; 28&lt;/span&gt;
&lt;span class="normal"&gt; 29&lt;/span&gt;
&lt;span class="normal"&gt; 30&lt;/span&gt;
&lt;span class="normal"&gt; 31&lt;/span&gt;
&lt;span class="normal"&gt; 32&lt;/span&gt;
&lt;span class="normal"&gt; 33&lt;/span&gt;
&lt;span class="normal"&gt; 34&lt;/span&gt;
&lt;span class="normal"&gt; 35&lt;/span&gt;
&lt;span class="normal"&gt; 36&lt;/span&gt;
&lt;span class="normal"&gt; 37&lt;/span&gt;
&lt;span class="normal"&gt; 38&lt;/span&gt;
&lt;span class="normal"&gt; 39&lt;/span&gt;
&lt;span class="normal"&gt; 40&lt;/span&gt;
&lt;span class="normal"&gt; 41&lt;/span&gt;
&lt;span class="normal"&gt; 42&lt;/span&gt;
&lt;span class="normal"&gt; 43&lt;/span&gt;
&lt;span class="normal"&gt; 44&lt;/span&gt;
&lt;span class="normal"&gt; 45&lt;/span&gt;
&lt;span class="normal"&gt; 46&lt;/span&gt;
&lt;span class="normal"&gt; 47&lt;/span&gt;
&lt;span class="normal"&gt; 48&lt;/span&gt;
&lt;span class="normal"&gt; 49&lt;/span&gt;
&lt;span class="normal"&gt; 50&lt;/span&gt;
&lt;span class="normal"&gt; 51&lt;/span&gt;
&lt;span class="normal"&gt; 52&lt;/span&gt;
&lt;span class="normal"&gt; 53&lt;/span&gt;
&lt;span class="normal"&gt; 54&lt;/span&gt;
&lt;span class="normal"&gt; 55&lt;/span&gt;
&lt;span class="normal"&gt; 56&lt;/span&gt;
&lt;span class="normal"&gt; 57&lt;/span&gt;
&lt;span class="normal"&gt; 58&lt;/span&gt;
&lt;span class="normal"&gt; 59&lt;/span&gt;
&lt;span class="normal"&gt; 60&lt;/span&gt;
&lt;span class="normal"&gt; 61&lt;/span&gt;
&lt;span class="normal"&gt; 62&lt;/span&gt;
&lt;span class="normal"&gt; 63&lt;/span&gt;
&lt;span class="normal"&gt; 64&lt;/span&gt;
&lt;span class="normal"&gt; 65&lt;/span&gt;
&lt;span class="normal"&gt; 66&lt;/span&gt;
&lt;span class="normal"&gt; 67&lt;/span&gt;
&lt;span class="normal"&gt; 68&lt;/span&gt;
&lt;span class="normal"&gt; 69&lt;/span&gt;
&lt;span class="normal"&gt; 70&lt;/span&gt;
&lt;span class="normal"&gt; 71&lt;/span&gt;
&lt;span class="normal"&gt; 72&lt;/span&gt;
&lt;span class="normal"&gt; 73&lt;/span&gt;
&lt;span class="normal"&gt; 74&lt;/span&gt;
&lt;span class="normal"&gt; 75&lt;/span&gt;
&lt;span class="normal"&gt; 76&lt;/span&gt;
&lt;span class="normal"&gt; 77&lt;/span&gt;
&lt;span class="normal"&gt; 78&lt;/span&gt;
&lt;span class="normal"&gt; 79&lt;/span&gt;
&lt;span class="normal"&gt; 80&lt;/span&gt;
&lt;span class="normal"&gt; 81&lt;/span&gt;
&lt;span class="normal"&gt; 82&lt;/span&gt;
&lt;span class="normal"&gt; 83&lt;/span&gt;
&lt;span class="normal"&gt; 84&lt;/span&gt;
&lt;span class="normal"&gt; 85&lt;/span&gt;
&lt;span class="normal"&gt; 86&lt;/span&gt;
&lt;span class="normal"&gt; 87&lt;/span&gt;
&lt;span class="normal"&gt; 88&lt;/span&gt;
&lt;span class="normal"&gt; 89&lt;/span&gt;
&lt;span class="normal"&gt; 90&lt;/span&gt;
&lt;span class="normal"&gt; 91&lt;/span&gt;
&lt;span class="normal"&gt; 92&lt;/span&gt;
&lt;span class="normal"&gt; 93&lt;/span&gt;
&lt;span class="normal"&gt; 94&lt;/span&gt;
&lt;span class="normal"&gt; 95&lt;/span&gt;
&lt;span class="normal"&gt; 96&lt;/span&gt;
&lt;span class="normal"&gt; 97&lt;/span&gt;
&lt;span class="normal"&gt; 98&lt;/span&gt;
&lt;span class="normal"&gt; 99&lt;/span&gt;
&lt;span class="normal"&gt;100&lt;/span&gt;
&lt;span class="normal"&gt;101&lt;/span&gt;
&lt;span class="normal"&gt;102&lt;/span&gt;
&lt;span class="normal"&gt;103&lt;/span&gt;
&lt;span class="normal"&gt;104&lt;/span&gt;
&lt;span class="normal"&gt;105&lt;/span&gt;
&lt;span class="normal"&gt;106&lt;/span&gt;
&lt;span class="normal"&gt;107&lt;/span&gt;
&lt;span class="normal"&gt;108&lt;/span&gt;
&lt;span class="normal"&gt;109&lt;/span&gt;
&lt;span class="normal"&gt;110&lt;/span&gt;
&lt;span class="normal"&gt;111&lt;/span&gt;
&lt;span class="normal"&gt;112&lt;/span&gt;
&lt;span class="normal"&gt;113&lt;/span&gt;
&lt;span class="normal"&gt;114&lt;/span&gt;
&lt;span class="normal"&gt;115&lt;/span&gt;
&lt;span class="normal"&gt;116&lt;/span&gt;
&lt;span class="normal"&gt;117&lt;/span&gt;
&lt;span class="normal"&gt;118&lt;/span&gt;
&lt;span class="normal"&gt;119&lt;/span&gt;
&lt;span class="normal"&gt;120&lt;/span&gt;
&lt;span class="normal"&gt;121&lt;/span&gt;
&lt;span class="normal"&gt;122&lt;/span&gt;
&lt;span class="normal"&gt;123&lt;/span&gt;
&lt;span class="normal"&gt;124&lt;/span&gt;
&lt;span class="normal"&gt;125&lt;/span&gt;
&lt;span class="normal"&gt;126&lt;/span&gt;
&lt;span class="normal"&gt;127&lt;/span&gt;
&lt;span class="normal"&gt;128&lt;/span&gt;
&lt;span class="normal"&gt;129&lt;/span&gt;
&lt;span class="normal"&gt;130&lt;/span&gt;
&lt;span class="normal"&gt;131&lt;/span&gt;
&lt;span class="normal"&gt;132&lt;/span&gt;
&lt;span class="normal"&gt;133&lt;/span&gt;
&lt;span class="normal"&gt;134&lt;/span&gt;
&lt;span class="normal"&gt;135&lt;/span&gt;
&lt;span class="normal"&gt;136&lt;/span&gt;
&lt;span class="normal"&gt;137&lt;/span&gt;
&lt;span class="normal"&gt;138&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;contextlib&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os.path&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pathlib&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;tempfile&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;toml&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;nox&lt;/span&gt;


&lt;span class="n"&gt;PROJECTS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="n"&gt;directory&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;directory&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;listdir&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;directory&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isfile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;directory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;pyproject.toml&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;CONSTRAINTS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; @ &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pathlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;abspath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;as_uri&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;PROJECTS&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="s2"&gt;attrs ~=19.3&lt;/span&gt;
&lt;span class="s2"&gt;camel ~=0.1.2&lt;/span&gt;
&lt;span class="s2"&gt;click ~=7.1.2&lt;/span&gt;
&lt;span class="s2"&gt;# punq ~=0.4.1&lt;/span&gt;
&lt;span class="s2"&gt;# trio&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="nd"&gt;@contextlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;contextmanager&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;constraints_env&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;tempfile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TemporaryDirectory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;tmpdir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;constraints&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tmpdir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;constraints.txt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;constraints&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;w&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;fh&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;fh&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CONSTRAINTS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;PIP_CONSTRAINT&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;constraints&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;PIP_NO_CACHE_DIR&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;YES&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;install_from_repo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;projects&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;constraints_env&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;projects&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;install_from_requirements&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;-r&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;requirements/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.txt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="nd"&gt;@nox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;clean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;install_from_requirements&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;coverage&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;coverage&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;erase&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="nd"&gt;@nox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;
&lt;span class="nd"&gt;@nox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parametrize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;project&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PROJECTS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;install_from_requirements&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;check&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;isort&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;--check-only&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;--diff&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/src&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/tests&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;flake8&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/src&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/tests&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="nd"&gt;@nox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;
&lt;span class="nd"&gt;@nox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parametrize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;project&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PROJECTS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;mypy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;install_from_repo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;install_from_requirements&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;mypy&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mypy&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/src&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;MYPYPATH&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;abspath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;stubs&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)})&lt;/span&gt;


&lt;span class="nd"&gt;@nox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;
&lt;span class="nd"&gt;@nox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parametrize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;project&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PROJECTS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;nocov&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;install_from_repo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;install_from_requirements&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;pytest&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;python&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-m&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;pytest&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;PYTHONPATH&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;abspath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="nd"&gt;@nox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;
&lt;span class="nd"&gt;@nox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parametrize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;project&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PROJECTS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cover&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;install_from_repo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;install_from_requirements&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;cover&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;coverage&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;run&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;-m&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;pytest&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;PYTHONPATH&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;abspath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;)},&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="nd"&gt;@nox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;install_from_requirements&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;report&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;coverage&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;combine&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Disable while the punq fork is the main focus of development.&lt;/span&gt;
    &lt;span class="c1"&gt;# session.run(&amp;quot;limit-coverage&amp;quot;)&lt;/span&gt;
    &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;coverage&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;html&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;--show-contexts&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;coverage&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;report&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;--skip-covered&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-m&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;--fail-under=100&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="nd"&gt;@nox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;shiv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;install_from_requirements&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;shiv&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;shiv_build&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;build/shiv&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;makedirs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;shiv_build&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exist_ok&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;artifacts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;PROJECTS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;pyproject.toml&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;toml_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;endpoint&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;toml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;toml_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;flit&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;scripts&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="n"&gt;artifacts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;constraints_env&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;endpoint&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;artifacts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="s2"&gt;&amp;quot;shiv&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;&amp;quot;-e&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;&amp;quot;-o&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;shiv_build&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;First, it detects all PEP 517 projects one level down, and uses them to generate constraint files.
I also added the only lines that I consider project-specific, to make sure that the various third-party packages are constrained consistently.
punq is commented out because my fork is one of the subprojects, and trio is commented out because I haven't tried to constrain it yet.&lt;/p&gt;
&lt;p&gt;Next up, helpers for actually using the constraints files.
The context manager puts the constraint data somewhere pip can see it, and creates environment variables to make pip, and nested pips, act properly.
I think this is because I'm not bothering to bump versions, but everything breaks if I let pip use a cache directory.
Anyway, the context manager was spun out from the following function, which handles installing one of the subprojects.
It was spun out so it could be used with shiv, because shiv uses pip under the covers.&lt;/p&gt;
&lt;p&gt;The next helper installs the requirements for a particular session, which are stored in the &lt;tt class="docutils literal"&gt;requirements&lt;/tt&gt; directory, and are built up by including each other as needed.&lt;/p&gt;
&lt;p&gt;Getting to the sessions, we've got &lt;tt class="docutils literal"&gt;clean&lt;/tt&gt;, which makes sure that coverage data doesn't leak between runs, and would do other cleanup if it were needed.
The &lt;tt class="docutils literal"&gt;check&lt;/tt&gt; session does basic linting against the codebases, that does not require installation.
I could maybe turn that into a for-loop and remove the parametrization.
The &lt;tt class="docutils literal"&gt;mypy&lt;/tt&gt; session typechecks each project in isolation, with the help of some stubfiles I had to write for some of the dependencies.
The &lt;tt class="docutils literal"&gt;nocov&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;cover&lt;/tt&gt; sessions run pytest against each project, with the invocations as similar as possible, except that &lt;tt class="docutils literal"&gt;cover&lt;/tt&gt; runs under coverage.
The environment manipulation is required to get punq's doctests to pass when invoking pytest from another directory; I don't know if the way they're being invoked and supported is idiomatic, because I don't use doctests much.
The &lt;tt class="docutils literal"&gt;report&lt;/tt&gt; session is not quite how I usually like it, because the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;limit-coverage&lt;/span&gt;&lt;/tt&gt; command has extremely specific expectations about test layout that are intuitive to me, and I don't know about anyone else.
Point is, unless I rearrange all of punq's tests (which I might as well do, at some point), running &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;limit-coverage&lt;/span&gt;&lt;/tt&gt; would make it impossible to get sensible data, so I'm not going to run it.
Anyway, it generates a nice HTML report and yells at me if I have uncovered statements, which is reasonable, in my experience.&lt;/p&gt;
&lt;p&gt;Lastly, the new session, &lt;tt class="docutils literal"&gt;shiv&lt;/tt&gt;, scrapes all of my pyproject files for script declarations, and converts them into shiv commands.
Thinking over what it does, I'm actually going to rewrite it a little, but it's nothing too significant.
The code is a little rough and kind of suggests some refactorings, but I don't think they'd be well-motivated yet, so I'm going to hold off.
The directory structure for the build artifacts is a little nested, because I want to leave my options open for creating other kinds of artifacts.&lt;/p&gt;
&lt;p&gt;(By the way, &lt;em&gt;apropos of nothing&lt;/em&gt;, I wonder what the etiquette is for something like... a PR that I haven't looked at in over a year, because I stopped using the project it's against...)&lt;/p&gt;
&lt;p&gt;Anyway, that file is more-or-less how I like to handle automated tasks related to Python development these days.&lt;/p&gt;
&lt;p&gt;It's late now, so I should wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-11-21</title><link href="https://mwchase.neocities.org/coding-2020-11-21" rel="alternate"></link><published>2020-11-21T05:00:00-05:00</published><updated>2020-11-21T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-11-21:/coding-2020-11-21</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Is this sufficiently done? 'Yes.'&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I ended up not having the patience to write out all of the end-to-end cases that the requirements changes in the Gilded Rose kata... require, so I just wrote tests for the basic case, and assumed it should compose as expected with all of the other cases.
I'm going to say this is &amp;quot;learning to finish&amp;quot;, and get on with my life.&lt;/p&gt;
&lt;p&gt;Anyway, I've been investigating the upcoming changes to pip and how they will, at least temporarily, potentially break my workflow, and the more I've thought about it, the more I think it would make more sense to implement my desired workflow as a policy against a local PyPI mirror.
This sidesteps the question of &amp;quot;how should pip interpret URL constraints&amp;quot;, by taking the question more-or-less out of pip's hands.
Looks like I'd like to try &lt;a class="reference external" href="https://docs.devpi.net/"&gt;devpi&lt;/a&gt; for that.&lt;/p&gt;
&lt;p&gt;The other thing that thinking about that made me realize is, I don't have a plan for getting the libraries I'm writing into a usable state for me, like having an executable.
For that, I'd either need to maintain a cache and a venv and make sure the venv pip always points to the cache, or... I could try out something like &lt;a class="reference external" href="https://shiv.readthedocs.io/en/latest/"&gt;shiv&lt;/a&gt;, and make the executables be explicit artifacts that get built.
In a similar vein, I'm kind of curious what happens if I try shoving some of these into something like &lt;a class="reference external" href="https://brython.info/"&gt;Brython&lt;/a&gt;.
I'm... not sure if Brython is compatible with trio's guest mode, but if I make sure the business logic doesn't refer to specific async libraries, and move that out to whatever executes them, I should be okay.
If I go this route, I'll want to break up my modules &lt;em&gt;even more&lt;/em&gt;, so I end up with, like, risus, and risus-cli, and I can hopefully be confident that I'm not mixing event loops in an unprincipled fashion.&lt;/p&gt;
&lt;p&gt;So, there's a plan for the future:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;devpi&lt;/li&gt;
&lt;li&gt;shiv&lt;/li&gt;
&lt;li&gt;&lt;em&gt;maybe&lt;/em&gt; Brython&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm trying to get a jump on understanding how best to configure devpi; it looks like I might want to try using &lt;a class="reference external" href="https://pypi.org/project/devpi-constrained/"&gt;devpi-constrained&lt;/a&gt; to have an intermediate index that filters out all of the packages I'm installing myself.
Maybe.
I'll figure this out later.
For now, I'll wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-11-20</title><link href="https://mwchase.neocities.org/coding-2020-11-20" rel="alternate"></link><published>2020-11-20T05:00:00-05:00</published><updated>2020-11-20T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-11-20:/coding-2020-11-20</id><summary type="html">&lt;p class="first last"&gt;Current solution is somewhat lacking in elegance, but at least it's clear what's going on.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I spent a big chunk of today trying to recover from whatever is going on with me, so I didn't have much time to work on the kata.
I did have time to change some of the callbacks I added, so they're now callable objects.
The plan there is to try to convert some of the extant conditionals/switches into operations I can call on the callbacks, so I can move some of the business logic back into the core function, rather than having opaque &amp;quot;do the thing&amp;quot; top-level functions.&lt;/p&gt;
&lt;p&gt;Okay, I did that, and now the groundwork is mostly laid to add processing for conjured items.
But doing that means adding tests, and it's too late at night for me to be up for that.
I'll work on updating the tables and the tests tomorrow or over the weekend.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-11-19</title><link href="https://mwchase.neocities.org/coding-2020-11-19" rel="alternate"></link><published>2020-11-19T05:00:00-05:00</published><updated>2020-11-19T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-11-19:/coding-2020-11-19</id><summary type="html">&lt;p class="first last"&gt;Nothing went wrong, so I didn't have much to write about.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I wrote up some simple decision tables for the kata, and used them to write a thorough set of tests.
From there, I was able to rewrite the kata code with a much flatter control flow.
Passed all tests once the types lined up properly.&lt;/p&gt;
&lt;p&gt;It's late now, so I'll work on the next part tomorrow.&lt;/p&gt;
&lt;p&gt;Ward was mostly easy to use, although I initially expected parameterization to work a little more like in pytest, which it doesn't quite.
Basically, Ward's parameters cannot vary independently.
This required me to split up some tests a little more thoroughly, which is probably fine.&lt;/p&gt;
&lt;p&gt;I guess I don't have much to say, since putting together the tables then translating them to tests was pretty straightforward and quick.
No real complaints; I'd definitely recommend at least trying it for any given project.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-11-18</title><link href="https://mwchase.neocities.org/coding-2020-11-18" rel="alternate"></link><published>2020-11-18T05:00:00-05:00</published><updated>2020-11-18T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-11-18:/coding-2020-11-18</id><summary type="html">&lt;p class="first last"&gt;I'm sure the documentation said I could do this, but I'm going to trust the deprecation warning more...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm going to try to keep this brief because I'm not in the best of shape right now.
To take a break from the punq stuff, I'm going to try using some somewhat new tools with a small challenge I haven't tried before.&lt;/p&gt;
&lt;p&gt;All of this is inspired by &lt;a class="reference external" href="https://twitter.com/mengwong/status/1328334995623006210"&gt;this twitter thread&lt;/a&gt;.
The quick summary of the thread is that people aren't using &lt;a class="reference external" href="https://www.hillelwayne.com/decision-tables/"&gt;decision&lt;/a&gt; &lt;a class="reference external" href="https://www.hillelwayne.com/post/decision-table-patterns/"&gt;tables&lt;/a&gt; with the &lt;a class="reference external" href="https://github.com/emilybache/GildedRose-Refactoring-Kata"&gt;Gilded Rose kata&lt;/a&gt;, and they should be.
I've used decision tables some in the past.
Though I didn't use them on the punq fork, I imagine they wouldn't have gone amiss there.&lt;/p&gt;
&lt;p&gt;The other thing I want to look into is using &lt;a class="reference external" href="https://wardpy.com/"&gt;Ward&lt;/a&gt; instead of &lt;a class="reference external" href="https://pytest.org/"&gt;pytest&lt;/a&gt;.
I heard of Ward recently, and given how little I mess with pytest's configuration in my hobby projects, I'm not feeling particularly tethered to pytest, so I'm curious what it's like currently.
The only thing I might need to do is name things somewhat un-idiomatically by Ward standards, to get &lt;a class="reference external" href="https://coverage.readthedocs.io/"&gt;Coverage.py&lt;/a&gt; to assign contexts properly.
(Although, that's not necessary for the kata, since it only has one source file.)&lt;/p&gt;
&lt;p&gt;Anyway, my plan is to copy over things from the virtual tabletop repo, since that has the most recent version of my project scaffolding, copy in the Gilded Rose stuff, make sure I've got everything working with pytest, then switch it to Ward.
After that, I'll work on documenting the current behavior with decision tables, translate the results into tests.
Refactor the code to be less of a tangle of if statements.
Then, extend the decision tables in accordance with the kata, and add the new tests required by the new rows.&lt;/p&gt;
&lt;p&gt;Let's see how far I can get with all that for now.&lt;/p&gt;
&lt;p&gt;Some time later, I'm nearly at the end of the first sentence.&lt;/p&gt;
&lt;p&gt;Ten minutes more and I am at the end.&lt;/p&gt;
&lt;p&gt;I'll get to work on the decision tables tomorrow.&lt;/p&gt;
&lt;p&gt;Stuff I learned from trying this:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I missed the boat to comment on &lt;a class="reference external" href="https://github.com/pypa/pip/issues/8210"&gt;pip#8210&lt;/a&gt;. That issue seems to mean I need to adapt my current workarounds to the new resolver, because they won't work. I'm looking into the related issues now.&lt;/li&gt;
&lt;li&gt;Coverage.py's dynamic contexts don't play well with Ward. I believe the problem is on the coverage side, and fixing it probably requires setting some configuration options that may or may not exist yet.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then I spaced out for about half an hour trying to figure out which pip issue fits my use case.
So, I guess I'm done for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2020-11-17</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-11-17" rel="alternate"></link><published>2020-11-17T05:00:00-05:00</published><updated>2020-11-17T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-11-17:/weekly-roundup-2020-11-17</id><summary type="html">&lt;p class="first last"&gt;I made good progress, but it stopped &lt;em&gt;feeling&lt;/em&gt; good.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I planned a bunch of changes to my punq fork.&lt;/li&gt;
&lt;li&gt;Thursday: I realized that &amp;quot;evaluate type aliases only up to the name of the alias&amp;quot; is actually a pretty involved ask.&lt;/li&gt;
&lt;li&gt;Friday: I fixed the majority of test failures that came from the previous changes, and realized that what I'm doing is probably not going to get merged back.&lt;/li&gt;
&lt;li&gt;Saturday: I wrote some extremely questionable-looking code to handle an edge case that only arose in doctests. (The code would later be removed, along with the features it supported.)&lt;/li&gt;
&lt;li&gt;Sunday: I understood punq's original implementation better, and tried to &amp;quot;fix&amp;quot; aspects of it.&lt;/li&gt;
&lt;li&gt;Monday: Looking over my attempted fixes, I decided instead to remove a bunch of features that I haven't used yet, and don't expect to.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to change pace somehow.
Something to get me out of the current cycle I feel like I'm in.
I've got some ideas, but I don't want to commit to anything.
If I can muster the will to get back to coding game rule logic, that's fine, but I don't know if I can, yet.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2020-11-16</title><link href="https://mwchase.neocities.org/coding-2020-11-16" rel="alternate"></link><published>2020-11-16T05:00:00-05:00</published><updated>2020-11-16T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-11-16:/coding-2020-11-16</id><summary type="html">&lt;p class="first last"&gt;Ditributing the fork later like, &amp;quot;What does it have going for it?&amp;quot; &amp;quot;Less features!&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I made the judgment call that, since my punq fork is purely for my own stuff currently, I'm removing the functionality I don't use.
This got rid of some of the weird hacky stuff I put in, but it didn't change much.
The existing code just seems a lot leaner than the stuff I added, I guess.&lt;/p&gt;
&lt;p&gt;Anyway, making another judgment call: I've been spinning my wheels on this a bit, so next week, I'm going to find something else to work on for a bit.&lt;/p&gt;
&lt;p&gt;I don't know what, and I'm feeling a little under the weather right now, so I'm not going to try too hard.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-11-15</title><link href="https://mwchase.neocities.org/coding-2020-11-15" rel="alternate"></link><published>2020-11-15T05:00:00-05:00</published><updated>2020-11-15T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-11-15:/coding-2020-11-15</id><summary type="html">&lt;p class="first last"&gt;Tinkering on this codebase like it's a project car.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today, I improved my coverage metrics by deciding that some of the code I added didn't make sense, so I deleted a bunch of it.&lt;/p&gt;
&lt;p&gt;Looking for other low-hanging fruit, I noticed some code I added that should have been running, but wasn't, because I didn't update the rest of the code to properly invoke it.
That improved things a little further.
Now I'm just missing &amp;quot;what about subclasses that don't define an &lt;tt class="docutils literal"&gt;__init__&lt;/tt&gt;, but a superclass does?&amp;quot;, and various invocations of annotations and alias helpers.
I should just put aside some time to work through those, but I don't feel like it right now.&lt;/p&gt;
&lt;p&gt;My longer-term plans, once this has full coverage:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Make sure that these changes I made to punq &lt;em&gt;actually enable&lt;/em&gt; the use cases that motivated the fundamental changes here in the first place. The place to look for this is in the Risus CLI functions.&lt;/li&gt;
&lt;li&gt;Remember what I was planning to do with Mythic. I &lt;em&gt;think&lt;/em&gt; my intention was to make the sheet a resolution-time argument, which I now realize I didn't need to make all these changes to enable, but I only realize that because of what I learned making the changes, so I guess it &lt;em&gt;sort of&lt;/em&gt; works out.&lt;/li&gt;
&lt;li&gt;Get this into a state where I can make it a proper fork, since I really don't think it'd make sense to merge up all of the changes I've made, but I'm willing to offer up some of them. Especially since some of the more drastic ones turned out to be unnecessary.&lt;/li&gt;
&lt;li&gt;Actually understand some of the core logic that I barely touched. I mean, clearly I didn't break it for simple cases, but for more complicated stuff...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Actually, looking over some of that code, I'm kind of skeptical of bits of it, and I'm going to try changing more of the base logic and see what happens.
Eh, need more planning.
And it's not hurting anything, currently.
I'm thinking that the cache value format for ResolutionContexts should be changed so it has fields like &lt;tt class="docutils literal"&gt;first: T; rest: Optional[Tuple[T, &lt;span class="pre"&gt;...]]&lt;/span&gt;&lt;/tt&gt;.
That's a tomorrow question, though.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-11-14</title><link href="https://mwchase.neocities.org/coding-2020-11-14" rel="alternate"></link><published>2020-11-14T05:00:00-05:00</published><updated>2020-11-14T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-11-14:/coding-2020-11-14</id><summary type="html">&lt;p class="first last"&gt;Here's one for the books everyone: I used a regular expression and ended up with less problems.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;After much agonizing over the way to make my new code work with doctests, I got something together that works for the existing tests without compromising normal functionality.
It's... only a little cursed.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;DESTRUCTURE_ALIAS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;^([^[]*)(\[.*\])?$&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;LIST_ALIASES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;frozenset&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;canonical_alias&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;canonical_alias&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;)])&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;alias&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Alias&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DESTRUCTURE_ALIAS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alias&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;LIST_ALIASES&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;It's fine.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Basically... doctests don't create bindings at module scope, so I had to avoid the code paths that queried for classes defined in the doctest, because those are &lt;em&gt;local&lt;/em&gt; variables, I think.
To figure out what I'm good to do, I had to define the &lt;tt class="docutils literal"&gt;Alias&lt;/tt&gt; newtype to track whether a string was a canonical alias.
While it's safe to call &lt;tt class="docutils literal"&gt;canonical_alias&lt;/tt&gt; repeatedly on normal aliases, it really expects to get references to module globals, and so barfs on these kinds of edge cases.&lt;/p&gt;
&lt;p&gt;Anyway, with this, and some minor test fixes, I'm back to all tests passing, and can now focus on patching up the coverage holes introduced by my additions.
My new code takes the coverage from 100% to 87%, and I know the error handling in the new sections is shaky at best, except where it was covered by existing tests.&lt;/p&gt;
&lt;p&gt;While implementing the ideas that I came up with was... an ordeal, it was nice to be rewriting code primarily to change the functionality, rather than because I didn't like the design.
It was also nice to have tests that worked right off the bat.&lt;/p&gt;
&lt;p&gt;Anyway, better wrap up for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-11-13</title><link href="https://mwchase.neocities.org/coding-2020-11-13" rel="alternate"></link><published>2020-11-13T05:00:00-05:00</published><updated>2020-11-13T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-11-13:/coding-2020-11-13</id><summary type="html">&lt;p class="first last"&gt;Haha whoops I forgot the summary at first. Um... it's going well, but not easily.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got the failures down to just a few in punq's suite, which, I did rework nearly everything, so, fair.&lt;/p&gt;
&lt;p&gt;Where I'm at now in addressing these is, I now understand the arguments to the &lt;tt class="docutils literal"&gt;resolve&lt;/tt&gt; function better, and now I realize I was accidentally changing the semantics.
I'm trying reverting my changes and seeing if the result just works.
It actually seems plausible.
And, it looks like it's working.
Just some minor tweaks after I finish testing, and then I can move on to fixing other stuff.&lt;/p&gt;
&lt;p&gt;Anyway, getting punq to do what I want was far harder and less pleasant than anyone could have politely predicted, and it's not quite done.
Current problem: I &lt;em&gt;somehow&lt;/em&gt; broke the logic that I didn't understand in the first place, what a shock.
It's passing too many arguments under some circumstances, so I've got to figure out why it's doing that and how to make it stop.&lt;/p&gt;
&lt;p&gt;Tomorrow.
I'll do that tomorrow.&lt;/p&gt;
&lt;p&gt;Anyway, I've sort of alluded to the potential of porting my changes back to the official version of punq, and that now seems very unlikely to me.
My fork is &lt;em&gt;a&lt;/em&gt; future of punq, in that it was directly developed from it, but I highly doubt it's &lt;em&gt;the&lt;/em&gt; future, due to the sheer scale of the breaking changes to it, and my introduction of syntax from Python 3.8.
When it's ready for public consumption, which it definitely isn't currently, I'll have to discuss and think about it some more, to figure out what I want to do.&lt;/p&gt;
&lt;p&gt;Anyway, I let this entry go too late for everything I want to get done, so I should wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-11-12</title><link href="https://mwchase.neocities.org/coding-2020-11-12" rel="alternate"></link><published>2020-11-12T05:00:00-05:00</published><updated>2020-11-12T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-11-12:/coding-2020-11-12</id><summary type="html">&lt;p class="first last"&gt;It's just a couple hundred lines of new code. It's probably fine.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;It turns out I didn't give &amp;quot;convert the annotations to a canonical form while preserving aliases&amp;quot; enough credit for how fiddly it seems like it's going to be.&lt;/p&gt;
&lt;p&gt;Let's see.
A top-level alias might be a Subscript, which can contain Tuples, Lists, Ellipsis/Constant, and must eventually bottom out in a top-level alias which must be interpreted in the context of the uppermost alias...
The fundamental constituents are Names and Attributes.&lt;/p&gt;
&lt;p&gt;After some effort, I put together several node visitor classes in a somewhat questionable fashion.
There is obvious room for improvement, but first I need to make sure it works.
And for that, I think I should take a break and get some sleep first.&lt;/p&gt;
&lt;p&gt;Although, actually, thinking about this, I noticed some big misses, so I guess it's not ready yet.
...
Just bashed something together for it.&lt;/p&gt;
&lt;p&gt;Okay, I'm too curious, I have to know how this breaks.&lt;/p&gt;
&lt;p&gt;... Oh wow, that's brutal.
Thousands of failures.
I can't even read the full output.&lt;/p&gt;
&lt;p&gt;And it looks like some of them are down to the fact that I haven't used, or written, the helper functions I knew I'd need.&lt;/p&gt;
&lt;p&gt;So, I scribbled out some helpers, and now I'd like to put this aside for now and work on some other things for a bit.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-11-11</title><link href="https://mwchase.neocities.org/coding-2020-11-11" rel="alternate"></link><published>2020-11-11T05:00:00-05:00</published><updated>2020-11-11T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-11-11:/coding-2020-11-11</id><summary type="html">&lt;p class="first last"&gt;Trying to plan ahead rather than work stuff out in my head and change it on the fly. Baby steps.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got some major changes that I want to make in my punq fork, and I decided I want to write them out here as a dry run before doing them.
That way there's a chance I'll notice if I get in over my head.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;For aesthetic reasons, I want to try replacing the &lt;tt class="docutils literal"&gt;instance&lt;/tt&gt; keyword argument with an &lt;tt class="docutils literal"&gt;Instance&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;Singleton&lt;/tt&gt; class that acts as an argument to the &lt;tt class="docutils literal"&gt;factory&lt;/tt&gt; keyword, but with special-casing. This represents a breaking change, but there are plenty more where that came from, so it's fine-ish.&lt;/li&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;builder&lt;/tt&gt; type annotation is too restrictive.&lt;/li&gt;
&lt;li&gt;I don't know &lt;em&gt;what's&lt;/em&gt; going on with &lt;tt class="docutils literal"&gt;args&lt;/tt&gt;. I'll have to come back to that, though a cursory look makes it look like it should be a &lt;tt class="docutils literal"&gt;Dict[str, Any]&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;_registrations&lt;/tt&gt; should be a &lt;tt class="docutils literal"&gt;DefaultDict[str, List[Registration]]&lt;/tt&gt;, and &lt;tt class="docutils literal"&gt;_localns&lt;/tt&gt; should be gone. (Maybe it should be with &lt;tt class="docutils literal"&gt;Tuple[Registration, &lt;span class="pre"&gt;...]&lt;/span&gt;&lt;/tt&gt;)&lt;/li&gt;
&lt;li&gt;As should the specific implementation of &lt;tt class="docutils literal"&gt;_get_needs_for_ctor&lt;/tt&gt;. Instead, it should crawl the mro for a class that defines &lt;tt class="docutils literal"&gt;__init__&lt;/tt&gt; in its &lt;tt class="docutils literal"&gt;__dict__&lt;/tt&gt;, then look up that class's &lt;tt class="docutils literal"&gt;__module__&lt;/tt&gt; in &lt;tt class="docutils literal"&gt;sys.modules&lt;/tt&gt;, and from there get the global module scope. Then, it should call &lt;tt class="docutils literal"&gt;get_type_hints(init, module_globals)&lt;/tt&gt;, and probably pop &lt;tt class="docutils literal"&gt;&amp;quot;return&amp;quot;&lt;/tt&gt; from the result. No error wrapping.&lt;/li&gt;
&lt;li&gt;Various parts of the library will have to perform type-to-string conversion, and that should be pushed to as high a level as possible.&lt;/li&gt;
&lt;li&gt;I don't know if I want to change it, but I'm not sure I understand why concrete impls can't be registered with keyword arguments. My inclination is to get as much code as possible shared between the various paths.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;build_context&lt;/tt&gt; looks fine, though the usage of explicit &lt;tt class="docutils literal"&gt;__getitem__&lt;/tt&gt; confuses me.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;_update_localns&lt;/tt&gt; is gone.&lt;/li&gt;
&lt;li&gt;The signature of &lt;tt class="docutils literal"&gt;Registry.register&lt;/tt&gt; should end up something like &lt;tt class="docutils literal"&gt;service: Union[str, type], factory: Optional[Callable], scope: Scope, /, **kwargs: Any&lt;/tt&gt;. This allows passing any kwargs, and requires an explicit factory to be provided when setting the scope. This is a (minor, I think) expressiveness hit in terms of what's required to register a concrete impl as a singleton, but I think the tradeoff is worth it. If it turns out problematic, my first attempt will be to change things &lt;em&gt;more&lt;/em&gt;, by replacing the &lt;tt class="docutils literal"&gt;scope&lt;/tt&gt; argument with more wrapper classes.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;ResolutionTarget&lt;/tt&gt; looks okay with &lt;tt class="docutils literal"&gt;str&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;List[Registration]&lt;/tt&gt;, but the &lt;tt class="docutils literal"&gt;generic_parameter&lt;/tt&gt; property freaks me out a little. It does, however, show that one thing that should be done when interpreting annotations and resolve arguments is, if the top node is an index operation, and the lhs is &lt;tt class="docutils literal"&gt;typing.List&lt;/tt&gt;, in some way or other, then the argument should be all attribute access, and that's what gets resolved.&lt;/li&gt;
&lt;li&gt;I think &lt;tt class="docutils literal"&gt;ResolutionContext&lt;/tt&gt; is about fine, I'll figure out the annotations later.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Container&lt;/tt&gt; is probably the most relevant part, but most of it follows from the previous notes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'll write up the supporting functions on paper later.
I think I basically have everything I need, between today and yesterday.&lt;/p&gt;
&lt;p&gt;I want to wind down now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2020-11-10</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-11-10" rel="alternate"></link><published>2020-11-10T05:00:00-05:00</published><updated>2020-11-10T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-11-10:/weekly-roundup-2020-11-10</id><summary type="html">&lt;p class="first last"&gt;I think it's possible to define aliases in more complicated contexts, but I don't really want to handle the cases that come to mind.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I was mildly freaked out about the election. I also talked about the Fate Roll.&lt;/li&gt;
&lt;li&gt;Thursday: I wasn't up for much, so I rewrote the code and disabled a bunch of tests.&lt;/li&gt;
&lt;li&gt;Friday: I explained the changes, and decided they were a net positive.&lt;/li&gt;
&lt;li&gt;Saturday: I made an update suggested by my previous changes.&lt;/li&gt;
&lt;li&gt;Sunday: I fixed up the tests I disabled.&lt;/li&gt;
&lt;li&gt;Monday: I decided to revisit my effort ten and a half months ago, to update or fork or do &lt;em&gt;something&lt;/em&gt; to punq.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to have to figure out how best to continue with the punq fork I'm developing.
Adding typing to the current state of it is... not happening.
I guess I should be working on tests, or maybe just...
I don't need to keep using limit-coverage for now.
So, let's comment that out of the noxfile and see what kind of raw coverage numbers we get...
All right, I can confirm that, in spite of what punq's coverage badge says, it gets full coverage.&lt;/p&gt;
&lt;p&gt;All right, remembering one of the directions I wanted to go all that time ago, I kind of wanted to make it canonicalize on string representations of types, but being aware of aliases.&lt;/p&gt;
&lt;p&gt;Let me see if I remember the logic.&lt;/p&gt;
&lt;p&gt;From the annotation side, given a string annotation in the context of a module, I want to &lt;em&gt;assume&lt;/em&gt; that the name before the final dot evaluates to a module, and that module contains the remainder of the name, and that if the &lt;tt class="docutils literal"&gt;__name__&lt;/tt&gt; attribute of the class matches the name, then the canonical name is the &lt;tt class="docutils literal"&gt;__qualname__&lt;/tt&gt; of the class, and that otherwise, the canonical name is the &lt;tt class="docutils literal"&gt;__name__&lt;/tt&gt; of the module and the original RHS.&lt;/p&gt;
&lt;p&gt;From the registration side, passing a class is shorthand for passing its &lt;tt class="docutils literal"&gt;__qualname__&lt;/tt&gt; (and probably similarly for resolution).
I want to avoid going too far with stack introspection, so I'll probably just want a helper function that basically takes &lt;tt class="docutils literal"&gt;(module, alias)&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;f&amp;quot;{module.__name__}.{alias}&amp;quot;&lt;/span&gt;&lt;/tt&gt; and is more compact.&lt;/p&gt;
&lt;p&gt;I think I can work from here.
I've got a few more ideas that are a bit less fleshed out, but also less fundamental, so I'm okay leaving them sketchy for now.&lt;/p&gt;
&lt;p&gt;Quick notes for my future self:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Rely on the &lt;tt class="docutils literal"&gt;ast&lt;/tt&gt; module to figure out where to look for the module path.&lt;/li&gt;
&lt;li&gt;I'm not sure how to handle subscripts, but I'm pretty sure the overall stuff that I can conceivably care about matching is like &lt;tt class="docutils literal"&gt;(&amp;lt;module &lt;span class="pre"&gt;name&amp;gt;\.)*&amp;lt;class&lt;/span&gt; &lt;span class="pre"&gt;name&amp;gt;(\[&amp;lt;args&amp;gt;])?&lt;/span&gt;&lt;/tt&gt;. In other words, if it's an index, then &lt;em&gt;probably&lt;/em&gt; discard the subscript, expect either a bare identifier, or an attribute access, in which the right hand side is a bare identifier, and the left-hand side is evaluated in the context of the current module to change the current module for the purposes of evaluating and analyzing the right-hand side.&lt;/li&gt;
&lt;li&gt;Allow some minor &amp;quot;inconsistencies&amp;quot; in the interpretation of the &amp;quot;just the class&amp;quot; registration shortcut.&lt;/li&gt;
&lt;li&gt;Walk the mro to figure out which module to resolve the &lt;tt class="docutils literal"&gt;__init__&lt;/tt&gt; annotations from the context of. First class in the mro where the &lt;tt class="docutils literal"&gt;__init__&lt;/tt&gt; shows up in the &lt;tt class="docutils literal"&gt;__dict__&lt;/tt&gt; is the place to look for the context.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Okay, that's enough poking at the code and design.
Done for now.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2020-11-09</title><link href="https://mwchase.neocities.org/coding-2020-11-09" rel="alternate"></link><published>2020-11-09T05:00:00-05:00</published><updated>2020-11-09T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-11-09:/coding-2020-11-09</id><summary type="html">&lt;p class="first last"&gt;Excited to see the potential of &amp;quot;just vendor whatever, it's all namespaced&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I forget exactly what I did today.
I think it was some coverage improvements and fixes, as well as the minor changes I was talking about yesterday.&lt;/p&gt;
&lt;p&gt;Still pondering the way to handle the roll stuff for Mythic.
What I'm leaning towards is, a given roll needs to be in the context of a particular player/sheet.
It also needs associated global information.
So, if there's a way to inject a SheetProxy...&lt;/p&gt;
&lt;p&gt;Ugh, dammit.
If I try to do this in the way that I think of as simple and obvious, I'm going to run into a limitation in &lt;a class="reference external" href="https://punq.readthedocs.io/en/latest/"&gt;punq&lt;/a&gt; that confused me so hard when I first ran into it.&lt;/p&gt;
&lt;p&gt;Here's the deal:&lt;/p&gt;
&lt;p&gt;punq is a library for performing dependency injection, and it can be used to &lt;a class="reference external" href="https://sobolevn.me/2019/03/enforcing-srp"&gt;make functions have flexible behavior without cluttering their interfaces&lt;/a&gt;.
Basically, by inspecting the annotations associated with a callable object, it figures out which other callables it needs to use to get the required arguments.
It also has the ability to specify associated values at resolution time, but such values are passed as keyword arguments, so they effectively must be string keys.
There are facilities for translating between string and type in some direction or other, but I do not trust them.
I try to avoid them, but to some extent, it's not possible.
This is because using string and type annotations that are equivalent from a typing analysis perspective leads to &lt;em&gt;different behavior&lt;/em&gt; when punq analyzes them.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;attr&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;punq&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="nd"&gt;@attr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;WithType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Target&lt;/span&gt;

&lt;span class="nd"&gt;@attr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;WithStr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Target&amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;punq&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WithType&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Works&lt;/span&gt;
&lt;span class="n"&gt;punq&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WithStr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Raises exception from within punq&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It seems to me like &amp;quot;define a string type annotation that gets filled in at runtime&amp;quot; would be a really useful pattern, but I'm not sure how to, like, do it.&lt;/p&gt;
&lt;p&gt;Unless... I've got an attempt at a fork that rectifies some of my complaints with punq.
I can just take that, and any changes to punq since, and make a local copy within the repo.
Thanks to my workarounds to the pip issues I was hitting earlier, that should just work, and give me some real-world proving-out of this stuff.&lt;/p&gt;
&lt;p&gt;... I opened the PR against punq &lt;em&gt;earlier this year&lt;/em&gt;‽
That's it, time is &lt;em&gt;definitely&lt;/em&gt; fake.
Fortunately, this means there's only a minor update required.
I'll get to work on this tomorrow.&lt;/p&gt;
&lt;p&gt;I think the correct order to do things is:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Copy code from the main punq repo. Get everything set up as I want, but leave the code itself be.&lt;/li&gt;
&lt;li&gt;Make sure it properly shadows everything, and still works.&lt;/li&gt;
&lt;li&gt;Archive the repo at that point, because I'm not super conversant with non-trivial pijul usage.&lt;/li&gt;
&lt;li&gt;Run black over the codebase.&lt;/li&gt;
&lt;li&gt;Address any coverage holes. (punq's coverage badge is broken, so I don't know what to expect; also it's almost certainly not compatible with limit-coverage, which will be... a barrier to merging back.)&lt;/li&gt;
&lt;li&gt;Look over the changes from my PR, and either redo them, or do something different.&lt;/li&gt;
&lt;li&gt;See how well or poorly my fork works when used in anger.&lt;/li&gt;
&lt;li&gt;Consider propagating the changes back to my own upstream, and committing to either a merge or a fork.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Those are big plans, and it's late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-11-08</title><link href="https://mwchase.neocities.org/coding-2020-11-08" rel="alternate"></link><published>2020-11-08T05:00:00-05:00</published><updated>2020-11-08T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-11-08:/coding-2020-11-08</id><summary type="html">&lt;p class="first last"&gt;Really satisfying to replace all my weird coroutine hacks with simple async library calls.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got all of the tests I disabled updated and enabled, so now coverage is in a much better place.
I just want to make some minor organizational changes, and then I'll be ready to start hacking on the Mythic rules and work on designing the last major callback I need to define.&lt;/p&gt;
&lt;p&gt;Basically, some of Mythic's rolls cause changes to the numbers I want the virtual tabletop to track, which means I'm going to have to figure out how to express and return changes to the state.&lt;/p&gt;
&lt;p&gt;I don't think I'll get anywhere with that tonight, so I'm going to wrap up for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-11-07</title><link href="https://mwchase.neocities.org/coding-2020-11-07" rel="alternate"></link><published>2020-11-07T05:00:00-05:00</published><updated>2020-11-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-11-07:/coding-2020-11-07</id><summary type="html">&lt;p class="first last"&gt;Want. Implement. Procrastinate on testing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was doing other stuff today, like napping, so let's see about blogging code work as I do it.&lt;/p&gt;
&lt;p&gt;First thing I want to do is separate out my click-trio &amp;quot;adaptor&amp;quot; class into its own package.
Let's see about that...&lt;/p&gt;
&lt;p&gt;Okay, that's done, no proper tests though.&lt;/p&gt;
&lt;p&gt;I would have liked to get more done, but I guess I just wasn't up for it.
I should get to bed ASAP.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-11-06</title><link href="https://mwchase.neocities.org/coding-2020-11-06" rel="alternate"></link><published>2020-11-06T05:00:00-05:00</published><updated>2020-11-06T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-11-06:/coding-2020-11-06</id><summary type="html">&lt;p class="first last"&gt;Today would have gone a lot worse if it hadn't turned out that the code all basically works.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I started playing around with my rewritten code, and the behavior seems solid.
It still desperately needs tests, but I want to couple any testing with more of a rewrite.&lt;/p&gt;
&lt;p&gt;Basically, the change I've been doing recently was to rework how my roller functions send messages to the host application.
Formerly, when I knew I didn't need input, I was able, and I think this was the right call within that context, to structure the output as a generator, using yields and yield froms to compose different components.
The basic concept, which I haven't yet written a host application to take proper advantage of, was to be able to incrementally display new messages as the calculations are completed.
I &lt;em&gt;think&lt;/em&gt; all of this is a kind of manual, restricted version of how async is implemented in Python.&lt;/p&gt;
&lt;p&gt;Now, Mythic will require the ability to prompt the user for input, and process the result.
A much earlier form of this code worked by just using the &lt;tt class="docutils literal"&gt;input&lt;/tt&gt; function directly, but I wanted something that would be more abstract from the standpoint of the business logic.
From reading about async, I thought it would be a better fit in terms of idiomatically expressing the behavior of input and output.&lt;/p&gt;
&lt;p&gt;When I actually tried it, I liked the result, especially because it allowed me to rewrite some context-manager type code as an actual context manager, rather than a higher-order function.
Marginal effort, marginal gain, good prospects for future changes.&lt;/p&gt;
&lt;p&gt;One thing that happened as a result of the rewrite was that I wrote an adaptor class that bridges Click and Trio.
I want to move that to its own package in the monorepo.
I'll do that first.&lt;/p&gt;
&lt;p&gt;And now, I sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-11-05</title><link href="https://mwchase.neocities.org/coding-2020-11-05" rel="alternate"></link><published>2020-11-05T05:00:00-05:00</published><updated>2020-11-05T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-11-05:/coding-2020-11-05</id><summary type="html">&lt;p class="first last"&gt;Test-*excessive mumbling*-development&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Things are looking generally up-ish from here.
I wa still kind of jittery, so rather than doing any kind of careful, considered work on my hobby code, I just switched everything over to using async, and disabled every test that looked at the resulting code funny.&lt;/p&gt;
&lt;p&gt;I'm going to have a heck of a time restoring coverage, but once I get coverage back up, I should be good to make enough progress on porting Mythic.
Where &amp;quot;enough progress&amp;quot; means &amp;quot;I'll write some code, then get a proper use case for a much less destructive change that I'll need to make&amp;quot;.&lt;/p&gt;
&lt;p&gt;I'm not really done with the original rewrite, it's just at a good stopping point.&lt;/p&gt;
&lt;p&gt;Anyway, I'm not up for focusing any more tonight, so I guess I'm done.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-11-04</title><link href="https://mwchase.neocities.org/coding-2020-11-04" rel="alternate"></link><published>2020-11-04T05:00:00-05:00</published><updated>2020-11-04T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-11-04:/coding-2020-11-04</id><summary type="html">&lt;p class="first last"&gt;I really want things to be better later.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, these posts are dated at the start of the day after they're about.
So this Wednesday post was written after a day of, well, I'm in the USA, so you can probably guess how it's been.
And probably going to be for a while.&lt;/p&gt;
&lt;p&gt;Regardless of those jitters, I got enough stuff together for Mythic to start thinking about how I'm going to put it all together.
It's not exactly clear to me from the perspective of just dashing off code, due to a few factors:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The chaos factor is consistent over the course of a single roll, and would be nice to avoid passing around overmuch, but it changes at defined points.&lt;/li&gt;
&lt;li&gt;The original fate roll will require user input according to additional factors that are not relevant to the rest of the roll calculation.&lt;/li&gt;
&lt;li&gt;The fate roll may result in additional outcomes &lt;em&gt;after&lt;/em&gt; the roll is resolved.&lt;/li&gt;
&lt;li&gt;There's a rules question here that I never asked about, and kind of don't want to; I'd rather just stand by my decision earlier.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I've got some ideas for how to deal with this; in a few cases, several possible solutions to one problem.
I'd like to ponder this stuff away from my screen.
It's late enough already.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2020-11-03</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-11-03" rel="alternate"></link><published>2020-11-03T05:00:00-05:00</published><updated>2020-11-03T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-11-03:/weekly-roundup-2020-11-03</id><summary type="html">&lt;p class="first last"&gt;Kind of a rough week that I don't fully remember.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I messed with trio and tkinter, and decided that I wanted to focus on the code that I understood better, to start with.&lt;/li&gt;
&lt;li&gt;Thursday: I made my tkinter/trio bridge better, but still not good enough that I'd want to show it off. On the virtual tabletop side, I implemented some stuff for Risus.&lt;/li&gt;
&lt;li&gt;Friday: I laid ut all of the systems that I want to implement stuff for to start with, and their approximate order of implementation.&lt;/li&gt;
&lt;li&gt;Saturday: I went through all of the details of Mythic's bundled lightweight system.&lt;/li&gt;
&lt;li&gt;Sunday: I started working on stuff for fate rolls in Mythic.&lt;/li&gt;
&lt;li&gt;Monday: I got more data structures for Mythic written. No real tests yet; I should probably get on that.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'll try to keep on all that, but I've got a few other things I could look into.
One is taking advantage of my design's sensibilities to port over more complex systems.
And another is taking another crack at songwriting for an idea that I don't feel like laying out here and now.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2020-11-02</title><link href="https://mwchase.neocities.org/coding-2020-11-02" rel="alternate"></link><published>2020-11-02T05:00:00-05:00</published><updated>2020-11-02T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-11-02:/coding-2020-11-02</id><summary type="html">&lt;p class="first last"&gt;Can't tell if it's because of how late it was while I was coding things, but now that I better understand the default system in Mythic, I &lt;em&gt;really&lt;/em&gt; don't like it. Good thing I won't be using it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got the bedrock details of original Mythic added.
What's mostly missing now is stuff that I've already coded up, so I'll be looking through that later.&lt;/p&gt;
&lt;p&gt;Going off daylight saving time is messing me up at this actually-extremely-late hour, so I'm not up for describing or explaining anything.
I should figure out when I will be, since I'm not sure when I'll have much to say on this before I get everything together and start trying to actually use it.&lt;/p&gt;
&lt;p&gt;Anyway, I'll stop forcing myself to stay up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-11-01</title><link href="https://mwchase.neocities.org/coding-2020-11-01" rel="alternate"></link><published>2020-11-01T04:00:00-05:00</published><updated>2020-11-01T04:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-11-01:/coding-2020-11-01</id><summary type="html">&lt;p class="first last"&gt;I &lt;em&gt;think&lt;/em&gt; I have to change the timestamps tomorrow?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Manifold Garden Manifold Garden Manifold Garden.&lt;/p&gt;
&lt;p&gt;Anyway, I didn't get those plans from yesterday implemented earlier today, for &lt;em&gt;some reason&lt;/em&gt;, so let's see what I can do now.&lt;/p&gt;
&lt;p&gt;So, I didn't get too much done:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The classes required for odds and ranks, missing some of the helper bits I put in other versions&lt;/li&gt;
&lt;li&gt;The fate chart is entered as a resource file.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If I manage to get things together on this for more than a few hours tomorrow, I should be able to sort things out.&lt;/p&gt;
&lt;p&gt;Anyway, it'll probably be tomorrow when I post this, so I'm done for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-10-31</title><link href="https://mwchase.neocities.org/coding-2020-10-31" rel="alternate"></link><published>2020-10-31T04:00:00-04:00</published><updated>2020-10-31T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-10-31:/coding-2020-10-31</id><summary type="html">&lt;p class="first last"&gt;I know it has two &amp;quot;i&amp;quot;s in the book, but I'm willing to be a prescriptivist at myself.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was tired all day, so, planning rather than wild prototyping.
With the Mythic stuff, I have four systems.
I'm leaning toward giving each of them their own package, but I don't know if that'll lead to problems.&lt;/p&gt;
&lt;p&gt;Putting that aside, covering the question of Rank.
Rank is used in various parts of Mythic, and my inclination is to turn it into a union of three types.
&amp;quot;Raw Rank&amp;quot; ranges from Minuscule to Superhuman.
There is also Superhuman Plus, and Minuscule Plus.
Characters can have Ranks that are Raw, or Superhuman Plus.
Rank shifts can adjust the ranks to anywhere in the full range.
The Plus ranks have an associated number, which, to be consistent with the Fate Chart, has a minimum value of 2.
The Plus ranks calculate an adjustment factor from their number; for the Raw ranks, this number is just 0.
The overall adjustment is the acting rank adjustment minus the difficulty adjustment.
Odds and Chaos Factor map to a Raw Rank, and those are then used as input to the fate function.&lt;/p&gt;
&lt;p&gt;Back to the character sheet, there are seven default attributes, as well as allowances for customization.
There are also abilities, which are more freeform.
Attributes and abilities are given a rank of at least minuscule.
Strengths and weaknesses consist of a name, rank shift (number from -3 to 3) and description (when it applies, and what it applies to).
Rank shifts must be applied at user discretion, from the point of view of the code.
There are also notes (this should be a module provided by the base package), and favor points (this should be a distinct module).
There's also &amp;quot;summary&amp;quot;, which I'll stick on the main Mythic module for now, but it might move to its own thing.&lt;/p&gt;
&lt;p&gt;Besides that, I don't need much I haven't already implemented in some form.
I need to be able to track the chaos factor, and I &lt;em&gt;think&lt;/em&gt; for that, I'll implement an idea of &amp;quot;party&amp;quot; that the player sheets can point to, and that'll hold the chaos factor.&lt;/p&gt;
&lt;p&gt;I've worked out a bunch of stuff to sink my teeth into.
I should get on this tomorrow afternoon.
For now, sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-10-30</title><link href="https://mwchase.neocities.org/coding-2020-10-30" rel="alternate"></link><published>2020-10-30T04:00:00-04:00</published><updated>2020-10-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-10-30:/coding-2020-10-30</id><summary type="html">&lt;p class="first last"&gt;For some reason, not totally willing to commit to &amp;quot;this is entirely a personal tool&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Looking over the systems I'm going to try to implement:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Risus (moving on for now)&lt;/li&gt;
&lt;li&gt;Mythic&lt;/li&gt;
&lt;li&gt;Mythic Variations&lt;/li&gt;
&lt;li&gt;Mythic Variations 2&lt;/li&gt;
&lt;li&gt;Some homebrew for Mythic Variations 2&lt;/li&gt;
&lt;li&gt;The Adventure Crafter&lt;/li&gt;
&lt;li&gt;(&lt;em&gt;Maybe&lt;/em&gt; other Word Mill stuff, but I'm not planning on it)&lt;/li&gt;
&lt;li&gt;The Universal NPC Emulator&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I intend to add support for everything, even the stuff I'm not planning to use, but I'm ready to jettison that.&lt;/p&gt;
&lt;p&gt;Here's the basic idea: The Adventure Crafter provides the large-scale arc of events, and hooks into the genre tables from Mythic Variations; the homebrew allows using the V2 fate check, which is much more compact; V2 also provides most of the other moment-to-moment questions, except for combat and task resolution, which are on Risus, and the behavior check, which is on the UNE.&lt;/p&gt;
&lt;p&gt;This &amp;quot;just the way I like it&amp;quot; setup leaves out a shocking amount of the original Mythic, but everything else will need to be most of the way implemented.&lt;/p&gt;
&lt;p&gt;Mythic will be interesting because it will require references to the modules in some of the roll flows, and the ability to update some of those modules because the original fate check allows you to spend resources to influence the outcome.&lt;/p&gt;
&lt;p&gt;Other things that will be required: those same resources will need to be able to listen for events in the game, or to ask for a judgment call at specific junctures.&lt;/p&gt;
&lt;p&gt;I won't be using the specific mechanics I have in mind there, but I think that at least planning them will help inform the architecture.&lt;/p&gt;
&lt;p&gt;I don't know if I'll make much progress on this tomorrow; the weekend seems like a better bet.
Anyway, I should wrap up, it's late again.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-10-29</title><link href="https://mwchase.neocities.org/coding-2020-10-29" rel="alternate"></link><published>2020-10-29T04:00:00-04:00</published><updated>2020-10-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-10-29:/coding-2020-10-29</id><summary type="html">&lt;p class="first last"&gt;The spellcheck dictionary here is weirdly limited for a code-centric editor. Seriously trying to tell me that &amp;quot;validator&amp;quot; isn't a word?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Still not handling my time well.
I did some hacking on the tkinter/Trio bridge, a mix of improving the correctness and just kind of golfing things down.
I'm not using what I have, and it's got some inflexibility that means I'd be reluctant to give it to anyone else until it's been proved out on non-toy code.&lt;/p&gt;
&lt;p&gt;So far as the virtual tabletop stuff, I just kind of did a few of the things I've been thinking about: removing the specific requirement for a serializer registry on the classes, implementing common modules, and implementing stuff for Risus.
I don't feel like writing tests for validators for the stuff I have now, so I'll probably just add some TODOs and start switching between systems to implement.&lt;/p&gt;
&lt;p&gt;I'm slightly more tired than I thought I'd be now, so I should wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-10-28</title><link href="https://mwchase.neocities.org/coding-2020-10-28" rel="alternate"></link><published>2020-10-28T04:00:00-04:00</published><updated>2020-10-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-10-28:/coding-2020-10-28</id><summary type="html">&lt;p class="first last"&gt;Not sure what the proportion is here between &amp;quot;not having enough prototyped to make an informed decision&amp;quot; and &amp;quot;wanting to stay in my comfort zone&amp;quot;, with a side bit of &amp;quot;taking on a bunch of new concepts and wondering if I'm over-complicating things&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, here's what I did today.
I tested communicating with trio from the tkinter side of the event loop, and it seemed to work.
Aside from that, napping, and, like, work and eating, I guess.&lt;/p&gt;
&lt;p&gt;Anyway, I'm hoping that I can use trio to handle computationally intensive or elaborate tasks.
I'm not sure how much sense it makes to go for it right off, so I'm now going to focus on wrapping or adapting my existing code to stream event information to a basic tkinter app.
I think I'd like to make things general enough that the same core logic can drive the command line or a GUI, but I'm not sure that makes sense.&lt;/p&gt;
&lt;p&gt;There's kind of a bunch of things I want to do, but they've got weird interdependencies and I'm not sure what I want to do first:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Factor out the requirement (not at all validated) that Modules define serializers, and put together some kind of policy-checking-something.&lt;/li&gt;
&lt;li&gt;Implement workflows that require user input, so I have something concrete to check against.&lt;/li&gt;
&lt;li&gt;Evaluate whether async adds value to those workflows.&lt;/li&gt;
&lt;li&gt;Figure out the general GUI design I want.&lt;/li&gt;
&lt;li&gt;Determine how to handle widget design for specific components.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thinking about this, I think what I want to do is punt on GUI code and actually using the serializers, and work on getting data structures and workflows for the symptoms I want, so I can have something concrete to point to when sketching out the systems I want.&lt;/p&gt;
&lt;p&gt;I'll write as much stuff as I can for each system.
(The serializers for Modules should be simple, and will let me know what validation actually needs, for example.
Also, I don't think I'm ready to put together a whole GUI, but I can definitely put together experimental widgets and see where the rough bits are.)&lt;/p&gt;
&lt;p&gt;I've been in rough shape myself lately, so I'm going to try to wrap up, like, thirty whole minutes earlier than usual.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2020-10-27</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-10-27" rel="alternate"></link><published>2020-10-27T04:00:00-04:00</published><updated>2020-10-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-10-27:/weekly-roundup-2020-10-27</id><summary type="html">&lt;p class="first last"&gt;Guess I'm learning new things. Wasn't quite planning on that.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I laid out my design concept for serializer methods, and thereby realized that I didn't want to use that concept.&lt;/li&gt;
&lt;li&gt;Thursday: I started working on type stubs for a third-party serialization library&lt;/li&gt;
&lt;li&gt;Friday: I sketched out what functionality I want from serializer validation. (That is, validation of the serializer, not validation performed by the serializer.)&lt;/li&gt;
&lt;li&gt;Saturday: I sketched out requirements for what exactly the serializer validation should look for.&lt;/li&gt;
&lt;li&gt;Sunday: I pondered how the new module that has all of this stuff feels too big already.&lt;/li&gt;
&lt;li&gt;Monday: I let things go until after minight and rushed out a post.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to experiment with what I can do with tkinter.
One thing I'm pretty sure I can do is integrate it with Trio, which should give me the ability to avoid explicitly breaking up big functions: just write helper functions that kick stuff off, then use a channel or an event or something.
(It looks like other people have looked into the general idea of Trio + tkinter, and run into &lt;a class="reference external" href="https://github.com/python-trio/trio/issues/1578#issuecomment-689785694"&gt;caveats&lt;/a&gt;.)
I need to get more experienced with tkinter first, and see how far I can push it to work with my existing message passing stuff.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2020-10-26</title><link href="https://mwchase.neocities.org/coding-2020-10-26" rel="alternate"></link><published>2020-10-26T04:00:00-04:00</published><updated>2020-10-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-10-26:/coding-2020-10-26</id><summary type="html">&lt;p class="first last"&gt;Oh no, not procrastination. Again. Who could have predicted this?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I let things go late again.
Here's the extremely fast summary of what I worked on today.&lt;/p&gt;
&lt;p&gt;I laid out the responsibilities of each module in my main virtual tabletop thing.
For the old modules, this is easy.
For the new module, it's kind of not.
I pondered trying to give this a GUI, and decided I'd like to make some decisions on that ahead of time so my design choices can be informed by an actual framework.&lt;/p&gt;
&lt;p&gt;I then started researching some of my options for GUI toolkits.&lt;/p&gt;
&lt;p&gt;And that brings us up to now.
I need to wrap up ASAP, so.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-10-25</title><link href="https://mwchase.neocities.org/coding-2020-10-25" rel="alternate"></link><published>2020-10-25T04:00:00-04:00</published><updated>2020-10-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-10-25:/coding-2020-10-25</id><summary type="html">&lt;p class="first last"&gt;I don't know if &amp;quot;carve&amp;quot; sounds weird, but it &lt;em&gt;feels&lt;/em&gt; right.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I know what the code needs to do for runtime serializer validation, but I'm not totally sure how to actually wedge the functionality in there.&lt;/p&gt;
&lt;p&gt;Part of the problem is that the module for managing modules/sheets/tables is starting to feel bloated to me.
I think I need to set aside some time to pin down what I'm trying to accomplish, and how each part fits into that.
Let's see what I can do towards that right now, in the next fifteen minutes or so.&lt;/p&gt;
&lt;p&gt;Basically, I want to play tabletop games that aren't &lt;em&gt;not&lt;/em&gt; meant for solo play, and I've got a few issues:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Even with my heavily tricked-out rules binder (so many flags sticking out of everywhere), it's sometimes a pain tracking down the relevant rules, and I've got new rules I want to try out.&lt;/li&gt;
&lt;li&gt;We don't have many dice.&lt;/li&gt;
&lt;li&gt;I don't want to have to keep track of physical character sheets, especially if I decide I want to do something like, I don't know, Danger Patrol but it's Retrocausality.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The second bullet point is an extremely solved problem by now.
I have iterated on code to handle this a whole bunch, and it's fine.
The first bullet point requires work to be done per-system, and also needs the third bullet.
The third bullet is what I've been focusing on recently.&lt;/p&gt;
&lt;p&gt;Putting them out like this suggests some avenues of improvement.
The second-bullet code is spread across seven modules, while the third bullet point is crammed into one.&lt;/p&gt;
&lt;p&gt;That's the first order of business: figuring out all of the responsibilities in this module so I can carve it up.&lt;/p&gt;
&lt;p&gt;Anyway, it's been more than fifteen minutes and I'm about to fall asleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-10-24</title><link href="https://mwchase.neocities.org/coding-2020-10-24" rel="alternate"></link><published>2020-10-24T04:00:00-04:00</published><updated>2020-10-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-10-24:/coding-2020-10-24</id><summary type="html">&lt;p class="first last"&gt;I'm still a little bitter about PEP 416 getting rejected.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I sort of took today easy, so this is going to just be a quick sketch of what I'm going to try to accomplish.&lt;/p&gt;
&lt;p&gt;This is all based off the &lt;a class="reference external" href="https://github.com/eevee/camel"&gt;camel&lt;/a&gt; library.
My minimum requirements are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;No multi-dumpers.&lt;/li&gt;
&lt;li&gt;Always use the highest version. This is &lt;tt class="docutils literal"&gt;None&lt;/tt&gt; if &lt;tt class="docutils literal"&gt;None&lt;/tt&gt; is present in the dumper dict, and the maximum value otherwise.&lt;/li&gt;
&lt;li&gt;Warn if the parameter annotations don't match the type.&lt;/li&gt;
&lt;li&gt;Expect a container type as the output&lt;/li&gt;
&lt;li&gt;If a list, add its parameter&lt;/li&gt;
&lt;li&gt;If a union, add each parameter&lt;/li&gt;
&lt;li&gt;If a typeddict (the normal case), add the type of each field&lt;/li&gt;
&lt;li&gt;Keep track of which types were seen; the values should form some kind of DAG, but the type system doesn't have to enforce that (even if it usually will)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Basically, most types should just be recursed on immediately, but we need special casing for lists, unions (and probably optionals), dicts, and typed dicts.
Basically, we need typed dict special casing because that's what most of the data will use for serialization, and we need special casing for all supported generics because we need to consider each runtime type separately.&lt;/p&gt;
&lt;p&gt;Another requirement that I'm not yet sure how to accomplish: no two registries should implement loaders or dumpers for the same type.
(If one registry implements a dumper for a type that isn't needed by the types that bring in that registry, then that dumper won't be checked, unless I just declare that every dumper in a every registry gets checked.)&lt;/p&gt;
&lt;p&gt;I'm tired and I don't think I can make this make much more sense for now, so I'm calling it here.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-10-23</title><link href="https://mwchase.neocities.org/coding-2020-10-23" rel="alternate"></link><published>2020-10-23T04:00:00-04:00</published><updated>2020-10-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-10-23:/coding-2020-10-23</id><summary type="html">&lt;p class="first last"&gt;List of caveats inspired by reading a bunch of Hillel Wayne, I think.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I seem to have gotten the type stubs I wrote working, so that's exciting.
After I publish this, I'm going to try updating the tests to be properly type-compatible before I start tossing in runtime validation using the new fields I expect to have.&lt;/p&gt;
&lt;p&gt;The basic idea there is to write visitors for different kinds of generic aliases, so I can confirm at import time that, if the data in a module instance conforms to its type annotations, the instance should be able to attempt &lt;em&gt;something&lt;/em&gt; when serialized.
There are a few things this idea doesn't test:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Whether the type annotations are actually accurate.&lt;/li&gt;
&lt;li&gt;Whether the serializer functions provided by the libraries will succeed.&lt;/li&gt;
&lt;li&gt;Whether loaders exist for the serialized data (this wouldn't be hard to add, but I don't know if it'd be worth it)&lt;/li&gt;
&lt;li&gt;Whether the serializers and deserializers properly round-trip data (this would be the domain of property-based testing)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I think what I want to do is get the basic runtime infrastructure together for the basic serializer checks, then work on property-based tests.
The idea there is to make sure that, if I use this code, it'll end up writing &lt;em&gt;something&lt;/em&gt; to disk.
The property-based testing is to develop confidence that what's written to disk is valid.
As long as I don't totally cheap out on the serializers, then it's &lt;em&gt;probably&lt;/em&gt; not a problem if something is wrong with a loader, since I can just debug the loader and then pick things back up.&lt;/p&gt;
&lt;p&gt;Anyway, cutting things close on time, better wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-10-22</title><link href="https://mwchase.neocities.org/coding-2020-10-22" rel="alternate"></link><published>2020-10-22T04:00:00-04:00</published><updated>2020-10-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-10-22:/coding-2020-10-22</id><summary type="html">&lt;p class="first last"&gt;This entry brought to you by both poor judgment, and poor time management.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Quick post.&lt;/p&gt;
&lt;p&gt;Got distracted by various things, the last of which was writing type stubs for a third-party library that only sort of fits my idea of a PEP-484 compliant library.
It's tricky, but I'm making headway.&lt;/p&gt;
&lt;p&gt;For a different value of it, it's midnight, so I should wrap up for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-10-21</title><link href="https://mwchase.neocities.org/coding-2020-10-21" rel="alternate"></link><published>2020-10-21T04:00:00-04:00</published><updated>2020-10-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-10-21:/coding-2020-10-21</id><summary type="html">&lt;p class="first last"&gt;It's nice to talk through my original design and figure out how much of it is unneeded or counterproductive.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;For the past few days, I thought about how I want to set up serialization so that there's some assurance that the classes I care about can handle it.&lt;/p&gt;
&lt;p&gt;Here's what I'm currently thinking of.
It's pretty elaborate, but it should provide the bare minimum of verification.&lt;/p&gt;
&lt;p&gt;Right now, my module modules look like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;

&lt;span class="nd"&gt;@attr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataclass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frozen&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FooModule&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;

&lt;span class="c1"&gt;# ModuleProxy populates a global registry,&lt;/span&gt;
&lt;span class="c1"&gt;# such that each module only has one proxy.&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FooProxy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ModuleProxy&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;FooModule&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;FooModule&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Put extra validation or functionality in&lt;/span&gt;
&lt;span class="sd"&gt;    here, not relevant to the example.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I want to make them look something like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FooSerialized&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TypedDict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FooBarSerializer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Serializer&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nd"&gt;@dumper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__dump_foo_v1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;FooModule&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;FooSerialized&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="c1"&gt;# type: ignore[misc]&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;field&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;# I haven&amp;#39;t thought too hard about this bit.&lt;/span&gt;
    &lt;span class="c1"&gt;# Maybe it&amp;#39;d be like this, maybe I&amp;#39;ll go crazier with subclassing.&lt;/span&gt;
    &lt;span class="c1"&gt;# Maybe I could go the other way and make everything a staticmethod.&lt;/span&gt;
    &lt;span class="nd"&gt;@loader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nd"&gt;@staticmethod&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__load_foo_v1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;FooSerialized&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;FooModule&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;FooModule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;field&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="nd"&gt;@attr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataclass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frozen&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FooModule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FooBarSerializer&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;

&lt;span class="c1"&gt;# Add the typing checks here,&lt;/span&gt;
&lt;span class="c1"&gt;# because that&amp;#39;s the latest that still has teeth.&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FooProxy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ModuleProxy&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;FooModule&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;FooModule&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Same as last time.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The verification step would basically be to make sure that, for every user-defined class that the module is defined in terms of, that class has a dumper defined in the module's base class.&lt;/p&gt;
&lt;p&gt;Thinking about it like that, I'm inclined to go the &amp;quot;everything is a staticmethod&amp;quot; route.&lt;/p&gt;
&lt;p&gt;Thinking over this from the top, I could make the serializer class a required class attribute rather than a subclass, which would make things cleaner.&lt;/p&gt;
&lt;p&gt;From there, I could remove the &amp;quot;dumb container&amp;quot; class, and just work with serializer registries directly.&lt;/p&gt;
&lt;p&gt;With a little minor fiddling, then, it shouldn't be as big of a change as I was thinking it might be.&lt;/p&gt;
&lt;p&gt;It's late, done for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2020-10-20</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-10-20" rel="alternate"></link><published>2020-10-20T04:00:00-04:00</published><updated>2020-10-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-10-20:/weekly-roundup-2020-10-20</id><summary type="html">&lt;p class="first last"&gt;If I keep on getting sidetracked like this, I'll end up trying to work on Shine Whave again or something.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I looked for natlangs to base my writeup off of.&lt;/li&gt;
&lt;li&gt;Thursday: I got sidetracked trying to figure out how L works in English. It's very subtle, and I can feel distinctions that I can't consistently hear.&lt;/li&gt;
&lt;li&gt;Friday: I decided it was time to look at the natlang grammars, and so I ended up...&lt;/li&gt;
&lt;li&gt;Saturday: Coding up auto-roller stuff.&lt;/li&gt;
&lt;li&gt;Sunday: I got sidetracked again via Minecraft, but I did get some design work done.&lt;/li&gt;
&lt;li&gt;Monday: I implemented the design, but not the tests. I thought about future directions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'd like to start looking at some of the natlang grammars, and figuring out how I want to handle serialization for the virtual tabletop stuff.
I know I want &lt;em&gt;something&lt;/em&gt;, because I don't want to do this all within a single Python session.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2020-10-19</title><link href="https://mwchase.neocities.org/coding-2020-10-19" rel="alternate"></link><published>2020-10-19T04:00:00-04:00</published><updated>2020-10-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-10-19:/coding-2020-10-19</id><summary type="html">&lt;p class="first last"&gt;Today's discovery: apparently, now my laptop needs a full restart after every software update, whether it says so or not.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got the classes for modeling the broader relationships between player characters hopefully completed.
There are a few directions to go from this:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Adding tests so I have some assurance that this stuff actually works.&lt;/li&gt;
&lt;li&gt;Adding common modules.&lt;/li&gt;
&lt;li&gt;Writing a module for Risus.&lt;/li&gt;
&lt;li&gt;Adding serialization support.&lt;/li&gt;
&lt;li&gt;Working on the six other systems I want to use.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I &lt;em&gt;think&lt;/em&gt; that's about the right order to work on this stuff in.
Maybe do serialization somewhat sooner.&lt;/p&gt;
&lt;p&gt;In any case, things are shaping up.
I just hope it doesn't all go horribly wrong when I try to actually use the new stuff.
If it does, it should at least be fixable.&lt;/p&gt;
&lt;p&gt;Anyway, it's getting late.
I'd like to wrap things up before I zone out too much more.&lt;/p&gt;
&lt;p&gt;(At some point, I should see about replacing some of my third-party software repositories with new versions, but that point is &lt;em&gt;super&lt;/em&gt; not now.)&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-10-18</title><link href="https://mwchase.neocities.org/coding-2020-10-18" rel="alternate"></link><published>2020-10-18T04:00:00-04:00</published><updated>2020-10-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-10-18:/coding-2020-10-18</id><summary type="html">&lt;p class="first last"&gt;Maybe these entries would be longer if I got enough sleep, and also didn't play I-don't-know-how-much Minecraft.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Minecraft Minecraft Minecraft.&lt;/p&gt;
&lt;p&gt;Anyway, I thought about how to handle Risus stuff, and then realized that my baseline classes aren't expressive enough to handle everything about the parts of Risus I want to represent, so I'm workig on designing the additional stuff.
I want to say that this will be enough detail to support anything else (basically, an individual module needs to have an interface it can use to inspect the entire table), but I can't feel confident about that.&lt;/p&gt;
&lt;p&gt;I haven't started coding this yet, but I'd like to get the ball rolling for tomorrow, so I'll start adding stub classes after I publish this.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-10-17</title><link href="https://mwchase.neocities.org/coding-2020-10-17" rel="alternate"></link><published>2020-10-17T04:00:00-04:00</published><updated>2020-10-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-10-17:/coding-2020-10-17</id><summary type="html">&lt;p class="first last"&gt;This code is easy to test, but sometimes I have trouble testing it &lt;em&gt;meaningfully&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've been coding on and off all week.
I've stashed away the Ironsworn stuff, and I'm working on a system for Risus.
My basic plan is to get the dice rolls solid (since that's what I personally care most about automating), and then see about working outward to handle stuff like character sheets (relatively simple) and the combat rules.&lt;/p&gt;
&lt;p&gt;I should probably do some planning or design once I'm done adding test coverage, since I'm not sure how to represent stuff like teams at a character sheet level.
It might need another redesign.&lt;/p&gt;
&lt;p&gt;Anyway, I got distracted playing Minecraft, so this entry is quick and short.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Conlanging 2020-10-16</title><link href="https://mwchase.neocities.org/conlanging-2020-10-16" rel="alternate"></link><published>2020-10-16T04:00:00-04:00</published><updated>2020-10-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-10-16:/conlanging-2020-10-16</id><summary type="html">&lt;p class="first last"&gt;Maybe these entries would end up less sparse if I brought back the &amp;quot;specific things on specific days&amp;quot; structure.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;A bit more Novegradian.
I'm liking the historical aspects, but I know that for my own conlang, I'd like the details to be much sketchier, so I should probably be looking at some of the natlang grammars soon, since those shuld give me an idea of what kind of things get said about extinct languages that we don't know much about.&lt;/p&gt;
&lt;p&gt;Spaced out for a bit, and once again I don't have much to add to what I've already said.
Wrapping up for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Conlanging 2020-10-15</title><link href="https://mwchase.neocities.org/conlanging-2020-10-15" rel="alternate"></link><published>2020-10-15T04:00:00-04:00</published><updated>2020-10-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-10-15:/conlanging-2020-10-15</id><summary type="html">&lt;p class="first last"&gt;Real tongue hours.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Reading up on Novegradian, I see that my confusion about the lateral consonants was due to unfamiliarty with IPA, and it's a contrast between clear L and dark L.
Both exist in English, except not quite, because English has alveolar L, and Novegradian (and apparently also Russian; I am learning so much Russian phonology, and getting progressively more annoyed with how evidently inadequate Duolingo is on its own) has dental L.&lt;/p&gt;
&lt;p&gt;Okay, I say all that, because that's what Wikipedia says, but I can't tell the difference audibly, and also, I'm pretty sure I actually use both in English?
Like, alveolar for word-final L, and dental otherwise.
(Except that's not quite right, because &amp;quot;lull&amp;quot; is all alveolar, &amp;quot;lily&amp;quot; is all dental, and the second L in &amp;quot;little&amp;quot; remains alveolar even if I add a suffix.
I &lt;em&gt;think&lt;/em&gt; compound words count as &amp;quot;not word-final&amp;quot;.
&amp;quot;Small&amp;quot; is alveolar, and I think &amp;quot;small-minded&amp;quot; is dental.)
Is that a thing?&lt;/p&gt;
&lt;p&gt;Well, my wife got similar results, and neither of us can tell what's going on by listening.
I should stop messing with this for now, because now my tongue is a little sore.&lt;/p&gt;
&lt;p&gt;Anyway, yeah, a bit more progress reading about Novegradian, and a bunch of learning about natlangs.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Conlanging 2020-10-14</title><link href="https://mwchase.neocities.org/conlanging-2020-10-14" rel="alternate"></link><published>2020-10-14T04:00:00-04:00</published><updated>2020-10-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-10-14:/conlanging-2020-10-14</id><summary type="html">&lt;p class="first last"&gt;So much of problem solving is restating things you know until you notice an obvious follow-up question.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I started reading the grammar for Novegradian.
It looks extremely promising as a reference point for what I plan with my current project, so I'll definitely keep on with it, even if it is a bit... lengthy.
I don't have much to comment about it specifically yet; I think I'm still in the introduction.&lt;/p&gt;
&lt;p&gt;One thing I'm trying to figure out is how much (invented) history I want to present in the grammar that I write.
I do have a basic historical trajectory sketched, but I kind of want to present this language as an isolate, even if I do have an explanation for where it came from.
Although, if I commit to an in-universe perspective, I suppose that means I'd have to mark some fraction of the language as a reconstruction, as it's supposed to be an exinct language.&lt;/p&gt;
&lt;p&gt;I suppose I should do the thing that I now realize is obvious, and look up resources on languages that went extinct in the past few centuries.&lt;/p&gt;
&lt;p&gt;Okay, a few skims of Wikipedia later, and I've got a promising cross-section of languages to investigate.&lt;/p&gt;
&lt;p&gt;All right, I can't think of anything else to say here, so I'll wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Weekly Roundup 2020-10-13</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-10-13" rel="alternate"></link><published>2020-10-13T04:00:00-04:00</published><updated>2020-10-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-10-13:/weekly-roundup-2020-10-13</id><summary type="html">&lt;p class="first last"&gt;Everything feels at least slightly different...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I grabbed some reference grammars, and forgot that definition of &amp;quot;grammar&amp;quot;.&lt;/li&gt;
&lt;li&gt;Thursday: I remembered the definition, and reconsidered my approach to reading the grammars.&lt;/li&gt;
&lt;li&gt;Friday: I put together a wishlist for things I want to see in a grammar, beyond the established checklists.&lt;/li&gt;
&lt;li&gt;Saturday: I took a detour from conlang stuff to work on some hobby code.&lt;/li&gt;
&lt;li&gt;Sunday: I explained at length some of the subtleties of one specific corner of Python's packaging ecosystem.&lt;/li&gt;
&lt;li&gt;Monday: I upgraded my laptop, and fixed all of the issues that I currently know about.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to skim over some of the other grammars, then start working in earnest on planning my own.
Probably tweak the hobby code some more, but I'd like that to be in the background.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2020-10-12</title><link href="https://mwchase.neocities.org/coding-2020-10-12" rel="alternate"></link><published>2020-10-12T04:00:00-04:00</published><updated>2020-10-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-10-12:/coding-2020-10-12</id><summary type="html">&lt;p class="first last"&gt;A collaboration between laziness and prudence.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Earlier today, I upgraded my laptop, and this post could very well have ended up brought to you by my phone's USB tethering mode, but I've fixed all of the upgrade issues.
That I know about.&lt;/p&gt;
&lt;p&gt;I did some coverage improvements for the auto-roller, as well as some fixes.
The testing I did convinced me to drop the pytest verbosity for that project, since it's a real pain to find a few failures buried in over a thousand successes.&lt;/p&gt;
&lt;p&gt;It'll also be kind of a pain to put together enough stuff to handle properly testing the Ironsworn stuff, which I'm not currently planning to actually use, but... hm.
Maybe I should see about putting this off in a branch or something.&lt;/p&gt;
&lt;p&gt;I should wrap this post up now so I have plenty of time to troubleshoot if something else is broken.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-10-11</title><link href="https://mwchase.neocities.org/coding-2020-10-11" rel="alternate"></link><published>2020-10-11T04:00:00-04:00</published><updated>2020-10-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-10-11:/coding-2020-10-11</id><summary type="html">&lt;p class="first last"&gt;There are two kinds of bulleted list items.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;More tweaks:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I undid some of my changes from yesterday, on the grounds that they weren't necessary, and made it harder to do type inference.&lt;/li&gt;
&lt;li&gt;I realized that setting the &lt;tt class="docutils literal"&gt;PIP_CONSTRAINT&lt;/tt&gt; environment variable made more sense than passing the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--find-links&lt;/span&gt;&lt;/tt&gt; argument to pip. I'm not sure if it's clear what use case could be somewhat covered by both of these. Basically, using constraint files was always the right answer for my use case, which is to have a bunch of packages in a repo that depend on each other, and I don't care about what's published. Passing &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--constraint&lt;/span&gt;&lt;/tt&gt; to pip didn't work here when the packages use flit, because currently pip generates further pip commands that don't respect the constraint files. (This might be less of an issue now, since flit tries to avoid installing so much any more, I think.) BUT, the environment variables get passed through, so &lt;tt class="docutils literal"&gt;PIP_CONSTRAINT&lt;/tt&gt; handles it. Before I realized this, I was pre-building the wheel files and storing them in a known location, so I could add that location as an index via &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--find-links&lt;/span&gt;&lt;/tt&gt;. The problem with that approach is that pip wouldn't actually prefer one index to another in any way that mattered to me, and I didn't want to cut off PyPI entirely. The way to require a local version of a package is constraint files, which didn't work for me, until I figured out this workaround, and also flit changed to not require the workaround, but, eh, the workaround makes it cleaner. (And it'll come in handy if I ever roll my own PEP 517 backend for some, presumably terrible, reason.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, next I want to switch focus to some systems that won't need such incredibly complicated formats for representing the relevant data, and work on factoring some things out.
(For example, most RPG characters have names.)&lt;/p&gt;
&lt;p&gt;And, I spaced out and it's late again, so I guess this post is done.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-10-10</title><link href="https://mwchase.neocities.org/coding-2020-10-10" rel="alternate"></link><published>2020-10-10T04:00:00-04:00</published><updated>2020-10-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-10-10:/coding-2020-10-10</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;my fancy metaprogramming was wrong, [so I] replaced it with different fancy metaprogramming&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I ended up not looking at conlang stuff today, so instead I'll talk about the coding stuff I was doing this week.
I've mentioed this before; the basic idea is that it's software for automatically following rolling rules for tabletop games, and hopefully tracking game state as well.
I'm not sure whether I'll ever be comfortable releasing the various &amp;quot;game&amp;quot; packages, but I might release the core at some point, maybe.&lt;/p&gt;
&lt;p&gt;This week, I put together a skeleton of an Ironsworn sheet to test the limits of the sheet logic, then realized that my fancy metaprogramming was wrong, and replaced it with different fancy metaprogramming that is slightly more amenable to typechecking.&lt;/p&gt;
&lt;p&gt;There are a few enhancements I want to make, some cleanup of the sheet, and then once I've wired stuff together and proven the basic functionality, I'll switch to the various systems that I'm interested in using currently, which should be simpler overall.&lt;/p&gt;
&lt;p&gt;Also, I should write serialization logic for all of this, which is going to be... a bit of a chore.&lt;/p&gt;
&lt;p&gt;I've been spacing out a bit tonight, so now it's late, so I guess I'm done for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Conlanging 2020-10-09</title><link href="https://mwchase.neocities.org/conlanging-2020-10-09" rel="alternate"></link><published>2020-10-09T04:00:00-04:00</published><updated>2020-10-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-10-09:/conlanging-2020-10-09</id><summary type="html">&lt;p class="first last"&gt;I should try and translate this into goals, and get to work soon.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Thoughts on what I'd like to look at first in a reference grammar:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Phonology&lt;/li&gt;
&lt;li&gt;The orthography used in the grammar&lt;/li&gt;
&lt;li&gt;Phonotactics, focusing at first on pronunciation changes that are implicit in the orthography&lt;/li&gt;
&lt;li&gt;Basic sentences and glosses&lt;/li&gt;
&lt;li&gt;Sentences and glosses embedded in a narrative context; basically, I want glosses where there's a motivation to say a sentence like &amp;quot;The girl brings a book to the elder.&amp;quot; or whatever.&lt;/li&gt;
&lt;li&gt;My idea here is &amp;quot;quickly get a sense of how it sounds&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some of this might not live in a grammar.
I'm not sure.&lt;/p&gt;
&lt;p&gt;Anyway, there's a lot more to cover, and stuff that needs to be worked out to get these, like morphology.&lt;/p&gt;
&lt;p&gt;I think these give me a good baseline to work towards.&lt;/p&gt;
&lt;p&gt;I'm tired and I divided my attention, so it's once again a quick entry.
Oh well.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Conlanging 2020-10-08</title><link href="https://mwchase.neocities.org/conlanging-2020-10-08" rel="alternate"></link><published>2020-10-08T04:00:00-04:00</published><updated>2020-10-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-10-08:/conlanging-2020-10-08</id><summary type="html">&lt;p class="first last"&gt;The heart wants what the heart wants, and what the heart wants is apparently hand-rolling code to handle character sheets.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I made a little more headway on the Kahtsaai grammar (&lt;em&gt;There's&lt;/em&gt; the word I was looking for yesterday!), but I got a bit distracted with some projects that are relevant to stuff that I'm not writing about.&lt;/p&gt;
&lt;p&gt;Thinking about my experience so far, now I'm trying to remember if there's any advice I've read on reading conlang grammars (or grammars in general), because trying to just read stuff in order is... a lot. (I read &lt;a class="reference external" href="http://www.nzdl.org/gsdlmod?e=d-00000-00---off-0hdl--00-0----0-10-0---0---0direct-10---4-------0-0l--11-en-50---20-about---00-0-1-00-0--4----0-0-11-10-0utfZz-8-00&amp;amp;cl=CL2.7.11&amp;amp;d=HASHf4c763bbedf2771100d30b.9.6.2&amp;amp;gt=1"&gt;this&lt;/a&gt;, and, hm, yes.)&lt;/p&gt;
&lt;p&gt;It wouldn't do for a reference grammar to present things like a textbook, but I wonder if there's some way to compile both in a way that reduces duplication of effort.&lt;/p&gt;
&lt;p&gt;Anyway, I should work on reading these grammars more actively, or I'll have a bad time.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Much like&lt;/em&gt; if I don't get to bed soon.
(Boom, nailed the segue.)&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Conlanging 2020-10-07</title><link href="https://mwchase.neocities.org/conlanging-2020-10-07" rel="alternate"></link><published>2020-10-07T04:00:00-04:00</published><updated>2020-10-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-10-07:/conlanging-2020-10-07</id><summary type="html">&lt;p class="first last"&gt;Don't want to be the Garth Marenghi of conlangs.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Rather than jumping back into this, I'm trying to read through other people's writeups of their conlangs.
There's so much to it that it doesn't make sense, at this point in time, to remake from first principles, so I'm trying to get an idea of what I should be doing, presentation-wise.
(Also, it wouldn't make any sense for me to expect other people to look at my stuff without looking at other people's stuff.)&lt;/p&gt;
&lt;p&gt;It might take me a while to get through it, but it also doesn't make sense to try to write something I'd have trouble reading.
And reading this kind of specialized writing is a skill.&lt;/p&gt;
&lt;p&gt;I've downloaded a few PDF writeups, and right now I'm looking over the one for &lt;a class="reference external" href="https://lingweenie.org/conlang/kahtsaai.pdf"&gt;Kahtsaai&lt;/a&gt;.
I'm just a few pages in, so so far I just have surface-level reactions, such as:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I am not confident in my ability to pronounce contrastive length or tone.&lt;/li&gt;
&lt;li&gt;I hadn't had a reason to use the voiceless alveolar lateral fricative before. (I'm hoping I read the consonant chart correctly.) Anyway, I really like it. I might see if I can use it somewhere in the history of my current project.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This will probably take a while, and I don't have anything else to say right now, so I'm calling the post here.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Weekly Roundup 2020-10-06</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-10-06" rel="alternate"></link><published>2020-10-06T04:00:00-04:00</published><updated>2020-10-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-10-06:/weekly-roundup-2020-10-06</id><summary type="html">&lt;p class="first last"&gt;I don't know how many people don't read these, and thereby get confused when I refer to them later.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I griped more about trying to use Sphinx with Cryptopals.&lt;/li&gt;
&lt;li&gt;Thursday: I figured out a way around the latest issue.&lt;/li&gt;
&lt;li&gt;Friday: I tried out some code metrics, and gave up on them.&lt;/li&gt;
&lt;li&gt;Saturday: I documented &amp;quot;why&amp;quot; a bunch of my documentation is weird and non-standard in its behavior or layout.&lt;/li&gt;
&lt;li&gt;Sunday: I made a little more progress on documentation, then decided I need a break.&lt;/li&gt;
&lt;li&gt;Monday: For my break, I picked conlanging back up.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I might also mess with the virtual tabletop stuff.
This is in contrast to my guess yesterday that I'd go for Dennis next.
Well, we'll see.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Conlanging 2020-10-05</title><link href="https://mwchase.neocities.org/conlanging-2020-10-05" rel="alternate"></link><published>2020-10-05T04:00:00-04:00</published><updated>2020-10-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-10-05:/conlanging-2020-10-05</id><summary type="html">&lt;p class="first last"&gt;I think the next project I'm going to return to X months after the last entry is Dennis.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I decided to take a break from Cryptopals, and dust off my conlanging stuff.
I basically remember what I was doing a few months ago, so I hopefully shouldn't end up totally lost.&lt;/p&gt;
&lt;p&gt;I tried to put together a few things inspired by this video, among them a list of goals.&lt;/p&gt;
&lt;div class="youtube youtube-16x9"&gt;&lt;iframe src="https://www.youtube.com/embed/bSaKIkWoR94" allowfullscreen seamless frameBorder="0"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p&gt;I've got some basic goals written up, but I think I need to go over them some more.
It feels like I'm kind of mingling &amp;quot;what I want to accomplish&amp;quot; and &amp;quot;possible ways to accomplish what I want to accomplish&amp;quot;.
Which, I don't think it's bad to note the latter, but it needs to be called out that that's what it is.&lt;/p&gt;
&lt;p&gt;The other thing I want to figure out is guidelines for &amp;quot;Is this ready to show off?&amp;quot;.
I don't want to be too quick or too slow to ask for feedback, though right now I'm sure it's not ready.
I think I need to just look at what other people are doing to get some idea of what standard to hold myself to.&lt;/p&gt;
&lt;p&gt;Anyway, I'm super tired, so, I should go deal with that.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Coding 2020-10-04</title><link href="https://mwchase.neocities.org/coding-2020-10-04" rel="alternate"></link><published>2020-10-04T04:00:00-04:00</published><updated>2020-10-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-10-04:/coding-2020-10-04</id><summary type="html">&lt;p class="first last"&gt;I should, like, keep track of how often I start feeling burnt out on stuff. Probably won't.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I ground away a bit at the AES documentation today.
It's pretty straightforward, but I'm not feeling focused on it.
I think I might need a change of pace.&lt;/p&gt;
&lt;p&gt;I'll think about it tomorrow.
There are some things I've been meaning to get back to.
I just need to work out a good way to be sure I'll get back to this.
I've just tried one way, I might think of others.&lt;/p&gt;
&lt;p&gt;And, I seem to be done for the night.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-10-03</title><link href="https://mwchase.neocities.org/coding-2020-10-03" rel="alternate"></link><published>2020-10-03T04:00:00-04:00</published><updated>2020-10-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-10-03:/coding-2020-10-03</id><summary type="html">&lt;p class="first last"&gt;Feeling really good at finding all of the things a tool can't easily do.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I forget if I documented any more code today.
I did decide to document my grievances with Sphinx next to the weird syntax I put in to work around them, to explain why the weird syntax is there.
By working through this, I was able to devise some workarounds that lead to output that I deem acceptable, and are accepted by the linting pass, so they're &lt;em&gt;probably&lt;/em&gt; fine.&lt;/p&gt;
&lt;p&gt;I'll try to power through documenting the AES wrappers tomorrow.&lt;/p&gt;
&lt;p&gt;What else am I doing...&lt;/p&gt;
&lt;p&gt;I'm working on some articles that I plan to actually edit, post elsewhere, and link to them here.
Those will probably take some time, but oh well.&lt;/p&gt;
&lt;p&gt;I am blanking out on whether I did anything else worth posting, which I assume means I should wind down now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-10-02</title><link href="https://mwchase.neocities.org/coding-2020-10-02" rel="alternate"></link><published>2020-10-02T04:00:00-04:00</published><updated>2020-10-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-10-02:/coding-2020-10-02</id><summary type="html">&lt;p class="first last"&gt;I should dial back the salt towards open-source projects. It's &lt;em&gt;meant&lt;/em&gt; to be directed at people recommending them when, IMO, they're not ready.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I spent today doing various things:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Coming to grips with the &lt;tt class="docutils literal"&gt;bitstreams&lt;/tt&gt; module, including:&lt;/li&gt;
&lt;li&gt;Turning some top-level functions into methods.&lt;/li&gt;
&lt;li&gt;Figuring out what I actually want to include in the documentation.&lt;/li&gt;
&lt;li&gt;And improving the names of classes and variables.&lt;/li&gt;
&lt;li&gt;Adding, and then removing, a nox session for running metrics against the code. Like, what's the point of metrics if the tool's Halstead metrics *cough* don't work, and the McCabe metrics are just a bunch of 1s and 2s, a few 3s, and a 7? Maybe there are better metrics, but the only other one I've seen people talking about is cognitive complexity, which incentivized some... interesting... code in Structured Data. I hope there's better stuff out there I haven't heard of, but if there is, I... haven't heard of it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What got me in a good place with the code was writing comments on how visible I want each thing to be in the documentation.
From there, I was able to use those notes to get a handle on the big picture.
It's possible I'll end up wanting to rewrite some of this, but I'll document everything first and see what I think.&lt;/p&gt;
&lt;p&gt;Things are going well, and I should wrap up for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-10-01</title><link href="https://mwchase.neocities.org/coding-2020-10-01" rel="alternate"></link><published>2020-10-01T04:00:00-04:00</published><updated>2020-10-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-10-01:/coding-2020-10-01</id><summary type="html">&lt;p class="first last"&gt;Quality issues? The code is &lt;em&gt;totally&lt;/em&gt; fine and intuitive. *shoves &lt;tt class="docutils literal"&gt;self = yield from self._emit()&lt;/tt&gt; under the rug*&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Putting &amp;quot;Ｉ　ｗｉｎ&amp;quot; as a commit message seems to have glitched up either pijul or my terminal a little, but the point is, specifying the aliases I want documented as autodata rather than letting them be collected as &amp;quot;genericalias&amp;quot; seems to basically do what I wanted done, at the slight cost of kicking those documentation entries out of order.
The moral of the story is, if you can't do a thing, do something else.&lt;/p&gt;
&lt;p&gt;Anyway, I added some documentation and switched configuration files into pyproject.toml, in part thanks to FlakeHell, which I am &lt;em&gt;extremely&lt;/em&gt; underutilizing, but at least it does what I initially wanted it to.
I'll see later what else I'd like to do with it.&lt;/p&gt;
&lt;p&gt;After that, I started documenting probably the most complicated module in the project, which just barely justifies its existence versus how complicated it is.
Basically, and this whole thing will probably provoke multiple &amp;quot;well, there's your problem&amp;quot; reactions, I rolled my own classes for converting streams to/from bytes and base64 and hex encodings.
At first, I was hand-coding the control flow inside the iterators, but that's kind of a pain, since you have to do various fiddly bits of bookkeeping in the base64 case.
By making the logic generic, I was able to undo the hand-rolling iteration synchronization I'd done, and offload the question of &amp;quot;which bits go where&amp;quot; onto the runtime.&lt;/p&gt;
&lt;p&gt;Where the &lt;em&gt;problem&lt;/em&gt; comes in, from my perspective, is that this &amp;quot;generic bitstream iterator&amp;quot; concept predates the rewrite to make all iteration repeatable.
This meant that I had to convert some of my boilerplate code for interacting with this, into a wrapper class.
So, there's &lt;em&gt;a bunch&lt;/em&gt; of code in there, (over 100 lines, with no documentation), and I'm looking at it and thinking &amp;quot;Before I even get to documentation, how much of this code should actually &lt;em&gt;exist&lt;/em&gt; in the current form?&amp;quot;
It's possible that &amp;quot;Before&amp;quot; is a bad assumption, and I should be trying to document stuff to get insight on what needs to change, but I'm not sure.&lt;/p&gt;
&lt;p&gt;I had kind of a rough night in other regards, for some reason, so I'm not going to push myself, but tomorrow I'd like to figure out what I'm going to do with this module.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
&lt;p&gt;(PS If my coworkers are reading this, there's a chance that they're boggling at my getting freaked out by &amp;quot;only&amp;quot; 100 lines.
Well, this is small hobby code, and if I tried singlehandedly imposing my standards on our codebases, I would not have time for anything else.
That's not hyperbole.&lt;/p&gt;
&lt;p&gt;Also, there are some longer files in this project, but they have a much higher ratio of API surface to LoC, and some of them are documented.)&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-09-30</title><link href="https://mwchase.neocities.org/coding-2020-09-30" rel="alternate"></link><published>2020-09-30T04:00:00-04:00</published><updated>2020-09-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-09-30:/coding-2020-09-30</id><summary type="html">&lt;p class="first last"&gt;So, Sphinx totally has stuff for handling &lt;tt class="docutils literal"&gt;typing&lt;/tt&gt; in there, it just... does a bunch of things that I don't want it to? And possibly does things that I'd be fine with, if I noticed.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I added some more documentation, and found a new gripe about Sphinx.
One of the things Sphinx does for &amp;quot;data&amp;quot; members by default is to include their value in the generated documentation.
I knew this, from elsewhere that I disabled it.
The automodule directive, as near as I can tell, and I would like to be wrong, invokes the other directives as needed, &lt;em&gt;with no way to control what options it passes&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This means that, when I document my stream types, I end up with gunk at the end of the entry like &amp;quot;alias of Union[cryptopals.sized_iterable.ExactSizedIterable[NewType.&amp;lt;locals&amp;gt;.new_type], cryptopals.sized_iterable.ApproximateSizedIterable[NewType.&amp;lt;locals&amp;gt;.new_type]]&amp;quot;.
No hyperlinks, no nothing.
In the current documentation, this comes right after some stuff I wrote manually that presents as the proper types, with links.&lt;/p&gt;
&lt;p&gt;I want to be wrong about this as well, but I believe having explicit entries for these definitions, to suppress the annotation, would cause the definitions to be grouped independently from the rest of the module, so if I want to avoid that, I need to document every member in order.&lt;/p&gt;
&lt;p&gt;After inspecting Sphinx's sourcecode, I have news!
Is it good news?
Bad news?
It's news!&lt;/p&gt;
&lt;p&gt;If I'm reading this right, I was incorrect in assuming that the &lt;tt class="docutils literal"&gt;:annotation:&lt;/tt&gt; directive would suppress the generated documentation of the value.
So the good news is that I don't have to try to do this, because the bad news is that I apparently can't!
News!&lt;/p&gt;
&lt;p&gt;It's midnight and I'm not taking this well, possibly because I strained my shoulder earlier learning how to do creative stuff that doesn't involve typing.&lt;/p&gt;
&lt;p&gt;I'm going to leave this as is and come back to it tomorrow, because I may want to sleep, but I &lt;em&gt;don't&lt;/em&gt; want to admit defeat.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2020-09-29</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-09-29" rel="alternate"></link><published>2020-09-29T04:00:00-04:00</published><updated>2020-09-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-09-29:/weekly-roundup-2020-09-29</id><summary type="html">&lt;p class="first last"&gt;I think I might have low standards for &amp;quot;mystery&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I complained about Sphinx, and devised workarounds for my complaints.&lt;/li&gt;
&lt;li&gt;Thursday: I thought about potential changes I could make to my Cryptopas code, that wouldn't currently be worth it.&lt;/li&gt;
&lt;li&gt;Friday: I sketched out my plans for Challenge 11, and justified them, because I felt they needed justification.&lt;/li&gt;
&lt;li&gt;Saturday: I gloated a bit about the quality of my old low-comment code, from the perspective of maintaining/rewriting it years later.&lt;/li&gt;
&lt;li&gt;Sunday: I ran into a problem with my Challenge 12 code. I assumed it was slow.&lt;/li&gt;
&lt;li&gt;Monday: &lt;a class="reference external" href="https://www.metalevel.at/prolog/nontermination"&gt;It was nonterminating&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to focus on tooling, documentation layout, general quality improvements.
I may try to figure out a mystery I discovered: under coverage, the Challenge 12 test runs significantly slower as a hypothesis test than a parametrized test, and the overall time does correlate with the number of examples, but the correlation should be linear, and 100 examples is nowhere near 100 times as long as 1 example, which implies to me some kind of massive constant term, &lt;em&gt;but&lt;/em&gt; I'm not getting the same slowdown from a strictly more complex test signature that runs at an acceptable speed.
So it's not the test body, because the constant term is dominating.
But it shouldn't be hypothesis, because other tests aren't hitting this slowdown.
It's like every section of the test lifecycle is pointing accusatory fingers at every other section.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2020-09-28</title><link href="https://mwchase.neocities.org/coding-2020-09-28" rel="alternate"></link><published>2020-09-28T04:00:00-04:00</published><updated>2020-09-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-09-28:/coding-2020-09-28</id><summary type="html">&lt;p class="first last"&gt;That's not what &amp;quot;never is often better than &lt;em&gt;right&lt;/em&gt; now.&amp;quot; means...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;... It would not have passed in a finite amount of time.
Turns out I messed up writing a helper function.
After giving that a few passes with breakpoints and assertions, I ran the code to discover...
That it's still slow by Hypothesis standards without Coverage.py, and it's quite slow under coverage.
To the point where I've elected to cut down on the number of explicit examples to a point where it's not really doing PBT, but I'm prioritizing development speed here.&lt;/p&gt;
&lt;p&gt;Ugh, I really wish I knew why that test takes like six minutes under coverage.
Anyway, time to work on code quality.&lt;/p&gt;
&lt;p&gt;Some code split out, and documentation improved.
I fixed up some minor loose ends from a few days ago.
I'm a little split between feeling like I ought to get more documentation in, and wanting to find checkers and metrics to mess with and perturb the code.&lt;/p&gt;
&lt;p&gt;Regardless, it's late enough that I'm done for tonight.
I'm going to publish this and let the test suite run one last time.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-09-27</title><link href="https://mwchase.neocities.org/coding-2020-09-27" rel="alternate"></link><published>2020-09-27T04:00:00-04:00</published><updated>2020-09-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-09-27:/coding-2020-09-27</id><summary type="html">&lt;p class="first last"&gt;This was... not as straightforward as I was expecting.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm not afraid to admit when I make mistakes.
One of them was passing 100 explicit examples of keys to my challenge 12 test.
I brushed my teeth after it hit that test, and it's still going as I write this.
I'll keep you posted.
I'll have to crank down the number of examples used in a normal test run, because this is, um, silly.&lt;/p&gt;
&lt;p&gt;Now, some of this could be down to language runtime slowness, or inefficiency in my underlying code, but I think the two things I should really be looking into, in reverse order of importance, are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Investigating the algorithmic complexity of my attacker function.&lt;/li&gt;
&lt;li&gt;Not running the code a hundred dang times, sheesh.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, while the code (hopefully) came over relatively fine, it could have done with more comments.
There is a comment in there, that was very nice and helpful (though I need to think over its assumptions some), but the rest of the code I lightly updated is, um, dire.&lt;/p&gt;
&lt;p&gt;And technically, I still don't know if it really worked, since it's still going, and the most I can say without results is that it's probably on the happy path, but the happy path could be coiled around on itself really nastily.&lt;/p&gt;
&lt;p&gt;The test conked out after like an hour.
So, something is wrong.
I'll definitely reduce the number of examples and see what I get.&lt;/p&gt;
&lt;p&gt;Hm.
One example is not exactly zippy, but, you know, I &lt;em&gt;can't&lt;/em&gt; go lower.
I'm going to need to do some serious investigation of this stuff later, because this is too intimidating for me when I'm this sleepy.&lt;/p&gt;
&lt;p&gt;Fingers crossed this passes in a finite amount of time.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-09-26</title><link href="https://mwchase.neocities.org/coding-2020-09-26" rel="alternate"></link><published>2020-09-26T04:00:00-04:00</published><updated>2020-09-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-09-26:/coding-2020-09-26</id><summary type="html">&lt;p class="first last"&gt;I've got to say, this has &lt;em&gt;not&lt;/em&gt; been an object lesson in the importance of commenting code. The old code with a few lines of comments actually &lt;em&gt;is&lt;/em&gt; that obvious to me, years down the line.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I followed yesterday's plan, and everything worked perfectly.
I should savor this while it lasts, since it looks like the twelfth challenge is the last one I have a past version to crib from.
Quick notes on what to do next:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I wrote an &lt;tt class="docutils literal"&gt;Encryptor&lt;/tt&gt; class to handle the eleventh challenge, and it can handle the twelfth challenge with no changes.&lt;/li&gt;
&lt;li&gt;The only required parameter there is the key.&lt;/li&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;Encryptor&lt;/tt&gt; class should be moved to an &lt;tt class="docutils literal"&gt;oracle&lt;/tt&gt; module.&lt;/li&gt;
&lt;li&gt;I should have a module for my custom hypothesis strategies.&lt;/li&gt;
&lt;li&gt;I should use &lt;tt class="docutils literal"&gt;random&lt;/tt&gt; with a constant seed to generate the key examples for the twelfth challenge.&lt;/li&gt;
&lt;li&gt;Once I solve the twelfth challenge again, I should take a break from challenges and work really hard on quality and tooling.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(Tooling and quality notes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I want to look into eliminating config files outside of &lt;tt class="docutils literal"&gt;pyproject.toml&lt;/tt&gt;. It looks like &lt;a class="reference external" href="https://github.com/life4/flakehell"&gt;FlakeHell&lt;/a&gt; will help with that.&lt;/li&gt;
&lt;li&gt;I should finally see about getting coverage on the modules that underly all of this.&lt;/li&gt;
&lt;li&gt;Document and reorganize before working on coverage, or I'll be sad.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;I wish I had something more substantial to say, but it really did work right out of the box.
So well, that I temporarily bumped up the verbosity and disabled output capturing to check that it was, in fact, running 432 explicit examples.
It turns out that telling a computer to do a bunch of relatively simple things, even in a high-level language, is fast.&lt;/p&gt;
&lt;p&gt;Anyway, I'm confident I'll handle the twelfth challenge easily after a night of sleep, and then things will get interesting.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-09-25</title><link href="https://mwchase.neocities.org/coding-2020-09-25" rel="alternate"></link><published>2020-09-25T04:00:00-04:00</published><updated>2020-09-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-09-25:/coding-2020-09-25</id><summary type="html">&lt;p class="first last"&gt;Weeks of coding could have saved me hours of planning!&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today, I didn't really touch the Cryptopals code, but I did make plans.
I'll quote them here in the hopes that they illuminate why I always end up putting special effort in challenge 11.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ingredients for random encryption:
short prefix
short suffix
key
cbc or ecb
if cbc, iv&lt;/p&gt;
&lt;p&gt;Usage:
The library must define an ecb detection oracle
(posit: cannot conclude cbc if ecb not detected, could be other obfuscation)
oracle takes a Callable[[bytes], bytes], returns True if ECB, False otherwise&lt;/p&gt;
&lt;p&gt;Construct the encryptor thus:&lt;/p&gt;
&lt;p&gt;prefix: bytes (len in [5, 10])
suffix: bytes (len in [5, 10])
key: bytes (len = 16)
iv: Optional[bytes] (len = 16)&lt;/p&gt;
&lt;p&gt;Constructing the plaintext stream requires a Chain SizedIterable&lt;/p&gt;
&lt;p&gt;Can create a single class that bundles up all relevant data and assembles them when called, with minor polymorphism&lt;/p&gt;
&lt;p&gt;Rationale for determinism:
I believe that the spirit of the challenge is in unpredictability and lack of influence, not the application of randomness at specific junctures per se.
If I write tests in terms of a range of input parameters, then it's still the case that the oracle must make judgments about code that it can only control the behavior of so far as feeding it input text.&lt;/p&gt;
&lt;p&gt;If it does in fact become necessary to generate random ciphertext, then I can write a trivial wrapper around this class.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As we can see, I'm trying to not follow the letter of the challenge, because that would involve writing automated tests that explicitly inject randomness, and honestly random tests that are implicitly random are bad enough.
I may look into an idea I had quite some time ago for some other code, to write tests as hypothesis tests that default to pre-specified deterministic behavior, but have the option to run a broader set of strategies.
It would be a little awkward, but I think the best way to handle that would be to opt into it by setting an environment variable to a truthy value and just bomb out of the &amp;quot;full hypothesis&amp;quot; session if it's falsy.&lt;/p&gt;
&lt;p&gt;Good plan.
I'll see about getting to at least some of it by the weekend.
For now, I'd like to give myself a bit more time to wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-09-24</title><link href="https://mwchase.neocities.org/coding-2020-09-24" rel="alternate"></link><published>2020-09-24T04:00:00-04:00</published><updated>2020-09-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-09-24:/coding-2020-09-24</id><summary type="html">&lt;p class="first last"&gt;I should get back on social media or something to find someone to look over this stuff.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;It feels like I'm getting into a nice rhythm of alternating between improving my Cryptopals codebase, and extending it to deal with new challenges.
After I got basic documentation done for some of the code, I started splitting out code from one of the more bloated modules.
After I was satisfied with that, I got through the tenth challenge.&lt;/p&gt;
&lt;p&gt;For the eleventh challenge, I'm going to consider things carefully, because I feel like every time I've done the eleventh challenge, the details of plumbing things together and having deterministic tests are more involved than the challenge description makes them sound.&lt;/p&gt;
&lt;p&gt;One thing the description is making me ponder, and I'll hold off on this until I see where the challenges are going, is rewriting things to go from creating streams based on other streams, to picking a &amp;quot;main&amp;quot; stream where applicable, and expressing the current stream types as a bunch of composable stream transformers.
The question of whether this makes sense to do for this project comes down to how many of the functions I'm going to have to write are going to look like &amp;quot;take a plaintext and produce a ciphertext with no other input&amp;quot;.
Also, how efficiently I can actually apply those transformations to a concrete stream.&lt;/p&gt;
&lt;p&gt;I believe that, if I don't peek ahead, the correct course of action is &amp;quot;build that function signature out of existing components&amp;quot;.
And peeking ahead would probably just confuse me.&lt;/p&gt;
&lt;p&gt;So, that's my plan for tomorrow.
And my plan for now: try to sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-09-23</title><link href="https://mwchase.neocities.org/coding-2020-09-23" rel="alternate"></link><published>2020-09-23T04:00:00-04:00</published><updated>2020-09-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-09-23:/coding-2020-09-23</id><summary type="html">&lt;p class="first last"&gt;Some elaborate-ass Karening to start with.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Sphinx gripes so far:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Generic classes get their constructor signature given as &lt;tt class="docutils literal"&gt;(*args, **kwargs)&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Type aliases (like other values) get expanded to their underyling value, even if that value is super gnarly.&lt;/li&gt;
&lt;li&gt;No dedicated support for documenting type parameters, a feature that has been in the language for—I'm sorry, but not sorry enough not to say this—five years now. See also the first item.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As you can imagine, these conspired to make documenting a group of generic classes that rely on a generic union referred to via type alias, somewhat unpleasant.
I had to approach this from several angles:&lt;/p&gt;
&lt;p&gt;From &lt;tt class="docutils literal"&gt;docs/conf.py&lt;/tt&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;suppress_all_signatures&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;what&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;return_annotation&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;autodoc-process-signature&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;suppress_all_signatures&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;From the first module I'm trying to type:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@attr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataclass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frozen&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;slots&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Generic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T_co&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Convert a (presumably finite) stream to a cycle.&lt;/span&gt;

&lt;span class="sd"&gt;    Parameters&lt;/span&gt;
&lt;span class="sd"&gt;    ----------&lt;/span&gt;
&lt;span class="sd"&gt;    [T_co] : TypeVar&lt;/span&gt;
&lt;span class="sd"&gt;        The yield type of the source iterable, and the instance.&lt;/span&gt;
&lt;span class="sd"&gt;    internal : :data:`SizedIterable`\\[T_co]&lt;/span&gt;
&lt;span class="sd"&gt;        The underlying Iterable that will be repeated.&lt;/span&gt;
&lt;span class="sd"&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The first code block just suppresses all signatures, because most of them run into at least one of the above issues.
To replace the (bad) generated signatures, I use parameter documentation in the class docstring.
(The docstring is in NumPy format, but I just did that to see what I thought of it.)
Before the parameters that actually get passed, I include the type parameters, in square brackets.
For now, they get explicitly called out as TypeVars; for working with type variables interesting enough to require documentation, I'll probably need a link to the TypeVar instance documentation in the type section.
(Putting the link in the variable name breaks things in a way that implied to me that I should stop pushing my luck.
I think I managed to make Napoleon generate invalid ReST.)
This isn't all-the-way-baked, since I'm working with a small sample of apparently rather eccentric code.&lt;/p&gt;
&lt;p&gt;(Mostly unrelated, but I managed to invalidate some of the tutorials I found, by not having any &lt;tt class="docutils literal"&gt;__init__&lt;/tt&gt; methods in the codebase.
attrs is just that good.
In any case, you can't put documentation into what isn't there.)&lt;/p&gt;
&lt;p&gt;Anyway, I should wrap things up, and get back into documenting this stuff tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2020-09-22</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-09-22" rel="alternate"></link><published>2020-09-22T04:00:00-04:00</published><updated>2020-09-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-09-22:/weekly-roundup-2020-09-22</id><summary type="html">&lt;p class="first last"&gt;Let's not do that again.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: We ran out of internet.&lt;/li&gt;
&lt;li&gt;Thursday: I messed around with a formerly-patented data structure.&lt;/li&gt;
&lt;li&gt;Friday: Getting the internet back &lt;em&gt;totally&lt;/em&gt; didn't go to my head.&lt;/li&gt;
&lt;li&gt;Saturday: I switched back to the &amp;quot;Coding&amp;quot; category, because I got really into revisiting Cryptopals.&lt;/li&gt;
&lt;li&gt;Sunday: I resolved to ry to improve the quality of my Cryptopals code.&lt;/li&gt;
&lt;li&gt;Monday: I tried out my ideas, and liked them in practice, which was a relief.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to put together basic commenting and documentation, possibly look into actually building docs.
I also want to experiment with some possible tooling improvements.
(Not tooling I write, but third-party tools.)&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2020-09-21</title><link href="https://mwchase.neocities.org/coding-2020-09-21" rel="alternate"></link><published>2020-09-21T04:00:00-04:00</published><updated>2020-09-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-09-21:/coding-2020-09-21</id><summary type="html">&lt;p class="first last"&gt;Still needs comments and documentation.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;My ideas turned out to be less of a boilerplate increase, and more of a boilerplate consolidation.
Specifically, the boilerplate got consolidated into the underlying libraries that other stuff is based on, so it's... basically fine.
The changes I made were focused around picking an interface for the streams I'm manipulating and sticking to it.&lt;/p&gt;
&lt;p&gt;Previously, I was trying to pass around iterators, which is kind of fragile, because they can only be used once, and kind of silly, because currently everything is ultimately backed by one of Python's string types, which are reusable.
So, the new interface is based around iterables instead.
Now, every iterator is an interable in Python, but not vice-versa, so if that were all, I'd have only gained a little.
&lt;em&gt;But also&lt;/em&gt;, I added the requirement that the iterables make a best effort to estimate their own size.
The details of this are a little involved, but thankfully not in a way that most code has to care about.
(It's basically a union of two custom protocols.)&lt;/p&gt;
&lt;p&gt;The big cost of this approach is that it means I need to reimplement basic primitives like &lt;tt class="docutils literal"&gt;map()&lt;/tt&gt;, because stdlib map doesn't bother to estimate its own length, according to basic manual testing I did.&lt;/p&gt;
&lt;p&gt;The thing I really like about the outcome is that it makes it really obvious where logic and flow control should go, to satisfy these constraints.
Because any fresh implementation of a stream transformation would require an implementation of the corresponding length estimation, it's &amp;quot;obviously better&amp;quot; to satisfy the requirements by breaking down complicated functions into simpler primitives with simpler reasoning.
Then, I can replace the implementation of generator functions with something that just glues together the corresponding primitives.&lt;/p&gt;
&lt;p&gt;(This does have the slight possible disadvantage that tracebacks are going to mostly ignore these helper functions, so that the relationship between frames is a little magic.
But, I mean, it's not as bad as the time I figured out how to make tail-call elimination work with context managers.
Which, now that I bring it up, I think could have improved ergonomics.)&lt;/p&gt;
&lt;p&gt;Anyway, I made a little more basic progress, which meant bringing in some third-party libraries.
I'm a little tempted to believe that I can implement the cryptographic primitives needed for this using my stream primitives, but that's not a good use of my time.
I'll just try and get caught up to my second attempt.
(My third attempt is just the vaporwave shitpost version of my second attempt.)&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-09-20</title><link href="https://mwchase.neocities.org/coding-2020-09-20" rel="alternate"></link><published>2020-09-20T04:00:00-04:00</published><updated>2020-09-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-09-20:/coding-2020-09-20</id><summary type="html">&lt;p class="first last"&gt;Getting seriously bitten by some of my typing choices, among other things.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got through the sixth challenge in Cryptopals again, but the code quality is really slipping.
I'm going to have to step back tomorrow and work out how I want this to work.
I've got some ideas that I think are interesting, but they'd definitely increase the boilerplate.&lt;/p&gt;
&lt;p&gt;I let this go late, so I'll have to stop here.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-09-19</title><link href="https://mwchase.neocities.org/coding-2020-09-19" rel="alternate"></link><published>2020-09-19T04:00:00-04:00</published><updated>2020-09-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-09-19:/coding-2020-09-19</id><summary type="html">&lt;p class="first last"&gt;I should &lt;em&gt;really&lt;/em&gt; comment this code...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Re: last entry: it was fine.&lt;/p&gt;
&lt;p&gt;Anyway, switching back to this category for the Cryptopals stuff.
I'm organizing things in a way that makes more sense to me than some of my previous attempts.
Specifically, I'm putting the helpful functions front and center, while the higher-level code that consumes them to solve the challenges is further from the root.
This is in contrast to what I had with previous attempts, in which the top level was a (high-on-boilerplate) collection of challenge answers, plus a subpackage for &amp;quot;all of the lower-level stuff&amp;quot;.
I think this way maks more sense, and it makes the imports less of a pain.&lt;/p&gt;
&lt;p&gt;One thing I have been taking from previous attempts is snippets of code.
At some point, I'm going to have to review all of the code I have, and make sure I actually understand what I'm doing with it.
I'm right now at the point where things ramp up in the first set, so I should make sure I'm well-rested before I try to get that working with my current libraries.&lt;/p&gt;
&lt;p&gt;Maybe once I do these in Python, I should try learning Julia and giving them a shot in that.
I also recently heard of a newish language called BQN that it might be interesting to try it with.
The programs from that would certainly probably be, like, shorter.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2020-09-18</title><link href="https://mwchase.neocities.org/diary-2020-09-18" rel="alternate"></link><published>2020-09-18T04:00:00-04:00</published><updated>2020-09-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-09-18:/diary-2020-09-18</id><summary type="html">&lt;p class="first last"&gt;AHH! After ten thousand years, I'M FREE! It's time to CONQUER EARTH!&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Late entry because I'm adjusting to going from virtually no internet, to rather a lot of internet.&lt;/p&gt;
&lt;p&gt;I thought about my various projects, and decided that what I need to be satisfied right now, is a project that gets concrete results quickly.
To that end, I'm revisiting &lt;a class="reference external" href="https://cryptopals.com/"&gt;Cryptopals&lt;/a&gt;, starting from scratch and hoping to apply my knowledge of Python libraries a little better.&lt;/p&gt;
&lt;p&gt;I did end up going a little wild on generality, writing the functions for the first challenge in terms of stream manipulation, with some... somewhat questionable levels of math, to cut down on special casing, hopefully.
This code is going to need some fiddly tests, that's for sure.&lt;/p&gt;
&lt;p&gt;Anyway, I'll probably stick with this in the coming days.
We'll see.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2020-09-17</title><link href="https://mwchase.neocities.org/diary-2020-09-17" rel="alternate"></link><published>2020-09-17T04:00:00-04:00</published><updated>2020-09-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-09-17:/diary-2020-09-17</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Apparently no longer patented&amp;quot; is a heck of a phrase, especially in the context of software.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;This should be the last day.
In less than twelve hours, we should be all set.&lt;/p&gt;
&lt;p&gt;Anyway, I spent some time today working on the data structure I mentioned yesterday, the zzStructure (which is apparently no longer patented).
I didn't get much implemented relative to my plans, but there's a little more in there than there was before.&lt;/p&gt;
&lt;p&gt;After that, I returned to the game dev stuff from... a few months ago, apparently, and worked on test coverage.
I forget exactly what I was doing, but test coverage is generally helpful and I was up for, so I did it.
It took some slight effort to exercise enough patience, since the current network throttles mean that I can't use the internet for &lt;em&gt;anything else&lt;/em&gt; while it's updating its caches.&lt;/p&gt;
&lt;p&gt;We'll see what I'm up for later; I've got to wrap things up now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2020-09-16</title><link href="https://mwchase.neocities.org/diary-2020-09-16" rel="alternate"></link><published>2020-09-16T04:00:00-04:00</published><updated>2020-09-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-09-16:/diary-2020-09-16</id><summary type="html">&lt;p class="first last"&gt;I anticipated this would happen, and referred to it then as &amp;quot;maximum underdrive&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The data plan has run dry, and switched to &amp;quot;technically enough internet to do things&amp;quot;.
It's... weird, seeing images load interlaced.
Attempting to stream audio is pointless, and I haven't even tried to stream video.
Fortunately, this is a temporary condition, we almost have internet back.&lt;/p&gt;
&lt;p&gt;I should wrap this entry up quickly, because it will take several minutes to post.&lt;/p&gt;
&lt;p&gt;Anyway, I spent some time today going over trying to design an emulator for some of &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Ted_Nelson"&gt;Ted Nelson&lt;/a&gt;'s ideas, because hands-on experience is way more valuable for such different models, than just reading over documentation.
I'm thinking that's what I'll mess with this week, at least in the short term.&lt;/p&gt;
&lt;p&gt;And, I am cutting this quite close.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2020-09-15</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-09-15" rel="alternate"></link><published>2020-09-15T04:00:00-04:00</published><updated>2020-09-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-09-15:/weekly-roundup-2020-09-15</id><summary type="html">&lt;p class="first last"&gt;Not as much progress as I'd like, but whatever.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I resolved to try not to change everything around when trying to convert Coverage to output Daikon traces.&lt;/li&gt;
&lt;li&gt;Thursday: I tried copying things over piecemeal.&lt;/li&gt;
&lt;li&gt;Friday: No entry to speak of, because I felt really sick.&lt;/li&gt;
&lt;li&gt;Saturday: I concluded that trying to pick and choose which bits of functionality to copy over was too many decisions with not enough information, even if I probably don't need most of it.&lt;/li&gt;
&lt;li&gt;Sunday: So, I copied everything over.&lt;/li&gt;
&lt;li&gt;Monday: I started taking notes on the code, and how it relates to execution and tracing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to look for a change of pace for a bit.
We're almost through rationing our internet, and I'm getting antsy.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Daikon Tracer 2020-09-14</title><link href="https://mwchase.neocities.org/daikon-tracer-2020-09-14" rel="alternate"></link><published>2020-09-14T04:00:00-04:00</published><updated>2020-09-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-09-14:/daikon-tracer-2020-09-14</id><summary type="html">&lt;p class="first last"&gt;Exactly like Coverage.py except for all the ways it shouldn't be.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Just hung out today and did other stuff, but I took a few notes on how Coverage.py works, for adapting it into the tracer.
This is probably going to require a more methodical approach.
I think I'll want to change gears for a bit before coming back to this.&lt;/p&gt;
&lt;p&gt;I don't think I have much more to say, again, so I'm not going to force the matter with myself.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Daikon Tracer"></category></entry><entry><title>Daikon Tracer 2020-09-13</title><link href="https://mwchase.neocities.org/daikon-tracer-2020-09-13" rel="alternate"></link><published>2020-09-13T04:00:00-04:00</published><updated>2020-09-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-09-13:/daikon-tracer-2020-09-13</id><summary type="html">&lt;p class="first last"&gt;Just take the whole thing, and incrementally change it. That probably makes more sense?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;We went shopping today, so I didn't think too much about the Daikon tracer, but I did think about it a little, and I concluded that copying stuff over piecemeal doesn't really make sense.
So, I've copied over the entire codebase, done light find-and-replace changes to it (very light), and my plan now is to informally follow the execution paths and figure out what changes need to be made.&lt;/p&gt;
&lt;p&gt;Not much more to say on that, and I want to work on other stuff for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Daikon Tracer"></category></entry><entry><title>Daikon Tracer 2020-09-12</title><link href="https://mwchase.neocities.org/daikon-tracer-2020-09-12" rel="alternate"></link><published>2020-09-12T04:00:00-04:00</published><updated>2020-09-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-09-12:/daikon-tracer-2020-09-12</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Copy, paste, and make minor changes&amp;quot; has gotten over-extended.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't work on the tracer yesterday, for what I assume are obvious reasons.
Looking over it now, I see that I'd gotten up to the point in the &lt;tt class="docutils literal"&gt;do_run&lt;/tt&gt; function where it's validating the arguments in the context of using multiprocessing.
I was thinking about this some yesterday, and now I'm remembering some trains of thought that didn't get too far.&lt;/p&gt;
&lt;p&gt;Basically, it comes down to whether the options for controlling the covered files are relevant.
At first, I didn't think so, but now I think that's wrong.
If the intent of trace analysis is to detect invariants in code that the user controls, then it makes sense to restrict the scope of measurement to files specified by the user.&lt;/p&gt;
&lt;p&gt;I'm still taking things somewhat easy, but I believe what I should do next, is sketch out high-level descriptions of what Coverage.py does, so I can figure out where the tracer needs to diverge.&lt;/p&gt;
&lt;p&gt;One design decision I was considering, is to kind of duplicate the way Coverage.py creates, updates, and processes a database as an intermediate format.
A Daikon tracer doesn't have the same diversity of output formats, but if I'm reading the documentation correctly, the list of list types has to come quite early on, and I'd like to populate that dynamically according to the execution data.
There's also the question of how actually to handle concurrency, and I assume &amp;quot;give each copy of the tracer its own output file, and aggregate them in a post-processing step&amp;quot; makes sense.&lt;/p&gt;
&lt;p&gt;I'll think about it some tomorrow.
Or take it easy.
Either is good.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Daikon Tracer"></category></entry><entry><title>Diary 2020-09-11</title><link href="https://mwchase.neocities.org/diary-2020-09-11" rel="alternate"></link><published>2020-09-11T04:00:00-04:00</published><updated>2020-09-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-09-11:/diary-2020-09-11</id><summary type="html">&lt;p class="first last"&gt;Ugh.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Can't write an entry.&lt;/p&gt;
&lt;p&gt;Feel awful.&lt;/p&gt;
&lt;p&gt;Trying not to throw up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Daikon Tracer 2020-09-10</title><link href="https://mwchase.neocities.org/daikon-tracer-2020-09-10" rel="alternate"></link><published>2020-09-10T04:00:00-04:00</published><updated>2020-09-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-09-10:/daikon-tracer-2020-09-10</id><summary type="html">&lt;p class="first last"&gt;I really hope I don't end up needing the setup.py layout.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Nothing really interesting to report yet.
Still just copying stuff over from Coverage.py.
In a few more days, I should have enough scaffolding copied over to start thinking about the trace function, but I want to make an effort to consider as few things as possible at one time.&lt;/p&gt;
&lt;p&gt;Also, it just occurred to me that my whole &amp;quot;Well, optparse says not to use it so I don't want to use it&amp;quot; thing doesn't quite make sense, insofar as I like Click, and last I checked, Click is based on optparse.
I read, but do not remember, the whole explanation for why they use optparse and not argparse.&lt;/p&gt;
&lt;p&gt;Anyway, that doesn't terribly matter to the tracer, because I want to have the same level of external dependencies as Coverage.py.&lt;/p&gt;
&lt;p&gt;I'm getting tired and I'd like to wrap things up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Daikon Tracer"></category></entry><entry><title>Daikon Tracer 2020-09-09</title><link href="https://mwchase.neocities.org/daikon-tracer-2020-09-09" rel="alternate"></link><published>2020-09-09T04:00:00-04:00</published><updated>2020-09-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-09-09:/daikon-tracer-2020-09-09</id><summary type="html">&lt;p class="first last"&gt;For once I've got to be humble about whether changing everything is a good idea. &lt;em&gt;For once&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've looked into Daikon's documentation, and Python tracer code, and concluded that I want to write a tracer for Daikon with a minimal/useless feature set, and refine it to gather more data.
So, to start with, I just want something that properly sets up a tracer function, and runs code.
I've concluded that the best way to accomplish that is to just copy the execfile module from Coverage.py, and probably much of the rest of Coverage.py.&lt;/p&gt;
&lt;p&gt;Looking over the source code, I see that my next task is to psych myself up to use optparse in spite of its deprecation.
I'm tempted to try and port things to argparse, but I'd need a better understanding of both modules to be able to accomplish it.
I can at least recognize the danger here: that there is some subtlety of behavior that is different between the libraries, that would produce mysterious bugs.&lt;/p&gt;
&lt;p&gt;I've started working on porting stuff over, but I don't have a good sense of the right order to work on this in, so I just kind of started copying over from the top down.
This might be wrong, we'll see.&lt;/p&gt;
&lt;p&gt;In any case, in the coming days, I'll work on getting things together enough to set up a stub trace function.
For now, I should wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Daikon Tracer"></category></entry><entry><title>Weekly Roundup 2020-09-08</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-09-08" rel="alternate"></link><published>2020-09-08T04:00:00-04:00</published><updated>2020-09-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-09-08:/weekly-roundup-2020-09-08</id><summary type="html">&lt;p class="first last"&gt;Week one of &amp;quot;Oh dang, I suddenly can't use the internet much.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I got my phone's hotspot to work, and thought more about literate programming.&lt;/li&gt;
&lt;li&gt;Thursday: I took another look at Exercism and Leo.&lt;/li&gt;
&lt;li&gt;Friday: I figured out what I'd like to use Leo for, and started using it a bunch.&lt;/li&gt;
&lt;li&gt;Saturday: I thought of other stuff Leo would be good for, while noticing (what I perceive to be) some of its limitations, mainly that I have no idea how to figure out how to do anything I don't already know.&lt;/li&gt;
&lt;li&gt;Sunday: We mooched off of the in-laws' internet and I downloaded a bunch of ebooks and websites.&lt;/li&gt;
&lt;li&gt;Monday: I kept on taking it easy, except I wondered if there was any way to make Zoom throttle its data. Initial investigation indicates: probably not.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I have, among other things, offline copies of the documentation for Daikon and Python, and a financial incentive to be online as little as possible.
I had better make something out of all of the stuff I've stockpiled.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Diary 2020-09-07</title><link href="https://mwchase.neocities.org/diary-2020-09-07" rel="alternate"></link><published>2020-09-07T04:00:00-04:00</published><updated>2020-09-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-09-07:/diary-2020-09-07</id><summary type="html">&lt;p class="first last"&gt;In the &amp;quot;looming specter&amp;quot; phase of vacation.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Another day of taking it easy.
Things are going to get much more hectic for me in a few days, so I'm absolutely going to take this.&lt;/p&gt;
&lt;p&gt;I'm still really dreading starting work with the wifi hotspot, because the daily Zoom calls are likely to eat up this month's bandwidth nigh-instantly, unless I figure out ahead of time how to turn down every setting I can.
Ideally I'd have no video whatsoever except for screen-sharing.&lt;/p&gt;
&lt;p&gt;I suppose there's nothing more for me to do right now.
I just need to remember to look into that when I get the chance.&lt;/p&gt;
&lt;p&gt;I don't know, I run the numbers, and it looks like this should be totally doable, but just one bad day could wipe everything out.
It sucks.
It sucks much less than a lot of things, but it still sucks.&lt;/p&gt;
&lt;p&gt;I'll try to wait one more day before worrying too hard about it, though.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2020-09-06</title><link href="https://mwchase.neocities.org/diary-2020-09-06" rel="alternate"></link><published>2020-09-06T04:00:00-04:00</published><updated>2020-09-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-09-06:/diary-2020-09-06</id><summary type="html">&lt;p class="first last"&gt;Absolutely flush with ebooks.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm just taking things easy for now.
We've got internet to mooch off of right now, so I'm working on stockpiling PDFs and website mirrors for offline reading later.
I've got a pretty good haul lined up, so I'm also working on stuff in Leo.&lt;/p&gt;
&lt;p&gt;I want to have more to say, but I don't have more to say.
I've just get to take this time to recharge before a rough bit-over-a-week.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2020-09-05</title><link href="https://mwchase.neocities.org/diary-2020-09-05" rel="alternate"></link><published>2020-09-05T04:00:00-04:00</published><updated>2020-09-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-09-05:/diary-2020-09-05</id><summary type="html">&lt;p class="first last"&gt;Still adjusting to the current situation...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm getting more and more ideas for stuff that works well with Leo.
It continues to be great for the Scrivener project I adapted, and I think it has some promise for restarting Drawabox, but I don't see myself using it for any programming projects, at least not directly.
It might work as a replacement for my use of &lt;a class="reference external" href="http://todotxt.org/"&gt;todo.txt&lt;/a&gt; in some projects, I'm not sure.&lt;/p&gt;
&lt;p&gt;It's a combination of, it's really great at representing multiple views of how a concept or task is relevant, a little iffy at manipulating those representations, and when I read the documentation for anything relating to code, I get hopelessly confused until I try it myself, which means I first need to figure out what to try and how to try it.
It kind of feels like Leo is pushing a bunch of paradigms in implementation that I'm unfamiliar with, so I can't really judge their worth.&lt;/p&gt;
&lt;p&gt;I still think it would be nice to get Leo to a point where it could substitute for my current usage of Sublime Text, or more of my former usage of Scrivener, but I don't know yet all the things that would need to change, and which of those are configuration changes, and which are code changes.&lt;/p&gt;
&lt;p&gt;(For example, how do I make it change autocompletion behavior based on the active language?
I don't want python completions in HTML text.)&lt;/p&gt;
&lt;p&gt;Anyway, I'll be looking into that as I feel like it, but it's at least proving useful for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2020-09-04</title><link href="https://mwchase.neocities.org/diary-2020-09-04" rel="alternate"></link><published>2020-09-04T04:00:00-04:00</published><updated>2020-09-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-09-04:/diary-2020-09-04</id><summary type="html">&lt;p class="first last"&gt;No, I won't go into any more detail on the project.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The connection metering checkbox is feeling like a bit of a placebo right now, so I'm typing this up offline.&lt;/p&gt;
&lt;p&gt;I found a use case that is getting me through the basics with Leo: converting my old Scrivener projects into Leo projects.
I had to do this by reading the XML and translating it into Leo's layout, because the export I did months ago didn't quite work, and also discarded important information.&lt;/p&gt;
&lt;p&gt;I don't know how replicable this will be with any other project, since this is a case where I specifically wasn't using any rich text formatting.
However, this is the project I was most interested in picking back up, so, I've got an in on using Leo, and I'll see if it seems applicable to anything else.&lt;/p&gt;
&lt;p&gt;I wonder how much effort it would take to port my syntax highlighting and color schemes from Sublime Text.
I'll look into that while this publishes.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2020-09-03</title><link href="https://mwchase.neocities.org/diary-2020-09-03" rel="alternate"></link><published>2020-09-03T04:00:00-04:00</published><updated>2020-09-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-09-03:/diary-2020-09-03</id><summary type="html">&lt;p class="first last"&gt;Nice heart-stopping moment earlier before I figured out how to meter my laptop's connection.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Still unpacking, but making progress.&lt;/p&gt;
&lt;p&gt;Recently, I decided to look back into &lt;a class="reference external" href="https://exercism.io/"&gt;Exercism&lt;/a&gt;, which I've previously gotten a very short way into on the Erlang and Elm tracks.
I basically reviewed everything I did on the Erlang track, and updated a few of my solutions, then went a little further with some of the side exercises.
(I also joined &lt;em&gt;a bunch&lt;/em&gt; of tracks, some of which I'm going to wait until I've upgraded my laptop to look into.)&lt;/p&gt;
&lt;p&gt;Not much to say about that, besides that I'm pretty skeptical about the quality of some of my solutions.
I ought to review the community solutions later.&lt;/p&gt;
&lt;p&gt;I also looked into separating my repository metadata project into distinct functional areas, and sketching out possible data types for it.
I think I'm going to need to find someone to discuss this project with, because there are a lot of things I want to accomplish, and I'm not sure I've totally nailed down the objectives.&lt;/p&gt;
&lt;p&gt;After I publish this, I'm going to mess with &lt;a class="reference external" href="https://leoeditor.com/leo_toc.html"&gt;Leo&lt;/a&gt; some more.
I've bounced off it a few times because I wasn't sure where to start, but the testimonials seem really interesting.
(Plus it'd be pretty cool to be using a Python-scriptable text editor with a free license.)&lt;/p&gt;
&lt;p&gt;I'll get on that now, for maybe the next hour or so.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2020-09-02</title><link href="https://mwchase.neocities.org/diary-2020-09-02" rel="alternate"></link><published>2020-09-02T04:00:00-04:00</published><updated>2020-09-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-09-02:/diary-2020-09-02</id><summary type="html">&lt;p class="first last"&gt;That could have gone better.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;We moved.
This post is brought to you in part by, my phone, which had a seriously glitchy hotspot at first, but now it's fine, I think.&lt;/p&gt;
&lt;p&gt;We're just barely unpacked right now, since I spent the whole day crashing until my wife crashed, at which point we switched, and then I got about as keyed up as I could, under the circumstances.&lt;/p&gt;
&lt;p&gt;Anyway, I ended up thinking some more about that minimal literate programming code I wrote/rewrote, and what I want my style to be.
It turns out one thing that bothers me is when the origin of variables is concealed by the weave.
I rewrote a block of code as a function, moved the chunk to the top level, and replaced the original substitution with a function invocation.
I much prefer the result, because it allows for more local reasoning.&lt;/p&gt;
&lt;p&gt;Trying to apply this principle in other ways suggests some possible features.
In particular, &amp;quot;run a chunk through a filter, such as lexically sorting and deduplication&amp;quot;.&lt;/p&gt;
&lt;p&gt;And I just realized that the practical effect of how I want to use that feature is to define a bunch of little modules in a file, specifically to tangle them into a single file.
This has given me feature envy for Lua's &lt;tt class="docutils literal"&gt;require&lt;/tt&gt; system all over again.&lt;/p&gt;
&lt;p&gt;Although, if I set the file up to tangle into &lt;em&gt;different&lt;/em&gt; files, then I wouldn't need the deduplication feature because I could use small modules.&lt;/p&gt;
&lt;p&gt;It just occurred to me that I'm having all of these thoughts in the context of a sub-100-line script.
It would behoove me to look into using this with one of the large codebases I have lying around.&lt;/p&gt;
&lt;p&gt;Not happening right now, though.
We are both exhausted.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2020-09-01</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-09-01" rel="alternate"></link><published>2020-09-01T04:00:00-04:00</published><updated>2020-09-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-09-01:/weekly-roundup-2020-09-01</id><summary type="html">&lt;p class="first last"&gt;Wish us luck...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I listed a bunch of things I'd like to look into when I'm less stressed. When exactly that is, remains to be seen, see subsequent entries.&lt;/li&gt;
&lt;li&gt;Thursday: With the weather nicer, I wrote up some notes on cell.&lt;/li&gt;
&lt;li&gt;Friday: I realized that the bundle of functionality I've been calling &amp;quot;cell&amp;quot; might initially work better if the different parts are developed in isolation.&lt;/li&gt;
&lt;li&gt;Saturday: I was all burnt out and tired, so I ported a small Python 2 script to Python 3, with the caveat that the script is generated by running itself on a source file. Simpler than it sounds, I was basically able to go through it on autopilot.&lt;/li&gt;
&lt;li&gt;Sunday: I had resolved to have less screentime. And failed.&lt;/li&gt;
&lt;li&gt;Monday: I came to the realization, that so far as transferring internet service in a timely fashion, I messed up, hard. We're going to be rationing the mobile data plan for the next 2+ weeks.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I will try to avoid going feral from the reduced internet.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Diary 2020-08-31</title><link href="https://mwchase.neocities.org/diary-2020-08-31" rel="alternate"></link><published>2020-08-31T04:00:00-04:00</published><updated>2020-08-31T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-08-31:/diary-2020-08-31</id><summary type="html">&lt;p class="first last"&gt;This is going to be a rough two weeks. At least we'll have a thermostat that does something.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Did not do a great job cutting down on screentime.
But whatever.&lt;/p&gt;
&lt;p&gt;I'm currently in the &amp;quot;bargaining&amp;quot; phase of getting my internet transferred.
Hopefully that all works out in a way that's satisfactory.
NOPE.&lt;/p&gt;
&lt;p&gt;So, things are going to be pretty boring for a few weeks.
Maybe deeply distrusting my backup plans' ability to stream video will get me to cut down on screen time.
One way or another, we'll make do.
Something something this wasn't a thing my parents had to worry about when I was young, ouch my hip, something something.&lt;/p&gt;
&lt;p&gt;Yeah, not happy with this situation, but I'm planning the best I can to deal with it, so I guess I have to accept whatever happens, because I can't change things any further.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2020-08-30</title><link href="https://mwchase.neocities.org/diary-2020-08-30" rel="alternate"></link><published>2020-08-30T04:00:00-04:00</published><updated>2020-08-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-08-30:/diary-2020-08-30</id><summary type="html">&lt;p class="first last"&gt;Need to be squinting at a screen &lt;em&gt;less&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;More moving prep today.
I should probably figure I won't get much else done until we're moved into the new place and I've had time to get settled.
I should also work on cutting down on screen time.&lt;/p&gt;
&lt;p&gt;I'm too tired to think of anything else, so, wrapping up now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2020-08-29</title><link href="https://mwchase.neocities.org/diary-2020-08-29" rel="alternate"></link><published>2020-08-29T04:00:00-04:00</published><updated>2020-08-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-08-29:/diary-2020-08-29</id><summary type="html">&lt;p class="first last"&gt;Fun thing I learned/realized: apparently &amp;quot;&amp;gt;&amp;quot; truncates a file &lt;em&gt;before&lt;/em&gt; any commands on the same line have a chance to read it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've been pushing myself too hard at work recently, so I'm burnt out and tired.
I should be able to somewhat recover from that over the next week, but for now, I just zoned out porting a small python script for literate programming from Python 2 to Python 3, and gave it a few other improvements while I was at it.&lt;/p&gt;
&lt;p&gt;I think this might end up being useful for my repo metadata and state analysis stuff, because making the analysis tools understand the literate programming syntax and properly determine whether to classify a diff as touching &amp;quot;test&amp;quot; or &amp;quot;source&amp;quot; is the hardest version of that problem I can imagine, since it seems totally valid to me to have a literate programming source file that interleaves test and implementation of functionality.&lt;/p&gt;
&lt;p&gt;I think those were all the words I had in me after the rest of today.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2020-08-28</title><link href="https://mwchase.neocities.org/diary-2020-08-28" rel="alternate"></link><published>2020-08-28T04:00:00-04:00</published><updated>2020-08-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-08-28:/diary-2020-08-28</id><summary type="html">&lt;p class="first last"&gt;Going to need to make a kanban board for this stuff, or something.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm revisiting some of my design assumptions for cell.
I think I've got a baseline for a better design, but I haven't fully nailed down how it's going to work.
Because of this vagueness, I've decided to put some of cell's functionality on the back burner (basically, see if I can separate out the template concept from the rest and do the rest first).
For now, I'm working on listing all of the functionality that the various utilities need from a top-down perspective, and I think I've got everything except the testing aspect of cell.
I'm going to need to either find or reconstruct those flowcharts.&lt;/p&gt;
&lt;p&gt;I'm also watching over some backup stuff.
I'm trying to switch providers, and the initial backup to the new one is super slow.
Hopefully it won't end up taking the full time until I &lt;em&gt;have&lt;/em&gt; to switch, but right now I'm not confident.&lt;/p&gt;
&lt;p&gt;Anyway, I'm tired and I want to wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2020-08-27</title><link href="https://mwchase.neocities.org/diary-2020-08-27" rel="alternate"></link><published>2020-08-27T04:00:00-04:00</published><updated>2020-08-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-08-27:/diary-2020-08-27</id><summary type="html">&lt;p class="first last"&gt;At least I'm not stewing in my own sweat now.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The weather is now tolerable.
And I did other moving prep and got a headache.
So mostly, what I managed was to write down some of my ideas for cell.
I think to figure this out, I'm going to need to take some time, probably after the move, to run through some hypothetical workflows and figure out what would be really hard to implement, and hopefully find a good alternative.&lt;/p&gt;
&lt;p&gt;I'm pretty tired, so I don't have anything else to articulate.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2020-08-26</title><link href="https://mwchase.neocities.org/diary-2020-08-26" rel="alternate"></link><published>2020-08-26T04:00:00-04:00</published><updated>2020-08-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-08-26:/diary-2020-08-26</id><summary type="html">&lt;p class="first last"&gt;Doing things called on account of soggy heat.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, everything is warm and gross right now.
Rather than trying to focus on anything that really demands my concentration, I'm going to try to list the tutorials I've been looking into.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I started following the &lt;a class="reference external" href="https://www.ponylang.io/"&gt;Pony&lt;/a&gt; tutorial, but when I went to compile it, I found that &lt;tt class="docutils literal"&gt;ponyc&lt;/tt&gt; is too cutting-edge for my laptop currently, and I'm going to need to do an OS upgrade. It's probably fine, I just want to get the move totally squared away before I risk putting my main machine for interacting with landlords temporarily out-of-commission.&lt;/li&gt;
&lt;li&gt;I started messing with &lt;a class="reference external" href="https://www.pixelvision8.com/"&gt;Scratch&lt;/a&gt;, because maybe it would be nice to do game dev where I'm not counterproductively challenging myself to reinvent foundational concepts, and also to have tutorials that are both soothing, and respectful of my time. I'm stepping away from this for now because I want to do a little more design work up front than what I have now.&lt;/li&gt;
&lt;li&gt;I briefly looked at the tutorial for the &lt;a class="reference external" href="https://www.pixelvision8.com/"&gt;Pixel Vision 8&lt;/a&gt;. No real reason for it to be brief, aside from the fact that I've been ping-ponging around between things.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Speaking of which, I've got &lt;a class="reference external" href="https://processing.org/"&gt;Processing&lt;/a&gt; installed now, and no concrete plan for doing anything wth it.&lt;/p&gt;
&lt;p&gt;I also thought some more about my experimentation with &lt;a class="reference external" href="https://lmms.io/"&gt;LMMS&lt;/a&gt;, and given the extremely constrained nature of the first thing I tried to do with it, I think the best thing I can do with that is try to adapt it into a chord loop.
Also, learn to write with chord loops.&lt;/p&gt;
&lt;p&gt;I'm trying to remember if there was anything else.&lt;/p&gt;
&lt;p&gt;Oh yeah, also pondering whether it would be worth it to try getting into niche card games.
If I'm looking at it like that, probably not, but we'll see.&lt;/p&gt;
&lt;p&gt;Oh yeah, I was also taking another look at &lt;a class="reference external" href="https://builtoncement.com/"&gt;Cement&lt;/a&gt;.
Another look that nearly immediately left me feeling the same as last time.
What that inspired me to do, and I haven't done this yet, just be inspired, is to design Cell to have templates for different kinds of projects, in line with the monorepo concept, so I can be like &amp;quot;okay, here's what's in here: a utility library, and, say, flask and cement apps that use it&amp;quot;.
Hypothetically speaking something like that.&lt;/p&gt;
&lt;p&gt;Also also, I've got &lt;a class="reference external" href="http://leoeditor.com/"&gt;Leo&lt;/a&gt; installed as well.
I'm probably physically incapable of looking into all of these things in depth in the next few weeks, but I'm feeling up for giving a new text editor a try.&lt;/p&gt;
&lt;p&gt;(Also also also, we watched the Rankin/Bass Hobbit movie, and the backstory made me want to try again to learn to play &lt;a class="reference external" href="http://www.bay12games.com/dwarves/"&gt;Dwarf Fortress&lt;/a&gt;.
&amp;quot;Why, &lt;em&gt;I&lt;/em&gt; could manage a dwarven palace until its dramatic and untimely demise!&amp;quot;)&lt;/p&gt;
&lt;p&gt;Well, this post is a disorganized mess.
So, it's an honest reflection of how I feel in this dang heat.
So excited for the heat to break in the next few hours or so.&lt;/p&gt;
&lt;p&gt;(I'll hopefully come back to this later and maybe actually do a thing.)&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2020-08-25</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-08-25" rel="alternate"></link><published>2020-08-25T04:00:00-04:00</published><updated>2020-08-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-08-25:/weekly-roundup-2020-08-25</id><summary type="html">&lt;p class="first last"&gt;Someone just dump silica gel packets all over my prone body, please.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I did drastic refactorings, because full test coverage baybee~&lt;/li&gt;
&lt;li&gt;Thursday: I planned a garbage collector.&lt;/li&gt;
&lt;li&gt;Friday: I got the garbage collector working.&lt;/li&gt;
&lt;li&gt;Saturday: I proved that the garbage collector worked. I should note that I got this done in three days worth of spare time because I didn't try too hard to make this &amp;quot;something I would be comfortable expecting someone to use for a serious purpose.&amp;quot; And also I had full test coverage so I don't have to think about regressions, I can know.&lt;/li&gt;
&lt;li&gt;Sunday: I hurt.&lt;/li&gt;
&lt;li&gt;Monday: I thought more about the repo metadata thing, and continued to try to give away a couch. That's still available as of this writing. EDIT: Not any more.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I won't do much tomorrow because the sun is a deadly laser.
Anyway, I want to work on specifying the repo metadata stuff.
I've also got tutorials for a whole bunch of things that I want to try out.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Diary 2020-08-24</title><link href="https://mwchase.neocities.org/diary-2020-08-24" rel="alternate"></link><published>2020-08-24T04:00:00-04:00</published><updated>2020-08-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-08-24:/diary-2020-08-24</id><summary type="html">&lt;p class="first last"&gt;The couch is fine, we just want to get rid of it before we move to a place without space for it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Feeling better today, though the pizza we split for dinner is trying to have something to say about that.&lt;/p&gt;
&lt;p&gt;I was doing stuff today that meant I couldn't get super into my super-project that tries to combine my various projects for dinking around with data from other tools based on repository layout.
Less than half an hour ago, I started trying to turn my notes from after last post into something resembling a specification.
One problem I'm having at this early stage is separating and naming the different parts.
Like, I need a structure that maps relative paths within the repository to subproject metadata, but how do I want to handle different kinds of project?
I guess I'll have to sketch out a hypothetical hybrid monorepo.
One thing that's annoying about considering this is that implementing the basic cell predicates for a Rust project seems much fiddlier than for a Python project.
Like I guess the code has to somehow determine whether the changed lines for a file are entirely inside a test block or not?
I'm going to hope there's a crate for that, at least.&lt;/p&gt;
&lt;p&gt;I'll have to consider this stuff when I'm better rested.
Failing that, in a few days.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2020-08-23</title><link href="https://mwchase.neocities.org/diary-2020-08-23" rel="alternate"></link><published>2020-08-23T04:00:00-04:00</published><updated>2020-08-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-08-23:/diary-2020-08-23</id><summary type="html">&lt;p class="first last"&gt;This post took a while to publish because I was mustering the energy required to put the computer down.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Current status: tired, in pain, sick, and I didn't do the specification work, in part due to taking a bunch of time to adult.&lt;/p&gt;
&lt;p&gt;I want to wrap this post up ASAP and try to do the stuff I was talking about doing yesterday.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Crafting Interpreters 2020-08-22</title><link href="https://mwchase.neocities.org/crafting-interpreters-2020-08-22" rel="alternate"></link><published>2020-08-22T04:00:00-04:00</published><updated>2020-08-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-08-22:/crafting-interpreters-2020-08-22</id><summary type="html">&lt;p class="first last"&gt;I'm thinking of trying to rename them with a mad-science theme.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've added some instrumentation and confirmed that the garbage collector can accomplish &lt;em&gt;something&lt;/em&gt;.
Thinking over this, I concluded that I want some native functions to interact with the garbage collector, and represent assertions in Lox code.&lt;/p&gt;
&lt;p&gt;I don't want to work on that now, so I worked out some comparisons between the features of cell, limit-coverage, and mutmut-runner (which I think needs a rename).
There are many underlying tasks that they all or most need to do, and some that would probably be helpful where not strictly necessary.
(For example, I think I'd much rather run mutation tests in a temporary clone of a repository.)
I was trying to plan this, and went too general, so I think what I should do is lay out exactly what these tools currently do, and work on converging their underlying operations.&lt;/p&gt;
&lt;p&gt;I'll get on that tomorrow, when I'm hopefully less tired from helping move furniture.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Crafting Interpreters"></category></entry><entry><title>Crafting Interpreters 2020-08-21</title><link href="https://mwchase.neocities.org/crafting-interpreters-2020-08-21" rel="alternate"></link><published>2020-08-21T04:00:00-04:00</published><updated>2020-08-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-08-21:/crafting-interpreters-2020-08-21</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;It did too much, so it was broken. Now it's not broken, and I can't tell if it's doing anything.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I tentatively believe the garbage collector is working, having hit one minor hiccup along the way.&lt;/p&gt;
&lt;p&gt;I'm tentative about it because I haven't properly instrumented the code to make sure it's accomplishing anything.
It's certainly getting called, and doing stuff, and I want to believe there's no reason it should fail, but I want certainty for this.&lt;/p&gt;
&lt;p&gt;The minor hiccup I hit was due to the fact that, until like half an hour ago, the interpreter code didn't have a proper stack, and instead relied on Python locals to store some of the frame references.
Which meant that those scopes were invisible to the marker.
I put a stack on my State struct, wrote a property to expose the same value as the old &amp;quot;index&amp;quot; field, removed the methods that manipulated that field directly, and rewrote the consumers, in a way that I think makes more sense, so that's nice.
All of the tests pass with the same level of coverage as before, so if I broke anything, it's really subtle.&lt;/p&gt;
&lt;p&gt;The breakage in that last paragraph manifested as a failure in garbage collection, due to an earlier garbage collection pass that occurred inside a function call.
Because the dynamically enclosing scope was only referred to in Python locals, it didn't survive collection, and after the function returned, it had an invalid scope reference.
I don't want to think about what would have happened if I were trying to do this in C.&lt;/p&gt;
&lt;p&gt;This is all very educational, but most people, myself included, probably shouldn't be hand-rolling garbage collectors for any serious purpose.
I can't say anything about anybody else in particular, but this feels to me like code that should be left to a library when possible.&lt;/p&gt;
&lt;p&gt;Anyway, I'll try to develop some kind of strategy for garbage collection that's better than &amp;quot;as often as I think it's possible&amp;quot;, and tests for it, and then I want to work on tooling, like I've been talking about.&lt;/p&gt;
&lt;p&gt;Anyway, I want to wrap up now; my head kind of hurts.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Crafting Interpreters"></category></entry><entry><title>Crafting Interpreters 2020-08-20</title><link href="https://mwchase.neocities.org/crafting-interpreters-2020-08-20" rel="alternate"></link><published>2020-08-20T04:00:00-04:00</published><updated>2020-08-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-08-20:/crafting-interpreters-2020-08-20</id><summary type="html">&lt;p class="first last"&gt;Pretty sure &amp;quot;remake the universe without the garbage&amp;quot; was the stated goal of several Pokémon antagonists.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've sketched out a plan for implementing garbage collection in my Lox interpreter.
I skipped ahead to the garbage collection chapter in Crafting Interpreters, for inspiration.
I can't draw directly from it, due to the following points of difference:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Implementation language&lt;/li&gt;
&lt;li&gt;Memory representation of values&lt;/li&gt;
&lt;li&gt;Update strategies&lt;/li&gt;
&lt;li&gt;Degree of implementation completeness&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;However, it did still help, because of general inspiration, and the considerations of &amp;quot;when and how often do we want to run the GC?&amp;quot; are equally relevant.&lt;/p&gt;
&lt;p&gt;My initial plan for this, and this is trying to work with the rest of my design, is to, instead of recreating the state variables but with one less entry each time, I would just traverse the state variable data to populate mutable versions of the state variables, then convert those to an immutable form, and replace them in.
By planning for this approach, I was able to remove some lines I'd added due to anticipating using a different approach.&lt;/p&gt;
&lt;p&gt;Looking over the structure of all of this, I think the way I want to implement this is with mutators around the top-level containers, because none of the items in the container get mutated.
I'm going to need to sketch out some of the details by hand, but my current thinking is that I can write helper functions that modify the mutators, and iterate over the referenced items using some methods and helpers I need to write, but &lt;em&gt;only&lt;/em&gt; if the item was not already in the mutator.&lt;/p&gt;
&lt;p&gt;I think that'll work, but we won't know for sure until I flesh out the design and actually try to implement it.&lt;/p&gt;
&lt;p&gt;My basic plan right now is to get this stuff implemented, write any tests I need to get coverage back up, and then change gears to tooling.
It seems to me that limit-coverage and my mutation testing helper should be able to share config logic.
And possibly cell as well.
I'll be really excited if it ends up going that way.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Crafting Interpreters"></category></entry><entry><title>Crafting Interpreters 2020-08-19</title><link href="https://mwchase.neocities.org/crafting-interpreters-2020-08-19" rel="alternate"></link><published>2020-08-19T04:00:00-04:00</published><updated>2020-08-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-08-19:/crafting-interpreters-2020-08-19</id><summary type="html">&lt;p class="first last"&gt;*Try to follow composition tutorial* &amp;quot;Ugh&amp;quot; *Bend my music theory knowledge in ways it was not meant to be bent* &amp;quot;Ooo&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;There is one line uncovered, and I do not care about it.
I made several hundred changes to the code base as part of refactorings today, and it's so, so satisfying.
I think the next thing I want to look into is designing a garbage collector for this implementation.
That'll be quite a lot of work.&lt;/p&gt;
&lt;p&gt;Anyway, I also took some time to mess with LMMS without a tutorial.
I experimented with applying a bunch of YouTube videos and vague memories of high school senior year to sketching a little chord progression.
It sounds good to me, which kind of implies that the natural analysis of it is &lt;em&gt;not&lt;/em&gt; what I used to come up with it.&lt;/p&gt;
&lt;p&gt;And it is past midnight, this is late, let's turn it in.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Crafting Interpreters"></category></entry><entry><title>Weekly Roundup 2020-08-18</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-08-18" rel="alternate"></link><published>2020-08-18T04:00:00-04:00</published><updated>2020-08-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-08-18:/weekly-roundup-2020-08-18</id><summary type="html">&lt;p class="first last"&gt;Massive increase in coverage, probably some redundant tests.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I wrote tests, and they didn't pass. I made them pass.&lt;/li&gt;
&lt;li&gt;Thursday: Ditto.&lt;/li&gt;
&lt;li&gt;Friday: It continued. I also looked into some tooling I might try to use for... something.&lt;/li&gt;
&lt;li&gt;Saturday: I took a break from writing tests to try to learn to use LMMS.&lt;/li&gt;
&lt;li&gt;Sunday: I managed to add coverage without finding embarrassing bugs.&lt;/li&gt;
&lt;li&gt;Monday: I got coverage on every line I care about.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to work on refactoring, and maybe cut down on cyclic dependencies?
I consider the various indented imports I have to be a code smell.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Crafting Interpreters 2020-08-17</title><link href="https://mwchase.neocities.org/crafting-interpreters-2020-08-17" rel="alternate"></link><published>2020-08-17T04:00:00-04:00</published><updated>2020-08-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-08-17:/crafting-interpreters-2020-08-17</id><summary type="html">&lt;p class="first last"&gt;Coming up on the end of the current push with the interpreter.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Limited coverage is over 98.7%.
23 lines are uncovered, and they should be of no consequence.
I'll work on eliminating them during the refactor.&lt;/p&gt;
&lt;p&gt;I got wiped out by some stuff we did today after I got coverage up, so I'll just leave it at that.
I'm thinking I'll take a break tomorrow and get back into this the next day.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Crafting Interpreters"></category></entry><entry><title>Crafting Interpreters 2020-08-16</title><link href="https://mwchase.neocities.org/crafting-interpreters-2020-08-16" rel="alternate"></link><published>2020-08-16T04:00:00-04:00</published><updated>2020-08-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-08-16:/crafting-interpreters-2020-08-16</id><summary type="html">&lt;p class="first last"&gt;Sure is boring./This quality is what all true programmers strive for.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Limited coverage is up around 97%.
I'm done for tonight, but this is good progress.
Another few days, and I can do some refactoring.&lt;/p&gt;
&lt;p&gt;Nothing really exciting to report.
I didn't hit any bugs this time.
The biggest stumbling block I'm hitting is the fact that some of the code paths I'm not covering are uninteresting and require tests that bypass the external interfaces.
For a sec I thought I had a way around that, but on further reflection I currently don't.
I'll just have to see if I come up with a nice rewrite during the refactors.&lt;/p&gt;
&lt;p&gt;For now, I'd like to wrap things up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Crafting Interpreters"></category></entry><entry><title>Diary 2020-08-15</title><link href="https://mwchase.neocities.org/diary-2020-08-15" rel="alternate"></link><published>2020-08-15T04:00:00-04:00</published><updated>2020-08-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-08-15:/diary-2020-08-15</id><summary type="html">&lt;p class="first last"&gt;I continue to be not to be trusted to follow directions.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I wasn't really up for increasing the test coverage on my Lox interpreter today, because the next natural section to work on covering is the various ways that a C-style for-loop can be written, and I'm a snob when it comes to for-loops, apparently.
I'll hopefully be up for it tomorrow, but we'll see.&lt;/p&gt;
&lt;p&gt;In any case, I guess what I actually did do today was mess around with a &lt;a class="reference external" href="https://lmms.io/"&gt;LMMS&lt;/a&gt; tutorial.
I have gotten to a slightly rocky bit as a result of not following the tutorial completely; I diverged from the tutorial either because:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Other resources explicitly recommended taking the opposite choice to the tutorial I'm mostly following;&lt;/li&gt;
&lt;li&gt;I have a &lt;em&gt;problem&lt;/em&gt;;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, I'm not really in love with the sound of what I've got so far.
I assume this isn't due to the tutorial, but some combination of personal musical taste, lack of experience choosing samples, and leaving the Beat + Bassline Editor playing on loop while I entered all of the percussion.
I'll come back to that later as well, sometime when I'm better rested, and able to relate what the tutorial says to what I've got in front of me.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Crafting Interpreters 2020-08-14</title><link href="https://mwchase.neocities.org/crafting-interpreters-2020-08-14" rel="alternate"></link><published>2020-08-14T04:00:00-04:00</published><updated>2020-08-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-08-14:/crafting-interpreters-2020-08-14</id><summary type="html">&lt;p class="first last"&gt;Recommendations for test coverage: &amp;quot;100% coverage is unealistic.&amp;quot; My uncovered statements: &amp;quot;NoThInG iS fOrBiDdEn AnD eVeRyThInG iS pErMiTtEd.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've hit eighty-something percent limited coverage, and the new lines of coverage &lt;em&gt;continue&lt;/em&gt; to turn up embarrassing bugs.
A few more days of this, and I should be ready to do some refactoring that will cut down on verbosity in exchange for some somewhat eccentric syntax, and then take coverage all the way to 100%, and work on mutation testing.&lt;/p&gt;
&lt;p&gt;I've also been looking into Daikon, and I'm significantly less enamored of my original idea tha the first thing I'd try would be to write a front-end myself so I could use it with code that interests me.
The documentation on how front-ends work seems to mix together descriptions of ideal implementations, descriptions of good-enough implementations, explanations of how those implementations can be good enough, descriptions of formats as they are or were, and of formats as they are no longer or might yet be.
For an example of that last one, currently &lt;a class="reference external" href="http://plse.cs.washington.edu/daikon/download/doc/developer.html#Dataflow-hierarchy"&gt;Dataflow hierarchy&lt;/a&gt; mentions an &lt;tt class="docutils literal"&gt;EXCEPTION&lt;/tt&gt; program point type that is mentioned nowhere else on the page.
Looking at the implementations some, it &lt;em&gt;looks&lt;/em&gt; like it's just supposed to always be an &lt;tt class="docutils literal"&gt;EXIT&lt;/tt&gt;, which, sort of makes sense.
Regardless, I'd rather throw it at some LLVM output or something.
(It also sounds like a custom build of Python would work, but that's a custom build of Python.
Redoing the work for every interpreter version I care about.
A Python library defining a cusstom tracer function could get potentially every version I care about, and probably almost work on versions I don't know about yet.)&lt;/p&gt;
&lt;p&gt;Anyway, I'm just about gone.
I should wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Crafting Interpreters"></category></entry><entry><title>Crafting Interpreters 2020-08-13</title><link href="https://mwchase.neocities.org/crafting-interpreters-2020-08-13" rel="alternate"></link><published>2020-08-13T04:00:00-04:00</published><updated>2020-08-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-08-13:/crafting-interpreters-2020-08-13</id><summary type="html">&lt;p class="first last"&gt;limit-coverage is sort of like New Game Plus for coverage metrics&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I worked through a few more modules.
Still really enjoying the degree of focus I get from knowing that each test module is only responsible for one source module.
I've had fix a few howlers of bugs as a result of, just, it turns out I never tried running most of the new code.
As such, I've had to make code changes, with varying degrees of gracefulness.&lt;/p&gt;
&lt;p&gt;I've got it up to about 60% coverage now, and I'm clearly hitting code that was never exercised before.
The tests I have written at this point are probably sufficient to get extremely high coverage just by pasting them around indiscriminately, but I'd prefer to paste them around discriminately.&lt;/p&gt;
&lt;p&gt;I am spacing out on anything else to add, so I guess I should stop.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Crafting Interpreters"></category></entry><entry><title>Crafting Interpreters 2020-08-12</title><link href="https://mwchase.neocities.org/crafting-interpreters-2020-08-12" rel="alternate"></link><published>2020-08-12T04:00:00-04:00</published><updated>2020-08-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-08-12:/crafting-interpreters-2020-08-12</id><summary type="html">&lt;p class="first last"&gt;Less than two weeks later, and I have determined that this isn't a working Lox interpreter.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Now that I'm motivated to add tests to specific test modules (it's how I prefer to work, apparently), I spent some time increasing coverage, one module at a time.
I got through a few modules, and then I got to the expression module, which includes stuff like dot notation, including with superclass access.
Now, I guess I didn't actually write tests for this before, because when I did here, I ran into numerous issues, and the last issue I hit tonight&lt;/p&gt;
&lt;blockquote&gt;
as I wrote the code for the book, I ran into a couple of subtle bugs where the resolver and interpreter code were slightly out of sync. Tracking those down was difficult.&lt;/blockquote&gt;
&lt;p&gt;... Yep.
That certainly seems to be the case here, where the number of levels of parent environment is not matching.&lt;/p&gt;
&lt;p&gt;Wow, that was arguably not actually the problem.
I thought for sure I was mis-directing the layers of environments related to &amp;quot;this&amp;quot; and &amp;quot;super&amp;quot;, but it turns out my implementation of method binding was, roughly speaking, dynamic instead of lexical.
Which I don't know what that works out to, semantically, but it's not good.&lt;/p&gt;
&lt;p&gt;Anyway, I'm happy I got the tests passing, but there's much more work to do.
Hopefully it won't involve quite as many instances of totally untested code being howlingly wrong.
I'll see about that tomorrow.
For now, I should wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Crafting Interpreters"></category></entry><entry><title>Weekly Roundup 2020-08-11</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-08-11" rel="alternate"></link><published>2020-08-11T04:00:00-04:00</published><updated>2020-08-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-08-11:/weekly-roundup-2020-08-11</id><summary type="html">&lt;p class="first last"&gt;Area man disturbed both by the unpredictable experience and the predictable effects of the passage of time.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I freaked out about how disjointed the passage of time has felt for the last *checks notes* five months, apparently.&lt;/li&gt;
&lt;li&gt;Thursday: I thought some more about programming language design.&lt;/li&gt;
&lt;li&gt;Friday: I messed up a random muscle that I apparently use for virtually everything.&lt;/li&gt;
&lt;li&gt;Saturday: The muscle was still messed up.&lt;/li&gt;
&lt;li&gt;Sunday: I finally updated limit-coverage.&lt;/li&gt;
&lt;li&gt;Monday: I started using limit-coverage with most of my recently-developed repos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to work on improving the Lox interpreter coverage, since limit-coverage (as intended and expected) dropped it by about 40 percentage points.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2020-08-10</title><link href="https://mwchase.neocities.org/coding-2020-08-10" rel="alternate"></link><published>2020-08-10T04:00:00-04:00</published><updated>2020-08-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-08-10:/coding-2020-08-10</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;This is probably fine.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I mostly took it easy today, and then quickly set up limit-coverage on a bunch of my projects.
It turns out they weren't &lt;em&gt;all&lt;/em&gt; set to use it out-of-the-box, since it was arbitrarily limited to Python 3.7 and later, and the Lox interpreter is written against Python 3.6 (so it can use PyPy).
One patch release later, and it's arbitrarily limited to Python 3.6 and later.
Python 3.5 is scheduled to end-of-life in a month or so, so this is probably fine.&lt;/p&gt;
&lt;p&gt;Anyway, enabling it on the virtual tabletop project, I'm not sure if that actually did anything, I can't remember if those few lines were missing or not before.
Enabling it on the Lox interpreter cut coverage in half, so I'll just have to see about refactoring the tests to get it back up.
When that's done, I'll feel good about the various rewrites that I have in mind.
When I want mutation testing, I should probably look over the changes I made to limit-coverage and see if any of them apply to my weird, over-engineered runner script.
(Which I should probably rewrite in Python, and convert to an installable library.)&lt;/p&gt;
&lt;p&gt;One other thing I was considering was, inspired by &lt;a class="reference external" href="https://jeanstack.substack.com/p/how-to-use-ais-to-find-bugs"&gt;JeanStack&lt;/a&gt;, writing a Python front-end for &lt;a class="reference external" href="https://plse.cs.washington.edu/daikon/"&gt;Daikon&lt;/a&gt;.
I need to read over the documentation some more to get a better idea of how much of a pain that would be, but I &lt;em&gt;think&lt;/em&gt; that &lt;a class="reference external" href="https://coverage.readthedocs.io/"&gt;Coverage.py&lt;/a&gt; indicates that a trace function could more-or-less handle extracting the relevant information.
For now, I'll focus on stuff I have a little more experience with.
And, for now for now, I should wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-08-09</title><link href="https://mwchase.neocities.org/coding-2020-08-09" rel="alternate"></link><published>2020-08-09T04:00:00-04:00</published><updated>2020-08-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-08-09:/coding-2020-08-09</id><summary type="html">&lt;p class="first last"&gt;Most representative commit message of today goes to &amp;quot;Fix a nonsense&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I mentioned yesterday that I wanted to make &lt;a class="reference external" href="https://pypi.org/project/limit-coverage/"&gt;limit-coverage&lt;/a&gt; work with the repository layout that I've used for a few projects now.
I put in the effort to update it, and I got it basically working, but I did end up regressing with respect to one of my repository layouts in a somewhat weird way.
I decided to just accept the reduction in functionality and &lt;em&gt;slightly&lt;/em&gt; reorganize the repository.
The only ongoing problem I'm having there is that I'm having the same nox session for that repo pass locally, and fail every time in Travis.
I'm going to have to remember to check again in the morning and see if it does any better, because no matter how many times I try, Travis doesn't act like my machine.&lt;/p&gt;
&lt;p&gt;While I was in limit-coverage, adding documentation and doing a bunch of manual tests, I kind of had to reflect on my habit of having really poor automation around testing and verifying the tools I write to help test and verify everything else.
I think one of the factors there is that these tools tend to work with the implementation or internal format of other tools.
This is certainly the case with limit-coverage, and its more horrifyingly-invasive predecessor, divide-and-cover.
(limit-coverage programmatically deletes some rows from a sqlite database and supports every version of &lt;a class="reference external" href="https://coverage.readthedocs.io/"&gt;Coverage.py&lt;/a&gt; starting from 5.0a6. divide-and-cover was basically every &amp;quot;here's why subclassing to add functionality is bad&amp;quot; example rolled into one, and needed updates to avoid regressing functionality added in Coverage 4.5, which was just one minor version later than it was originally written against.)&lt;/p&gt;
&lt;p&gt;I'm going to have to think about how to address this.
I mean, the answer is &amp;quot;write more tests&amp;quot;, but I look at the tests that I'd have to write and feel really discouraged.
Tests against this functionality basically need fake source code repositories and coverage data to work with.
I suppose I could just write a bunch of toy repos that each exercise a little bit of functionality...&lt;/p&gt;
&lt;p&gt;Amyway, the other thing I can do to find issues is use this more widely, which now I can do, since it should work on every repo I've done active development against recently.
I'll get to work on that tomorrow, unless I decide to focus on something else.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2020-08-08</title><link href="https://mwchase.neocities.org/diary-2020-08-08" rel="alternate"></link><published>2020-08-08T04:00:00-04:00</published><updated>2020-08-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-08-08:/diary-2020-08-08</id><summary type="html">&lt;p class="first last"&gt;Too tired to explain how tired I am...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I'm clearly not dealing well with the muscle stuff.
I was tired all day, and I didn't really do anything about it.
I'll see what I can do over the weekend; hopefully &amp;quot;nap a lot&amp;quot; helps.&lt;/p&gt;
&lt;p&gt;Thinking about what would help with projects, and I think adapting &lt;a class="reference external" href="https://pypi.org/project/limit-coverage/"&gt;limit-coverage&lt;/a&gt; to the repository layout I'm starting to use would help a lot.
...
Documentation and tests wouldn't go amiss, as well.&lt;/p&gt;
&lt;p&gt;I'm going to wrap up for tonight because I am &lt;em&gt;so tired&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2020-08-07</title><link href="https://mwchase.neocities.org/diary-2020-08-07" rel="alternate"></link><published>2020-08-07T04:00:00-04:00</published><updated>2020-08-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-08-07:/diary-2020-08-07</id><summary type="html">&lt;p class="first last"&gt;oww, oof, my [MUSCLES]&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I sat badly for a lot of today, and now my chest is messed up.
It's hard for me to focus on writing, so I'm just going to take it easy.&lt;/p&gt;
&lt;p&gt;I messed around with Portal 2's level creator a bit, and managed to make a level that's not really bad, but I did find it kind of uninspiring.
That's progress, so I'll take it.&lt;/p&gt;
&lt;p&gt;Ugh, I want to write more, but it's so hard to focus like this.
I'm just going to wrap up for tonight and hope that lying down normally will fix my muscles.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Programming Language Design 2020-08-06</title><link href="https://mwchase.neocities.org/programming-language-design-2020-08-06" rel="alternate"></link><published>2020-08-06T04:00:00-04:00</published><updated>2020-08-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-08-06:/programming-language-design-2020-08-06</id><summary type="html">&lt;p class="first last"&gt;Something tells me I need to write &lt;em&gt;a lot&lt;/em&gt; of pseudocode and then, through parsing, cause it to retroactively become code.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm still trying to get a handle on access control in this language.
I think I've figured out one hurdle, which is that all types need an access control specification.
So, in addition to &amp;quot;a shared vector of shared&amp;quot; and &amp;quot;an exclusive vector of exclusive&amp;quot;, there can be &amp;quot;a shared vector of exclusive&amp;quot; and &amp;quot;an exclusive vector of shared&amp;quot;.
The ones where the access controls match are pretty easy to reason about, as is &amp;quot;exclusive vector of shared&amp;quot;.
That last just means that the individual entries can't be edited, but they can be added or removed from the vector.
Shared vector of exclusive is more troublesome.
It sort of makes sense to have as one possible way to implement &amp;quot;tweak every element of the vector, but don't touch the vector itself&amp;quot;, but a shared reference can be cloned, which means that if we naively do what I think makes sense, we can have multiple consumers trying to get exclusive locks on the same reference.
I'm leaning towards &amp;quot;it shouldn't be possible to get multiple references doing that&amp;quot;, since a synchronization-based approach would still be fundamentally unpredictable.&lt;/p&gt;
&lt;p&gt;I think this means that I can't have trivial auto-derives for copy/clone, which is fine, and some kind of &amp;quot;derive&amp;quot; macro wouldn't work for container types that are specifically designed to expose more access to their items.&lt;/p&gt;
&lt;p&gt;Thinking about this has revealed some kind of asymmetry in my mental model, where I'm assuming that a shared reference to a type with exclusive access to a field casts to a shared reference to that field, while a shared reference to a container with exclusive access to its items results in exclusive access to the items.
I think this is useful for the degree of semantic range it permits, but actually implementing this requires some means of opting out of the standard logic.
I think this is the kind of thing that &lt;tt class="docutils literal"&gt;unsafe&lt;/tt&gt; is for in Rust, but I don't know if there's any direct equivalent to what I'm describing, for Rust Vectors.&lt;/p&gt;
&lt;p&gt;Anyway, one thing I'm trying to figure out about access controls, is how much non-determinism I want to allow.
Like, I could imagine a primitive that's just &amp;quot;release the exclusive lock so some other thread of execution can have it&amp;quot;, but if you do a release and a reacquire, what can you expect to have happened during the time it was released?
I suppose there could be some signalling layer indicating work to do and work done, but some kind of standard notification system that directly ties into the ownership system seems much more robust, and I think equally expressive.
Like, I could imagine just passing the reference into some kind of worker or scheduler, and waiting for it to complete.
If there's concurrent work to be done, this does imply some kind of spawning or multi-scheduling system.&lt;/p&gt;
&lt;p&gt;I think the things I need to review for this are &lt;a class="reference external" href="https://vorpus.org/blog/notes-on-structured-concurrency-or-go-statement-considered-harmful/"&gt;Notes on structured concurrency&lt;/a&gt;, and &lt;a class="reference external" href="https://without.boats/blog/notes-on-a-smaller-rust/"&gt;Notes on a smaller Rust&lt;/a&gt;.
I'll definitely be considering &amp;quot;structured concurrency&amp;quot;, but it's worth emphasizing that my current vision for Toad drops enough expressive power relative to Rust that it cannot be the &amp;quot;smaller Rust&amp;quot; that Saoirse describes.
That post is of interest because most of the ideas that apply to &amp;quot;smaller Rust&amp;quot; also apply to Toad.
I would describe my thinking for Toad thus: &amp;quot;Many high-level languages have some form of 'box' for their high-level types, that simplifies access control and includes metadata relevant to, for example, garbage collection. I want to experiment with tweaking the capabilities of the 'box'. For situations where Python is 'fast enough', can I design a language with similar expressive power, but that makes it harder to write bugs around concurrent data access?&amp;quot;
Realistically speaking, if I'm working on my own, the answer is probably &amp;quot;no&amp;quot;, but I'm curious to see what I can accomplish.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Programming Language Design"></category></entry><entry><title>Diary 2020-08-05</title><link href="https://mwchase.neocities.org/diary-2020-08-05" rel="alternate"></link><published>2020-08-05T04:00:00-04:00</published><updated>2020-08-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-08-05:/diary-2020-08-05</id><summary type="html">&lt;p class="first last"&gt;I have lost the ability to get the hang of any day whatsoever.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I ended up taking it easy today.
I don't remember what I actually &lt;em&gt;did&lt;/em&gt;, but I assume it was taking it easy.
I can't believe it's only Tuesday.&lt;/p&gt;
&lt;p&gt;And when it's Friday, I'm shocked.
It's like every day, I have the strongest impression of what it was like a week ago, so Tuesday is like it came after a string of Tuesdays, and Fridays feel like the six days between pass really quickly.&lt;/p&gt;
&lt;p&gt;Really could have done with a competent federal response to the pandemic, like, several months ago.&lt;/p&gt;
&lt;p&gt;I don't know, some of the stuff I've been sinking my time into lately, I wrapped up the really focus-intensive parts today, so maybe I'll have more focus for other stuff.
Maybe.&lt;/p&gt;
&lt;p&gt;Anyway, the time I'm using to write this post is passing really quickly, so I should wrap up ASAP.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2020-08-04</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-08-04" rel="alternate"></link><published>2020-08-04T04:00:00-04:00</published><updated>2020-08-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-08-04:/weekly-roundup-2020-08-04</id><summary type="html">&lt;p class="first last"&gt;Kind of curious to see how much will have to change for me to be satisfied with my Lox code base.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I got a rough version of the resolver working.&lt;/li&gt;
&lt;li&gt;Thursday: I finished the resolver except for classes, so I started working on classes.&lt;/li&gt;
&lt;li&gt;Friday: I finished the first chapter on classes.&lt;/li&gt;
&lt;li&gt;Saturday: I finished the second chapter on classes.&lt;/li&gt;
&lt;li&gt;Sunday: I poked at the code base, added some tests. Mostly I focused on, what do I want out of a new language? And started sketching stuff for a new project.&lt;/li&gt;
&lt;li&gt;Monday: I got some &amp;quot;actual code&amp;quot; written for the new language. Quote marks included because the syntax is in &lt;em&gt;a lot&lt;/em&gt; of flux.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to nail stuff down for the new language, and work out both where I think I want the language to end up, and a minimal proof of concept I can build on.
I probably won't try implementing anything until I've cleaned up the Lox interpreter code base, and pulled out parts of it for reuse.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Programming Language Design 2020-08-03</title><link href="https://mwchase.neocities.org/programming-language-design-2020-08-03" rel="alternate"></link><published>2020-08-03T04:00:00-04:00</published><updated>2020-08-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-08-03:/programming-language-design-2020-08-03</id><summary type="html">&lt;p class="first last"&gt;Currently, I'm calling it &amp;quot;Toad&amp;quot;, for reasons that I'll leave mysterious for now.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I realized that, rather than Rosetta Code, &lt;a class="reference external" href="https://projecteuler.net/"&gt;Project Euler&lt;/a&gt; would probably be a better starting point, because it offers challenges in a specific order, and there are multiple ways to approach them.
I messed around with the first challenge, and this got me inspired enough to draft a bunch of rough ideas for standard library-y stuff.
However, there was one thing that I punted on that I want to try to work out in this post.&lt;/p&gt;
&lt;p&gt;I kind of punted on mutability.
When I write code, I'm very in favor of immutability, but I feel like this project could do with mutability; I'm not sure why.
Rust-style static lifetimes are cool, but I'm not ready to try to implement them.
As I see it, that means my choices are &amp;quot;dynamic ownership&amp;quot;, &amp;quot;Python-style mix&amp;quot;, or &amp;quot;everything mutable&amp;quot;.
Speaking as someone who writes Python like &lt;tt class="docutils literal"&gt;attr.evolve(obj, field=obj.field + &lt;span class="pre"&gt;(new,))&lt;/span&gt;&lt;/tt&gt; (or &lt;tt class="docutils literal"&gt;attr.evolve(obj, field=obj.field.append(new))&lt;/tt&gt;), I don't want a Python-style mix.
I think some kind of ability to &amp;quot;lock&amp;quot; data strctures would be helpful for correctness, though it might turn out kind of fiddly in practice; we'll see.&lt;/p&gt;
&lt;p&gt;Here's what I sort of imagine, and this might be totally off...
Let's swipe some ideas from Rust.
We could think about the default version of a type as &amp;quot;owned&amp;quot;.
Given a value of a type, there must be exactly one reference to that value by that type.
From an owned value, we can take &amp;quot;shared&amp;quot; and &amp;quot;exclusive&amp;quot; references.
Now as I say this, in a dynamic ownership kind of situation, it's pretty annoying to be constantly destructuring your compound data, so accessing fields or parts of a container should somehow default to shared references, with an option to get out an exclusive reference instead.
I'm not quite sure what an explicit destructuring would look like, but these ideas kind of imply it has to exist.&lt;/p&gt;
&lt;p&gt;Now, accesses and iteration and such might need to be defined in terms of reference types, so that iterating over an exclusive reference produces exclusive references, and shared produces shared.
It'd be cool to have this kind of correspondence &amp;quot;for free&amp;quot;, but I don't know if that's actually possible.
One thing that I kind of decided here is that there isn't &amp;quot;destructuring iteration&amp;quot;.
I think I'm fine with that.&lt;/p&gt;
&lt;p&gt;I'll have to adapt the code I have so far to reflect these ideas, and see if it still makes sense.
I think it might be possible to get &lt;em&gt;some&lt;/em&gt; correspondences for free.
Basically, and I'm not totally confient in this idea, but I'm not sure what could go wrong, associate trait definitions with types of reference, so that there could be separate &amp;quot;index&amp;quot; implementations for shared and exclusive references.
As I think about this, I realize that I'm wanting implementations for shared references to act as fallbacks for exclusive references.
That seems a little iffy.
According to my intuition, it shouldn't hit a situation where, given several choices, it somehow picks &amp;quot;the wrong one&amp;quot;, but weird, gnarly edge cases can pop up seemingly anywhere.
I'll need to consider this while being better-rested.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Programming Language Design"></category></entry><entry><title>Programming Language Design 2020-08-02</title><link href="https://mwchase.neocities.org/programming-language-design-2020-08-02" rel="alternate"></link><published>2020-08-02T04:00:00-04:00</published><updated>2020-08-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-08-02:/programming-language-design-2020-08-02</id><summary type="html">&lt;p class="first last"&gt;Just staring at some code I copied from Programming in Lua and going &amp;quot;Hm. Hmm. Hmmmmmmmmmm.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today, I worked a little on improving test coverage for my Lox implementation.
I made a little progress.&lt;/p&gt;
&lt;p&gt;Besides that, I sketched out ideas I might try for applying what I learned to creating a language of my own.
I'm pretty good at implementing these kinds of small language specifications (especially if I'm not actively working against the design of the reference implementation), but actually writing a specification is much more work.
For now, I tried sketching out some ideas.&lt;/p&gt;
&lt;p&gt;These ideas include:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Lua-style linear syntax. The fact that Lua doesn't really need semicolons or line breaks to divide statements seems pretty neat to me.&lt;/li&gt;
&lt;li&gt;Rust-style lifetimes. I gave up on this when I tried sketching an iterator implementation, and realized that I'd need both &amp;quot;unsafe&amp;quot; and an equivalent of Rust's &amp;quot;Copy&amp;quot; trait to make it even vaguely ergonomic. On reflection, maybe I would have had more luck with a Python-style generator than a Lua-style iterator, but I don't want to go that way right now.&lt;/li&gt;
&lt;li&gt;Separating the different kinds of inheritance. I didn't get too far sketching this out, but I think this is what I want to focus on.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thinking about how to sketch out these ideas, I wasn't really sure before, but it just occurred to me that I might be able to get inspiration from &lt;a class="reference external" href="http://rosettacode.org/wiki/Rosetta_Code"&gt;Rosetta Code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I'll have to look into that later.
For now, I want to wrap things up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Programming Language Design"></category></entry><entry><title>Crafting Interpreters 2020-08-01</title><link href="https://mwchase.neocities.org/crafting-interpreters-2020-08-01" rel="alternate"></link><published>2020-08-01T04:00:00-04:00</published><updated>2020-08-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-08-01:/crafting-interpreters-2020-08-01</id><summary type="html">&lt;p class="first last"&gt;Whoo. Two weeks later, and I have, probably, a working Lox interpreter.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Crafting Interpreters has two chapters on classes.
I've gotten through the second chapter.
Test coverage is still not great, only 85%.&lt;/p&gt;
&lt;p&gt;I forget when I planned to take a break.
Maybe it would help to lay out the changes I want to make:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;100% test coverage&lt;/li&gt;
&lt;li&gt;Good mutation coverage&lt;/li&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;Various ergonomics improvements:&lt;/dt&gt;
&lt;dd&gt;&lt;ul class="first last"&gt;
&lt;li&gt;Convert tokens to &lt;tt class="docutils literal"&gt;enum.IntFlag&lt;/tt&gt;, then convert the helper functions that process them to use bitwise operators instead of sometimes sets, sometimes not.&lt;/li&gt;
&lt;li&gt;Convert the Visitor protocol to a fluent interface&lt;/li&gt;
&lt;li&gt;Generally convert tuple returns to fluent returns or iterators&lt;/li&gt;
&lt;li&gt;Audit some of my weirder divergences from JLox, such as various one-off methods&lt;/li&gt;
&lt;li&gt;Reorganize the modules to make importing less fraught&lt;/li&gt;
&lt;li&gt;Implement garbage collection for the arenas. (&amp;quot;Wait, you wrote this in Python and it doesn't have garbage collection?&amp;quot; I wrote it using immutable data structures, because once you have those worked out, it's much easier to reason about the code. As a side effect, every value in the interpreter lives until it gets overwritten, and there's no such thing as a delete.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I don't think there's any urgent need for me to either work on this, or deliberately not work on it, so I'll see what I feel like doing tomorrow, but I should probably try focusing on other things first.&lt;/p&gt;
&lt;p&gt;One thing that it would be nice to have before the mutation testing is a version of my &lt;a class="reference external" href="https://pypi.org/project/limit-coverage/"&gt;limit-coverage&lt;/a&gt; tool that works with the whole &amp;quot;monorepo&amp;quot; layout that I seem to be going with for a bunch of projects now.&lt;/p&gt;
&lt;p&gt;(... &amp;quot;I have several mono[repo]s.&amp;quot;)&lt;/p&gt;
&lt;p&gt;Riffs aside, that would be nice because one of the things that made mutation testing against &lt;a class="reference external" href="https://pypi.org/project/structured-data/"&gt;Structured Data&lt;/a&gt; bearable was that each module had an associated test module, so when there was a mutation, that meant that I could declare that catching the mutation with a non-associated test module didn't &amp;quot;count&amp;quot;, and therefore skip running all of them.&lt;/p&gt;
&lt;p&gt;Maybe I should do the &amp;quot;module reorganization&amp;quot; step before &amp;quot;mutation testing&amp;quot;.
Anyway, that's a question for another day.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Crafting Interpreters"></category></entry><entry><title>Crafting Interpreters 2020-07-31</title><link href="https://mwchase.neocities.org/crafting-interpreters-2020-07-31" rel="alternate"></link><published>2020-07-31T04:00:00-04:00</published><updated>2020-07-31T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-07-31:/crafting-interpreters-2020-07-31</id><summary type="html">&lt;p class="first last"&gt;With being implemented that quickly, it can't be &lt;em&gt;that&lt;/em&gt; classy...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Crafting Interpreters has two chapters on classes.
I've gotten through the first chapter, although I haven't done a great job of keeping up with test coverage.
I should be able to finish up the other chapter in a few days, and then I can work on stuff like increasing coverage and improving ergonomics.&lt;/p&gt;
&lt;p&gt;I anticipate that it'll be somewhat of a bumpy ride, since I haven't exercised the new code yet.
It can't be totally wrong, since it does typecheck, but there are probably a bunch of weird edge cases I haven't noticed yet.&lt;/p&gt;
&lt;p&gt;It's midnight and I have nothing else to say, so, there we go.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Crafting Interpreters"></category></entry><entry><title>Crafting Interpreters 2020-07-30</title><link href="https://mwchase.neocities.org/crafting-interpreters-2020-07-30" rel="alternate"></link><published>2020-07-30T04:00:00-04:00</published><updated>2020-07-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-07-30:/crafting-interpreters-2020-07-30</id><summary type="html">&lt;p class="first last"&gt;It's so much easier to write when something goes horribly wrong...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The resolver code seems to be all set, so now I'm working on implementing classes.
This might take a while.&lt;/p&gt;
&lt;p&gt;I wish I could come up with more to say for these entries, but my day has been taken up by various technical issues that I don't want to write about, and I'm getting a consistent handle on adapting between the intended code and my code.&lt;/p&gt;
&lt;p&gt;So, there aren't really any interesting puzzle-y things to write up for now.&lt;/p&gt;
&lt;p&gt;One thing that occurred to me to check was how many statements the codebase has, according to coverage measurements.
Looks like 1295, though that can be massaged and altered in various ways, probably by as much as a hundred statements if I really dedicated myself to golfing it.
I should not.&lt;/p&gt;
&lt;p&gt;Anyway, it's too late already.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Crafting Interpreters"></category></entry><entry><title>Crafting Interpreters 2020-07-29</title><link href="https://mwchase.neocities.org/crafting-interpreters-2020-07-29" rel="alternate"></link><published>2020-07-29T04:00:00-04:00</published><updated>2020-07-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-07-29:/crafting-interpreters-2020-07-29</id><summary type="html">&lt;p class="first last"&gt;Thanks to Mypy for catching some absolute nonsense.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got the basic parts of the resolver seemingly working.
One concern I have to keep in mind is that I'm not sure how I want the resolution to work in the repl.
I'm thinking the simplest solution is to just have some kind of incrementing thing that gets put in the tokens to disambiguate them.&lt;/p&gt;
&lt;p&gt;Anyway, I'll work on that later.
Trying to think if there's anything else I want to mention...
There are some simplifications to my changes that I want to make, but I'm so close to getting through the basic funtionality, and I'd rather push through with it and clean stuff up later.&lt;/p&gt;
&lt;p&gt;I'll try out the repl support stuff while this posts.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Crafting Interpreters"></category></entry><entry><title>Weekly Roundup 2020-07-28</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-07-28" rel="alternate"></link><published>2020-07-28T04:00:00-04:00</published><updated>2020-07-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-07-28:/weekly-roundup-2020-07-28</id><summary type="html">&lt;p class="first last"&gt;Early posting because I'm trying to do a backup, and the external drive is &lt;em&gt;really&lt;/em&gt; finicky.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I found a bug when I was trying to add coverage, so that's nice.&lt;/li&gt;
&lt;li&gt;Thursday: I thought about the stuff that I'll have to add to my Lox implementation.&lt;/li&gt;
&lt;li&gt;Friday: I finished implementing function calls. (I'll have to revisit them later.)&lt;/li&gt;
&lt;li&gt;Saturday: I made some progress on getting ready to move.&lt;/li&gt;
&lt;li&gt;Sunday: I came up with a plan for implementing the resolver.&lt;/li&gt;
&lt;li&gt;Monday: I started implementing the resolver.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'll try to wrap up my Lox implementation.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Crafting Interpreters 2020-07-27</title><link href="https://mwchase.neocities.org/crafting-interpreters-2020-07-27" rel="alternate"></link><published>2020-07-27T04:00:00-04:00</published><updated>2020-07-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-07-27:/crafting-interpreters-2020-07-27</id><summary type="html">&lt;p class="first last"&gt;I'd been thinking for a bit &amp;quot;This doesn't make sense.&amp;quot; Turns out it doesn't, and the reason is that I misread a function definition.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Yesterday, I worked out a general plan for getting the resolver written, and today I started working on it.
I didn't get too far on the actual resolver bit, because I got somewhat hung up on some jank in the typing system while laying the groundwork for it, and then I got just a few visitor methods implemented before I realized that I'd implemented function calls slightly wrong, and I'll either need to fix them, or replicate the breakage in the resolver.
I figured I'd rather fix the implementation, because the wrongness is basically a case of unintentionally diverging from JLox, as opposed to all of the intentional divergences.&lt;/p&gt;
&lt;p&gt;One area where I'm not diverging, for now, is in maintaining the shadowing behavior.
The behavior is justified with &amp;quot;Shadowing is rare and often an error so initializing a shadowing variable based on the value of the shadowed one seems unlikely to be deliberate.&amp;quot;
That rings a little false to me, but maybe that's just because I've read so many Rust tutorials.
In any case, I'm keeping the behavior of &amp;quot;error on shadow&amp;quot; for now, because the name of a local cannot be visible to consumers, which means that allowing shadowing doesn't open up expressiveness, so I'll stick with what the book says, for once.
(Although, this post indicates that I'm going for at least twice, but whatever.)&lt;/p&gt;
&lt;p&gt;I'll probably take a different tack with the language concept sketches that I'll hopefully be working on next week, but that's then and this is now.
And now is late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Crafting Interpreters"></category></entry><entry><title>Crafting Interpreters 2020-07-26</title><link href="https://mwchase.neocities.org/crafting-interpreters-2020-07-26" rel="alternate"></link><published>2020-07-26T04:00:00-04:00</published><updated>2020-07-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-07-26:/crafting-interpreters-2020-07-26</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;I wonder if it's a sign that, whenever I attempt something like this, the scope of the changes spirals wildly out of control. ... Naaaah.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I spent a little time today figuring out the plan for implementing the resolver for Lox.
(To be real, I spent more of the day watching Portal-related speedruns.)
Now, one thing that I notice happening with my &amp;quot;bad-at-following-directions&amp;quot; take on tutorials, is that I eventually pile on so many changes and quick hacks, that it becomes impractical to follow the precise details of the tutorial so closely while keeping my reworks, and I have to refactor it to either accord with the tutorial, or what appeals to me aesthetically.
I don't recall ever taking the former option, but it's there.&lt;/p&gt;
&lt;p&gt;Anyway, the &amp;quot;reckoning&amp;quot; for the Lox tutorial wasn't too bad, at least I don't think it was.
The basic point of friction is that I'm tracking state very differently from the tutorial, and that means that, while the JLox resolver works by injecting state onto an Interpreter instance, my codebase has all of the mutable state essentially concentrated into a single new class, which updates via &lt;tt class="docutils literal"&gt;attr.evolve&lt;/tt&gt; rather than mutation.
So, to implement the resolver, I have to have it take a state, and put data on the state.&lt;/p&gt;
&lt;p&gt;There are a bunch of improvements I want to make first, that are slightly more complicated than the corresponding improvements to JLox.
Once I make those improvements, I should be ready to implement the resolver and move on.
For now, I want to wind down and cool off.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Crafting Interpreters"></category></entry><entry><title>Diary 2020-07-25</title><link href="https://mwchase.neocities.org/diary-2020-07-25" rel="alternate"></link><published>2020-07-25T04:00:00-04:00</published><updated>2020-07-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-07-25:/diary-2020-07-25</id><summary type="html">&lt;p class="first last"&gt;I've earned some rest.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Things are looking in good shape now.
I was kind of tired today, so I didn't end up doing anything that I want to write about.
I think we've got plans set for all of the big stuff, so now I'm free to work on prioritizing the stuff that I enjoy doing.&lt;/p&gt;
&lt;p&gt;I thought maybe I'd come up with something else to put in this post, but I didn't.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Crafting Interpreters 2020-07-24</title><link href="https://mwchase.neocities.org/crafting-interpreters-2020-07-24" rel="alternate"></link><published>2020-07-24T04:00:00-04:00</published><updated>2020-07-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-07-24:/crafting-interpreters-2020-07-24</id><summary type="html">&lt;p class="first last"&gt;Not sure if I'm actually reading the chapters at this point.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've gotten up through implementing function calls for Lox.
Next up is the resolver, then classes and inheritance, then I'm going to take a break, and when I come back to it, work on improving coverage and testing, and figuring out profiling.
Looks like I want to look into &lt;a class="reference external" href="https://vmprof.readthedocs.org/"&gt;vmprof&lt;/a&gt; for that when the time comes.&lt;/p&gt;
&lt;p&gt;I hope I have more to say about doing this on-the-fly port when I come back to it later.
The most I've got right now is, it's kind of shocking how well things map between the different versions.
I'm converting mutation-based Java code to Python code using persistent data structures, and somehow, even when I jump ahead, I end up with code that's bug-for-bug compatible with the code at the time that the book is explaining the bugfix.&lt;/p&gt;
&lt;p&gt;Anyway, one thing I want to mess with while taking a break is designing a toy language that I find more interesting.
Maybe try mixing linear syntax, like Lua's, with built-in inheritance and affordances for static analysis.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Crafting Interpreters"></category></entry><entry><title>Crafting Interpreters 2020-07-23</title><link href="https://mwchase.neocities.org/crafting-interpreters-2020-07-23" rel="alternate"></link><published>2020-07-23T04:00:00-04:00</published><updated>2020-07-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-07-23:/crafting-interpreters-2020-07-23</id><summary type="html">&lt;p class="first last"&gt;I don't think I'll be able to keep up this pace after I catch up to where I was, but eh.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got environments mostly done.
There are some loose ends related to the fact that my on-the-fly redesign (of course I have an on-the-fly redesign) in some sense &amp;quot;wants&amp;quot; garbage collection, and is somewhat set up to support it, but does not currently have it.
Currently, namespaces just always exist, and all the changes is the index into an arena.
Ideally, there should be some kind of ref-counting happening, but I think it would be prudent to wait to get to closures before messing with that.&lt;/p&gt;
&lt;p&gt;Along with environments, I've got support for most kinds of statement currently in the grammar, and I also fixed up the support for some of the stuff that I added in response to the challenges.&lt;/p&gt;
&lt;p&gt;I also also made some improvements to testing coverage.
There'll be some un-fixable shortcomings until I get through the next few chapters, but the coverage is still much better.
Anyway, it's late and hot.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Crafting Interpreters"></category></entry><entry><title>Crafting Interpreters 2020-07-22</title><link href="https://mwchase.neocities.org/crafting-interpreters-2020-07-22" rel="alternate"></link><published>2020-07-22T04:00:00-04:00</published><updated>2020-07-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-07-22:/crafting-interpreters-2020-07-22</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Debugging is like being the detective in a crime movie where you are also the murderer.&amp;quot; &amp;quot;... and the victim&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm approaching parity with the Lua version of the Crafting Interpreters stuff, which means that I'm going to have to slow down soon.
First, though, I have to get moving; I'm working on adding coverage, and I'm seeing some behavior that makes no sense to me at all.
Until I can figure it all out, I'm kind of stuck, because I want to at least understand where the weird behavior is coming from.&lt;/p&gt;
&lt;p&gt;I found it.
I'd failed to decorate one of my classes with attrs stuff, so the code that consumed it was crashing because the attributes it was looking for didn't exist.
(And this wasn't bubbling out in a meaningful way becase the test was already expecting failure.)
I can't imagine how much grief that would have caused me if I hadn't worked it out now.&lt;/p&gt;
&lt;p&gt;The way is clear to work on Environments, but I think it would be a bad idea to do that now.
I'll work on it tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Crafting Interpreters"></category></entry><entry><title>Weekly Roundup 2020-07-21</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-07-21" rel="alternate"></link><published>2020-07-21T04:00:00-04:00</published><updated>2020-07-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-07-21:/weekly-roundup-2020-07-21</id><summary type="html">&lt;p class="first last"&gt;Again, my response to programming tutorials is nothing if not consistent.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I complained about my back and my posting schedule, then thoughts about the projects I could pick back up.&lt;/li&gt;
&lt;li&gt;Thursday: I got more stuf cleaned up for the move.&lt;/li&gt;
&lt;li&gt;Friday: I picked Crafting Interpreters back up, this time with a strategy of &amp;quot;Let's write this in typed Python, an see how far I can push that, first.&amp;quot;&lt;/li&gt;
&lt;li&gt;Saturday: I wrote tests for my Crafting Interpreters code, finally.&lt;/li&gt;
&lt;li&gt;Sunday: I jumped the gun a bit, and ported code from my previous attempt. It's probably fine.&lt;/li&gt;
&lt;li&gt;Monday: I considered a minor implementation issue, which I have since addressed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to probably mess with Crafting Interpreters stuff some more, and maybe work on planning a new posting schedule.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Crafting Interpreters 2020-07-20</title><link href="https://mwchase.neocities.org/crafting-interpreters-2020-07-20" rel="alternate"></link><published>2020-07-20T04:00:00-04:00</published><updated>2020-07-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-07-20:/crafting-interpreters-2020-07-20</id><summary type="html">&lt;p class="first last"&gt;I need a rubber duck with a label that says &amp;quot;Internet&amp;quot; on it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today, I hid from the heat, and did some more work porting Lox interpreter stuff to Python.
I decided to move on in the book, to the actual interpreter logic, and getting it ported to Python is a little tricky.
The problem isn't strictly expressing the logic of the Lua or Java version, it's expressing the logic in a way that's visible to static analysis.&lt;/p&gt;
&lt;p&gt;Fortunately, just complaining about the problem in general terms turned out to provide all the insight I needed to deal with the problem.
However, I do see that there's trouble on the horizon I'll need to deal with later:
The Lua version manages to define the expression &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Visitor_pattern"&gt;visitor&lt;/a&gt; so that it passes through additional arguments.
I'm not sure how to express that with function signatures in Python.
When I was first thinking about this, I kind of punted it like &amp;quot;Oh, well, it an act like it's just operating on the first argument, but actually it's allowed to return a callable, so the signature can be something like ExprVisitor[Callable[[Environment], Tuple[Environment, LoxObject]]]&amp;quot; and maybe these callables are, like partial applications of private methods?
I don't know, I shouldn't rush into implementing this stuff, so I'm going to sleep on it, and also flee this terrible warmth.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Crafting Interpreters"></category></entry><entry><title>Crafting Interpreters 2020-07-19</title><link href="https://mwchase.neocities.org/crafting-interpreters-2020-07-19" rel="alternate"></link><published>2020-07-19T04:00:00-04:00</published><updated>2020-07-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-07-19:/crafting-interpreters-2020-07-19</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;This is going slow. I'll just crib from my past self's extensive yet cryptic notes.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Heck of a day today; I'm more wiped out than I usually am around this time.
I did have some time to work on the Crafting Interpreters stuff.&lt;/p&gt;
&lt;p&gt;I... ended up getting a little impatient, and porting logic from my Lua version, rather than following the book.
This means that there's random advanced and optional functionality stuck in here, relative to what the book is telling me to do.
This would be pretty bad for a concrete deliverable that is supposed to directly accomplish specific tasks, but I choose to approach this as an opportunity for additional learning.&lt;/p&gt;
&lt;p&gt;I think I'll call it a night.
I'm pretty tired now, and I got &lt;em&gt;plenty&lt;/em&gt; done today.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Crafting Interpreters"></category></entry><entry><title>Crafting Interpreters 2020-07-18</title><link href="https://mwchase.neocities.org/crafting-interpreters-2020-07-18" rel="alternate"></link><published>2020-07-18T04:00:00-04:00</published><updated>2020-07-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-07-18:/crafting-interpreters-2020-07-18</id><summary type="html">&lt;p class="first last"&gt;At some point I should try to fix my syntax highlighter for ReST. It has some weird gaps that I'm pretty sure it inherited from its previous version.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got up through the end of chapter for of Crafting Interpreters with my Python version.
It too a little finagling, and the result is kind of awkward (as a result of how I wrote the code), but it works, at least according to the tests I wrote.
It's nice having tests; I never got experienced with any testing libraries in Lua like I did with &lt;a class="reference external" href="https://docs.pytest.org/"&gt;pytest&lt;/a&gt; and &lt;a class="reference external" href="https://coverage.readthedocs.io/"&gt;coverage.py&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Anyway, I guess I don't have much more to say.
It's late, and the basic lexer for Lox isn't too impressive.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Crafting Interpreters"></category></entry><entry><title>Crafting Interpreters 2020-07-17</title><link href="https://mwchase.neocities.org/crafting-interpreters-2020-07-17" rel="alternate"></link><published>2020-07-17T04:00:00-04:00</published><updated>2020-07-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-07-17:/crafting-interpreters-2020-07-17</id><summary type="html">&lt;p class="first last"&gt;A fresh start&lt;/p&gt;
</summary><content type="html">&lt;p&gt;(Wow, I totally forgot how I laid out my posts two years ago.
Maybe I should bring some of that back, if I settle on a topic schedule.)&lt;/p&gt;
&lt;p&gt;Anyway, while I was poking around programming blogs and thinking about stuff to work on, I stumbled back over &lt;a class="reference external" href="http://craftinginterpreters.com/"&gt;Crafting Interpreters&lt;/a&gt;.
Nearly two years ago, I had looked at the instructions for writing an interpreter in Java, and thought &amp;quot;Eh, I'll try it in Lua.&amp;quot;
That decision was both broadly consistent with my reaction to seemingly every coding tutorial, and led to a bunch of work that I foolishly did not comment.&lt;/p&gt;
&lt;p&gt;I see that my last post on the topic had me speculating about targeting &lt;a class="reference external" href="https://rpython.readthedocs.io/"&gt;RPython&lt;/a&gt; for a JIT interpreter.
I've thought about such things in the past few years, and I think I'd specifically like to try prototyping in PyPy3, then potentially porting it back to PyPy2, then restricting it to RPython.
Each step of that entails giving up developer convenience and writing more code in the hope of increasing execution speed.
Either I write simple code now, and gradually replace it with more complicated code, or I try to write the more complicated code all at once, up front.
As such, the cost of using Python 3 to start with is, at worst, the up-front cost of the code that will have to be rewritten into a more complicated version later, which is really low, because &lt;a class="reference external" href="https://www.attrs.org/"&gt;attrs&lt;/a&gt; and enum are great.&lt;/p&gt;
&lt;p&gt;I've just basically gotten started with my Python version of Lox, and it's not too impressive yet.
I don't know if I'll keep on with this, but switching gears seems to have helped with my stress a bit.
Anyway, it's way late now, so I should wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Crafting Interpreters"></category></entry><entry><title>Diary 2020-07-16</title><link href="https://mwchase.neocities.org/diary-2020-07-16" rel="alternate"></link><published>2020-07-16T04:00:00-04:00</published><updated>2020-07-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-07-16:/diary-2020-07-16</id><summary type="html">&lt;p class="first last"&gt;I'm a little less sore.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did more moving stuff today. We're not totally ready, but I feel like we've got enough detritus sorted through that it won't be too onerous to get packed.
Much as it would be nice to get back to the projects I have, I'm still a bit keyed up and it's late.
So, I can't get into them &lt;em&gt;right now&lt;/em&gt;.
I'll try to put aside some time for planning and considering over the next few days, and hopefully I'll come to a decision by next week.&lt;/p&gt;
&lt;p&gt;Anyway, I don't think I have anything else to say right now, so let's wrap this up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2020-07-15</title><link href="https://mwchase.neocities.org/diary-2020-07-15" rel="alternate"></link><published>2020-07-15T04:00:00-04:00</published><updated>2020-07-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-07-15:/diary-2020-07-15</id><summary type="html">&lt;p class="first last"&gt;Hanging out all day with a messed-up back.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I mostly took it easy today.
One of the quirks of how I date these posts is, I put them up for the day &lt;em&gt;after&lt;/em&gt; I wrote them.
(Or mostly wrote them.)
So, this post was written on my birthday, unlike the one with my birthday date on it.
Every once in a while the discrepancy here seems a bit confusing to me, but generally it makes just enough sense that I'm not interested in coming up with alternatives.&lt;/p&gt;
&lt;p&gt;Anyway, I did spend some time putting together a list of projects I've been working on or thinking about lately.
There are actually quite a few, and I'm not sure how I want to organize things, but it should be possible for me to work out some kind of schedule.
I don't know when I'll feel comfortable trying to commit to a schedule, since things are kind of in flux right now.
I'm still reading stuff, but I don't have much to say on the stuff I'm reading.&lt;/p&gt;
&lt;p&gt;I should wrap things up soon, or I'll regret it.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2020-07-14</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-07-14" rel="alternate"></link><published>2020-07-14T04:00:00-04:00</published><updated>2020-07-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-07-14:/weekly-roundup-2020-07-14</id><summary type="html">&lt;p class="first last"&gt;Happy birthday to me...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I took the ECS stuff in a different direction.&lt;/li&gt;
&lt;li&gt;Thursday: I tweaked the interface some, and discovered a Mypy limitation.&lt;/li&gt;
&lt;li&gt;Friday: It was hot. Instead of trying to code, I tried to learn about generating functions.&lt;/li&gt;
&lt;li&gt;Saturday: I had to rearrange the ECS stuff kind of heavily to avoid import cycles.&lt;/li&gt;
&lt;li&gt;Sunday: I made a little more progress on the ECS stuff.&lt;/li&gt;
&lt;li&gt;Monday: I didn't do anything that I felt like going into detail on.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to work on cleaning this place out.
Hopefully, I'll have time and energy for other stuff, but no promises.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Diary 2020-07-13</title><link href="https://mwchase.neocities.org/diary-2020-07-13" rel="alternate"></link><published>2020-07-13T04:00:00-04:00</published><updated>2020-07-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-07-13:/diary-2020-07-13</id><summary type="html">&lt;p class="first last"&gt;Just kind of tried to take it easy and zone out.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I once again don't remember if I got much done with coding today.
I'm guessing things are going to shift into &amp;quot;preparing to move&amp;quot; mode, and hopefully I'll be able to get back up to speed after that's done, which will probably take a few weeks.&lt;/p&gt;
&lt;p&gt;I'm mostly focused on collecting reading materials for some of the projects I want to get back to.
My plan, once I get back up to speed, is to work out something like the weekly schedule of topic days I used to have.
Anyway, it's getting late, and the weather sucks out here.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2020-07-12</title><link href="https://mwchase.neocities.org/coding-2020-07-12" rel="alternate"></link><published>2020-07-12T04:00:00-04:00</published><updated>2020-07-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-07-12:/coding-2020-07-12</id><summary type="html">&lt;p class="first last"&gt;Why's it so hot... Ugh...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Slow going on the ECS stuff again today.
Oh well.
I made some progress, though.&lt;/p&gt;
&lt;p&gt;I did some more work on other stuff, that I'll maybe talk about later.
Not feeling the motivation right now, so...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-07-11</title><link href="https://mwchase.neocities.org/coding-2020-07-11" rel="alternate"></link><published>2020-07-11T04:00:00-04:00</published><updated>2020-07-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-07-11:/coding-2020-07-11</id><summary type="html">&lt;p class="first last"&gt;Complications that were unforeseen, mainly because I didn't want to foresee them.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;It turns out that even though I put in a lot of work on tests just now, I didn't make much numerical progress.
Basically, I had the type definitions for the ECS package spread out among the various modules, which turns out to not work well when they have all sorts of interdependencies.
When I tried to actually import and test some of the new modules, it crashed repeatedly, and in weirder ways as I tried to work around it.&lt;/p&gt;
&lt;p&gt;So, after I added some basic tests, I moved the type definitions to a single module, and tried to get them to mostly build on each other linearly.&lt;/p&gt;
&lt;p&gt;That seems to have done the trick, so I'll try to polish off the rest later.
Hopefully there'll be no weird hurdles waiting for me in the morning.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2020-07-10</title><link href="https://mwchase.neocities.org/diary-2020-07-10" rel="alternate"></link><published>2020-07-10T04:00:00-04:00</published><updated>2020-07-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-07-10:/diary-2020-07-10</id><summary type="html">&lt;p class="first last"&gt;Summer...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I don't remember if I got much done with coding today.
Certainly no tests.
The basic problem was that it was just stupidly hot today, so I couldn't really focus.
I basically spent all of my mental energy doing exercises from a math textbook I loaded into my e-reader, because squinting at the somewhat-small text is easier than staring at a bright screen that needs to be taken into the hot to recharge every few hours.&lt;/p&gt;
&lt;p&gt;If conditions are favorable tomorrow, I'll wrap up the ECS stuff.
If not, I probably won't.
I need to wrap up now; it's really gross out here.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2020-07-09</title><link href="https://mwchase.neocities.org/coding-2020-07-09" rel="alternate"></link><published>2020-07-09T04:00:00-04:00</published><updated>2020-07-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-07-09:/coding-2020-07-09</id><summary type="html">&lt;p class="first last"&gt;I would get rumbled so hard by a problem that starts with a bear walking south, and doesn't involve the curvature of the Earth.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did not get tests done today.
Instead, I iterated on the interface some more.
The way things are going is making me question whether I want to use more specialized data structures for some of this, but the interface to what I have is fine, so this is pretty much a &amp;quot;performance&amp;quot; question, so I'm not currently equipped to answer it.&lt;/p&gt;
&lt;p&gt;I think the interface I'm going with currently is solid.
Again, have to try it out, which means I need to get it ready to be tried out.
I'll try to get the tests done tomorrow.&lt;/p&gt;
&lt;p&gt;One unfortunate thing I found is that Mypy apparently doesn't really even &lt;em&gt;see&lt;/em&gt; class decorators, so I'm possibly going to have to reconsider all of the class decorators I used.
Or maybe just say &amp;quot;You know what, this isn't ready for release, but it's good enough for me right now.&amp;quot;&lt;/p&gt;
&lt;p&gt;I also tried out some of the problem solving stuff today, first with some of the example problems.
(I had to skip to the end, becase my mental monologue reading the early ones went something like &amp;quot;'A bear walks one mile south'—the north pole! no, white!&amp;quot;)
Anyway, that seemed to work out, so I tried applying the principles to something outside the area of math/lateral thinking.
I didn't get as far, because the problem was much more open-ended, but I'm happy with my progress so far.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-07-08</title><link href="https://mwchase.neocities.org/coding-2020-07-08" rel="alternate"></link><published>2020-07-08T04:00:00-04:00</published><updated>2020-07-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-07-08:/coding-2020-07-08</id><summary type="html">&lt;p class="first last"&gt;Me from a few years ago is super jazzed about trying out this design.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I went through a few iterations with the attempt to convert Dennis's ECS design to entirely immutable data structures.
I concluded that a straight port was impossible, &lt;em&gt;but&lt;/em&gt; I've got a draft implementation of a more elegant design.
Once I have it tested (I think I'll finally bring back mutation testing for this), I'm going to try to port Dennis to it, to make sure I properly understand the ramifications.&lt;/p&gt;
&lt;p&gt;The big difference is, Dennis's ECS implementation did not actually have the &amp;quot;system&amp;quot; from &amp;quot;entity component system&amp;quot;.
It basically got by with a concept I called &amp;quot;Views&amp;quot;, which were a way to interact with the &amp;quot;World&amp;quot; structure that contained everything else in a type-safe way.
The key difference between &amp;quot;Views&amp;quot; and anything in the new system is that Views were explicitly coupled into the &amp;quot;World&amp;quot;.
In the new system, they're replaced by &amp;quot;Bundles&amp;quot;, which are like &amp;quot;Views&amp;quot; that don't do anything, and &amp;quot;Systems&amp;quot;, which couple a &amp;quot;Bundle&amp;quot; to a single action that is restricted in what it can actually do.
Basically, the &amp;quot;System&amp;quot; operates on a snapshot of the &amp;quot;World&amp;quot; when the system is started, and it ultimately does two things: return either a new bundle to replace the current entity's bundle, or remove the bundle completely, and return any number of bundles to add to the world.
These modifications are not visible to the other runs of the system, so there can be no dependence on order.
(Or, there can, but it would have to be a deliberate attempt to work around the library.)&lt;/p&gt;
&lt;p&gt;It's possible that I'll want more sophisticated interfaces once I try actually using this, but I think this is expressive enough to handle anything I might want to do, &lt;em&gt;somehow&lt;/em&gt;.
It should just be a question of convenience.&lt;/p&gt;
&lt;p&gt;Anyway, I should get those tests done tomorrow.
For now, I sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2020-07-07</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-07-07" rel="alternate"></link><published>2020-07-07T04:00:00-04:00</published><updated>2020-07-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-07-07:/weekly-roundup-2020-07-07</id><summary type="html">&lt;p class="first last"&gt;I think I prefer the books on technique or motivation that don't sound like the the author has the urge to found a cult.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I tried to follow a programming tutorial, and got impatient and started trying to rewrite it on the fly. Sensing a pattern here...&lt;/li&gt;
&lt;li&gt;Thursday: The rewrites got too tricky.&lt;/li&gt;
&lt;li&gt;Friday: I had a headache and tried to do tricky math problems. Not recommended.&lt;/li&gt;
&lt;li&gt;Saturday: I got way too into video games and had an adrenaline crash. Not recommended.&lt;/li&gt;
&lt;li&gt;Sunday: I tried to apply more rigorous principles to some of my creative processes. So far, all I can say for sure is that it's a refreshing change in perspective. It feels good. I don't know if it works good.&lt;/li&gt;
&lt;li&gt;Monday: I made an effort to explain a lot of things around my programming projects.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to work on refining processes, but try to put them into practice as soon as I can,&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2020-07-06</title><link href="https://mwchase.neocities.org/coding-2020-07-06" rel="alternate"></link><published>2020-07-06T04:00:00-04:00</published><updated>2020-07-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-07-06:/coding-2020-07-06</id><summary type="html">&lt;p class="first last"&gt;I don't think I ever explained that reference before.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I started trying to rewrite Dennis's ECS implementation using &lt;a class="reference external" href="https://www.attrs.org/"&gt;attrs&lt;/a&gt; and &lt;a class="reference external" href="https://pyrsistent.readthedocs.io/"&gt;pyrsistent&lt;/a&gt; in a new monorepo.&lt;/p&gt;
&lt;p&gt;I feel like it might be helpful to explain what all that means and why I'm doing it.&lt;/p&gt;
&lt;p&gt;Dennis is what I called my project to rework the implementation of the roguelike from &lt;a class="reference external" href="http://rogueliketutorials.com/tutorials/tcod/"&gt;TStand90's roguelike tutorials&lt;/a&gt; in line with my own preferences.
It leans a lot on some features of &lt;a class="reference external" href="http://coconut-lang.org/"&gt;Coconut&lt;/a&gt;, which I'll &lt;em&gt;probably&lt;/em&gt; end up replacing with attrs somehow.
It's called Dennis because it's an &lt;a class="reference external" href="http://www.hrwiki.org/wiki/Thy_Dungeonman"&gt;adventure game&lt;/a&gt;, kind of, and the implementation is in Coconut, which is a reference to &lt;a class="reference external" href="https://www.youtube.com/watch?v=eKIyVnoZDdQ"&gt;Monty Python and the Holy Grail&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Part of the rework involved redoing the implementation of the ECS, or entity component system.
The idea of an entity component system is that, instead of creating a distinct class for each &amp;quot;kind of thing&amp;quot; (something like &lt;tt class="docutils literal"&gt;PositionedFactionBasedSizedMonsterWithAI&lt;/tt&gt;), there's just one &amp;quot;kind of thing&amp;quot; called an entity, which can have &amp;quot;components&amp;quot; associated with it (which, in the example given, would be something like &amp;quot;Position&amp;quot;, &amp;quot;Faction&amp;quot;, &amp;quot;Size&amp;quot;, &amp;quot;Statblock&amp;quot;, &amp;quot;AI&amp;quot;).
Dennis represents entities as a simple opaque identifier (using a system that can be simplified in the current rewrite), and component instances are stored in mappings from those identifiers.&lt;/p&gt;
&lt;p&gt;In Dennis, the master data structure for the ECS is mutable, and the implementation makes heavy use of Coconut's &amp;quot;data&amp;quot; classes.
In the current rewrite, the data structures are all immutable thanks to pyrsistent, and the &amp;quot;frozen&amp;quot; feature from attrs.&lt;/p&gt;
&lt;p&gt;The rewrite is taking place in a new version control repository that will contain the source for multiple Python packages, which will be developed in tandem.
The basic idea is that, where Dennis had a single ECS module, I'm now trying to put that into an ECS package, which should hopefully be easier to reuse in other applications.
Just add a package to the monorepo that defines an entry point for execution, and I can have it pick and choose from the packages in the monorepo.
Part of what I plan to do is rewrite Dennis into the monorepo, so I can better reuse the work I already did.&lt;/p&gt;
&lt;p&gt;Anyway, that's a bunch of explaining I just did.
I should get to bed ASAP, again.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2020-07-05</title><link href="https://mwchase.neocities.org/diary-2020-07-05" rel="alternate"></link><published>2020-07-05T04:00:00-04:00</published><updated>2020-07-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-07-05:/diary-2020-07-05</id><summary type="html">&lt;p class="first last"&gt;Part of the problem: &amp;quot;It's the same exact game, but now I'm better at it in a way that makes it boring.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did some reading on problem-solving techniques (which is something that I feel I haven't really been taght in the way that I've just been reading about), and promptly concluded &amp;quot;If these are general techniques, I should be able to apply them to any problem domain, like, say, high-level game design.&amp;quot;&lt;/p&gt;
&lt;p&gt;I do feel like the attempt led to various better understandings on my part, but I think I should take a break from that and try applying these principles to the kinds of problems they were originally meant for: math problems.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to wrap up, and maybe read other things.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2020-07-04</title><link href="https://mwchase.neocities.org/diary-2020-07-04" rel="alternate"></link><published>2020-07-04T04:00:00-04:00</published><updated>2020-07-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-07-04:/diary-2020-07-04</id><summary type="html">&lt;p class="first last"&gt;It turns out I'm apparently a background character in Yu-Gi-Oh.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I looked over the code I mentioned yesterday, and a bit of tinkering and simplification was all I needed to accept that there's probably no point in trying to get it workable in production.
Instead, I decided to pull in some existing libraries, and see about building the system I want on top of them.
I got a fair bit sketched out before deciding that I need to plan and think more about this.&lt;/p&gt;
&lt;p&gt;Anyway, other stuff I did today...
I almost beat Slay the Spire with the fourth character, and then spent the next hour or so crashing from the adrenaline rush, because apparently I get excited about card games with virtual monsters attached to them.&lt;/p&gt;
&lt;p&gt;I'm gradually accumulating more books I want to read.
I think I should do more of that so my eyes get a little less blasted by backlighting.&lt;/p&gt;
&lt;p&gt;I'll get that set up while this publishes, and wrap up for today ASAP.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2020-07-03</title><link href="https://mwchase.neocities.org/diary-2020-07-03" rel="alternate"></link><published>2020-07-03T04:00:00-04:00</published><updated>2020-07-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-07-03:/diary-2020-07-03</id><summary type="html">&lt;p class="first last"&gt;Like my brain is trying to balance good and bad ideas for some reason.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got too much afternoon sunlight today, so I mostly just suffered a little for a while.
I'll try to remember not to do that tomorrow.&lt;/p&gt;
&lt;p&gt;So far as what I accomplished, I messed with some recreational math; I've taken a really hard problem, and derived a simplified form of it that I still don't know how to solve, but maybe I can come at it from another angle, unlike the original problem.&lt;/p&gt;
&lt;p&gt;I also thought about the game development tutorials that I've tried to follow, and decided that this might be another case for putting together monorepo, like I did for the virtual tabletop stuff, so when I find myself needing to solve similar problems, I can just reach for the code, without copy-paste or a formal repo.&lt;/p&gt;
&lt;p&gt;Somewhat unfortunately, the first thing I feel like I want to try putting in there is some experimental code I wrote a few years ago that was just, really bad.
And I have some ideas for improving it, but I don't know of anything that would address the core issue, which is that it was just really not performant at all.
I think I'm being led astray by a gut feeling that I can make it more efficient.
Maybe this time I can figure out why I'm wrong about it.&lt;/p&gt;
&lt;p&gt;Anyway, my head still hurts, and maybe if I wrap up now, I can do something about that.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2020-07-02</title><link href="https://mwchase.neocities.org/coding-2020-07-02" rel="alternate"></link><published>2020-07-02T04:00:00-04:00</published><updated>2020-07-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-07-02:/coding-2020-07-02</id><summary type="html">&lt;p class="first last"&gt;Where are the Python game dev tutorials from the &amp;quot;composition over inheritance&amp;quot; people?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got a little further with the &lt;a class="reference external" href="https://pyglet.readthedocs.io/"&gt;pyglet&lt;/a&gt; tutorial today, before hitting a point where my reflexive refactors got a lot more involved.
So right now, I'm in a little bit of a standoff with myself, over whether to just do this next part as the tutorial says, or to do things right, for some value of &amp;quot;right&amp;quot;.&lt;/p&gt;
&lt;p&gt;Updates might be even more sketchy in the coming weeks.
We have to move, which seems a little reckless to me, but neither of us is calling the shots here.&lt;/p&gt;
&lt;p&gt;I'm trying to think if there's anything else I want to talk about in this entry, and I guess not really?
I focused some on apartment hunting today, which I have no desire to blog about.
I'm going to try to get to bed at a healthier time than I have been lately.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-07-01</title><link href="https://mwchase.neocities.org/coding-2020-07-01" rel="alternate"></link><published>2020-07-01T04:00:00-04:00</published><updated>2020-07-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-07-01:/coding-2020-07-01</id><summary type="html">&lt;p class="first last"&gt;Poor Dennis. I really should look over the build tasks sometime and see if I can simplify and update things.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;After I messed around with &lt;a class="reference external" href="https://pyglet.readthedocs.io/"&gt;pyglet&lt;/a&gt; earlier, I decided to follow along with their tutorial for a simple game.
Now, judging by how I handled the first part, and how Dennis came about, I'm apparently constitutionally incapable of following a game-dev tutorial for Python without throwing in countless refactoring attempts.&lt;/p&gt;
&lt;p&gt;I've refrained from using the event dispatcher I wrote earlier, but I'm definitely going to be keeping an eye out as the tutorial gets more sophisticated, seeing if it makes sense to use it anywhere.&lt;/p&gt;
&lt;p&gt;Still kind of psyching myself up to try fixing the Ink bug I was looking into.
My intuition says that the changes to behavior should be relatively straightforward, and that level of optimism regarding parts of the codebase I haven't really looked at puts my other intuition on edge.&lt;/p&gt;
&lt;p&gt;I'll hopefully have made an attempt by the weekend.
For now, I should wind down.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2020-06-30</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-06-30" rel="alternate"></link><published>2020-06-30T04:00:00-04:00</published><updated>2020-06-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-06-30:/weekly-roundup-2020-06-30</id><summary type="html">&lt;p class="first last"&gt;It's kind of not nice to call pyglet-trio &amp;quot;a solution in search of a problem&amp;quot;, but, yeah...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I prototyped more of the character sheet stuff for the virtual tabletop.&lt;/li&gt;
&lt;li&gt;Thursday: I wrote some utility functions for the character sheet.&lt;/li&gt;
&lt;li&gt;Friday: I took a break from coding to mess with World Maker&lt;/li&gt;
&lt;li&gt;Saturday: I kept on with World Maker, and didn't have much to say about it.&lt;/li&gt;
&lt;li&gt;Sunday: I played Slay the Spire, and poked at other coding stuff.&lt;/li&gt;
&lt;li&gt;Monday: I decided to wire together two Python frameworks, got it working on the first try, and realized I didn't have anything I wanted to &lt;em&gt;do&lt;/em&gt; with them yet.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I might try to fix a bug I found in Ink earlier this month.
Also, I wouldn't mind adding &amp;quot;use a more general-purpose game library&amp;quot; to Dennis's todo list.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2020-06-29</title><link href="https://mwchase.neocities.org/coding-2020-06-29" rel="alternate"></link><published>2020-06-29T04:00:00-04:00</published><updated>2020-06-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-06-29:/coding-2020-06-29</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;I implemented [THING]!&amp;quot; &amp;quot;Why?&amp;quot; &amp;quot;I... don't know...&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't have any real plan today, but I ended up mesing with &lt;a class="reference external" href="https://trio.readthedocs.io/"&gt;Trio&lt;/a&gt; and &lt;a class="reference external" href="https://pyglet.readthedocs.io/"&gt;pyglet&lt;/a&gt;.
I followed Trio's directions for running under and arbitrary other event loop, and it worked on the first try, which is a massive testament to the quality of both projects' documentation.
(I mean, we've seen how things can go when I'm not working with such libraries or frameworks at all.
The odds are really stacked against things &amp;quot;just working&amp;quot;; I'm way more used to having to &lt;em&gt;make&lt;/em&gt; them work.)
Anyway, I didn't have any specific thing in mind that I needed this for, so I guess I'll just back-burner this and keep it in mind as &amp;quot;a thing I can do&amp;quot;.&lt;/p&gt;
&lt;p&gt;Here's the code I wrote, including a weird hybrid &amp;quot;hello world&amp;quot; sample.
This differs from the original &amp;quot;just works&amp;quot; code in that I did some minor refactorings to simplify and shorten some of the code, and I added some basic documentation of what I did and why.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;
&lt;span class="normal"&gt;22&lt;/span&gt;
&lt;span class="normal"&gt;23&lt;/span&gt;
&lt;span class="normal"&gt;24&lt;/span&gt;
&lt;span class="normal"&gt;25&lt;/span&gt;
&lt;span class="normal"&gt;26&lt;/span&gt;
&lt;span class="normal"&gt;27&lt;/span&gt;
&lt;span class="normal"&gt;28&lt;/span&gt;
&lt;span class="normal"&gt;29&lt;/span&gt;
&lt;span class="normal"&gt;30&lt;/span&gt;
&lt;span class="normal"&gt;31&lt;/span&gt;
&lt;span class="normal"&gt;32&lt;/span&gt;
&lt;span class="normal"&gt;33&lt;/span&gt;
&lt;span class="normal"&gt;34&lt;/span&gt;
&lt;span class="normal"&gt;35&lt;/span&gt;
&lt;span class="normal"&gt;36&lt;/span&gt;
&lt;span class="normal"&gt;37&lt;/span&gt;
&lt;span class="normal"&gt;38&lt;/span&gt;
&lt;span class="normal"&gt;39&lt;/span&gt;
&lt;span class="normal"&gt;40&lt;/span&gt;
&lt;span class="normal"&gt;41&lt;/span&gt;
&lt;span class="normal"&gt;42&lt;/span&gt;
&lt;span class="normal"&gt;43&lt;/span&gt;
&lt;span class="normal"&gt;44&lt;/span&gt;
&lt;span class="normal"&gt;45&lt;/span&gt;
&lt;span class="normal"&gt;46&lt;/span&gt;
&lt;span class="normal"&gt;47&lt;/span&gt;
&lt;span class="normal"&gt;48&lt;/span&gt;
&lt;span class="normal"&gt;49&lt;/span&gt;
&lt;span class="normal"&gt;50&lt;/span&gt;
&lt;span class="normal"&gt;51&lt;/span&gt;
&lt;span class="normal"&gt;52&lt;/span&gt;
&lt;span class="normal"&gt;53&lt;/span&gt;
&lt;span class="normal"&gt;54&lt;/span&gt;
&lt;span class="normal"&gt;55&lt;/span&gt;
&lt;span class="normal"&gt;56&lt;/span&gt;
&lt;span class="normal"&gt;57&lt;/span&gt;
&lt;span class="normal"&gt;58&lt;/span&gt;
&lt;span class="normal"&gt;59&lt;/span&gt;
&lt;span class="normal"&gt;60&lt;/span&gt;
&lt;span class="normal"&gt;61&lt;/span&gt;
&lt;span class="normal"&gt;62&lt;/span&gt;
&lt;span class="normal"&gt;63&lt;/span&gt;
&lt;span class="normal"&gt;64&lt;/span&gt;
&lt;span class="normal"&gt;65&lt;/span&gt;
&lt;span class="normal"&gt;66&lt;/span&gt;
&lt;span class="normal"&gt;67&lt;/span&gt;
&lt;span class="normal"&gt;68&lt;/span&gt;
&lt;span class="normal"&gt;69&lt;/span&gt;
&lt;span class="normal"&gt;70&lt;/span&gt;
&lt;span class="normal"&gt;71&lt;/span&gt;
&lt;span class="normal"&gt;72&lt;/span&gt;
&lt;span class="normal"&gt;73&lt;/span&gt;
&lt;span class="normal"&gt;74&lt;/span&gt;
&lt;span class="normal"&gt;75&lt;/span&gt;
&lt;span class="normal"&gt;76&lt;/span&gt;
&lt;span class="normal"&gt;77&lt;/span&gt;
&lt;span class="normal"&gt;78&lt;/span&gt;
&lt;span class="normal"&gt;79&lt;/span&gt;
&lt;span class="normal"&gt;80&lt;/span&gt;
&lt;span class="normal"&gt;81&lt;/span&gt;
&lt;span class="normal"&gt;82&lt;/span&gt;
&lt;span class="normal"&gt;83&lt;/span&gt;
&lt;span class="normal"&gt;84&lt;/span&gt;
&lt;span class="normal"&gt;85&lt;/span&gt;
&lt;span class="normal"&gt;86&lt;/span&gt;
&lt;span class="normal"&gt;87&lt;/span&gt;
&lt;span class="normal"&gt;88&lt;/span&gt;
&lt;span class="normal"&gt;89&lt;/span&gt;
&lt;span class="normal"&gt;90&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Adapter widget to run the Trio and pyglet event loops together.&lt;/span&gt;

&lt;span class="sd"&gt;I tried and failed to come up with a Three Little Pigs joke.&lt;/span&gt;
&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pyglet.app&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pyglet.event&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pyglet.window&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;trio.lowlevel&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TrioLoop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pyglet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EventDispatcher&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Custom widget for running a Trio event loop concurrently with pyglet.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;

    &lt;span class="n"&gt;started&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;start_trio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;trio_main&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Queue the Trio mainloop to run when the app starts.&lt;/span&gt;

&lt;span class="sd"&gt;        This function should be called once, before pyglet.app.run().&lt;/span&gt;
&lt;span class="sd"&gt;        &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;started&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;RuntimeError&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;started&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
        &lt;span class="n"&gt;pyglet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;platform_event_loop&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post_event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;on_trio_start&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;trio_main&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_schedule_callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Schedule the guest loop callback in pyglet&amp;#39;s event loop.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;pyglet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;platform_event_loop&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post_event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;on_trio_callback&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_done_callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;outcome&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Schedule the done callback in pyglet&amp;#39;s event loop.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;pyglet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;platform_event_loop&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post_event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;on_trio_done&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;outcome&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_trio_start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;trio_main&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Handle the on_trio_start event. Start Trio in guest mode.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;trio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lowlevel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start_guest_run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;trio_main&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;run_sync_soon_threadsafe&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_schedule_callback&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;done_callback&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_done_callback&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_trio_callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Handle the on_trio_callback event.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_trio_done&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;outcome&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Handle the on_trio_done event. Stop the event loop.&lt;/span&gt;

&lt;span class="sd"&gt;        This function should, but does not yet, do something with the &amp;quot;outcome&amp;quot;&lt;/span&gt;
&lt;span class="sd"&gt;        parameter.&lt;/span&gt;
&lt;span class="sd"&gt;        &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;pyglet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;event_loop&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;


&lt;span class="n"&gt;TrioLoop&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;register_event_type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;on_trio_start&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;TrioLoop&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;register_event_type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;on_trio_callback&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;TrioLoop&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;register_event_type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;on_trio_done&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;mainloop&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Run a combination of the Trio and pyglet tutorials.&lt;/span&gt;

&lt;span class="sd"&gt;    This code isn&amp;#39;t really useful on its own, but functions as a&lt;/span&gt;
&lt;span class="sd"&gt;    proof-of-concept and manual test.&lt;/span&gt;
&lt;span class="sd"&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pyglet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Window&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pyglet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;Hello from Trio&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;font_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Times New Roman&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;font_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;anchor_x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;center&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;anchor_y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;center&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="nd"&gt;@window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;
        &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_draw&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;trio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;__main__&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;trio_loop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TrioLoop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;trio_loop&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start_trio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mainloop&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;pyglet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Honestly, I spent some time trying to work out if I somehow implemented this wrong in a way that looks right to me for simple cases.
I can't see any way that could happen, given the behavior I'm seeing.
The fact that five windows get created means that the callback function is definitely being called, and that can only happen if pyglet's event loop is handling events properly.
In addition, the &lt;tt class="docutils literal"&gt;on_draw&lt;/tt&gt; events are firing.&lt;/p&gt;
&lt;p&gt;Anyway, I'm sure there's a lot of potential here that I'm not seeing at the moment because I've been so caught up in low-level details.
Maybe I should try to design a Zach-like to try and implement in it.
I'll have to think about it.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2020-06-28</title><link href="https://mwchase.neocities.org/diary-2020-06-28" rel="alternate"></link><published>2020-06-28T04:00:00-04:00</published><updated>2020-06-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-06-28:/diary-2020-06-28</id><summary type="html">&lt;p class="first last"&gt;Loading stuff into my Kindle to save my eyes.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I keep on trying to force myself to work on one of the coding projects, before going &amp;quot;no, wait, that's a bad idea&amp;quot;.
So, today was mostly writing, and a bunch of &lt;a class="reference external" href="https://www.megacrit.com/"&gt;Slay the Spire&lt;/a&gt;.
I also spent a bit of time trying to figure out what kind of interface I want for the virtual tabletop, and messing with other people's projects using &lt;a class="reference external" href="http://pyglet.org/"&gt;Pyglet&lt;/a&gt;.
The two parts of that sentence may or may not end up coming together; I haven't gotten enough into either to be sure.&lt;/p&gt;
&lt;p&gt;One thing I was kind of thinking of doing, and I don't know that this would make for an in-depth post, was to hit up math textbooks some, see if I can get anything recreational out of that.&lt;/p&gt;
&lt;p&gt;For now, I guess I'm just kind of decompressing.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2020-06-27</title><link href="https://mwchase.neocities.org/diary-2020-06-27" rel="alternate"></link><published>2020-06-27T04:00:00-04:00</published><updated>2020-06-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-06-27:/diary-2020-06-27</id><summary type="html">&lt;p class="first last"&gt;Hard to write under the crushing weight of summer.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today, I started working on transferring my World Maker notes to paper.
I seem to be a bit out of practice with using notebooks.
In any case, I'll try to work on that some over the weekend.&lt;/p&gt;
&lt;p&gt;I thought I had more to say, but then I spaced out.
I am hopefully going to look over other things I can try to use with World Maker.&lt;/p&gt;
&lt;p&gt;Right now, I'm going to play Dissembler while the post publishes, then go to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2020-06-26</title><link href="https://mwchase.neocities.org/diary-2020-06-26" rel="alternate"></link><published>2020-06-26T04:00:00-04:00</published><updated>2020-06-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-06-26:/diary-2020-06-26</id><summary type="html">&lt;p class="first last"&gt;Slightly worried I won't know where to start with this setting...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today, I didn't really feel like coding, so I tried out something else I'd been interested in, &lt;a class="reference external" href="https://sohkrates.itch.io/world-maker"&gt;World Maker&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;My first draw was kind of unlucky, because I drew character cards totaling 45 details, which, taking the other cards needed into account, adds up to more cards than there are in the deck.
This shouldn't be possible except with five characters, and it shouldn't happen that often, but it was a little awkward and I did have to fudge stuff.
The other tricky bit of drawing 45 details is that these characters kind of have everything going on.
Again, luck of the draw, but when the characters I have the best handle on are the cyborg angel and the faerie scientist... this is going to be a little out there.&lt;/p&gt;
&lt;p&gt;I actually just now filled in the last of the connections between these characters.
Now that I've got notes on all this stuff, I'll have to flesh it out later.&lt;/p&gt;
&lt;p&gt;I don't know how much I'll do with this first attempt, but I want to see how far I can take it.
Once I have a handle on this, I want to try using World Maker to come up with plot hooks for a setting that I have some more idea of what it's like, going into it.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2020-06-25</title><link href="https://mwchase.neocities.org/coding-2020-06-25" rel="alternate"></link><published>2020-06-25T04:00:00-04:00</published><updated>2020-06-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-06-25:/coding-2020-06-25</id><summary type="html">&lt;p class="first last"&gt;This is the first entry since I added a progress meter to the upload script. Let's see how that goes.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't get much done in the way of mockups today.
I was working on squaring away a few things, and that ended up taking a few hours.
That, and playing Minit.&lt;/p&gt;
&lt;p&gt;Anyway, I was able to reason about one thing that the sheet/module code needs, and that's a version of &lt;tt class="docutils literal"&gt;evolve&lt;/tt&gt; from &lt;a class="reference external" href="https://www.attrs.org/en/stable/"&gt;attrs&lt;/a&gt; that implicitly converts a proxy to the underlying module.
That probably doesn't make much sense without context.
Basically, the way I'm trying to set up this whole modular concept, is to allow client code to define module classes using a decorator.
The decorator essentially splits the class into a container class and a proxy class.
All client logic lives on the proxy, which defines accessors to all of the fields on the container.
I haven't totally thought through the typing considerations for this; they might be really hairy or they might be fine.
Initial experimentation points towards &amp;quot;hairy&amp;quot;.&lt;/p&gt;
&lt;p&gt;Oh well, if this ends up needing a plugin, it'll probably be less of a hassle than my attempts at a plugin for Structured Data.
And I've already gt this monorepo setup working, so there wouldn't be much friction in getting the project spun up...&lt;/p&gt;
&lt;p&gt;Regardless, I'd like real example code to test this against.
I'll try to get that specified tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-06-24</title><link href="https://mwchase.neocities.org/coding-2020-06-24" rel="alternate"></link><published>2020-06-24T04:00:00-04:00</published><updated>2020-06-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-06-24:/coding-2020-06-24</id><summary type="html">&lt;p class="first last"&gt;Thoughts are amorphous; they're much more reliable when given some kind of external form.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did some iteration on the sheet interface.
Slightly worryingly, it seems to have a lot of false negatives around typing, even when I think I'm being restrictive.
Regardless, I rearranged a bunch of stuff, and changed which types get foregrounded, and I think it's an improvement.
I'm going to need to try this out for real to see if any more tweaks are required; there are some bits that suggest to me that I might end up needing to do some complicated metaprogramming, but I'd rather do that later than sooner.&lt;/p&gt;
&lt;p&gt;I didn't have time tonight to work on the sheet editing actions, which I'm going to call &amp;quot;operations&amp;quot;.
I'll have to mock up usage of those ahead of time, because I feel like there are a bunch of possibilities for the interface and I can't figure out which would work best for my intended use case solely by thinking really hard.
I'll try to do some mockups tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2020-06-23</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-06-23" rel="alternate"></link><published>2020-06-23T04:00:00-04:00</published><updated>2020-06-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-06-23:/weekly-roundup-2020-06-23</id><summary type="html">&lt;p class="first last"&gt;Too tired to come up with anything unifying here.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I wrote a command-line interface to the Ironsworn helper re-implementation, using Click.&lt;/li&gt;
&lt;li&gt;Thursday: I did some tweaks to the core library, and thought about the Cement framework.&lt;/li&gt;
&lt;li&gt;Friday: I started porting my character sheet prototype.&lt;/li&gt;
&lt;li&gt;Saturday: I finished the port; did not finish tweaking the code.&lt;/li&gt;
&lt;li&gt;Sunday: I made some important tweaks to the code.&lt;/li&gt;
&lt;li&gt;Monday: I thought hard about &amp;quot;how character sheets will be used&amp;quot;, which gave me some inpiration for the interfaces I'll need.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'll either work more on the interfaces, or switch gears again.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2020-06-22</title><link href="https://mwchase.neocities.org/coding-2020-06-22" rel="alternate"></link><published>2020-06-22T04:00:00-04:00</published><updated>2020-06-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-06-22:/coding-2020-06-22</id><summary type="html">&lt;p class="first last"&gt;Writing out the code sample in this helped organize my thoughts immensely. I need to start using notebooks more.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I spent a bit of today looking over how the Ironsworn character sheet is used in the context of the game, because that informs decisions about how to represent it.
As an extreme example, if I decided no code was going to interact with the details, I could say that it should just be freeform text.
Since I don't really want to do it like that, I know there are tasks I'd like for the system to actually be able to accomplish with it.&lt;/p&gt;
&lt;p&gt;I tried out listing all of the various ways that the character sheet can change in Ironsworn, and I think I have that written up.
What I have to figure out next is how to represent this stuff in code.
I'm not exactly sure, but I'm leaning towards something like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Protocol&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;virtual_tabletop&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sheet&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;sheet_&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Transform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Protocol&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sheet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sheet_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sheet&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;sheet_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sheet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Whether this is represented as a protocol as above, or just as &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Callable[[Sheet],&lt;/span&gt; Sheet]&lt;/tt&gt; depends on whether I come up with other operations besides simply applying the transformation.
The types are somewhat lax compared to what the system should be capable of, because this way is slightly more expressive than the strict idea I had in mind, and slightly more ergonomic than the next strictest idea.&lt;/p&gt;
&lt;p&gt;I think what would make sense is to use the callable interface, define classes for handling specific operations paramaterized with arguments, and create a simple fluent interface on &lt;tt class="docutils literal"&gt;Sheet&lt;/tt&gt; to allow for calls like &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;sheet.apply(transform_1).apply(transform_2)&lt;/span&gt;&lt;/tt&gt;, or even possibly &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;sheet(transform_1)(transform_2)&lt;/span&gt;&lt;/tt&gt;.
(Or maybe indexing, or varargs. The precise details aren't relevant to the rest of the implementation, and finding a good choice means thinking more about how I want to use this.)&lt;/p&gt;
&lt;p&gt;Anyway, it's getting late and I'm getting tired.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-06-21</title><link href="https://mwchase.neocities.org/coding-2020-06-21" rel="alternate"></link><published>2020-06-21T04:00:00-04:00</published><updated>2020-06-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-06-21:/coding-2020-06-21</id><summary type="html">&lt;p class="first last"&gt;Several hours of trial and error could save you several minutes of reading the doumentation.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm going to have to come up with something for a change of pace, but for the moment...&lt;/p&gt;
&lt;p&gt;I've written tests and done some minor improvements and fixes to the character sheet code.
I'm probably missing a bunch of helper functions and methods, but I can't really figure out what they should be from first principles.
I'm going to have to try to code character sheets with this library.
I'll do that some tomorrow.&lt;/p&gt;
&lt;p&gt;For now, I'm very tired.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-06-20</title><link href="https://mwchase.neocities.org/coding-2020-06-20" rel="alternate"></link><published>2020-06-20T04:00:00-04:00</published><updated>2020-06-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-06-20:/coding-2020-06-20</id><summary type="html">&lt;p class="first last"&gt;Still haven't had the time to really go in-depth on this project lately.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Current status of prototype character sheet port:
All of the logic has been ported over, and given various minor improvements.
All of this code needs to be tested.
Some of this code needs to be heavily refactored in some way.&lt;/p&gt;
&lt;p&gt;I can't say much more because it's really late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-06-19</title><link href="https://mwchase.neocities.org/coding-2020-06-19" rel="alternate"></link><published>2020-06-19T04:00:00-04:00</published><updated>2020-06-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-06-19:/coding-2020-06-19</id><summary type="html">&lt;p class="first last"&gt;Status of this one type that I really want to fit into a type system: it still doesn't fit into any type system I know of.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I wasn't too focused on tabletop stuff today, so I ended up just now getting the very basics of the character sheet prototype ported over.
I'm going to need to plan stuff while fully awake to make more progress, so there's not much point in trying right now.&lt;/p&gt;
&lt;p&gt;I did just now try to do an obvious addition, and now mypy is yelling at me in ways that I understand, but don't want to.
So, I definitely should wrap this up now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-06-18</title><link href="https://mwchase.neocities.org/coding-2020-06-18" rel="alternate"></link><published>2020-06-18T04:00:00-04:00</published><updated>2020-06-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-06-18:/coding-2020-06-18</id><summary type="html">&lt;p class="first last"&gt;I'm not saying don't use Cement. I just haven't figured out what it does for me yet, if anything.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I gave the core logic a nicer implementation in concept, but I haven't yet figured out a nice way to express it in code.
I gave the command-line interface some minor tweaks as well.
I've got some vague ideas for how I might extend it to do stuff cooperatively with the dependency injection containers, but I'd need more frontends to have an idea of what &amp;quot;interacting frontends&amp;quot; would look like.&lt;/p&gt;
&lt;p&gt;Speaking of the CLI, when I think about using Click, I often think about a blog post that I've read and reread that advocates against its use.
I've tried to give the post the benefit of the doubt, and I'm looking into some of the libraries it recommends, like &lt;a class="reference external" href="https://builtoncement.com/"&gt;Cement&lt;/a&gt;.
The overarching problem I'm having in all of this is that while the sentiment in the post is undoubtedly heartfelt, none of it has connected with me in a way that I can look at a Click interface I put together and go &amp;quot;Yes, I understand why that's bad&amp;quot;.
I'm honestly looking at the Cement documentation from the perspective of &amp;quot;How can I use this to replicate the interfaces I built on Click and Fire, but using a framework that will give me plausible protection against judgment from a stranger&amp;quot;, which is just, so bad, on so many levels.&lt;/p&gt;
&lt;p&gt;Anyway, I'm trying to get through the Cement tutorial, but I'm just jumping on all kinds of stuff.
I'm going to make an effort to get through this stuff, because plenty of people clearly think it's useful, but right now the odds are kind of stacked against me caring.&lt;/p&gt;
&lt;p&gt;Anyway, I also thought more about my character sheet prototype, and realized that I basically set it up like my ECS concept from working on Dennis, so now I'm trying to figure out what capabilities I want.
Because I'm not really sure, the best course of action is probably to work on requirements from, say, Ironsworn and Retrocausality.
Although, thinking about it some, I've got an initial idea of how I want things to go.
I'm too tired to describe it.&lt;/p&gt;
&lt;p&gt;Actually, I've been getting to bed late recently, and that's bad, so I'd better work on that.
Now's a good time t work on it.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-06-17</title><link href="https://mwchase.neocities.org/coding-2020-06-17" rel="alternate"></link><published>2020-06-17T04:00:00-04:00</published><updated>2020-06-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-06-17:/coding-2020-06-17</id><summary type="html">&lt;p class="first last"&gt;I really tried to give some other libraries a fair shake.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I hooked up &lt;a class="reference external" href="https://click.palletsprojects.com/en/7.x/"&gt;Click&lt;/a&gt; to my new, streamlined Ironsworn implementation, and got it all working.
I think I understand Python better than the last time I used Click heavily, because I've got a lot less junk around testing.&lt;/p&gt;
&lt;p&gt;I was trying to give libraries besides Click a shot, and I actually tried a few, but the ease of setting up entry points, and not requiring custom annotations, won me over.
In the current implementation, there are somewhere between two and four lines of boilerplate, in my opinion, and that feels pretty good for a cli library.&lt;/p&gt;
&lt;p&gt;Now that I've got a consumer of some of this code set up, my next priority is trying to make some of the core logic a little nicer.&lt;/p&gt;
&lt;p&gt;After that, porting and updating prototypes, or setting up mutation testing. We'll see.&lt;/p&gt;
&lt;p&gt;For now, sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2020-06-16</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-06-16" rel="alternate"></link><published>2020-06-16T04:00:00-04:00</published><updated>2020-06-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-06-16:/weekly-roundup-2020-06-16</id><summary type="html">&lt;p class="first last"&gt;I would really like it if time could pass at a normal rate, please and thank you.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I talked about some of my concerns with my over-engineered card representation idea. The concerns at most tangentially related to the over-engineering.&lt;/li&gt;
&lt;li&gt;Thursday: I got the basic outline of the next version of that nailed down.&lt;/li&gt;
&lt;li&gt;Friday: I got the card stuff done enough for now, and made myself put it down.&lt;/li&gt;
&lt;li&gt;Saturday: For some reason, I wrote code for manipulating todo.txt data. Which I only ever edit manually.&lt;/li&gt;
&lt;li&gt;Sunday: I took my first pass at a &amp;quot;monorepo&amp;quot; kind of setup for the &amp;quot;virtual tabletop&amp;quot; project, to avoid having concrete implementations in the same package as the abstract helper code. I ran into trouble, and found a workaround.&lt;/li&gt;
&lt;li&gt;Monday: On further investigation, I found a workaroud that was closer to just &amp;quot;a good way to do things&amp;quot;, and got back to making progress on the actual project.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to go over my options for command-line parsing, and maybe look into making some of the output logic more theoretically efficient.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2020-06-15</title><link href="https://mwchase.neocities.org/coding-2020-06-15" rel="alternate"></link><published>2020-06-15T04:00:00-04:00</published><updated>2020-06-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-06-15:/coding-2020-06-15</id><summary type="html">&lt;p class="first last"&gt;Hard to believe I was getting by without this, like, two days ago.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Good work on the virtual tabletop today.
I finally figured out what the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--find-links&lt;/span&gt;&lt;/tt&gt; option to &lt;tt class="docutils literal"&gt;pip install&lt;/tt&gt; is for.
The answer is &amp;quot;what I've been using weird workarounds for for probably over a year now&amp;quot;.
So, my test runner setup is now much better.
I got extremely thorough unit test coverage on some system-specific code, so that's nice.
The code that's remaining to port is just wiring input and output around the logic I just thoroughly tested.&lt;/p&gt;
&lt;p&gt;My immediate priorities for this are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Figure out whether I want to keep using &lt;a class="reference external" href="https://github.com/google/python-fire"&gt;Fire&lt;/a&gt; or switch to another cli library&lt;/li&gt;
&lt;li&gt;Figure out how I want to hook up the internals of this to whatever I end up using&lt;/li&gt;
&lt;li&gt;Do it&lt;/li&gt;
&lt;li&gt;Make sure it all works&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After that, I want to see about either:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Porting some of the prototypes I've been working on into the core&lt;/li&gt;
&lt;li&gt;Setting up mutation testing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, none of that's happening now, because I'm sleepy.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-06-14</title><link href="https://mwchase.neocities.org/coding-2020-06-14" rel="alternate"></link><published>2020-06-14T04:00:00-04:00</published><updated>2020-06-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-06-14:/coding-2020-06-14</id><summary type="html">&lt;p class="first last"&gt;The commit with the workaround is just a bunch of incoherent swears.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, how'd the monorepo stuff work out for me?&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;... &lt;a class="reference external" href="https://github.com/takluyver/flit/issues/354"&gt;Great&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;In all seriousness, following some aesthetically bothersome workarounds, I've successfully installed a package with a local dependency using a generated constraints file.
So, the tech stack seems to work, aside from some code that I published months ago.
I'll put fixing that code into the pile of things to look into at some point.
Actually, I should write this stuff down...&lt;/p&gt;
&lt;p&gt;Okay, it's written down.&lt;/p&gt;
&lt;p&gt;So, the workflow for adding and developing packages in this setup is more-or-less stable, and now I just need to port more logic.&lt;/p&gt;
&lt;p&gt;I'm actually really drained from chasing down that issue, so I'm cutting things short once again.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-06-13</title><link href="https://mwchase.neocities.org/coding-2020-06-13" rel="alternate"></link><published>2020-06-13T04:00:00-04:00</published><updated>2020-06-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-06-13:/coding-2020-06-13</id><summary type="html">&lt;p class="first last"&gt;I wouldn't mind working on random stuff if I had a plan for it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;More distractedness today.
This time, I tried writing a library for manipulating &lt;a class="reference external" href="http://todotxt.org/"&gt;todo.txt&lt;/a&gt; files.
I got the basics into what should be a working state, but I think I should step away from it for now, because I'm frankly not sure what I would do with it.
I don't really have any use cases yet that aren't handled by my text editor.&lt;/p&gt;
&lt;p&gt;I want to get back to auto-roller stuff, and my tentative plan there is to structure it as a monorepo until I can stabilize the core logic, then start splitting stuff out.
I'm not sure if that'll work like I think, but I'll see what I can do, experiment if I need to.&lt;/p&gt;
&lt;p&gt;(Also, at some point I need to update my Ink port again.)&lt;/p&gt;
&lt;p&gt;Anyway, it's too late and I should stop getting distracted.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-06-12</title><link href="https://mwchase.neocities.org/coding-2020-06-12" rel="alternate"></link><published>2020-06-12T04:00:00-04:00</published><updated>2020-06-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-06-12:/coding-2020-06-12</id><summary type="html">&lt;p class="first last"&gt;It feels so off to be telling myself &amp;quot;no, no, this is good enough for now&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't touch the code much today, but I did bash together the stuff I actually needed the card code for to start with: a function to generate a standard deck with a specified number of jokers.
The data structures for the code are rather nice at a conceptual level, I think, but manipulating them directly is quite awkward.&lt;/p&gt;
&lt;p&gt;My plan for now is to deliberately put this prototype aside, and mess with the other prototype next.&lt;/p&gt;
&lt;p&gt;This post was delayed by the decision to download &lt;em&gt;a lot&lt;/em&gt; of titles from DriveThruRPG; I'm going to focus on that completely for now and try to wrap that up soon.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-06-11</title><link href="https://mwchase.neocities.org/coding-2020-06-11" rel="alternate"></link><published>2020-06-11T04:00:00-04:00</published><updated>2020-06-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-06-11:/coding-2020-06-11</id><summary type="html">&lt;p class="first last"&gt;I wonder if there are type checkers for Python with more extensive dependent types support.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't do too much coding tonight, but I did finish up the draft of the baseline for the second card prototype.
Everything beyond this should be a matter of specification and data entry.
This assumes that I got the implementation totally correct, which probably isn't true, though I'm confident it is at least mostly correct, by some measure.&lt;/p&gt;
&lt;p&gt;I did think a little about attempting weird type-level logic, but it frankly doesn't seem worth it right now.&lt;/p&gt;
&lt;p&gt;Once again, I want to wrap things up quick.
I managed to mess my back up by sitting upright for a while, so to deal with that, I need to lie down and get off my laptop.
So, that's that for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-06-10</title><link href="https://mwchase.neocities.org/coding-2020-06-10" rel="alternate"></link><published>2020-06-10T04:00:00-04:00</published><updated>2020-06-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-06-10:/coding-2020-06-10</id><summary type="html">&lt;p class="first last"&gt;Still a little sad that I can't use ludicrous type hacks. I might try to come up with something.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I started implementing my ideas about a new take on modeling cards, and after I got a bunch of stuff roughed out, I decided that I needed to do more planning with this sometime when I'm better-rested.&lt;/p&gt;
&lt;p&gt;The problem (2 problems? 1.5 problems?) I have to address has to do with which cards appear where in runtime &amp;quot;deck&amp;quot; structures.
One example is that &amp;quot;duplicate&amp;quot; cards should appear as close to the card they're duplicating as possible.
I'm kind of leaning towards, the two basic kinds of decks are single named cards, and full products of rank and suit, and other decks are made up of combinations of those, and &amp;quot;duplicate&amp;quot; decks around basic decks, and rank and suit are each similar, but without the &amp;quot;rank-suit product&amp;quot; because that only makes sense for full cards.&lt;/p&gt;
&lt;p&gt;I think I understand this now well enough to implement it, but I don't want to push my luck.
I'm really tired now, so it's time to wrap things up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2020-06-09</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-06-09" rel="alternate"></link><published>2020-06-09T04:00:00-04:00</published><updated>2020-06-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-06-09:/weekly-roundup-2020-06-09</id><summary type="html">&lt;p class="first last"&gt;I feel like it's rare for me to come out of a ridiculous metaprogramming exercise going &amp;quot;You shouldn't use this because it doesn't meet the requirements.&amp;quot; rather than &amp;quot;You shouldn't use this because it's unsettling.&amp;quot; Maybe I'm not pushing my code far enough.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I decided to mess with my auto-roller.&lt;/li&gt;
&lt;li&gt;Thursday: I threw a bunch of shade at the linter I was trying out on the project, and removed it. I specced some other stuff out.&lt;/li&gt;
&lt;li&gt;Friday: I threw together a character sheet prototype. It's... very prototype-quality.&lt;/li&gt;
&lt;li&gt;Saturday: I blogged about feeling kind of gross, from over-exertion and probably pollen.&lt;/li&gt;
&lt;li&gt;Sunday: I got back into things, now focusing on emulating cards. I came up with a really complicated system that seemed to work.&lt;/li&gt;
&lt;li&gt;Monday: The really complicated system did not work. It's going to need a rework to satisfy the basic requirements.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to redo the card handling, given what I learned from my first attempts.
(I &lt;em&gt;might&lt;/em&gt; be able to pull off some horrible melding of the current system and its planned replacement, but I should make sure the replacement works on its own first before considering stuff like that.)
I also hope to feel less sick.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2020-06-08</title><link href="https://mwchase.neocities.org/coding-2020-06-08" rel="alternate"></link><published>2020-06-08T04:00:00-04:00</published><updated>2020-06-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-06-08:/coding-2020-06-08</id><summary type="html">&lt;p class="first last"&gt;A learning experience.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today, I mostly tried to rough out specifications for different kinds of decks.
This eventually got me inspired to try some improvements to my representation.
Those seem to work, but while testing them, I discovered that my &amp;quot;creative&amp;quot; use of the type system didn't quite work, and I'll have to rework some of it to get consistent and desirable behavior.&lt;/p&gt;
&lt;p&gt;Thinking about this a bit more, I'll probably have to drop the &amp;quot;type&amp;quot; concept altogether and focus on making the mechanisms for generating instances explicit.&lt;/p&gt;
&lt;p&gt;I've got some ideas here that I think are good, but I spent all day fighting off kind of illness, and right now I don't have what it takes to keep up with trying this or writing any more about it.&lt;/p&gt;
&lt;p&gt;I have to wrap up now because I feel tired and gross.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-06-07</title><link href="https://mwchase.neocities.org/coding-2020-06-07" rel="alternate"></link><published>2020-06-07T04:00:00-04:00</published><updated>2020-06-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-06-07:/coding-2020-06-07</id><summary type="html">&lt;p class="first last"&gt;Good turnaround from &amp;quot;How can I possibly do this?&amp;quot; to &amp;quot;I can do this.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today, I learned about how decks of playing cards can have all kinds of confusing stuff going on when they're not the &amp;quot;standard&amp;quot; deck.
I vaguely knew about this from playing Zachtronics games, but it seems like what I've seen there so far is just scratching the surface.&lt;/p&gt;
&lt;p&gt;In any case, I spent the day iterating on representing playing cards in a way that works more like an ordered set than the options that were more obvious to me.
Those options would have introduced many run-time distinctions that I would consider basically meaningless.
The implementation is, at a type level, extremely cursed, but it resolves down to really simple data at runtime.&lt;/p&gt;
&lt;p&gt;The practical benefit of this is that I can extract an ordering of cards from the type that describes them, but the actual instances are also instances of a type with the same cards in a different order.
I haven't checked, but I assume these rearrangements are indistinguishable from a static analysis perspective.
The really nice thing is that it's still the same cards if I have a deck that drops some, or if I add the same cards to two different decks.&lt;/p&gt;
&lt;p&gt;So, the initial prototyping went well, and what I want to focus on now is writing up a specification for every deck I try to model, because some of the prototypes came out a little wrong, now that I understand my system better.&lt;/p&gt;
&lt;p&gt;I'll wrap up for now and work on documenting stuff tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Diary 2020-06-06</title><link href="https://mwchase.neocities.org/diary-2020-06-06" rel="alternate"></link><published>2020-06-06T04:00:00-04:00</published><updated>2020-06-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-06-06:/diary-2020-06-06</id><summary type="html">&lt;p class="first last"&gt;Feeling excessively aware of my sinuses&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Not a coding entry today, because I was super out of it after going all in on work yesterday.
I did poke at the character sheet prototype a little, but not enough to merit talking about it.&lt;/p&gt;
&lt;p&gt;My plan once I get back into the swing of things is to work on prototypes for some of the other content I want for the roller code, and then start figuring out desired features of all of this stuff by figuring out what's needed to adapt various character sheets and card or dice games.
Hm, thinking about it, I should also figure out what &amp;quot;counters&amp;quot; would look like.
Just a bunch of natural number fields, or something more...&lt;/p&gt;
&lt;p&gt;Anyway, the air is awful right now, and my response to that at night is to go to sleep so I don't have to deal with it.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2020-06-05</title><link href="https://mwchase.neocities.org/coding-2020-06-05" rel="alternate"></link><published>2020-06-05T04:00:00-04:00</published><updated>2020-06-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-06-05:/coding-2020-06-05</id><summary type="html">&lt;p class="first last"&gt;Maybe I should try outlining my posts sometime.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today I was kind of pressed for time and energy because I ended up working late.
Still not entirely done with what I wanted, but it's way too late at night for me to do work worth money to other people.&lt;/p&gt;
&lt;p&gt;Speaking of which, I've got most of a prototype of the character sheet concept put together.
It's currently missing key functionality in the actual sheet part, but that shouldn't be too bad to fill in over the weekend.
Previous experience tells me there are probably some howlingly bad bugs in here just because I put it together over the course of an hour or so, late at night, with no tests.
Although, to get it as far as I did, I have to credit writing, once again.
Type stuff out, organize thoughts, then treat what's there as a checklist.
While I'm implementing something, does my painfully sleepy brain need to be able to correlate it to the whole design?
Nope!&lt;/p&gt;
&lt;p&gt;Anyway, I have no more focus left and do not know how to end this or connect any loose ends in my paragraphs together.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-06-04</title><link href="https://mwchase.neocities.org/coding-2020-06-04" rel="alternate"></link><published>2020-06-04T04:00:00-04:00</published><updated>2020-06-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-06-04:/coding-2020-06-04</id><summary type="html">&lt;p class="first last"&gt;Just writing stuff down can clarify things immensely.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I feel like I've tried super hard to work with wemake-python-styleguide, even going so far as to have indirectly contributed &lt;a class="reference external" href="https://github.com/wemake-services/wemake-python-styleguide/blob/75ea8907d5b2f9a93995852bb3f492b4a125b342/wemake_python_styleguide/logic/complexity/annotations.py#L41"&gt;one (1) line of code&lt;/a&gt;.
But it's just the same kind of thing over and over: confident general statement that overreaches or &lt;a class="reference external" href="https://www.python.org/dev/peps/pep-0570/"&gt;is just wrong&lt;/a&gt;, followed by an eventual course correction, maybe.
I'm kind of anticipating more of those, but I'm not certain.&lt;/p&gt;
&lt;p&gt;Anyway, that's sort of why I decided the most obvious improvement I could make to my dice roller code was to stop using &amp;quot;the strictest linter&amp;quot; on it.
I then rewrote a bunch of lines, and it's &lt;em&gt;possible&lt;/em&gt; I overcorrected, but I'm going to have to wait and use my judgment to make that decision later.&lt;/p&gt;
&lt;p&gt;With all that taken care of, I started writing down what I want out of some of my desired features, such as emulating cards instead of dice.
This helped because, before I articulated my wants, I was thinking about this stuff in a manner that was too informal to really pin down anything related to tradeoffs or alternatives.
Now that I've spent a short amount of time reasoning through things, I know what the first thing I want to try is.
Which I will be trying, not today, because I'm tired.&lt;/p&gt;
&lt;p&gt;I also put together kind of a complicated specification for how I think character sheets should work.
If I manage any sort of implementation of character sheets, it'll be a pretty big expansion in possible functionality, so that's definitely exciting.&lt;/p&gt;
&lt;p&gt;Not exciting enough to keep me up much longer, though.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-06-03</title><link href="https://mwchase.neocities.org/coding-2020-06-03" rel="alternate"></link><published>2020-06-03T04:00:00-04:00</published><updated>2020-06-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-06-03:/coding-2020-06-03</id><summary type="html">&lt;p class="first last"&gt;Oh boy, I'm going to need a local package repository if I go through with this idea...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't get much time with my code tonight, so I'm just going to go over some of my plans for one project.&lt;/p&gt;
&lt;p&gt;I believe I've mentioned working on a basic dice-rolling app for some roleplaying games.
If not, I've worked on a basic dice-rolling app for some roleplaying games.
Right now, the package has all of the generic stuff in modules under the root, and things for specific games in a subpackage.
The most concrete change I want to make is to make the per-game implementations independently installable.&lt;/p&gt;
&lt;p&gt;I've got various other things I want to try, but I don't have a strong sense of what to go for first, so I think what I should do is figure out where the current implementation falls short, and work on improving that area, whatever it is.&lt;/p&gt;
&lt;p&gt;And, I don't have enough consciousness left for tonight to ponder this in any more detail, so I guess I'm done.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2020-06-02</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-06-02" rel="alternate"></link><published>2020-06-02T04:00:00-04:00</published><updated>2020-06-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-06-02:/weekly-roundup-2020-06-02</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;The first 90 percent of the code accounts for the first 90 percent of the development time. The remaining 10 percent of the code accounts for the other 90 percent of the development time.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;It was all coding this week.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I got a little further on the port.&lt;/li&gt;
&lt;li&gt;Thursday: I finished the port of the tests as of a few months ago, then pulled, and ported the new test added since.&lt;/li&gt;
&lt;li&gt;Friday: I got those new tests to pass. Then, I fixed a random deficiency that the port has had for a while.&lt;/li&gt;
&lt;li&gt;Saturday: I started working on a stripped-down CLI for the port.&lt;/li&gt;
&lt;li&gt;Sunday: I got play mode working in the CLI.&lt;/li&gt;
&lt;li&gt;Monday: I wired the CLI into ink-proof. Unfortunately, even once I got the vagaries of command-line output dealt with (inklecate emits mystery newlines), I didn't really get anything new out of ink-proof. I should probably contribute some tests to it once I feel up to diving back into my code.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to change gears at least a little, and take another break from the port.
Maybe get back to other coding projects, maybe switch things up a bit more.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2020-06-01</title><link href="https://mwchase.neocities.org/coding-2020-06-01" rel="alternate"></link><published>2020-06-01T04:00:00-04:00</published><updated>2020-06-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-06-01:/coding-2020-06-01</id><summary type="html">&lt;p class="first last"&gt;I'm going to have to learn to debug with Mono before I can hope to resolve these test failures.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I got my CLI hacked into ink-proof, and the results were... only sort of interesting.
There were some failures, but I don't think any of them were due to the shortcomings I know my code has, but rather as a result of a difference in behavior between my CLI and inklecate that seems like an edge case to me.
In particular, when I look at the sources, I can't see why inklecate acts the way it does.&lt;/p&gt;
&lt;p&gt;I'll figure that out, and work on improving the coverage, later, but for now, I think I need a break.
I'll think some about what to work on instead.
So far, I have a reasonable idea, and a probably bad idea.
I'll take some time over the next day to see if I come up with any others.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-05-31</title><link href="https://mwchase.neocities.org/coding-2020-05-31" rel="alternate"></link><published>2020-05-31T04:00:00-04:00</published><updated>2020-05-31T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-05-31:/coding-2020-05-31</id><summary type="html">&lt;p class="first last"&gt;They have overlapping functionality, but I &lt;em&gt;think&lt;/em&gt; they both have some unique features.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't do conlanging or anything else today because I was focused on relaxing, and tinkring with the Ink port is relaxing when I'm not staring at inexplicable stack traces.&lt;/p&gt;
&lt;p&gt;Ink CLI status: I skipped implementing a bunch of it, but it looks like the very basics work.
I finally pulled in some external dependencies: &lt;a class="reference external" href="https://pypi.org/project/blessings/"&gt;blessings&lt;/a&gt; for tty-aware ANSI escape codes, and &lt;a class="reference external" href="https://pypi.org/project/colorama/"&gt;colorama&lt;/a&gt; to make ANSI escape codes work with Windows.
(I haven't tested that that all works on Windows.)&lt;/p&gt;
&lt;p&gt;Tomorrow, I'm probably going to try to hack my port into ink-proof, and see what's missing from the implementation according to it.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-05-30</title><link href="https://mwchase.neocities.org/coding-2020-05-30" rel="alternate"></link><published>2020-05-30T04:00:00-04:00</published><updated>2020-05-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-05-30:/coding-2020-05-30</id><summary type="html">&lt;p class="first last"&gt;Blurring the line between self-isolation and just really not wanting to be out in that weather.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Ink CLI status: I've got a command-line interface sketched out, with much of it put behind a conditional because I haven't written a compiler.
Hopefully, the actual meat of it shouldn't be too much more code, since the code responsible is pretty short in the C# version.&lt;/p&gt;
&lt;p&gt;Sorry I'm not up for writing more, but the weather still just, like, really sucks.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-05-29</title><link href="https://mwchase.neocities.org/coding-2020-05-29" rel="alternate"></link><published>2020-05-29T04:00:00-04:00</published><updated>2020-05-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-05-29:/coding-2020-05-29</id><summary type="html">&lt;p class="first last"&gt;There are some tests I wrote before I worked out the Ink VM that don't, like, make sense. I should get rid of them, probably.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, it took some fields that I'm not really sure if that's how I want it to actually work, but my port of Ink has reached test parity with the current GitHub master.&lt;/p&gt;
&lt;p&gt;I think next I want to write a CLI around this to mimic inklecate's play mode, and use that to create and manually verify test cases around all of the missing implementation stuff.
Also, I never did implement the initial random seed correctly, so I ought to get that right.
I'll see if that's something I can just knock out now.&lt;/p&gt;
&lt;p&gt;Yep, it was relatively straightforward to get feature parity there.&lt;/p&gt;
&lt;p&gt;It is oppressively humid in here, so I'm just going to wrap things up as quickly as I can again.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-05-28</title><link href="https://mwchase.neocities.org/coding-2020-05-28" rel="alternate"></link><published>2020-05-28T04:00:00-04:00</published><updated>2020-05-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-05-28:/coding-2020-05-28</id><summary type="html">&lt;p class="first last"&gt;This space unintentially left blank.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got through the Ink tests as of when I'd last pulled.
Then I updated, and got one additional test, which I opted to split into two tests.
Getting them to work promises to be a doozy.
I'm going to either need to rewrite a bunch of function signatures in an obnoxious way, or add extra fields to the StoryState object.
I'm leaning towards fields on the StoryState, but I've decided to sleep on this.
Given the rate of changes to Ink right now, I don't think I'm in a hurry.&lt;/p&gt;
&lt;p&gt;As far as completeness of implementation, there are still around twenty stubbed-out branches in my code; hopefully getting set up with ink-proof will shake some of that out.&lt;/p&gt;
&lt;p&gt;I've got to wrap up for now, I'm exhausted.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-05-27</title><link href="https://mwchase.neocities.org/coding-2020-05-27" rel="alternate"></link><published>2020-05-27T04:00:00-04:00</published><updated>2020-05-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-05-27:/coding-2020-05-27</id><summary type="html">&lt;p class="first last"&gt;Once I start refactoring in earnest, I'm probably going to try to convert the conditionals that work on commands into a bunch of separate functions, because that's just a huge if-else block right now.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I went through a few more tests in the Ink port.
I think it's nearly done, just a few more to go.&lt;/p&gt;
&lt;p&gt;Not much to say in detail.
It's gotten to the point where sometimes tests just find weird bugs.
Also, I found some behavior in mypy that sure seems like a bug; I'll have to look into that.&lt;/p&gt;
&lt;p&gt;I'm working on another kind of abstract coding project, so that's some kind-of questionable judgment on my part, but I'm hoping to just learn stuff from it.&lt;/p&gt;
&lt;p&gt;Anyway, nothing more to be done right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2020-05-26</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-05-26" rel="alternate"></link><published>2020-05-26T04:00:00-04:00</published><updated>2020-05-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-05-26:/weekly-roundup-2020-05-26</id><summary type="html">&lt;p class="first last"&gt;Attacked by trees and the sun. I think I've figured out where Captain Planet villains come from.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I complained about the part of the Ink port I'm currently working on.&lt;/li&gt;
&lt;li&gt;Thursday: I noticed some problems with how I was handling basic setup stuff in Ink, fixed those, and then ran into some bad organizational issues that I haven't fixed, just worked around.&lt;/li&gt;
&lt;li&gt;Friday: I had the deserialization code almost wrapped up. (A subset of it, at least.)&lt;/li&gt;
&lt;li&gt;Saturday: I shrank the test code by a bunch, which was nice. Then nature itself started attacking me.&lt;/li&gt;
&lt;li&gt;Sunday: I thought over my progress reading the linguistics paper that I'm currently reading.&lt;/li&gt;
&lt;li&gt;Monday: I was feeling too out of it, so I just did a diary about how out-of-it I was feeling.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to get through some more of the tests in the Ink codebase, and maybe look into &lt;a class="reference external" href="https://github.com/chromy/ink-proof"&gt;ink-proof&lt;/a&gt;.
I've also got some other code projects I might look into.
Also also, I want to see about getting into creative stuff outside of coding again.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Diary 2020-05-25</title><link href="https://mwchase.neocities.org/diary-2020-05-25" rel="alternate"></link><published>2020-05-25T04:00:00-04:00</published><updated>2020-05-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-05-25:/diary-2020-05-25</id><summary type="html">&lt;p class="first last"&gt;I have been viciously attacked by the sun. (… I should keep a list of these somewhere.)&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Just a diary entry for today, because I was zonked out and just did some light reading, pretty much.&lt;/p&gt;
&lt;p&gt;I think how I'm feeling is that I've gotten kind of out into the weeds with various projects.
The Ink port is just a few dozen tests away from parity according to the tests, but that's not feature parity, because I'm sure the tests have gaps.
Conlanging is mostly waiting for feature grammar code, which is somewhat waiting on me reading the other half of the paper I've found, as well as possibly chasing a few references that sounded significant.
I've got grid-based game stuff I want to mess with, but getting that working means either learning an engine, or porting Dennis from Coconut to Python, which… hm.
I had to use a bunch of type ignore comments anyway, so maybe it'd be worth trying that in a branch.&lt;/p&gt;
&lt;p&gt;Anyway, I'm also going to try to come up with a project that's fewer layers of abstraction away from mattering to other people.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Conlanging 2020-05-24</title><link href="https://mwchase.neocities.org/conlanging-2020-05-24" rel="alternate"></link><published>2020-05-24T04:00:00-04:00</published><updated>2020-05-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-05-24:/conlanging-2020-05-24</id><summary type="html">&lt;p class="first last"&gt;When this paper makes any sense to me, it makes a lot of sense to me.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't focus too much on conlanging today, but I did take some of what I've read about feature geometry and turn it into specific statements for the behind-the-scenes stuff.
If this all works out when I get to coding it, then I think it'll be much easier for me.
And if it doesn't, I'll still have a more principled idea of how to create rewrite rules.&lt;/p&gt;
&lt;p&gt;It's getting late now, so I should wrap up even though I didn't have much to say.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Coding 2020-05-23</title><link href="https://mwchase.neocities.org/coding-2020-05-23" rel="alternate"></link><published>2020-05-23T04:00:00-04:00</published><updated>2020-05-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-05-23:/coding-2020-05-23</id><summary type="html">&lt;p class="first last"&gt;I'm starting to get a little skeptical about the level of coverage I'll get after all of the tests I'm going for are ported.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today in the Ink port, I wrote a tiny helper function and rewrote a bunch of tests to use it.
Then I wrote a few more tests.
I'm feeling good about working on this stuff again, but I can't do any more right this moment because the late spring (wow what) weather is keeping me down.
The pollen out there has done something to my sinuses, and the heat is making it feel like I'm melting.
Once again, reality has fallen short of an idealized environment, as is its wont.&lt;/p&gt;
&lt;p&gt;I cannot accomplish anything else right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-05-22</title><link href="https://mwchase.neocities.org/coding-2020-05-22" rel="alternate"></link><published>2020-05-22T04:00:00-04:00</published><updated>2020-05-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-05-22:/coding-2020-05-22</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;In Spite of Some Glaring Omissions&amp;quot; is another good name.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got a little further with the port.
Looking at what I encode, it's just a little further before most of the deserialization code falls into place.&lt;/p&gt;
&lt;p&gt;It occurs to me that there hasn't really been much going on in these coding posts.
I should figure out something I can do with screenshots or video when this is more fully-featured.&lt;/p&gt;
&lt;p&gt;Anyway, I talked up how close I was to done, enough that I decided to get it over with, and now, in spite of some glaring omissions in the code, the test passes.
Let's see what's in line for tomorrow...&lt;/p&gt;
&lt;p&gt;Hm, looking at these tests, I don't have a sense for what'll fail.
I think tomorrow might be a good time to work on reducing test boilerplate.
Then, try out an idea I had to just port over all of the rest of the tests now, and mark them xfail so I can selectively enable them and avoid switching between the test files in the two projects.&lt;/p&gt;
&lt;p&gt;Anyway, I'm super tired, so I guess I'm done for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-05-21</title><link href="https://mwchase.neocities.org/coding-2020-05-21" rel="alternate"></link><published>2020-05-21T04:00:00-04:00</published><updated>2020-05-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-05-21:/coding-2020-05-21</id><summary type="html">&lt;p class="first last"&gt;I'm confident this code can be made better. I'm just not totally sure what and how much that will require.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;My port of the serialization code is growing somewhat more cursed.
I think I see a way to rescue some of it, but it'll need some test rewrites to reduce boilerplate first.&lt;/p&gt;
&lt;p&gt;The basic issue I have to address is that a bunch of the StoryState deserialization in the C# version strongly expects the StoryState to already exist.
This really isn't intuitive to me, but I can deal with it.
The only logical value for the StoryState to start with is the initial value that can be generated by going through the &lt;tt class="docutils literal"&gt;global decl&lt;/tt&gt; container.
Currently, this is generated from a top-level function in the package root, but I can switch it to a class method easily enough.&lt;/p&gt;
&lt;p&gt;In fact, I'll take care of some of that now.
And when I did, I removed some imports and that made it fail with a circular import error.
&lt;em&gt;Somewhat&lt;/em&gt;.
&lt;em&gt;Cursed&lt;/em&gt;.
(Am I going to need to write a distinct test run for importing each module at the top level of the test script?
Because the fact that importing modules in the wong order can mess things up this bad is... bad.)&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to go lie down and try not to think about that too hard.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-05-20</title><link href="https://mwchase.neocities.org/coding-2020-05-20" rel="alternate"></link><published>2020-05-20T04:00:00-04:00</published><updated>2020-05-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-05-20:/coding-2020-05-20</id><summary type="html">&lt;p class="first last"&gt;Writing like five lines or whatever, but they're really mentally taxing lines.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Did some more reading on phonology today, and I can see now that the stuff I'm reading will have me in for the long haul.
Just casually dropping the fact that some of the stuff it shows off in figure 11 will be elaborated on in &lt;em&gt;figure 123&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Anyway, I got back to working on the Ink port.
It was nice to come back to it after the break.
Although, I'm currently in the guts of the serialization code.
It's giving me wistful flashbacks to the serialization code in Dennis, which was much easier to write, and worked with, I think, more complicated data.
(This is because, rather than using the standard library to work at a level just slightly higher than the C# version, I was using the &lt;a class="reference external" href="https://camel.readthedocs.io/en/latest/"&gt;camel&lt;/a&gt; library, which is, regrettably for me in this exact context, not a drop-in replacement for stdlib json, and I don't know if C# has an equivalent.)&lt;/p&gt;
&lt;p&gt;I'm probably going to be in slow-and-steady mode a bit on everything, since I'm like a sixth of the way through the article I'm looking at now, and the serialization code is... kind of a slog, if I'm being honest.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2020-05-19</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-05-19" rel="alternate"></link><published>2020-05-19T04:00:00-04:00</published><updated>2020-05-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-05-19:/weekly-roundup-2020-05-19</id><summary type="html">&lt;p class="first last"&gt;I was listening to Takamachi Walk's Permanence while writing this. It helped.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I got my rewrite of SCA² working. It needed some usability improvements.&lt;/li&gt;
&lt;li&gt;Thursday: I made some usability improvements, and started messing with the idea of trying out a different design and having this as a fallback.&lt;/li&gt;
&lt;li&gt;Friday: I thought I'd researched enough to get a prototype for the new system out in a few days.&lt;/li&gt;
&lt;li&gt;Saturday: I was wrong.&lt;/li&gt;
&lt;li&gt;Sunday: I pulled some of my old notes into the new repository, and thought more about the design of the feature geometry stuff. (I'm updating the link when this post goes live.)&lt;/li&gt;
&lt;li&gt;Monday: I took things easy, and figured out what's next for conlang development.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(Today, I got fucked up because I saw what some&lt;/p&gt;
&lt;p&gt;…&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;person&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;…&lt;/p&gt;
&lt;p&gt;decided to put on their Twitter timeline.&lt;/p&gt;
&lt;p&gt;This isn't some kind of ironic &amp;quot;hahah, this is terrible&amp;quot; thing.
Somebody working content moderation is going to have to look at it at some point, and if they're lucky (but not by much), they won't yet be numb to the horror.)&lt;/p&gt;
&lt;p&gt;Next week, I'm going to try to get back into the Ink port.
And to feel better.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Conlanging 2020-05-18</title><link href="https://mwchase.neocities.org/conlanging-2020-05-18" rel="alternate"></link><published>2020-05-18T04:00:00-04:00</published><updated>2020-05-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-05-18:/conlanging-2020-05-18</id><summary type="html">&lt;p class="first last"&gt;Have to remember not to overthink things…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I mostly read stuff today, but I did a little more work conlanging.
I realized that, although I don't yet have a better option for glosses than the tabular approach I'm taking (which has some issues to iron out), for tracking changes in syntax, representing each version of a sentence as a list item should be sufficient.&lt;/p&gt;
&lt;p&gt;I came up with a few simple sentences to try to track over the course of the language's fictional history.&lt;/p&gt;
&lt;p&gt;I don't have much more to say.
I guess I'm a little burnt out again, which is hardly surprising.
So, I should wrap things up for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Conlanging 2020-05-17</title><link href="https://mwchase.neocities.org/conlanging-2020-05-17" rel="alternate"></link><published>2020-05-17T04:00:00-04:00</published><updated>2020-05-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-05-17:/conlanging-2020-05-17</id><summary type="html">&lt;p class="first last"&gt;Slow but steady(?)&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today I mostly focused on reading more about phonology.
I did take some time to migrate some of my old notes into the new repository.
My basic plan is to sketch out grammatical details and work my way from there, combined with a mixture of plausible loanwords and generated ancient roots.&lt;/p&gt;
&lt;p&gt;From my reading-up, I'm getting the impression that I can use the models I'm reading about to create a more fully-featured model of syllable structure than &amp;quot;whatever's there after the sound change rules are done&amp;quot;.
My dream here is to have a system that can encode information about the world, as well as language-specific constraints.
This encoding would be &lt;a class="reference external" href="https://www.hillelwayne.com/post/constructive/"&gt;predicative rather than constructive&lt;/a&gt;, both because I think that would be easier to tinker with, and because much of linguistics is concerned with reasoning about the acceptableness of possible sequences, or sometimes their &lt;em&gt;marginal&lt;/em&gt; acceptableness.
I want to make tinkering easy because I hope it's possible to make something that works both on human speech, and, say, on bird-like vocal systems, which it seems to me would have to have a different feature tree because they're not shaped the same.&lt;/p&gt;
&lt;p&gt;Anyway, to make progress conlanging, I'm going to need to study historical linguistics more broadly, especially the notation.
I've got ideas about changes in syntax over time, but I don't know how to represent those changes.
I tried to track down some sources there immediately after typing that, but no dice.
I should wrap up for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Coding 2020-05-16</title><link href="https://mwchase.neocities.org/coding-2020-05-16" rel="alternate"></link><published>2020-05-16T04:00:00-04:00</published><updated>2020-05-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-05-16:/coding-2020-05-16</id><summary type="html">&lt;p class="first last"&gt;Turns out this stuff is hard. Who knew? (The answer is every linguist.)&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've read even more about the concepts around distinctive features in linguistics, and my conclusion so far is...
That I need to read &lt;em&gt;even more&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I think I'm close to having a workable design based on the ideas I'm reading about, but I'm itching to code &lt;em&gt;something&lt;/em&gt;, so next week I'm going to switch back to actively developing my Ink port, and reading papers so I can do design work on this stuff.&lt;/p&gt;
&lt;p&gt;I wanted to say more, but I guess I'm tired, the weather is gross, and I didn't do much today that fits well in a post.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-05-15</title><link href="https://mwchase.neocities.org/coding-2020-05-15" rel="alternate"></link><published>2020-05-15T04:00:00-04:00</published><updated>2020-05-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-05-15:/coding-2020-05-15</id><summary type="html">&lt;p class="first last"&gt;I've got a plan. We'll see how it works out.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I spent some time today trying to synthesize the various things I've read about representing linguistic features into something that makes sense to me.&lt;/p&gt;
&lt;p&gt;What I'm going for right now—tentatively—is to try to do something with feature geometry.
I just found out about it... it must be less than an hour ago, as I write this, but it seems interesting, and accords with some of my previous attempts to understand how features are reasoned about.&lt;/p&gt;
&lt;p&gt;Per Wikipedia:&lt;/p&gt;
&lt;blockquote&gt;
In 2008 Jeff Mielke argued that feature geometry merely recapitulated physiological organization, and that since the influence of articulation on sound change will independently create patterns in the behavior of features, feature geometry recapitulates diachrony and is redundant as a theory of the mental organisation of phonology.&lt;/blockquote&gt;
&lt;p&gt;This criticism doesn't seem to speak against using feature geometry for my purposes, because I'm not interested in specifically modeling mental processing; rather, I'm interested in the observable changes in phoneme usage in particular contexts over time.&lt;/p&gt;
&lt;p&gt;Unlike some other areas of this project, where I can look at a theoretical concept and work out &amp;quot;Well, obviously this should work for my purposes, and if I make these concessions here, it'll simplify the overall implementation&amp;quot;, I am not qualified to weigh in on the debates that appear to exist on these matters.
The best I can do is to go through a few rounds of prototyping and see if anything is obviously and foundationally wrong with the idea.&lt;/p&gt;
&lt;p&gt;I'll get on the prototyping tomorrow, but I'm going to try to take things easy for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-05-14</title><link href="https://mwchase.neocities.org/coding-2020-05-14" rel="alternate"></link><published>2020-05-14T04:00:00-04:00</published><updated>2020-05-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-05-14:/coding-2020-05-14</id><summary type="html">&lt;p class="first last"&gt;Trying to be a humble STEM major.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I came up with a more concise interface for creating phonological rules in my sound change rewrite, so now it only takes up 20 lines, which is fine.&lt;/p&gt;
&lt;p&gt;My next concern is that the current design operates on specific named phonemes, and explicit collections of them.
I'd like to overhaul it to work with distinctive features, which would simplify some of the rule definitions.
First, though, I need to figure out which theories of distinctive features I want to support, and how to do so.
This is a question of specification, and I can't fall back on replicating behavior or porting tests this time.&lt;/p&gt;
&lt;p&gt;Here's what I've got from a cursory inspection of Wikipedia and its sources:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Maybe &amp;quot;distinctive features&amp;quot; aren't universals&lt;/li&gt;
&lt;li&gt;Maybe the distinctive features for vowels aren't what most linguists think. Then again, maybe they are. Maybe it varies by language.&lt;/li&gt;
&lt;li&gt;Historically, distinctive features were thought of as having two values which can both be explicitly reasoned about&lt;/li&gt;
&lt;li&gt;More recently, the idea of features whose absence cannot be explicitly reasoned about gained traction&lt;/li&gt;
&lt;li&gt;Some frameworks use both kinds of feature for different purposes, some go all in on one or the other&lt;/li&gt;
&lt;li&gt;Some that use both (and maybe some that use only binary features?) have the possibility that a binary feature is &amp;quot;unspecified&amp;quot; for some concrete phonemes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Since I'm currently interested in this for the potential to improve phonological rules, I'm not interested in totally general applicability, just how different approaches apply to phonological rules specifically.
Also, for some of this I sort of have an out, in that, whatever categories of feature I include, I don't have to model the details of the feature in the low-level implementation code.&lt;/p&gt;
&lt;p&gt;Speaking of that code, at a high level, there are just a few basic tasks that have to be supported:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Match a concrete phoneme against a concrete phoneme&lt;/li&gt;
&lt;li&gt;Match a concrete phoneme against a category—that is, a subset of that phoneme's features. Under some theories, I believe a &amp;quot;category&amp;quot; in the sense I'm defining it here is considered an equally real phoneme that the &amp;quot;concrete&amp;quot; phoneme is in some sense a refinement of.&lt;/li&gt;
&lt;li&gt;Match a concrete phoneme against a category and transfer the distinctive aspects of the phoneme within that category to another category.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This last one is, I think, most likely to be problmatic, especially with some of the theories I mention above.&lt;/p&gt;
&lt;p&gt;For example, suppose a phoneme changes its place of articulation, perhaps due to assimilation.
If doing so causes it to gain or lose featural distinctions, how do I account for that?
This sounds like an obvious question to ask, so it should have an answer in the literature already.
Hopefully, it's out there, and I just havn't seen it yet because I'm only skimming right now because it's late.&lt;/p&gt;
&lt;p&gt;Anyway, tomorrow I'll work on research and specification.
I might also start breaking the code up some, because working with a 500-line module is still super-obnoxious.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-05-13</title><link href="https://mwchase.neocities.org/coding-2020-05-13" rel="alternate"></link><published>2020-05-13T04:00:00-04:00</published><updated>2020-05-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-05-13:/coding-2020-05-13</id><summary type="html">&lt;p class="first last"&gt;Surprisingly low amount of horrible brokenness, for code that I only just started testing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I made myself actually use the SCA² rewrite with writing tests.
Impressions so far:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The design is solid&lt;/li&gt;
&lt;li&gt;There were some howlers in the implementation&lt;/li&gt;
&lt;li&gt;It's hard to navigate the source code, and I should probably break it into a bunch of modules.&lt;/li&gt;
&lt;li&gt;In my opinion, which it should be understood is likely to be biased to see the various facets of this code in the best light possible... using the current interfaces to write phonological rules is like digging a trench with a spoon. And not a big spoon, either.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This last point is basically a result of the fact that, instead of the original's style of mingling parsing and processing, there's virtually no parsing in this whatsoever.
Which is an improvement in some ways, but a massive reduction in usability.&lt;/p&gt;
&lt;p&gt;To address this, I think I should, before I mess with any further enhancements, document everything wrong with the code in the tests, starting with the fact that 14 rule definitions somehow require 134 lines of code.
I'll get on it tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2020-05-12</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-05-12" rel="alternate"></link><published>2020-05-12T04:00:00-04:00</published><updated>2020-05-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-05-12:/weekly-roundup-2020-05-12</id><summary type="html">&lt;p class="first last"&gt;Let's see what other cool things I come up with excuses to use in code.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I started working out exactly how I want environment matching to work in my SCA rewrite.&lt;/li&gt;
&lt;li&gt;Thursday: I came up with a few things that would be really useful for writing tests again the rewrite.&lt;/li&gt;
&lt;li&gt;Friday: I got as far as implenting the code for performing environment matches, but not generating the specific instances required by a high-level description of the matching.&lt;/li&gt;
&lt;li&gt;Saturday: I mostly finished the generation code. (I ended up filling in the gaps over the weekend.)&lt;/li&gt;
&lt;li&gt;Sunday: I worked out some of the history of the con-culture by hand.&lt;/li&gt;
&lt;li&gt;Monday: I transcribed my notes into my laptop.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to write tests against the rewritten code, and consider some further refinements.
I'm also working on a writeup of the environment matcher design I came up with, because it's really cool, but it's looking like it'll be really long, because I want to try to make it accessible, which means I have to explain and motivate a lot of background material.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Conlanging 2020-05-11</title><link href="https://mwchase.neocities.org/conlanging-2020-05-11" rel="alternate"></link><published>2020-05-11T04:00:00-04:00</published><updated>2020-05-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-05-11:/conlanging-2020-05-11</id><summary type="html">&lt;p class="first last"&gt;I'd say this is the bare minimum of effort that's gone into a post, but I'm sure that's not true.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today I was more focused on writing up my latest SCA² rewrite.
This turned out to be... a lot.
I'm not sure how many posts it's going to be; my goal is to make it generally accessible, and in service of that, I'm explaining or leaving myself notes to explain &lt;em&gt;a lot&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;To get something done conlanging, I transcribed my notes from yesterday.
This should be a starting point for the ancestral lexicon.&lt;/p&gt;
&lt;p&gt;Moving forward with the behind-the-scenes, I'm going to need to rearrange the source files in there some, since the behind-the-scenes version needs to account for many more lexicons and syntax writeups than the public-facing version.&lt;/p&gt;
&lt;p&gt;I guess I don't have anything else to say on the matter right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Conlanging 2020-05-10</title><link href="https://mwchase.neocities.org/conlanging-2020-05-10" rel="alternate"></link><published>2020-05-10T04:00:00-04:00</published><updated>2020-05-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-05-10:/conlanging-2020-05-10</id><summary type="html">&lt;p class="first last"&gt;There is so much history that I don't know, or, more charitably, remember.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't touch the files much today, but I was able to rough out the beginning of an idea of a timeline for when the con-culture was where.
I'll have to learn more history to figure out if my first ideas there are at all reasonable.&lt;/p&gt;
&lt;p&gt;But, it's something.
I'm going to wrap up early-ish, because all the sun today gave me a headache, I think.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Coding 2020-05-09</title><link href="https://mwchase.neocities.org/coding-2020-05-09" rel="alternate"></link><published>2020-05-09T04:00:00-04:00</published><updated>2020-05-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-05-09:/coding-2020-05-09</id><summary type="html">&lt;p class="first last"&gt;I should probably put together a post where I try to explain all of this, with diagrams.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got a bit of work done on the port/rewrite: the code to represent and reverse a raw environment is in, as is most of the code required to convert a raw environment to a matcher automaton.&lt;/p&gt;
&lt;p&gt;What's missing from that is the code to handle categories, which is complicated somewhat by the fact that it's also the code to handle word boundaries.
What's missing from the rest is the metathesis code, still, and some wiring-together logic that should be trivial.&lt;/p&gt;
&lt;p&gt;I've been having kind of a rough week in general, but I think I'm making some minor breakthroughs in productivity, which is a nice bone to be thrown after over a month.&lt;/p&gt;
&lt;p&gt;Anyway, I'm done for the night, so I'm wrapping up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-05-08</title><link href="https://mwchase.neocities.org/coding-2020-05-08" rel="alternate"></link><published>2020-05-08T04:00:00-04:00</published><updated>2020-05-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-05-08:/coding-2020-05-08</id><summary type="html">&lt;p class="first last"&gt;Fingers crossed for using this in a week.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Status on SCA² port/rewrite/I-don't-know: I've set up the code to implement matching via an automaton, but I haven't written the code required to &lt;em&gt;generate&lt;/em&gt; an automaton, and expecting consumers to hand-write one would be... really bad.&lt;/p&gt;
&lt;p&gt;I also haven't implemented targets yet, which is easy, I'll get it last.&lt;/p&gt;
&lt;p&gt;Generating the automata shouldn't be a big deal; I just need to make sure my input format can handle everything.
It basically needs to handle word boundary matching, geminates, wildcards, categories (possibly including boundary matches) and literals, as well as nesting to represent optional sections.
The only interesting thing that it needs to be possible to do to the data for this is to reverse it.
Actually generating it is just a matter of iterating over the data and accumulating it into the automaton.&lt;/p&gt;
&lt;p&gt;All in all, I should have this ready to go soon, and then I can write tests for it, which will probably reveal all manner of fascinating things.&lt;/p&gt;
&lt;p&gt;For now, though, I'll just be glad to have made some more progress.&lt;/p&gt;
&lt;p&gt;(One thing of note is that I'm making a bunch of basically-arbitrary choices because the design is underconstrained.
I haven't been able to predict what constraints could apply in the future, so I'm just making whichever choices make sense to me at the moment, since I don't have a stronger consideration yet.)&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-05-07</title><link href="https://mwchase.neocities.org/coding-2020-05-07" rel="alternate"></link><published>2020-05-07T04:00:00-04:00</published><updated>2020-05-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-05-07:/coding-2020-05-07</id><summary type="html">&lt;p class="first last"&gt;Well, it makes sense to me.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today, I'd like to do the planning/design for the environment matching in here.&lt;/p&gt;
&lt;p&gt;I'm thinking a helper class that combines a phoneme sequence and an index; it can perform one of several checks on demand.&lt;/p&gt;
&lt;p&gt;Anyway, the trickiest bit is the automaton design.
Here are a few points to keep in mind:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The automaton corresponding to an empty sequence always matches&lt;/li&gt;
&lt;li&gt;The &amp;quot;earliest&amp;quot; that any state will refer back in the collection of states is to itself&lt;/li&gt;
&lt;li&gt;Python's builtin sequences allow for indexing from the end.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This means that the automaton can be built in a single pass by starting at the end of the match, and if it's done arena-style (I can't stomach the idea of repeatedly hashing the entire state graph), then the start state has index -1, and the state at index 0 is the success state.&lt;/p&gt;
&lt;p&gt;States need to be capable of:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;perform a literal match and advance&lt;/li&gt;
&lt;li&gt;check for set membership and advance&lt;/li&gt;
&lt;li&gt;provide two states to check against the current position&lt;/li&gt;
&lt;li&gt;accept any input and provide two indices&lt;/li&gt;
&lt;li&gt;check the gemination status and advance&lt;/li&gt;
&lt;li&gt;check the word boundary status, and provide another state to check against the current position&lt;/li&gt;
&lt;li&gt;Being detectable as the success state before any further processing occurs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Specific cases to check for: optionals or wildcards on their own should succeed immediately; this means that my &amp;quot;single-pass&amp;quot; idea might not pan out, unless the matching process is broken up very carefully:&lt;/p&gt;
&lt;p&gt;Given an initial set of states (from the starting conditions or the previous step), generate a set of states that advance the string.
If the success state is encountered in this process, the match succeeds.
The following three states must be processed as part of this stage:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The branch state must give its two targets as candidates&lt;/li&gt;
&lt;li&gt;The wildcard state must give its successor as a candidate, and itself as a thing to perform a match&lt;/li&gt;
&lt;li&gt;The word boundary state must give its successor as a candidate, but only if the word boundary condition evaluates to true.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This can be viewed as a combination of &amp;quot;does this state have transitions that consume a phoneme?&amp;quot; and &amp;quot;what transitions does this state have that do not consume a phoneme?&amp;quot;&lt;/p&gt;
&lt;p&gt;The stage can then be broken up into:&lt;/p&gt;
&lt;p&gt;While there are candidates: process each candidate by adding its candidates to a new set, and possibly itself to a consumer set; if the success state is encountered, succeed; at some point filter out all candidates that have been seen from the new set; make the new set the candidate set; the output of this stage is the consumer set; if the consumer set is empty, then fail.&lt;/p&gt;
&lt;p&gt;Although, if the consumer set is empty, then processing it will yield no candidates, so if the loop condition is the truthiness of the candidate set, then I could have an early return true inside the loops, and a fallback return false afterwards.&lt;/p&gt;
&lt;p&gt;Wait, I'm confusing myself.
This isn't a while loop, it's a for loop.
Unless I make it a while loop and have the cursor handle advancing, which seems acceptable, and allows me to perform processing steps even when there aren't phonemes to process, which is necessary for the empty sequence to match the empty sequence.&lt;/p&gt;
&lt;p&gt;I think I've got it all together.
Now I just need to be focused on this stuff long enough to get it all into code.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-05-06</title><link href="https://mwchase.neocities.org/coding-2020-05-06" rel="alternate"></link><published>2020-05-06T04:00:00-04:00</published><updated>2020-05-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-05-06:/coding-2020-05-06</id><summary type="html">&lt;p class="first last"&gt;If I can keep the latest attempt from doubling in length, it'll end up shorter than the last one.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today, I did the match logic for the &amp;quot;target&amp;quot; section of SCA² rules, which is one of the easiest parts, I think.&lt;/p&gt;
&lt;p&gt;The logic for handling the replacement section is almost as easy, it just needs some subclasses or protocols or something.&lt;/p&gt;
&lt;p&gt;Environment matching is the big hole so far.
It'll need some mild special-casing to handle degemination, and I think the main logic will have to operate on a sliding window of trigraphs or something.
I might need to just lay out all of the logic imperatively and see how much I can simplify it.&lt;/p&gt;
&lt;p&gt;I mean, what I want to do there is convert the matching logic to a nondeterministic finite automaton, then convert that to a deterministic finite automaton, then make sure that runs properly off of a stream of phonemes.&lt;/p&gt;
&lt;p&gt;The key weirdness in that is getting the matches right.
There's &amp;quot;literal phoneme&amp;quot;, &amp;quot;list of phonemes&amp;quot;, arbitrary-length sequence of anything, &amp;quot;the phoneme in the input word at the next lowest index&amp;quot;, &amp;quot;word break (do not advance the stream)&amp;quot;, and &amp;quot;optional sub-sequence&amp;quot;.&lt;/p&gt;
&lt;p&gt;This might sound like absurd premature optimization, but my intention here is to construct the logic from simple pieces in a principled fashion, rather than trying to enumerate every high-level special case.&lt;/p&gt;
&lt;p&gt;Thoughts for how to do some of this:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Include a &amp;quot;geminated&amp;quot; flag in the iterator implementation so the gemination test doesn't have to know about indices&lt;/li&gt;
&lt;li&gt;Make sure it's possible to move through multiple states in a single iteration step&lt;/li&gt;
&lt;li&gt;Oh, wait, my plan for gemination was to fold it into the category data, since a non-category gemination can be statically converted to a specific phoneme&lt;/li&gt;
&lt;li&gt;Hm. Either one probably works, but having an explicit flag sounds like less work, I think.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We'll see what works in a few days, hopefully.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2020-05-05</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-05-05" rel="alternate"></link><published>2020-05-05T04:00:00-04:00</published><updated>2020-05-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-05-05:/weekly-roundup-2020-05-05</id><summary type="html">&lt;p class="first last"&gt;Time status: possibly not real?&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I filled in some gaps in the second(?) SCA² port attempt I've made.&lt;/li&gt;
&lt;li&gt;Thursday: I got the project all set up. (Although I think my backup system wiped out the commit? It's weird like that.)&lt;/li&gt;
&lt;li&gt;Friday: I started planning the third attempt.&lt;/li&gt;
&lt;li&gt;Saturday: I started working on the third attempt.&lt;/li&gt;
&lt;li&gt;Sunday: I worked on my conlanging notes a little.&lt;/li&gt;
&lt;li&gt;Monday: I ported some more from the notes to my current repository.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to get the third attempt to a position where it can run a test, then maybe get back to the Ink port if there's time.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Conlanging 2020-05-04</title><link href="https://mwchase.neocities.org/conlanging-2020-05-04" rel="alternate"></link><published>2020-05-04T04:00:00-04:00</published><updated>2020-05-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-05-04:/conlanging-2020-05-04</id><summary type="html">&lt;p class="first last"&gt;Why is it suddenly so hot?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Conlanging side: ported the rest of the correlatives chart to reStructuredText, ecause that was easy and I'll need it eventually.&lt;/p&gt;
&lt;p&gt;Everything else side: barely leaving the house for over a month now seems to be taking some kind of toll.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Conlanging 2020-05-03</title><link href="https://mwchase.neocities.org/conlanging-2020-05-03" rel="alternate"></link><published>2020-05-03T04:00:00-04:00</published><updated>2020-05-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-05-03:/conlanging-2020-05-03</id><summary type="html">&lt;p class="first last"&gt;Just keep taking it easy, I guess.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did some planning work for the SCA port, but I didn't try to push it forward yet.&lt;/p&gt;
&lt;p&gt;On the conlanging side, that's waiting on a usable form of SCA, but I did refer to some of my old notes and worked a little on the proto-language grammar.&lt;/p&gt;
&lt;p&gt;I'll probably be taking it easy until I get the code to be usable.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Coding 2020-05-02</title><link href="https://mwchase.neocities.org/coding-2020-05-02" rel="alternate"></link><published>2020-05-02T04:00:00-04:00</published><updated>2020-05-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-05-02:/coding-2020-05-02</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;I don't foresee any issues with this course of action.&amp;quot; would go &lt;em&gt;great&lt;/em&gt; on a tombstone.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I started on what's apparently the third (maybe fourth?) iteration on porting SCA².
Fortunately, I'm understanding it better each time, so I think there's a chance this time will get it into a state I want to use.&lt;/p&gt;
&lt;p&gt;There's not much to say specifically about it, since it's just been a matter of filling in stub implementations with the stuff I wrote up yesterday.
It's not all done, and some of the things I haven't gotten to are definitely fiddly, but I don't foresee any issues with this course of action.&lt;/p&gt;
&lt;p&gt;Okay, I should wrap up for tonight.
Sorry I didn't have much to say, but it's just like, it looks like my plan was solid.
Not really a lot to write about; maybe some of the bits I currently have stubbed out will be more, um, fruitful.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-05-01</title><link href="https://mwchase.neocities.org/coding-2020-05-01" rel="alternate"></link><published>2020-05-01T04:00:00-04:00</published><updated>2020-05-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-05-01:/coding-2020-05-01</id><summary type="html">&lt;p class="first last"&gt;You'd think I would learn about making big, sweeping changes.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Instead of writing more tests, I thought about the datatypes involved in SCA², and I concluded that I wanted things to be less stringly typed before I went forward.
I started redoing a bunch of stuff, and that was probably a mistake, because now it's kind of frankensteined together.&lt;/p&gt;
&lt;p&gt;Hm.
Yes.
I'm going to save a diff, revert, fix some bugs I found in the rewrite, and start over with an actual plan.&lt;/p&gt;
&lt;p&gt;Bits of a plan:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Specific types of morphemes, lines, categories, environments, targets, replacements. (There are valid replacements that aren't valid targets)&lt;/li&gt;
&lt;li&gt;For environments, have explicit separation between &amp;quot;before&amp;quot; and &amp;quot;after&amp;quot;, and check before &lt;em&gt;backwards&lt;/em&gt; from the current index into the line. This should allow for some capabilities that don't exist in SCA².&lt;/li&gt;
&lt;li&gt;Targets are optionally a category, followed by phonemes&lt;/li&gt;
&lt;li&gt;Replacements are a sequence of phonemes, and if the target started with a category, optionally a category; or metathesis or gemination&lt;/li&gt;
&lt;li&gt;Morphemes are wrappers around string constants&lt;/li&gt;
&lt;li&gt;Lines are wrappers or aliases for a sequence of morphemes (including word boundaries)&lt;/li&gt;
&lt;li&gt;Categories are wrappers for a sequence of morphemes, and can be combined.&lt;/li&gt;
&lt;li&gt;Environments allow for special sequences for word boundaries (can't be a space, because it matches at the beginning), degemination, and wildcards&lt;/li&gt;
&lt;li&gt;Replacements operate on the input word, and construct an output word&lt;/li&gt;
&lt;li&gt;It may be possible to use some kind of enhanced iterator to implement the transformations as a stream, but given the expected length of a word, it's not going to be worth it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm exhausted right now, but let's see if I can put any of this into action tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-04-30</title><link href="https://mwchase.neocities.org/coding-2020-04-30" rel="alternate"></link><published>2020-04-30T04:00:00-04:00</published><updated>2020-04-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-04-30:/coding-2020-04-30</id><summary type="html">&lt;p class="first last"&gt;I'm not sure how much faster I want doing this with cell to be, but it's got to be at least an order of magnitude.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, I kind of procrastinated on setting up a flit project.
Instead, I've theoretically got a full implementation of every function I copied over so far.
We'll see; the code is more-or-less at &amp;quot;eyeballed vigorously&amp;quot; level of quality assurance, so I wouldn't trust it.
On a related hand, however, I don't have an interface designed for it, so really, this is all kinds of a tossup right now.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Anyway&lt;/em&gt;, I'm going to document all of the steps I need to do, and do them, so I can hopefully get this done tonight.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Create artifacts directories outside of my synched directories. This step is specific to my kind of lazy and janky home directory setup. Basically, I don't want to deal with conflict files in my build artifacts. I did this earlier today because it's quick, although I didn't symlink the directories in yet. I'll get that now.&lt;/li&gt;
&lt;li&gt;Create a source control repository. I've mostly been using &lt;a class="reference external" href="https://pijul.org/"&gt;pijul&lt;/a&gt; for my new projects, so I'll keep that up.&lt;/li&gt;
&lt;li&gt;Next I'll need an ignore file. Let's see if I can grab one from another project... All set, although it does indicate that I might have created some unneeded directories in the first step. Eh.&lt;/li&gt;
&lt;li&gt;Need a bunch of configuration files, and some minor reorganization... Okay, the source is in the right place, now, setup.cfg, requirements.txt, README.rst, pyproject.toml, noxfile.py, more requirements files, mypy.ini, .coveragerc, and now I'm suddenly remembering why I want to write cell, sheesh.&lt;/li&gt;
&lt;li&gt;Create a python environment...&lt;/li&gt;
&lt;li&gt;Run the tests so I remember what I haven't handled yet... Added a few things, like docs directory, some metadata, and updated checker requirements.&lt;/li&gt;
&lt;li&gt;Okay, let's do the initial commit.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And, that's enough for now.
Tomorrow, I'll sketch out how I want to use this code, and maybe start getting the coverage up from 4%.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-04-29</title><link href="https://mwchase.neocities.org/coding-2020-04-29" rel="alternate"></link><published>2020-04-29T04:00:00-04:00</published><updated>2020-04-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-04-29:/coding-2020-04-29</id><summary type="html">&lt;p class="first last"&gt;I refuse to git gud.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Earlier this afternoon, I added some tentative implementations to my SCA² port.
I puzzled over some of my past implementation choices enough that I think I ought to have some proper documentation in here.&lt;/p&gt;
&lt;p&gt;I could have worked on that later tonight, but instead I hate-read documentation on how the Git server is configured at work.
It has been over a year since it got set up, and the pain from the workflow hasn't gotten any less bad, just more predictable.
If I had to sum it up, I'd say that it feels like everything is being sacrificed on the altar of conforming to a specific set of commit history aesthetics that nobody has given me a reason to care about.
(I think the basic crux of it is that the server is configured—I think, it's confusing—to require fast-forward merges to certain kinds of branch, and also to disallow &amp;quot;foxtrot merges&amp;quot; to them.
The explanations I've read of foxtrot merges say you can do anything you want on topic branches, you just have to merge them back correctly.
But my actual experience with plugins that are supposed to prevent this stuff is that the quickest way to address these merges is to... rewrite history on the topic branch.)&lt;/p&gt;
&lt;p&gt;Sorry to go off like that and not edit it back out, but I really needed to vent.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to work on converting my porting effort into a flit project and look into writing tests for it.
Tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2020-04-28</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-04-28" rel="alternate"></link><published>2020-04-28T04:00:00-04:00</published><updated>2020-04-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-04-28:/weekly-roundup-2020-04-28</id><summary type="html">&lt;p class="first last"&gt;Lot of failure, for some reason. Oh well.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I tried to totally redo the analogue to &amp;quot;Pointers&amp;quot;, and failed.&lt;/li&gt;
&lt;li&gt;Thursday: I tried again with a weird Frankenstein half-measure that gets things just close enough to the right format. The half-way nature of it bothers me, but for now I'd rather move on. Then I hit a Mypy bug that I never understood well enough to file.&lt;/li&gt;
&lt;li&gt;Friday: I tried to understand the Mypy bug, and failed.&lt;/li&gt;
&lt;li&gt;Saturday: I finished writing a serializer, but I'm missing deserializer components.&lt;/li&gt;
&lt;li&gt;Sunday: I finished some needed reorganization of the conlang writeup.&lt;/li&gt;
&lt;li&gt;Monday: I started working on a fork of the conlang writeup that includes worldbuilding details that I don't want to publish. Hopefully, these will allow me to fill in enough information to have pronunciations finally.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to revist porting SCA², and probably also port over some more of Ink'd deserializers.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Conlanging 2020-04-27</title><link href="https://mwchase.neocities.org/conlanging-2020-04-27" rel="alternate"></link><published>2020-04-27T04:00:00-04:00</published><updated>2020-04-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-04-27:/conlanging-2020-04-27</id><summary type="html">&lt;p class="first last"&gt;Progress is progress.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't get a particularly early start on conlanging today, but I got some needed planning done, and started porting stuff over from my old notes.&lt;/p&gt;
&lt;p&gt;My basic plan is that I made a new branch of the repo where I'm writing the grammar.
That branch is going to be &amp;quot;everything in the published version [when it's published] PLUS world-building details that guide the creative process, but I don't want to include them&amp;quot;.&lt;/p&gt;
&lt;p&gt;So far, that just has brief details on the different forms of the language that I want to flesh out.&lt;/p&gt;
&lt;p&gt;It just occurred to me that I'm going to want to have some kind of verification that the different versions of the lexicon actually do link up via sound change.
Perhaps this would be a case for doctests?
Which would need me to get back to that other porting effort I was doing recently.
I don't think I'd mind that, but I'm not doing it right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Conlanging 2020-04-26</title><link href="https://mwchase.neocities.org/conlanging-2020-04-26" rel="alternate"></link><published>2020-04-26T04:00:00-04:00</published><updated>2020-04-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-04-26:/conlanging-2020-04-26</id><summary type="html">&lt;p class="first last"&gt;I had trouble coming up with a summary, and spaced out for half an hour. Not a good move.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got a late start today, but I have the first version of the glossary put together.
Next version: put spellings to words and use those.&lt;/p&gt;
&lt;p&gt;Getting actual pronounceable spellings does feel like something I want to get on soon; I started trying to put together a basic lesson to give me some idea of how to structure the grammar, and using just placeholders here feels kind of empty.&lt;/p&gt;
&lt;p&gt;I'm probably too sleepy right now to handle this well, but here are some ideas:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Put together a list of the grammatical changes that have taken place since the ancestral form&lt;/li&gt;
&lt;li&gt;Mark particular changes as likely to result in the re-analysis of words&lt;/li&gt;
&lt;li&gt;Place candidate sound changes in relation to all of this.&lt;/li&gt;
&lt;li&gt;Work out general flow for lexicon entries through all of this.&lt;/li&gt;
&lt;li&gt;Start trying stuff out in the ancestral language and see where it ends up.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I should get on this earlier tomorrow, it seems like a lot of work.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Coding 2020-04-25</title><link href="https://mwchase.neocities.org/coding-2020-04-25" rel="alternate"></link><published>2020-04-25T04:00:00-04:00</published><updated>2020-04-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-04-25:/coding-2020-04-25</id><summary type="html">&lt;p class="first last"&gt;I thought I was all set to continue porting tests, until I remembered that to do a round trip, you need to go &lt;em&gt;both ways&lt;/em&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I now seem to be able to serialize arbitrary StoryStates, but I can't yet deserialize them.
Soon.&lt;/p&gt;
&lt;p&gt;I don't have much to say about getting the serialization working, as it's a straightforward port of the C# version, with some slight sanity checks based on remembering how the deserialization logic that does exist works.&lt;/p&gt;
&lt;p&gt;Having more to say about anything would be cool, but I'm way wiped out so I guess I won't.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-04-24</title><link href="https://mwchase.neocities.org/coding-2020-04-24" rel="alternate"></link><published>2020-04-24T04:00:00-04:00</published><updated>2020-04-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-04-24:/coding-2020-04-24</id><summary type="html">&lt;p class="first last"&gt;Not a fan of thinking I know the essence of a behavior, and not being able to replicate it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Update on the Mypy issue I hit: I was able to reduce the issue to a few lines of code, but I couldn't reproduce it outside the context of the port.
I was able to work around the issue, and move on.&lt;/p&gt;
&lt;p&gt;I'm going to try to describe what I worked out about the issue, because it's weird:&lt;/p&gt;
&lt;p&gt;There are two modules.
They import each other.
One module defines a type and an instance of that type, as a global value, un-annotated.
The other defines a function.
In the function, and it's possible I missed some opportunities for reduction, but what I got was:
A variable annotated with a type defined in the other module, a variable that is equal to an expression that depends on the first variable and the global value from the other module, and a flow control statement that includes an expression of the form &lt;cite&gt;isinstance(var := expr, ...)&lt;/cite&gt;.
Under some but not all circumstances, this will crash Mypy.
I cannot tell what differentiates things.&lt;/p&gt;
&lt;p&gt;Anyway, I'm now working on writing serializers for Ink objects, to go along with the de-serializer I sort of forgot I had to write to make any of this work.&lt;/p&gt;
&lt;p&gt;I did that a bit, and now I'm done for tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-04-23</title><link href="https://mwchase.neocities.org/coding-2020-04-23" rel="alternate"></link><published>2020-04-23T04:00:00-04:00</published><updated>2020-04-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-04-23:/coding-2020-04-23</id><summary type="html">&lt;p class="first last"&gt;I should learn electronic music production, and make sad songs under the name &amp;quot;Technically Sufficient and Deeply Unsatisfying&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I ended up not being able to swap out the core logic of the port to use pointers, but I was able to convert everything I needed at the edges.
This is both technically sufficient and deeply unsatisfying, but I've got work to do.&lt;/p&gt;
&lt;p&gt;The biggest obvious hole in the serialization code, after I handled the pointer stuff, is the lack of serializing runtime objects.
I'm still not excited to try to mix subclassing with the way I did this, so I've got a big Union of all of the subclass equivalents.
It turns out that a fifteen-plus-variant union generates &lt;em&gt;a lot&lt;/em&gt; of type errors.&lt;/p&gt;
&lt;p&gt;I've been working my way through things, getting bits of code actually typed, but I've hit a snag that I'm too sleepy to handle right now: I've somehow broken Mypy.
(Again.)
I tried to do a simple refactor, and suddenly it's telling me to test against master and file a bug.
I kind of need a reproduction first, and my attempts so far have not reproduced the issue.&lt;/p&gt;
&lt;p&gt;Anyway, time to wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-04-22</title><link href="https://mwchase.neocities.org/coding-2020-04-22" rel="alternate"></link><published>2020-04-22T04:00:00-04:00</published><updated>2020-04-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-04-22:/coding-2020-04-22</id><summary type="html">&lt;p class="first last"&gt;A learning experience.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The change I've been psyching myself up for is to convert from using paths everywhere, to having an explicit analogue to Ink's &amp;quot;Pointer&amp;quot; type.
C# Ink Pointers are a combination of a Container object and an integer index.&lt;/p&gt;
&lt;p&gt;What I want is a combination of a CanonicalPath (which is a rough, rough equivalent of the path attribute on Ink Objects) with an index.
I tried to do this, and I ended up changing too much at once.
It was supposed to be a refactor, but there was just so, so much red.&lt;/p&gt;
&lt;p&gt;Tonight ended up being a bust, but at least now I know what to do next: figure out how to roll out the changes bit by bit, using a compatibility interface between old and new to gradually expand the coverage to the entire codebase.&lt;/p&gt;
&lt;p&gt;Once that's done, I can finish implementing serialization and deserialization, and get back to work on the tests.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
&lt;p&gt;EDIT: What are &amp;quot;days&amp;quot;?&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2020-04-21</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-04-21" rel="alternate"></link><published>2020-04-21T04:00:00-04:00</published><updated>2020-04-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-04-21:/weekly-roundup-2020-04-21</id><summary type="html">&lt;p class="first last"&gt;I think I know what I want to work on when I decide to take a break from this: revisiting the whole Mypy plugin thing.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I got into unexplored territory with the Ink port again.&lt;/li&gt;
&lt;li&gt;Thursday: I finished writing tests for calling Ink functions from game code.&lt;/li&gt;
&lt;li&gt;Friday: I psyched myself up for implementing Ink-style lists.&lt;/li&gt;
&lt;li&gt;Saturday: Started the implementation...&lt;/li&gt;
&lt;li&gt;Sunday: I did a little housekeeping in the conlang lexicon.&lt;/li&gt;
&lt;li&gt;Monday: I figured out the answers to some questions I had on categorization.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to redo some of the data representations in the Ink port to make serialization easier.&lt;/p&gt;
&lt;p&gt;Also: since I'm emulating all of the variable observer logic myself, I need to make sure that everything that mutates the state that's visible to the consumer fires off the observer logic.
This might be a case for a decorator?&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Conlanging 2020-04-20</title><link href="https://mwchase.neocities.org/conlanging-2020-04-20" rel="alternate"></link><published>2020-04-20T04:00:00-04:00</published><updated>2020-04-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-04-20:/conlanging-2020-04-20</id><summary type="html">&lt;p class="first last"&gt;Out-of-context thing I typed just now: &amp;quot;don't let Strunk and White say I never did anything for them.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I wasn't too focused on conlanging today, so I once again put out some quick work a few minutes ago.
I'm glad I did it though, since it's helping to clarify the grammatical role of some words I wasn't really sure what to do with, and I should have a way forward when I'm a bit better rested.&lt;/p&gt;
&lt;p&gt;On the Ink front... I've got some architectural walkbacks planned that I want to sleep on before I commit to them.
Nothing as drastic as reintroducing reference cycles, but I'm not sure whether making the changes I have in mind, or not, would be better overall.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Conlanging 2020-04-19</title><link href="https://mwchase.neocities.org/conlanging-2020-04-19" rel="alternate"></link><published>2020-04-19T04:00:00-04:00</published><updated>2020-04-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-04-19:/conlanging-2020-04-19</id><summary type="html">&lt;p class="first last"&gt;I should look into doing more glosses soon.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Nothing too exciting for today.
I got a few entries ready to put into glossaries, moved some sections into the proper file, and started consolidating the glossaries.
The big barrier right now is the section on anaphors.&lt;/p&gt;
&lt;p&gt;Besides that, I wrote up a little more worldbuilding, this time of fringe religious beliefs, and some brief notes on possible loanwords from various periods.&lt;/p&gt;
&lt;p&gt;Aside from that, I was still doing some stuff with the Ink port, which was tricky, because now it's kind of all in on &amp;quot;bugs are probably caused by code that was neither ported nor stubbed, so it just goes merrily past.&amp;quot;&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Coding 2020-04-18</title><link href="https://mwchase.neocities.org/coding-2020-04-18" rel="alternate"></link><published>2020-04-18T04:00:00-04:00</published><updated>2020-04-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-04-18:/coding-2020-04-18</id><summary type="html">&lt;p class="first last"&gt;I think I've managed to have &lt;em&gt;more&lt;/em&gt; stubbed-out suites than I did the last time I checked. Apparently implementing things results in more things explicitly not being implemented?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I've gotten through one list test.
Getting stuff to pass is requiring some relatively subtle tweaks to make sure things have the right value at the right time.
The latest bit of missing functionality looks like it's going to require plumbing more data through some of the functions.&lt;/p&gt;
&lt;p&gt;Regardless, I may be really unsure what some of my latest changes are actually, like, doing, but the tests pass, so it must work perfectly.
(It does not work perfectly.)&lt;/p&gt;
&lt;p&gt;I've been looking into some other projects to try, so I might be due for a break from this; I'll see what I think next week.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-04-17</title><link href="https://mwchase.neocities.org/coding-2020-04-17" rel="alternate"></link><published>2020-04-17T04:00:00-04:00</published><updated>2020-04-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-04-17:/coding-2020-04-17</id><summary type="html">&lt;p class="first last"&gt;I'm basically done after this, right? (I am not.)&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I got calling functions from outside working, and getting the tests to pass wasn't too bad.
I went a bit further.
Implementing tags wasn't too much of a hassle.
Now, I have to handle lists, finally, which I suspect might end up being nearly as much of a hassle as the original few tests were, where there was practically nothing implemented.&lt;/p&gt;
&lt;p&gt;Here's what needs to happen, more or less...
There are a bunch of support classes just for working with Ink lists, and I need to follow each one from creation until I'm sure it's done mutating.
Given that some of these classes have members called &amp;quot;cache&amp;quot; on them, that might technically not happen.&lt;/p&gt;
&lt;p&gt;But, when the time comes (tomorrow), I'll get to work on it and see what I can get out of the source code.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-04-16</title><link href="https://mwchase.neocities.org/coding-2020-04-16" rel="alternate"></link><published>2020-04-16T04:00:00-04:00</published><updated>2020-04-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-04-16:/coding-2020-04-16</id><summary type="html">&lt;p class="first last"&gt;I feel like I'm getting very good at doing this extremely specific kind of translation.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Ink port status: I've gotten through most of the tests around calling functions from outside the VM code.
The next test is around setting non-existent variables, and I'm fairly sure I haven't covered that, so I'll try to do it tomorrow.&lt;/p&gt;
&lt;p&gt;I'm noticing some gaps in coverage that are brought about by how I implemented things.
For example, I'm explicitly managing the list of events to send to the variable observers, which means I should probably write a test around using variable observers with function calls &amp;quot;from the game&amp;quot;.&lt;/p&gt;
&lt;p&gt;Thinking over the stuff I'm missing, I'm probably going to have to review the public API when I'm done, and figure out how to address the many, many discrepancies that are going to show up.&lt;/p&gt;
&lt;p&gt;Anyway, I've been spacing out once again, so I should call the entry now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-04-15</title><link href="https://mwchase.neocities.org/coding-2020-04-15" rel="alternate"></link><published>2020-04-15T04:00:00-04:00</published><updated>2020-04-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-04-15:/coding-2020-04-15</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Drastic Undercount&amp;quot; sounds like someone pretending to be drow royalty.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I tossed together an unrelated coding project yesterday.
I'll see if that goes anywhere.&lt;/p&gt;
&lt;p&gt;Anyway, on the Ink port front, I got one more test ported today, and then the next one was kind of a doozy.
This is the first test that involves triggering a function evaluation from outside the VM context, and since I've only implemented functions and complicated code paths as I've needed, support for that functionality right now is patchy at best.
(Also, I just noticed that I've somehow been drastically undercounting the tests that target the Ink VM.
I thought I was almost done, and it's more like not-quite 2/3 of the way through, apparently.
That number makes sense, but I'm not sure how I messed up.)&lt;/p&gt;
&lt;p&gt;Here's what I'm thinking: the interface I expose has a return value of (the state, the function result, the text).
Possibly the result and the text will be bound up in a namedtuple.
There's probably more to this, but I think the best way to move forward there is to just try a bunch of stuff.&lt;/p&gt;
&lt;p&gt;In other, non-coding news, I've been following the development of &lt;a class="reference external" href="https://penguinking.com/gone-to-hell/"&gt;Gone to Hell&lt;/a&gt;, and I'm kind of tempted to try to make an unofficial Slayer character outside the core focus: THE CHOSEN ONE, a JRPG-inspired hero's-journeyer who can solve problems through such means as throwing an absurd amount of money at overcoming them, and has a light action to mindlessly grind for resources.
I'll try to do something with that idea when I'm better-rested than I was today.&lt;/p&gt;
&lt;p&gt;Hopefully I'm not messing that up too much right this instant.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2020-04-14</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-04-14" rel="alternate"></link><published>2020-04-14T04:00:00-04:00</published><updated>2020-04-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-04-14:/weekly-roundup-2020-04-14</id><summary type="html">&lt;p class="first last"&gt;It is frankly astonishing how many bugs can exist around visit counts, while the code still &amp;quot;mostly works&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I discovered a subtle but pervasive bug in some of the new code I wrote for the port. Finding it was... interesting.&lt;/li&gt;
&lt;li&gt;Thursday: I implemented the type coercion in Ink.&lt;/li&gt;
&lt;li&gt;Friday: I walked back some of the more radical design changes I made, because they weren't doing what they were supposed to.&lt;/li&gt;
&lt;li&gt;Saturday: I prepared to do a little extra code work on the weekend.&lt;/li&gt;
&lt;li&gt;Sunday: I added a little more content to the lexicon, and then got a little sidetracked reorganizing it.&lt;/li&gt;
&lt;li&gt;Monday: I rewrote the glosses so they're hopefully a little more stable.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to push through the remaining tests of the Ink VM, and maybe try to add tests of functionality that's not covered.
On the conlanging side of things, I want to review the outline organization, and then get to filling stuff in.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Conlanging 2020-04-13</title><link href="https://mwchase.neocities.org/conlanging-2020-04-13" rel="alternate"></link><published>2020-04-13T04:00:00-04:00</published><updated>2020-04-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-04-13:/conlanging-2020-04-13</id><summary type="html">&lt;p class="first last"&gt;I should probably do a writeup on how I'm using Sphinx, once this is in a publishable state.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;One of the speed bumps I've been encountering in using Sphinx is that the link syntax is a little heavy-handed for the contexts I'm using it, and it's sensitive to the details of the exact target of the link.
As a result, when I tweak the lexicon, it results in a bunch of crazy diffs in my glosses.
I finally got fed up enough with this to figure out that substitutions will help me.
Basically, I'm currently working with gloss abbreviations rather than &amp;quot;actual words&amp;quot;, and the big change I made today was to define substitutions for every abbreviation rather than copying the same link syntax everywhere.
As a result, when I update the way the links work, I just need to change the substitution, which isn't defined in a table, so it doesn't have a bunch of inevitable knock-on effects.
I'll still end up changing stuff in the future, but only when I actually change something about the visible content in the glosses.&lt;/p&gt;
&lt;p&gt;As far as the updates that inspired this change, I've got most of the glossed words updated, but I haven't yet tried to merge the glossaries together.
I'd kind of like to find a new home for the parts-of-speech link targets first, and that means I need to make sure I have a proper handle on the organization of the grammar.&lt;/p&gt;
&lt;p&gt;So that today wouldn't be just housekeeping, I did a rough draft writeup of the different major paradigms in the conlang, laying out the kind of variation to expect from nouns, verbs, and a few major categories.&lt;/p&gt;
&lt;p&gt;Moving forward, I want to finish glossary-ifying the lexicon, and then get the draft of the correlative table ported.
When I start filling that in, I think I'll end up redoing some of the stuff that went into the glosses, so there'll be minor adjustments there.
Once that's done, I want to review all the sections of the grammar, and figure out what needs to be in each.
After that, I want to start tracing out the histories of various words, so I can hopefully get some diachronics done and get this to a point where anything at all has a pronunciation.
Hopefully I'll also get some worldbuilding in there; I've already added a few notes on religion.&lt;/p&gt;
&lt;p&gt;Anyway, I'd like to take it easy for the rest of tonight, so I'm calling this entry here.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Conlanging 2020-04-12</title><link href="https://mwchase.neocities.org/conlanging-2020-04-12" rel="alternate"></link><published>2020-04-12T04:00:00-04:00</published><updated>2020-04-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-04-12:/conlanging-2020-04-12</id><summary type="html">&lt;p class="first last"&gt;I should figure out how to fix up the PDF output. There's just so much overfull hbox right now...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today, I started working on the correlative table.
I made a few decisions, then realized that I really should get the lexicon into the form of a definition list.
I'm working on adapting each individual section of the lexicon, and I'll merge them together later.
Doing it incrementally does have the slight disadvantage that I have to &lt;em&gt;keep on&lt;/em&gt; fixing the table layout for the glosses, but oh well.&lt;/p&gt;
&lt;p&gt;Anyway, as I put stuff into the glosses, I get links to parts of speech out of it, and I'll start filling actual details into those afterwards.&lt;/p&gt;
&lt;p&gt;I mentioned I made some decisions.
One was to make a four-way distinction in the demonstratives.
This is a little outside of the norm of languages I know (one or three seems like the most common to me), but it's not totally crazy, and it should be too much of a hassle to work with.&lt;/p&gt;
&lt;p&gt;I might have gotten a bit more done on all of this, but I put in a bit more time on the Ink port instead.
As the test coverage increases, the remaining bugs get gnarlier and more ridiculous.
One bug covers up the existence of another, causing the fix for it to result in fresh test failures.
It kind of feels like this:&lt;/p&gt;
&lt;div class="youtube youtube-16x9"&gt;&lt;iframe src="https://www.youtube.com/embed/aI0euMFAWF8" allowfullscreen seamless frameBorder="0"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p&gt;Hopefully, there aren't too many more unpleasant surprises, but I can't know until I get through all this.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Coding 2020-04-11</title><link href="https://mwchase.neocities.org/coding-2020-04-11" rel="alternate"></link><published>2020-04-11T04:00:00-04:00</published><updated>2020-04-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-04-11:/coding-2020-04-11</id><summary type="html">&lt;p class="first last"&gt;I didn't put the wrong timestamp on yesterday's entry. YOU put the wrong timestamp on yesterday's entry. I'm not getting defensive.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Overall, I didn't implement new functionality in the Ink port today, because I was noticing simplifications I could make to the code now that I'm not trying to make the state machine a thing, and then I was working on the design for the variable observer feature.
I just now wrote a test for it according to my initial plan.&lt;/p&gt;
&lt;p&gt;My initial plan is something I'm not totally sure about, but I can defend it to myself.
Basically, the context is that most of the rest of the interface I put together is about having the consumer manage immutable state.
So, I could, in theory, emit the state changes explicitly and have the caller dispatch them.
But that seems kind of awkward, even by the standards of the designs I've inflicted on this port in the past.
When I get to the end of the equivalent of the &amp;quot;continue&amp;quot; function, I know that the consumer &amp;quot;should&amp;quot; continue on, and therefore wants the observer functions to have triggered by then.&lt;/p&gt;
&lt;p&gt;So, for my initial implementation, my plan is to have some kind of accumulator queue of variable changes that gets populated from the VariablesState, and cleared and processed at the end of the &amp;quot;continue&amp;quot; function.
I'll probably want to have some kind of aggressive exception handling on the observer functions, because this code doesn't care what they do, and implementing any kind of control flow via exceptions in consumer code seems perverse.
(Also, observer code should probably be putting stuff on message queues or something like that anyway, I think.)&lt;/p&gt;
&lt;p&gt;(While I'm thinking in this area, I think it'd be safe to remove the string part of the output from the function, which would then be more-or-less fluent.
That kind of big rewrite would be helped by another idea I have in mind, which is to reduce boilerplate in the test code.
I have some ideas in mind that would reduce many tests to one-liners.)&lt;/p&gt;
&lt;p&gt;Anyway, if I try to work on that now, I'll probably mess it up in some ludicrous way, so I'll wait until later for that.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-04-10</title><link href="https://mwchase.neocities.org/coding-2020-04-10" rel="alternate"></link><published>2020-04-10T04:00:00-04:00</published><updated>2020-04-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-04-10:/coding-2020-04-10</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Why is the code like this? Well, there's a good reason...&amp;quot; (several weeks later) &amp;quot;Actually, it wasn't a very good reason.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I recently finally admitted that the whole &amp;quot;state machine&amp;quot; idea isn't working for the Ink port, so I pulled that out, and was then able to get rid of the &amp;quot;CommonState&amp;quot; concept.
While I was at it, I made the choice-choosing logic more in line with the original API, because what I was having it do was not accomplishing anything that I wanted it to.&lt;/p&gt;
&lt;p&gt;I made these changes because I finally reached the tests that involve manipulating the VariablesState, and having all of the different states lying around would have made it difficult to implement an API that I could reliably expect to have access to.
Shout-out to all of the tests I ported, which showed me that I apparently got the refactors all right on the first try, which is great, and not something I could have relied on happening.&lt;/p&gt;
&lt;p&gt;It looks like there around around twenty tests left for me to finish up the initial port.
Unfortunately, the next test is of variable observers, which I'm going to have to think about to figure out how I want to implement them.
And also look over the C# code pretty closely.&lt;/p&gt;
&lt;p&gt;Also, looking over the stuff I haven't tested yet, I think I've found some testing gaps in the C# codebase.
So, that'll be fun.&lt;/p&gt;
&lt;p&gt;Anyway, it's too late at night, because I kept spacing out while writing this.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-04-09</title><link href="https://mwchase.neocities.org/coding-2020-04-09" rel="alternate"></link><published>2020-04-09T04:00:00-04:00</published><updated>2020-04-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-04-09:/coding-2020-04-09</id><summary type="html">&lt;p class="first last"&gt;Miss me with anything related to &amp;quot;strong&amp;quot; or &amp;quot;weak&amp;quot; typing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got through a few more tests in the Ink port.
The big new thing from tonight is implicit coercion between value types.
My gut feeling is that I'd lke to somehow not have that, but I don't have a good enough replacement yet, and besides, I should focus on feature parity for now.&lt;/p&gt;
&lt;p&gt;So far as that goes...
Aside from some builtins, and the entire list concept, the functionality is mostly done, if somewhat algorithmically questionable in places.&lt;/p&gt;
&lt;p&gt;It's in a good place, and hopefully it gets to feature parity in a week or two.
Not much happening with it in the very immediate future, though, because it's almost midnight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-04-08</title><link href="https://mwchase.neocities.org/coding-2020-04-08" rel="alternate"></link><published>2020-04-08T04:00:00-04:00</published><updated>2020-04-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-04-08:/coding-2020-04-08</id><summary type="html">&lt;p class="first last"&gt;Commit message: &amp;quot;Trust no one, not even yourself&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got a few more tests knocked out easy, and then I hit TestNestedPassByReference.
A test that contains the comment &amp;quot;Bloody whitespace&amp;quot;, which is a sentiment that I really agree with right now.
Investigating the test's history leads to &lt;a class="reference external" href="https://github.com/inkle/ink/commit/a478f1b237a0f86165375edc2b28389fe746da0f"&gt;this commit&lt;/a&gt;, which involves changes that produce a more pleasant output.
Formerly, the test output would include a snippet of whitespace outputted by the top-level function call, as well as an extra newline.
Afterwards, it emits neither.
I've somehow managed to write code that includes the extra newline, but not the inline whitespace.
(Technically, the inline whitespace is generated, but not rendered.)&lt;/p&gt;
&lt;p&gt;Somewhere in the steps of &amp;quot;first line generates newline, execution steps through function, hits next content line, rolls back, outputs line, and steps back through function&amp;quot;, something is going wrong.&lt;/p&gt;
&lt;p&gt;Okay, I went back to it, because I was just so bothered, and I found the problem.
This is pretty much entirely on me; I'll see if I can sum it up quickly.&lt;/p&gt;
&lt;p&gt;The C# Ink VM defines boxed versions of various built-in types, including strings.
The boxed string includes some pre-calculated common properties, which I foolishly did not port in any capacity, and just tried to do stuff inline where needed.
One of these instances is the function TrimWhitespaceFromFunctionEnd, which should have been preventing the whitespace from getting pushed to the output stream in the first place.
But there was a problem.
In a fit of extreme fanciness, I expressed the isInlineWhitespace property as &lt;tt class="docutils literal"&gt;set(obj.value) == {&amp;quot; &amp;quot;, &amp;quot;\t&amp;quot;}&lt;/tt&gt;.
The correct expression is, obviously &lt;strong&gt;in retrospect&lt;/strong&gt;, &lt;tt class="docutils literal"&gt;set(obj.value) &amp;lt;= {&amp;quot; &amp;quot;, &amp;quot;\t&amp;quot;}&lt;/tt&gt;.
The difference between them is that the original form wouldn't catch strings that only contained one of these characters.
Which is most strings we're interested in.
The new form does also theoretically drop empty strings, but I'm too tired right now to handle the levels of zen in &amp;quot;does it make a difference to discard the empty string?&amp;quot;&lt;/p&gt;
&lt;p&gt;Anyway, I sincerely hope I don't have any more of these tiny oversights on my part to deal with, but that seems unlikely.
Technically, I won't have to deal with any of them tonight, because that's enough for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2020-04-07</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-04-07" rel="alternate"></link><published>2020-04-07T04:00:00-04:00</published><updated>2020-04-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-04-07:/weekly-roundup-2020-04-07</id><summary type="html">&lt;p class="first last"&gt;I'm not sure how much more of &amp;quot;being wrong about what's easy to tweak in Ink&amp;quot; I can take...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I made the type annotations in the Ink port a little less sloppy. I also figured out how to get the conlang stuff into a more inspectable form without &lt;em&gt;immediately&lt;/em&gt; starting to yak-shave.&lt;/li&gt;
&lt;li&gt;Thursday: I tried to make the code follow the structure of the C# version a little better.&lt;/li&gt;
&lt;li&gt;Friday: I got the rest of the way through those updates, and started porting tests again.&lt;/li&gt;
&lt;li&gt;Saturday: I realized that the Ink VM is too low-level to unilaterally implement the semantics tweak I want for it. Between this entry and the next, I realized that I need to get into compiler hacking for that.&lt;/li&gt;
&lt;li&gt;Sunday: With some efforts on the side in the days before, I got the glosses I've written put into Sphinx.&lt;/li&gt;
&lt;li&gt;Monday: I started pulling from my other documentation efforts into the Sphinx project. Ended up thinking about how to arbitrarily divide these fictional words into specific categories. In my defense, I don't think the specific issue I'm worried about is settled for natural languages (where applicable).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to reach another failing test in the Ink port.
&amp;quot;Approximately alphabetically&amp;quot; might not be a great order to port the tests in, but it's good for being able to compare later.
Also, I'm going to just commit to a position on the conlang stuff.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Conlanging 2020-04-06</title><link href="https://mwchase.neocities.org/conlanging-2020-04-06" rel="alternate"></link><published>2020-04-06T04:00:00-04:00</published><updated>2020-04-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-04-06:/conlanging-2020-04-06</id><summary type="html">&lt;p class="first last"&gt;Super excited to realign the tables later. Ugh.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I copied some more out of the old outline into the new one.
I think the next thing I need to look at from the old outline is correlatives.
Working on that may or may not end up changing the glosses, we'll see.&lt;/p&gt;
&lt;p&gt;From my perspective right now, it sort of comes down to what's a &amp;quot;correlative&amp;quot; and what's an &amp;quot;article&amp;quot;, and whether the distinction makes sense in this context.
I think the way I'm thinking about it is that articles have a 4-by-4 grid of inflections, while correlatives fit into series on other axes, and may lack inflection for gender to some degree.&lt;/p&gt;
&lt;p&gt;I'll think about it next week.
For now, I've been spacing out and should wrap up.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Conlanging 2020-04-05</title><link href="https://mwchase.neocities.org/conlanging-2020-04-05" rel="alternate"></link><published>2020-04-05T04:00:00-04:00</published><updated>2020-04-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-04-05:/conlanging-2020-04-05</id><summary type="html">&lt;p class="first last"&gt;I should probably redo the heading markup, but eh.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Quick note on the Ink stuff: I realized that the behavior changes I want can't be introduced in the interpreter, and I should instead work on hacking the compiler when I feel like it.
This is helpful, because it means that my goal with the interpreter port is entirely to get it functioning to spec.
The most complicated thing I might end up doing is having separate branches for mutation testing coverage, and profiling and optimization.
But none of that is relevant right now, since I still haven't implemented all of the opcodes.&lt;/p&gt;
&lt;p&gt;Anyway, as far as conlanging goes, I've got all of the glosses put into tables now, which renders hideously, but I'll look into that later.
I've added sections for all of the sections from my original outline, and started copying stuff over.
My task now is to collate and categorize all of the disorganized thoughts I've had so far, and fit them into the outline.&lt;/p&gt;
&lt;p&gt;In the process of inputing the glosses, I found a few more errors in the glosses I posted, but I kind of don't feel like correcting them in the post.&lt;/p&gt;
&lt;p&gt;I don't have much more to say now, because this has mostly been just taking things I've already talked about somewhat, and putting them together so they can usefully interact.&lt;/p&gt;
&lt;p&gt;Anyway, I am sleepy and should go to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Coding 2020-04-04</title><link href="https://mwchase.neocities.org/coding-2020-04-04" rel="alternate"></link><published>2020-04-04T04:00:00-04:00</published><updated>2020-04-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-04-04:/coding-2020-04-04</id><summary type="html">&lt;p class="first last"&gt;This is more understanding of the Ink VM than I expected to have, at least.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got a little bit more done on the port earlier today, but I also looked over the code, and realized that I'd already gone over all of the code that would have to be changed for a particular behavior change I wanted, and I hadn't changed it, which means it must be possible to write a failing test case for that behavior.
And it is.
Given the following Ink file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;* Text: {a|b}
-
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The choice displays initially as &amp;quot;Text: a&amp;quot;, and, after it is taken, as &amp;quot;Text: b&amp;quot;.
(Followed by a newline.)
I spent a bit of time trying to figure out how to change this behavior, and, once again contrary to my initial expectations, it's not obvious to me right now.
The problem is that, at least according to my ad-hoc prints, it's hard to get a sense of &amp;quot;context&amp;quot; within the VM's stack-based execution.&lt;/p&gt;
&lt;p&gt;I've got an idea, which I'm just going to write up, and not attempt yet, that the following might be a workable starting point:&lt;/p&gt;
&lt;p&gt;When the parent of the &amp;quot;previous path&amp;quot; is not an ancestor of the &amp;quot;current path&amp;quot;, stop visiting containers &amp;quot;at the start&amp;quot;, until the &amp;quot;current path&amp;quot; is not a descendant of the first &amp;quot;current path&amp;quot;, modulo sticking a tunnel in the middle, so I guess this would have to be tracked on the stack.
Or maybe following a choice needs to put some new data on the stack to determine when to start tracking data again.&lt;/p&gt;
&lt;p&gt;I'm pretty sure that first idea would break most things catastrophically, so I'm not going to try it right now.&lt;/p&gt;
&lt;p&gt;One thing that all this messing around has made me realize is that I've got a bunch of not-all-compatible things I want out of this port.&lt;/p&gt;
&lt;p&gt;One is to basically audit the codebase, and submit the Python version to automatic analysis that can hopefully shed light on the C# version.
This requires relative fidelity to the original codebase.&lt;/p&gt;
&lt;p&gt;Another is to have a version of Ink that I can easily use in my Python projects.
The big priority here is optimization, followed by adding features that I want.&lt;/p&gt;
&lt;p&gt;I'm going to take a stab at explaining what happens with the Ink code I posted above, so I can get my thoughts in order:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Ink begins expression evaluation.&lt;/li&gt;
&lt;li&gt;It assigns the label &amp;quot;0.0.$r1&amp;quot; to the local variable &amp;quot;$r&amp;quot;&lt;/li&gt;
&lt;li&gt;It begins string evaluation.&lt;/li&gt;
&lt;li&gt;It jumps to &amp;quot;0.0.s&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;0.0.s.0&amp;quot; pushes text to the stack&lt;/li&gt;
&lt;li&gt;&amp;quot;0.0.s.1&amp;quot; contains the sequence logic. This is the part where I want to monkey with the visit count logic. Several internal diverts are hit in this.&lt;/li&gt;
&lt;li&gt;&amp;quot;0.0.s.2&amp;quot; diverts to the label stored in &amp;quot;$r&amp;quot;&lt;/li&gt;
&lt;li&gt;At this stage, the code after the label ends string evaluation, ends expression evaluation, bundles the value into a Choice, and knows to stop and not output anything else because... I'm not sure right now.&lt;/li&gt;
&lt;li&gt;Anyway, the test follows the generated Choice, which ultimately redirects to &amp;quot;0.c-0&amp;quot;&lt;/li&gt;
&lt;li&gt;This increments the visit count, which is necessary.&lt;/li&gt;
&lt;li&gt;Anyway, next it stores the label &amp;quot;0.c-0.$r2&amp;quot; in &amp;quot;$r&amp;quot;, and redirects back to &amp;quot;0.0.s&amp;quot;. This increments the visit counts, which I would like not to happen.&lt;/li&gt;
&lt;li&gt;&amp;quot;0.0.s&amp;quot; runs through its logic as normal, but now the final divert leads to &amp;quot;0.c-0.$r2&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Perhaps if following a choice made it so that:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Detect entering the target path of the choice&lt;/li&gt;
&lt;li&gt;When the choice's container is diverted out of&lt;/li&gt;
&lt;li&gt;Suspend visit count increments until&lt;/li&gt;
&lt;li&gt;The container is diverted back into.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That might work.
Maybe.
And it still might break things.
I'll have to try this out later.
For now, it's late and I'm tired.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-04-03</title><link href="https://mwchase.neocities.org/coding-2020-04-03" rel="alternate"></link><published>2020-04-03T04:00:00-04:00</published><updated>2020-04-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-04-03:/coding-2020-04-03</id><summary type="html">&lt;p class="first last"&gt;Somewhat scared to see how a port with stricter typing would handle the external function stuff.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The Ink port is now a little better about how it does errors, although one thing that I'm not sure if I want to deal with is the fact that the error logic in the equivalent of &amp;quot;continue&amp;quot; will &amp;quot;automatically&amp;quot; do rollback before attaching errors.
(Really, it's that it does not have access to the state at the time of the error, and giving it access would be kind of a pain.)&lt;/p&gt;
&lt;p&gt;Anyway, I got a few more tests ported.
The relationship between the number of passing tests and the number of tests ported over is getting increasingly tenuous (tonight, one test became three tests, one of which xfails because I'm not testing the compiler, one test became two tests to highlight a semantic flexibility introduced in the port), so I'll just say that I've gotten up through calculating factorial by reference.&lt;/p&gt;
&lt;p&gt;I've still got about a dozen NotImplementedErrors kicking around, and probably a few more bits where I skipped over the code like a dope, and also some of those NotImplementedErrors are doing &lt;em&gt;a lot&lt;/em&gt; of work, but I'm making progress on this, for sure, and it feels good.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-04-02</title><link href="https://mwchase.neocities.org/coding-2020-04-02" rel="alternate"></link><published>2020-04-02T04:00:00-04:00</published><updated>2020-04-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-04-02:/coding-2020-04-02</id><summary type="html">&lt;p class="first last"&gt;Turns out that using LaTeX as an intermediate layout representation doesn't automatically make your document look awesome.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;No movement on porting over Ink tests, but I did get some of the error-related methods ported over.
I still need to port &lt;tt class="docutils literal"&gt;AddError&lt;/tt&gt;, but once that's in, I'll have no reason not to get back to the tests.&lt;/p&gt;
&lt;p&gt;I got another part of the gloss put into the Sphinx book version of the conlang stuff.
Right now I want to focus on getting content in, but I'm going to have to focus on styling somehow eventually; the way I'm doing this looks atrocious.&lt;/p&gt;
&lt;p&gt;Wrapping up now because I was tired all day, and am moreso now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-04-01</title><link href="https://mwchase.neocities.org/coding-2020-04-01" rel="alternate"></link><published>2020-04-01T04:00:00-04:00</published><updated>2020-04-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-04-01:/coding-2020-04-01</id><summary type="html">&lt;p class="first last"&gt;Give this a few weeks, and it might be usable. Slow, but usable.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got up to 27 tests ported over the weekend, though two of them kind of freak me out; it's not clear to me how they pass in the C# version, but I verified for myself that they do, so this is my problem.&lt;/p&gt;
&lt;p&gt;Anyway, I know the next tests to go for will work out poorly for me, because I've been really lax in populating the error/warning data.
That's why I spent today shoring up the typing system and discovering a bug thanks to that.
I'm going to try to psych myself up to fix the error/warning code tomorrow, so I can hopefully keep breezing through tests after that.&lt;/p&gt;
&lt;p&gt;I also realized yesterday that if I relax some preconceptions I had about how it should all work, then &lt;a class="reference external" href="https://www.sphinx-doc.org/en/master/"&gt;Sphinx&lt;/a&gt; might be a good fit for conlanging work.
Lets me link stuff from my glosses, adding a lexicon entry is relatively lightweight, and if I get really desperate for some kind of generated data, I can do terrible things to the contents of Python docstrings.&lt;/p&gt;
&lt;p&gt;I'm going to work on loading my disparate notes into it, when I'm not up for puzzling out what's happening in Ink.
(I'm honestly still not sure what's actually different between how I had some code implemented, and what I changd it to; I just know that the former was an attempt to match my understanding of Ink's continue logic, and the latter is an extremely close translation of the actual code. They do not behave the same.)&lt;/p&gt;
&lt;p&gt;Anyway, that's enough for now.
Maybe I'll actually get to bed in a timely fashion tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2020-03-31</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-03-31" rel="alternate"></link><published>2020-03-31T04:00:00-04:00</published><updated>2020-03-31T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-03-31:/weekly-roundup-2020-03-31</id><summary type="html">&lt;p class="first last"&gt;Slow progress.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: Three tests ported over, and I managed to simultaneously lament my hubris and continue to engage in it.&lt;/li&gt;
&lt;li&gt;Thursday: Four tests ported over. A little worried about trying to port over the random number stuff, since C# and Python provide different random generators out of the box.&lt;/li&gt;
&lt;li&gt;Friday: Six tests. Getting kind of tired of all of the bits where I mixed up &amp;quot;and&amp;quot; and &amp;quot;or&amp;quot; or &amp;quot;parent&amp;quot; and &amp;quot;first child&amp;quot;. I think I also managed to push some values to the wrong stack, which took a surpisingly long time to mess things up.&lt;/li&gt;
&lt;li&gt;Saturday: More dealing with hubris.&lt;/li&gt;
&lt;li&gt;Sunday: I did a quick look at the syntactic bestiary, then tried to do a semantic analysis of part of the post I was writing. Even at the time, it was quickly clear to me that it was too late at night for me to be trying that.&lt;/li&gt;
&lt;li&gt;Monday: A bit more unfocused work.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, definitely more porting Ink.
This is an interesting experience.
While I do have specific complaints about parts of Ink's code, overall I feel the codebase has earned far more respect from me than I had for the code from TStand90's roguelike tutorials.
It's a matter of, the requirements put on Ink are much stricter than those on the tutorial code.
The ultimate form of the VM will probably actually end up extremely similar to the C# code.
I'd like to pull off some kind of bonkers refactor, for the dopamine hit, but the likely targets for improvement are the awful interfaces I've imposed on it.
(Every three tests or so, I'm just like &amp;quot;I've made a huge mistake, but I can cope&amp;quot;.)&lt;/p&gt;
&lt;p&gt;On the conlanging side, I want to clean up my glosses and make them cross-referenceable somehow.
I've got some ideas I'll look into for that.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Conlanging 2020-03-30</title><link href="https://mwchase.neocities.org/conlanging-2020-03-30" rel="alternate"></link><published>2020-03-30T04:00:00-04:00</published><updated>2020-03-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-03-30:/conlanging-2020-03-30</id><summary type="html">&lt;p class="first last"&gt;I wonder if there's a good format I can record my glosses in so I know which glosses still need an associated word.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I didn't really have the priorities I was hoping for today, so let's have another quick stream-of-consciousness.&lt;/p&gt;
&lt;p&gt;I've got the equivalent of basic declarative sentences, and I've worked out rules for converting them to yes-or-no or wh- questions, and rules for converting those to emphatic utterances.&lt;/p&gt;
&lt;p&gt;I've got some rules for negation, but there are some edge cases I don't think I've fully covered.
I'm basically not quite sure what I want to happen when the negation applies to a proper noun, but I have some ideas.&lt;/p&gt;
&lt;p&gt;There are various constructions and phrases that require a nonce object.
The neutral pronoun probably makes the most sense.
However, I also want the ability to attach the nonce object to an intransitive verb, which means I should probably designate a preposition for that.
(Or have it vary by verb?)&lt;/p&gt;
&lt;p&gt;Open question: are the relative and interrogative pronouns the same?
My gut preference is &amp;quot;no&amp;quot;.&lt;/p&gt;
&lt;p&gt;I haven't worked out the causative yet.&lt;/p&gt;
&lt;p&gt;And now I'm both getting quite late at night, and to a point in my notes where I really should have taken more notes.
There is no more post to be had, it must be done now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Conlanging 2020-03-29</title><link href="https://mwchase.neocities.org/conlanging-2020-03-29" rel="alternate"></link><published>2020-03-29T04:00:00-04:00</published><updated>2020-03-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-03-29:/conlanging-2020-03-29</id><summary type="html">&lt;p class="first last"&gt;Editing? What's that?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I kind of didn't focus much on conlanging today, but I did take some time to go over a few more syntactic transformations.&lt;/p&gt;
&lt;p&gt;What I should have thought to do was go over last week's entry.
Oh well.&lt;/p&gt;
&lt;p&gt;Trying to figure some of this stuff out is making me hyper-aware of stuff that English does.
Like, look back at that last paragraph:
&amp;quot;What I should have thought to do was go over last week's entry.&amp;quot;
Means about the same as:
&amp;quot;I should have thought to go over last week's entry.&amp;quot;
But emphasizes what I did or didn't do.
I can notice some of this, but not necessarily understand it.
Like, does that rearrangement basically frame the sentence as a question that I ask myself and then answer?&lt;/p&gt;
&lt;p&gt;Oh, wait, I'm sleepy.
&amp;quot;What I should have thought to do&amp;quot; is a relative clause.
It's just kind of big.&lt;/p&gt;
&lt;p&gt;Now I want to figure out how that kind of construction would work in the conlang, because that's a whole bunch of verbs.
Like, the subject and the object are both verbs, right?&lt;/p&gt;
&lt;p&gt;Okay, start with &amp;quot;I should have thought to X&amp;quot;&lt;/p&gt;
&lt;p&gt;First roadblock: &amp;quot;think&amp;quot; is intransitive in English.
I don't think (that) I want that here, so let's have the verb in question be more like &amp;quot;think about&amp;quot; or &amp;quot;think of&amp;quot; in its basic form.
&amp;quot;should have&amp;quot; expresses irrealis mood I think, obligation, and whatever the heck &amp;quot;have&amp;quot; even means in a tense/aspect sense by now.&lt;/p&gt;
&lt;p&gt;&amp;quot;I [tense aspect mood] think to X&amp;quot;&lt;/p&gt;
&lt;p&gt;I want to layer things in a little different of an order.
Because the obligation/duty had a point where it should have been handled, and passed by, I want to have the aspect verb first, followed by a modal verb expressing obligation, and to have the object be irrealis, because it's a thing that I didn't do.
Maybe I'll go back on the ordering if it turns out that I want to enforce mood before aspect, but I want to start by seeing what happens if I don't.&lt;/p&gt;
&lt;p&gt;The highlights of all of this are that the relative pronoun is in the accusative, while &amp;quot;go over last week's entry&amp;quot; is in the nominative (and irrealis. It would be in indefinite or definite if I'd been saying &amp;quot;I was supposed to do this thing, and I &lt;em&gt;did&lt;/em&gt;.&amp;quot;).
The word order of &amp;quot;last week's entry&amp;quot; is &amp;quot;entry last week&amp;quot;, where &amp;quot;entry&amp;quot; is in the accusative, and &amp;quot;last&amp;quot; and &amp;quot;week&amp;quot; are in the genitive.&lt;/p&gt;
&lt;p&gt;Tomorrow, I should try diagramming this stuff in English and the conlang.
Can't handle it now, though.
I could barely handle what I did do...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Coding 2020-03-28</title><link href="https://mwchase.neocities.org/coding-2020-03-28" rel="alternate"></link><published>2020-03-28T04:00:00-04:00</published><updated>2020-03-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-03-28:/coding-2020-03-28</id><summary type="html">&lt;p class="first last"&gt;Hello hubris my old friend...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I haven't got any more tests working, but I've cracked 85 percent coverage.
However, I've come to the conclusion that my mental model of how StoryStates work is flawed, and I should probably collapse most of the states together.
I'm not exactly sure how big of a deal this will be, but hopefully it'll make things easier.&lt;/p&gt;
&lt;p&gt;Basically, I'd been visualizing the states as cleanly switching between streams of different kinds of output (text and choices), when what actually seems to happen is that choices are generated throughout the course of streaming text output, then expected to be looked at when the text stream ends.
This was not obvious to me, because it's not immediately obvious how to author content that causes the distinction to matter.
The test that had me realize this accomplishes such a thing by generating the choices, then generating the content using a thread.
The choices will show up in the same place as usual in the interface, but they were actually generated first.&lt;/p&gt;
&lt;p&gt;I think all I need to do to handle this is to eliminate &lt;tt class="docutils literal"&gt;ChoiceState&lt;/tt&gt; and have &lt;tt class="docutils literal"&gt;LineState&lt;/tt&gt; go directly to &lt;tt class="docutils literal"&gt;ReadyState&lt;/tt&gt; when it can't continue.
I might change how I model this stuff, and have &lt;tt class="docutils literal"&gt;LineState&lt;/tt&gt; be the only state that's permissible in most functions, and have &lt;tt class="docutils literal"&gt;ReadyState&lt;/tt&gt; just wrap it.&lt;/p&gt;
&lt;p&gt;It's possible that I'll end up dropping more distinctions by the time I'm done working with this, but I want to try having them.&lt;/p&gt;
&lt;p&gt;I'm going to hope there are no more complications, but we'll see.
For now, I really should get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-03-27</title><link href="https://mwchase.neocities.org/coding-2020-03-27" rel="alternate"></link><published>2020-03-27T04:00:00-04:00</published><updated>2020-03-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-03-27:/coding-2020-03-27</id><summary type="html">&lt;p class="first last"&gt;The mistakes I've made on this code indicate that I casually think of a disturbing number of distinct abstract concepts as &amp;quot;basically the same thing.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Six passing tests.
One of them just worked with no further code changes.
Unfortunately, now I'm working with ChoicePoints, which means remembering the proper equivalent to ResolvePath.
It's too late at night, and I'm too tired, for me to try to work this out right now, but I'm pretty sure it can be done.&lt;/p&gt;
&lt;p&gt;It's just that I've fixed enough absent-minded typos in this code that I don't want to make more.&lt;/p&gt;
&lt;p&gt;Anyway, coverage is almost at 85%.
And I have nothing more to say.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-03-26</title><link href="https://mwchase.neocities.org/coding-2020-03-26" rel="alternate"></link><published>2020-03-26T04:00:00-04:00</published><updated>2020-03-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-03-26:/coding-2020-03-26</id><summary type="html">&lt;p class="first last"&gt;I think at some point the number of passing tests will ramp up noticeably.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Up to four passing tests against the Ink interpreter port.
Things started working a lot better after I started actually using the functions I wrote a while ago.&lt;/p&gt;
&lt;p&gt;So, the next one I'm trying to implement is related to random numbers, which means I need to port the random number code, which... eeeeeeeh.
I don't object to it on any specific grounds right now, it's just that it's a lot of fiddly stuff to ultimately get a number out at the end.
Even if I wanted to come up with my own take on it, I kind of can't, because it's supposed to be compatible with the test output.&lt;/p&gt;
&lt;p&gt;Anyway, I'll get to that later, when I've got a bit more energy.&lt;/p&gt;
&lt;p&gt;I'm thinking about getting the style checkers to accept the code, but that'll also take some effort and thought.&lt;/p&gt;
&lt;p&gt;I'm messing with other stuff, and I think it might be possible for me to get back into Nova Drift on this laptop.
We'll see how that goes in a few days, I think.&lt;/p&gt;
&lt;p&gt;Anyway, I was up too late last night and paid the price, so I'm going to wrap things up now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-03-25</title><link href="https://mwchase.neocities.org/coding-2020-03-25" rel="alternate"></link><published>2020-03-25T04:00:00-04:00</published><updated>2020-03-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-03-25:/coding-2020-03-25</id><summary type="html">&lt;p class="first last"&gt;The lack of documentation I left myself sometimes really hurts, but oh well.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, I've got the lookahead logic at least sort of sometimes working.
That's three whole tests ported over.
I feel like I should add some more anecdata about how raw coverage metrics aren't helpful: right now, this is at 77% branch coverage.
As an Ink interpreter, this code is still basically useless.&lt;/p&gt;
&lt;p&gt;I don't know if I have much to say about this.
I'm really not following good commit message practices.
If I get this in a state where I put it out in the world, I'll probably do a fresh repo starting from whatever state the project is in.
I don't want to explain what's going on in the commit that's just labeled &amp;quot;HSDJKLFHSLKJDHFLKJDSHFLKDSJHFLKSDJHFLKSJDLKS&amp;quot;.
(Mostly, I was confronting the consequences of my hubris.)&lt;/p&gt;
&lt;p&gt;Anyway, I'm still pretty excited about this whole project.
I've already made some pretty sweeping changes to the design, and I'm fairly sure there are more improvements to make, both in the stuff I've yet to port, and the stuff I've already ported.
(Teaser of the kinds of stuff I've done: the Pointer type has no need to exist in my design. I'm replacing it entirely with AbsolutePath, which is one of the two distinct subclasses of Path I have. I kind of suspect that I should be able to eliminate usage of the base class entirely, but I think I need more code ported before I can be sure. I'm also trying to get as far as I can without having the Object base class; much of its functionality was folded into Path.)&lt;/p&gt;
&lt;p&gt;Anyway, I should wrap up now.
It's late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2020-03-24</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-03-24" rel="alternate"></link><published>2020-03-24T04:00:00-04:00</published><updated>2020-03-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-03-24:/weekly-roundup-2020-03-24</id><summary type="html">&lt;p class="first last"&gt;Scrabbling for structure in weeks of blurred-together days...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I made some minor adjustments to the Ink port code. I broke things, and decided not to delay the entry trying to fix them.&lt;/li&gt;
&lt;li&gt;Thursday: I fixed the issue that was entirely my fault, then started trying to work out what I actually need to track as part of the state object. This is tricky because the member declarations seem to be scattered throughout the class bodies, which in some of these files are nested, and also I'm not used to languages with implicit self. Also, the whole &amp;quot;we need a zero-argument constructor for deserialization&amp;quot; thing adds a whole extra layer of indirection. (My code does not explicitly attempt to have zero-argument constructors.)&lt;/li&gt;
&lt;li&gt;Friday: Putting that stuff into practice was helpful, because I'd messed up the layout of LineState, because it's hard to guess whether something is a member or a getter/setter when I don't have a clear idea of where to look for the definitions.&lt;/li&gt;
&lt;li&gt;Saturday: I cut over to the new layout, and got things exactly as broken as before.&lt;/li&gt;
&lt;li&gt;Sunday: A bit of work conlanging, focusing on the broad contours of what is and isn't in the syntax.&lt;/li&gt;
&lt;li&gt;Monday: A little bit more of that, but not much.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm really getting into this Ink port stuff, so I see no reason to stop right now.
I'm up to two out of three ported tests passing; I'm kind of hoping to get some kind of Pareto situation where most of the effort is in getting the basics to work, and things are just minor tweaks by the time I get to the hundredth test.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Conlanging 2020-03-23</title><link href="https://mwchase.neocities.org/conlanging-2020-03-23" rel="alternate"></link><published>2020-03-23T04:00:00-04:00</published><updated>2020-03-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-03-23:/conlanging-2020-03-23</id><summary type="html">&lt;p class="first last"&gt;Another day mostly lost to Minecraft. I ought to take a break...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, real quick because I mostly did other stuff today and it's late.
I went through the syntactic bestiary from the Syntax Construction Kit some more.
Most of the ones I looked over today, I decided to skip for now because I don't have a clear picture of the aesthetics in those areas.&lt;/p&gt;
&lt;p&gt;I guess I'm hoping to see something that I can latch onto as interesting, aesthetically pleasing, and distinct from languages that I know.&lt;/p&gt;
&lt;p&gt;I should wrap up for now.
Next time, I should take inventory of the stuff I more-or-less know how to do, so I know what to focus on next.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Conlanging 2020-03-22</title><link href="https://mwchase.neocities.org/conlanging-2020-03-22" rel="alternate"></link><published>2020-03-22T04:00:00-04:00</published><updated>2020-03-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-03-22:/conlanging-2020-03-22</id><summary type="html">&lt;p class="first last"&gt;Maybe there's some way to replicate the complexity of do-support in other contexts. Something to do with measure words, perhaps...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I started going over a listing of transformations/constructions to consider for conlangs, and figuring out how they would or wouldn't apply to what I'm working on right now.
I think when I actually get this into a publishable state (... whenever that ends up being), I should try to write up my justifications for the various decisions that went into the design.&lt;/p&gt;
&lt;p&gt;One thing I ended up thinking about was another bit of The Syntax Construction Kit, the book I got the list from, where the author seems kind of sad as a conlanger that do-support is a feature of English, because it's objectively pretty strange and interesting.
Here are rules that you can't use most verbs in certain ways, so you have to bring in a helper verb, and that results in all kinds of transformations of the sentence.
But all of this weirdness is a feature of one of the most widely-spoken languages in the world.
Given that one of the failure modes in attempting to make a naturalistic conlang is to make a cipher of one's native language, it feels kind of wrong to intentionally reach for that sort of thing.&lt;/p&gt;
&lt;p&gt;Which is something that I'm really cognizant of in my attempts to riff on Standard Average European.
I didn't include do-support (since it's not a part of Standard Average European, as near as I can tell), but researching Standard Average European turned up quite a few things for me that I hadn't realized were mostly confined to Europe.&lt;/p&gt;
&lt;p&gt;Anyway, I'll get back to this tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Coding 2020-03-21</title><link href="https://mwchase.neocities.org/coding-2020-03-21" rel="alternate"></link><published>2020-03-21T04:00:00-04:00</published><updated>2020-03-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-03-21:/coding-2020-03-21</id><summary type="html">&lt;p class="first last"&gt;I really should have documented some of my thought process. Oh well.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got distracted from porting Ink for most of today again, but I seem to be doing okay at getting in short bursts of work.
I switched things over to the &amp;quot;CommonState&amp;quot; setup, and updated enough calls to &lt;tt class="docutils literal"&gt;dataclasses.replace&lt;/tt&gt; that the tests behaved the same.
I should &lt;em&gt;probably&lt;/em&gt; turn those replace calls into methods on the objects in question, because they're really hairy, and the type-checking around them doesn't seem super strict?
Anyway, I made some judgment calls on how to move forward from there, and I might have to come back to some of this later and fix it up, but now I'm getting helpful error messages again, so I'm going to just go with it for now.&lt;/p&gt;
&lt;p&gt;I'm going to see if I can squeeze some work on this around the conlanging tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-03-20</title><link href="https://mwchase.neocities.org/coding-2020-03-20" rel="alternate"></link><published>2020-03-20T04:00:00-04:00</published><updated>2020-03-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-03-20:/coding-2020-03-20</id><summary type="html">&lt;p class="first last"&gt;Got to get things done right before I can have fun...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was mostly doing not-this-hobby-code today, so I just now quickly put together the layout of the common state class I worked out last night.
In doing so, I discovered that some of the state I'd been tracking in LineState, I should not have been.&lt;/p&gt;
&lt;p&gt;So, I'm kind of pondering how to update stuff, when all of the states are going to wrap a helper class that contains twelve attributes, some somewhat complex.
Now, to start with I'm going to just keep nesting calls to &lt;tt class="docutils literal"&gt;dataclasses.replace&lt;/tt&gt;, but it's fun to imagine more involved implementations, like having a helper method that takes all attribute names and does dispatches on them.
Or a helper that, rather than mapping names to values, maps names to functions that transform the value.&lt;/p&gt;
&lt;p&gt;More value for now in getting the flow of data correct, which it right now... isn't.
Anyway, I let things go late, so I should once again wrap up a short post.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-03-19</title><link href="https://mwchase.neocities.org/coding-2020-03-19" rel="alternate"></link><published>2020-03-19T04:00:00-04:00</published><updated>2020-03-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-03-19:/coding-2020-03-19</id><summary type="html">&lt;p class="first last"&gt;I'm not sure how well I've motivated the whole multiple-state concept, but it makes sense to me, and that's what's most important here.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;After last night's post, I figured out what I was doing wrong: I had two arguments in the wrong order.
When I swapped them, it worked fine.&lt;/p&gt;
&lt;p&gt;Before I touch anything else, I want to figure out what is in the StoryState class that I care about.
I'm going to do that in here.
Fair warning: I don't really know .NET or C#, so I'm going to be playing fast and loose with some of the terminology.&lt;/p&gt;
&lt;p&gt;All right, so the following attributes get touched inside the Copy method:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;outputStream (manipulating this appears to also involve OutputStreamDirty()); this is a getter around _outputStream.&lt;/li&gt;
&lt;li&gt;_currentChoices; this is a variable.&lt;/li&gt;
&lt;li&gt;hasError and currentErrors; hasError is free in Python, syntactically speaking, and currentErrors is a semi-protected variable.&lt;/li&gt;
&lt;li&gt;callStack and _originalCallstack; callStack is a variable, and _originalCallstack is a slot that's needed for some function calls or something.&lt;/li&gt;
&lt;li&gt;variablesState (which has stuff to do with callStack and story.listDefinitions); variablesState is a variable.&lt;/li&gt;
&lt;li&gt;evaluationStack and _originalEvaluationStackHeight; evaluationStack is a semi-protected variable and _originalEvaluationStackHeight is another sometimes-needed thing.&lt;/li&gt;
&lt;li&gt;divertedTargetObject; this is a variable.&lt;/li&gt;
&lt;li&gt;previousContentObject; this is a calculated value that lives in the callStack, so I'm not entirely sure why Copy is setting it explicitly when it should, just... have the right value because the callStack gets copied...&lt;/li&gt;
&lt;li&gt;visitCounts; this is a semi-protected variable.&lt;/li&gt;
&lt;li&gt;turnIndices; this is a semi-protected variable.&lt;/li&gt;
&lt;li&gt;currentTurnIndex; this is a semi-protected variable.&lt;/li&gt;
&lt;li&gt;storySeed; this is a variable.&lt;/li&gt;
&lt;li&gt;previousRandom; this is a variable.&lt;/li&gt;
&lt;li&gt;didSafeExit; this is a variable.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the jsonToken property, we get...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;_currentChoices (above)&lt;/li&gt;
&lt;li&gt;callStack (above)&lt;/li&gt;
&lt;li&gt;choiceThreads isn't an attribute, rather it's derived from _currentChoices and callStack&lt;/li&gt;
&lt;li&gt;callStack (above)&lt;/li&gt;
&lt;li&gt;variablesState (above)&lt;/li&gt;
&lt;li&gt;evaluationStack (above, though I got thrown off for a sec because the serialization names don't match the variable names for... some reason)&lt;/li&gt;
&lt;li&gt;_outputStream (above)&lt;/li&gt;
&lt;li&gt;divertedTargetObject (above)&lt;/li&gt;
&lt;li&gt;visitCounts (above)&lt;/li&gt;
&lt;li&gt;turnIndices (above)&lt;/li&gt;
&lt;li&gt;currentTurnIndex (above)&lt;/li&gt;
&lt;li&gt;storySeed (above)&lt;/li&gt;
&lt;li&gt;previousRandom (above)&lt;/li&gt;
&lt;li&gt;didSafeExit is not in there, that I see&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, I came up with the idea to divide the StoryState behavior into three (now four) states: LineState, ChoiceState, ReadyState, and EndState.
When the story is in LineState, it has produced zero or more lines of text since the last state it was in, and could produce zero or more lines before transitioning to ChoiceState or EndState.
In EndState, the state is functionally inert, until it's brought back to LineState by setting the path.
In ChoiceState, it has produced zero or more choices since the last LineState, and could produce zero or more choices before transitioning to ReadyState; I don't think it can go directly to EndState, but implementing that if I need it shouldn't be a problem.
Actually, what should it do if it tries to transition without producing a Choice...?
In ReadyState, it has (hopefully!) produced at least one Choice, and, given one of those choices, it will transition to either LineState or EndState; the latter transition might not be necessary, depending on how diverts to END are coded.&lt;/p&gt;
&lt;p&gt;For serialization purposes, I don't think it poses any problems to deserialize no choices as a LineState, and some choices as a ChoiceState.
The &amp;quot;real&amp;quot; state might be EndState or ReadyState, but it'll immediately enter them if needed.
I could be wrong.
We'll see.&lt;/p&gt;
&lt;p&gt;Anyway, the conclusion I draw here is that all the states need most of these values, except for _currentChoices.
So, I should probably define a helper that tracks all of that state and use that in the State classes, since I expect most data to need to persist through transitions.&lt;/p&gt;
&lt;p&gt;Anyway, that's a good thing to work on the next few days.
For now, I should get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-03-18</title><link href="https://mwchase.neocities.org/coding-2020-03-18" rel="alternate"></link><published>2020-03-18T04:00:00-04:00</published><updated>2020-03-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-03-18:/coding-2020-03-18</id><summary type="html">&lt;p class="first last"&gt;The fabled red to red refactor...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today, I did stuff in Minecraft, mostly.
I did end up doing some basic reorganization of the Ink port's code; just moved a few classes into their own modules.&lt;/p&gt;
&lt;p&gt;I made a draft of the new state I'm going to want.
I think before I charge ahead on implementing this kind of sweeping change, I want to work on having a concrete plan for some of this stuff.&lt;/p&gt;
&lt;p&gt;For the moment, I'm trying to get the type annotations a little more detailed to hopefully avoid unpleasant surprises.
That didn't go so well, because I ran into some unexpected behavior in code that's all on me, so I'm going to spend a few minutes trying to diagnose that after I finish this entry.&lt;/p&gt;
&lt;p&gt;Which is... right... about... now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2020-03-17</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-03-17" rel="alternate"></link><published>2020-03-17T04:00:00-04:00</published><updated>2020-03-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-03-17:/weekly-roundup-2020-03-17</id><summary type="html">&lt;p class="first last"&gt;A week almost totally indoors...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I switched to doing more coding during the week, and started off mostly just criticizing wemake-python-styleguide.&lt;/li&gt;
&lt;li&gt;Thursday: I write some tests.&lt;/li&gt;
&lt;li&gt;Friday: I switched to porting Ink again, and spent the first day of that battling technical difficulties.&lt;/li&gt;
&lt;li&gt;Saturday: I got a test to pass.&lt;/li&gt;
&lt;li&gt;Sunday: I got distracted, so I ended up just drafting some glosses.&lt;/li&gt;
&lt;li&gt;Monday: I improved the glosses, and posted them, because I could.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to have to make some design changes to the Ink port.
I'd also like to do a refactor of it to make it easier to find stuff, but I'd be a little bit more comfortable with refactoring if there were more than one green test currently.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Conlanging 2020-03-16</title><link href="https://mwchase.neocities.org/conlanging-2020-03-16" rel="alternate"></link><published>2020-03-16T04:00:00-04:00</published><updated>2020-03-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-03-16:/conlanging-2020-03-16</id><summary type="html">&lt;p class="first last"&gt;A bunch of abbreviations.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I made glosses, minor revisions, and updates to my grammar notes.
Somehow, making detailed glosses was exhausting.
I don't know if that's typical, something that can just be like that for some people, or a reaction to the prospect of not leaving the house for the next week.&lt;/p&gt;
&lt;p&gt;For the heck of it, I'll paste (and lightly edit) the glosses I wrote.
I doubt they'll make much sense without the context of what I have worked out about the grammar, but eh.
They're still a little rough, but most of the important ideas are there.
The source is the beginning of a sermon based around the folklore of the con-culture.
When I have some time, I'll change some of the hyphens to dots, but which should be which is a matter of derivational morphology, which I'm punting on.
The &amp;quot;g#&amp;quot; markers are arbitrary gender markers, because I don't have a lexicon.
The pronouns are kind of wobbly right now, and some of them are almost certainly under-specified currently.
I didn't figure out what I want to call &amp;quot;every&amp;quot; in the context of the glosses, but I knew how I wanted to treat it.
(According to my notes, &amp;quot;result-verb&amp;quot; ought to be &amp;quot;should&amp;quot;, but I don't know if I'm keeping that.)&lt;/p&gt;
&lt;blockquote&gt;
art-def-g1-nom first-g1-nom sin-g1 be-3s be-prep art-def-g2-nom hubris-g2-nom.
art-def-g1-nom devil-g1-nom think-3s refl-3s-acc be-prep art-irr-g1-nom great-g1-nom com-(?) art-def-g2 god-def-g2.
g1-nom result-3s art-def-g1-nom wield-inf-g1-nom art-def-g2-dat creation-g2-dat art-def-pl-acc tools-pl-acc.
art-def-g1-nom god-g1-nom result-3s art-def-g1-nom punish-inf-g1-nom g2-acc inst-prep art-def-n-dat cast-inf-n-dat into-prep art-g3-dat world-g3-dat imperfect-g3-dat relative-acc g2-nom create-3s.
art-pl-nom army-pl-nom hell-g1-gen be-3p be-prep art-pl-nom reflection-pl-nom diminished-pl-nom g2-gen.
pl-nom seek-3p art-def-n-nom usurp-inf-n-nom art-def-g1-dat god-g1-dat art-def-g2-acc creation-g2-acc for-prep art-def-n-nom improve-inf-n-nom refl-3p-acc.
g1-nom believe-3s art-irr-n-nom bolster-inf-n-nom (every)-g2-nom bit-g2-nom creation-g3-gen god-g4-gen relative-acc g1-nom incorporate-3s into-prep art-def-g5-dat refl-3p-gen refl-3p-dat art-def-pl-acc power-pl-acc creative-pl-acc.&lt;/blockquote&gt;
&lt;p&gt;It'd be kind of cool if I could say that this is all part of a method I've worked out to conlanging, but I really haven't done enough of it.
Basically, I'm feeling my way around, seeing what's easy to do that seems promising.
I want to do some analysis of these glosses, then figure out what other features I want to show off, write sentences for those, analyze them, and try getting the analysis loaded into software.&lt;/p&gt;
&lt;p&gt;Anyway, that's it for now.
I'm sleepy and I can't reasonably expect to get any given task all the way to completion in the next few minutes.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Conlanging 2020-03-15</title><link href="https://mwchase.neocities.org/conlanging-2020-03-15" rel="alternate"></link><published>2020-03-15T04:00:00-04:00</published><updated>2020-03-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-03-15:/conlanging-2020-03-15</id><summary type="html">&lt;p class="first last"&gt;Literal translation of the sentence I'm worried about: &amp;quot;He believes some bolster every bit creation's God's what he incorporates into the world hisselves himself the powers creative.&amp;quot; (EDIT2: Moved &amp;quot;himself&amp;quot; from the end of the sentence. EDIT1: Final word changed from &amp;quot;hisselves&amp;quot;.) It makes sense in context. Actually, I'm a little shocked by the level of nuance and clarity that got lost in the process.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So.
Weekend conlanging.
I didn't get so much of that done, because I got distracted porting over more of Ink.&lt;/p&gt;
&lt;p&gt;I did manage to work out candidate structures for some of the in-setting sentences I came up with.
They seem pretty good to me, though I'm worried that one of the more complicated ones (a bunch of nested clauses) might be a &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Garden-path_sentence"&gt;garden path&lt;/a&gt; or a &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Syntactic_ambiguity#In_headlines"&gt;crash blossom&lt;/a&gt;, and I might need to consider some kind of rewrite or repair rule.&lt;/p&gt;
&lt;p&gt;Since I've been interested in syntax recently, I'll try analyzing them according to different syntactic frameworks, once I have proper glosses and not just a list of parts of speech.&lt;/p&gt;
&lt;p&gt;That's not now, though, because it's almost midnight, again.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Coding 2020-03-14</title><link href="https://mwchase.neocities.org/coding-2020-03-14" rel="alternate"></link><published>2020-03-14T04:00:00-04:00</published><updated>2020-03-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-03-14:/coding-2020-03-14</id><summary type="html">&lt;p class="first last"&gt;Turns out the code won't complain about parts not being written, if you don't actually try to execute them...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Weird technical issues are dealt with.
It turns out I was actually really close to getting the first interesting test to pass; I just needed to tweak the default display of floating point numbers.&lt;/p&gt;
&lt;p&gt;Now, the next test works with variables, which I haven't really handled at all.
Doing this requires a surprising amount of &lt;em&gt;stuff&lt;/em&gt;.
Variable initialization is handled by diverting to &amp;quot;global decl&amp;quot;, so I'm going to need to handle that.
Once I get that working, it'll hit the variable assignments, and I'll have to implement those... which means actually storing the variables.
Hopefully, after that, it'll just kind of go, but it's quite hard to say.&lt;/p&gt;
&lt;p&gt;Once this is in a workable state, I think it'd be very interesting to port it to other languages, because I believe the way I'm writing it is relatively language-agnostic.
But, I can't do that soon, and I shouldn't do anything else tonight, because it's late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-03-13</title><link href="https://mwchase.neocities.org/coding-2020-03-13" rel="alternate"></link><published>2020-03-13T04:00:00-04:00</published><updated>2020-03-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-03-13:/coding-2020-03-13</id><summary type="html">&lt;p class="first last"&gt;It is a little frustrating to be sidetracked from doing actual work by weird technical issues.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I decided today that I wanted to switch gears from the auto-roller to revisiting my attempt to port Ink to Python.
I ended up getting on that kind of late in the day, and it went kind of like this:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Update repo&lt;/li&gt;
&lt;li&gt;Realize I'd been in the middle of some changes&lt;/li&gt;
&lt;li&gt;Turns out the repo is corrupted&lt;/li&gt;
&lt;li&gt;Fix it using an arbitrary sequence of steps that kind of seems like it maybe shouldn't work, but does&lt;/li&gt;
&lt;li&gt;I should probably get my online backups synchronized before I mess with this any more&lt;/li&gt;
&lt;li&gt;... He said, by typing into a new file that exists in the same directory tree.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, migrating to flit in the middle of whatever I'd been doing seems to have worked, so I just need to work out what I was doing and finish doing it.
That's going to have to be tomorrow or later, because right now my backups are busy synching a bunch of files that they absolutely should not be synching, but whatever.
I'm going to try something with this repo to deal with that, and if it works, I'll do it for the other repos.
Basically, I'm pretty sure this doesn't follow symlinks, even if it sometimes looks like it says it does.
So, volatile folders should be symlinked to outside of the backed-up directories.
I probably should have done this all the way in the first place, with no half measures, but, effort.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to try to let this finish up, then wrap up for tonight and get to actual work on this stuff tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-03-12</title><link href="https://mwchase.neocities.org/coding-2020-03-12" rel="alternate"></link><published>2020-03-12T04:00:00-04:00</published><updated>2020-03-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-03-12:/coding-2020-03-12</id><summary type="html">&lt;p class="first last"&gt;Coming up with test cases for this code isn't as fun as it was for Structured Data.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Still took things easy today, evidently.&lt;/p&gt;
&lt;p&gt;I did spend some time getting the auto-roller test coverage up a little.
It's kind of tricky to psych myself up to do, because a lot of the observeable behavior of the auto-roller code is kind of trivial, so I have to look at the source code, sigh, think &amp;quot;the tests for that would be incredibly simplistic&amp;quot;, and then muscle my way to &amp;quot;so, I shouldn't worry about writing them, and just get it over with&amp;quot;.&lt;/p&gt;
&lt;p&gt;Since I spaced out reading wiki articles for the last fifteen minutes, that's it, I guess.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-03-11</title><link href="https://mwchase.neocities.org/coding-2020-03-11" rel="alternate"></link><published>2020-03-11T04:00:00-04:00</published><updated>2020-03-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-03-11:/coding-2020-03-11</id><summary type="html">&lt;p class="first last"&gt;A bunch of links to cover up the fact that I zoned out 100%-ing Snakebird Primer over the course of two hours of play time.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I let things go late today, so I'm going to have to wrap things up quickly.
For the latest attempt at conlang software, I think I mentioned that I'd like to try using an existing conlang as test data.
For now, I just grabbed &lt;a class="reference external" href="https://www.zompist.com/verdurian.htm"&gt;Verdurian&lt;/a&gt;.
We'll see how that goes when I actually work on it instead of playing Snakebird.&lt;/p&gt;
&lt;p&gt;I've also been thinking about coding standards and exercises, like &lt;a class="reference external" href="https://www.cs.helsinki.fi/u/luontola/tdd-2009/ext/ObjectCalisthenics.pdf"&gt;Object Calisthenics&lt;/a&gt;, and the fact that I'm still kind of iffy on the &lt;a class="reference external" href="https://wemake-python-stylegui.de/en/latest/"&gt;wemake-python-styleguide&lt;/a&gt;.
One thing that I keep on mentally nitpicking is the justification for wrapping lines at 80 characters.
Now, to be clear, I don't mind that kind of length limit, though I would like it if I could remember that docstrings are supposed to wrap at 72 instead, I think.
I mean, I think the wrapping that makes sense for code samples on this blog, when (&lt;em&gt;when&lt;/em&gt;) I remember to do it, is like 40 characters.
I don't mind the limit.
What I take issue with is the idea that &amp;quot;The first and the most obvious complexity metric for a line is its length.&amp;quot; (&lt;a class="reference external" href="https://sobolevn.me/2019/10/complexity-waterfall#lines"&gt;Complexity Waterfall&lt;/a&gt;)
Complex lines have internal structure that allows for easy splitting onto multiple lines.
In trying to use (more or less) WPS, I pretty consistently got that the lines of problematic length were extremely simple, but involved long names or literals.&lt;/p&gt;
&lt;p&gt;Also, I still think it's rich to criticize &lt;a class="reference external" href="https://github.com/psf/black"&gt;black&lt;/a&gt; for violating &lt;a class="reference external" href="https://www.python.org/dev/peps/pep-0008/"&gt;PEP 8&lt;/a&gt; from the same project that mandates always having an encoding comment.
(&lt;a class="reference external" href="https://wemake-python-stylegui.de/en/latest/pages/usage/integrations/auto-formatters.html#black"&gt;black criticism&lt;/a&gt;, &lt;a class="reference external" href="https://github.com/tk0miya/flake8-coding#rules"&gt;encoding comment violation&lt;/a&gt;, &lt;a class="reference external" href="https://www.python.org/dev/peps/pep-0008/#id22"&gt;PEP 8 on encoding comments&lt;/a&gt;)
(Or, I guess they're getting rid of that in the next version? Or something?)&lt;/p&gt;
&lt;p&gt;Also, &lt;a class="reference external" href="https://wemake-python-stylegui.de/en/latest/pages/usage/violations/best_practices.html#wemake_python_styleguide.violations.best_practices.PositionalOnlyArgumentsViolation"&gt;WPS451&lt;/a&gt; is getting disabled the instant I have to deal with it.
It's not &lt;em&gt;impossible&lt;/em&gt; to replicate &lt;tt class="docutils literal"&gt;def method(self, an_arg, /, **kwargs)&lt;/tt&gt; without using positional-only syntax, but it is &lt;em&gt;highly&lt;/em&gt; unpleasant, and worse code.
Code is better when the surface appearance reflects the intent, and &amp;quot;using the syntax&amp;quot; reflects the intent far better than &amp;quot;weird decorator where you have to define the kwargs dictionary as a positional argument&amp;quot;.&lt;/p&gt;
&lt;p&gt;Anyway, before I mess around with rewriting the auto-roller any more, actual tests, right, yes.
But that's not happening now, because it's already way too late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Weekly Roundup 2020-03-10</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-03-10" rel="alternate"></link><published>2020-03-10T04:00:00-04:00</published><updated>2020-03-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-03-10:/weekly-roundup-2020-03-10</id><summary type="html">&lt;p class="first last"&gt;So... tired... and... forgetful...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Even more than usual, I don't really remember what I did this week.
Changing the clocks &lt;em&gt;sucks&lt;/em&gt;.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I circled back around to &amp;quot;I should really work on documenting my conlangs&amp;quot;&lt;/li&gt;
&lt;li&gt;Thursday: &amp;quot;I think to do that I'll need to switch this to the weekend and do something more bite-sized during the week.&amp;quot; An interesting idea. Let's try following up on it.&lt;/li&gt;
&lt;li&gt;Friday: I looked into new Python web frameworks.&lt;/li&gt;
&lt;li&gt;Saturday: I looked into Python web frameworks that I &lt;em&gt;think&lt;/em&gt; aren't as new.&lt;/li&gt;
&lt;li&gt;Sunday: I added some weird code to the auto-roller that allowed for technical simplifications.&lt;/li&gt;
&lt;li&gt;Monday: I replaced the weird code with more straightforward code that put some somewhat bothersome requirements on niche cases, in return for simplifying the code base considerably.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I've been reading about &amp;quot;object calisthenics&amp;quot;, so I might try applying that to the auto-roller.
The code is already ahead of the curve on some metrics.
There are no instance variables or setters, and most of the classes are tiny.
First, though, I really should work on the coverage.
It's at 75%, but most of the 25% remaining is the bulk of the business logic.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2020-03-09</title><link href="https://mwchase.neocities.org/coding-2020-03-09" rel="alternate"></link><published>2020-03-09T04:00:00-04:00</published><updated>2020-03-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-03-09:/coding-2020-03-09</id><summary type="html">&lt;p class="first last"&gt;Tanking my coverage stats by deleting questionable-but-tested code&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I hacked some more on the auto-roller code.
I basically got rid of some of the functionality I added earlier, in favor of something that's a little more transparent, I think.
As an added bonus, it eliminated a bunch of low-level classes, meaning that they no longer need to get instantiated, and some of the functionality is more useful on its own.&lt;/p&gt;
&lt;p&gt;I did manage to kind of mess up my pijul state, by forgetting to add a new file, and then getting a bunch of mysterious conflicts that made no sense to me.
All like, &amp;quot;did you mean this text block, or this identical text block?&amp;quot;&lt;/p&gt;
&lt;p&gt;Ubfortunately, I dont have much time to reflect on this because it's getting late and I'm tired.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-03-08</title><link href="https://mwchase.neocities.org/coding-2020-03-08" rel="alternate"></link><published>2020-03-08T05:00:00-04:00</published><updated>2020-03-08T05:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-03-08:/coding-2020-03-08</id><summary type="html">&lt;p class="first last"&gt;I'm not at all confident in my usage of the contextvars library, but the tests do all pass...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Not a terribly focused day.
I did some writing along with some coding, and unfortunately I'm very sleepy so it's hard to talk about it.
I made some improvements to my auto-roller code; mostly some way-too-complicated stuff that means I can get rid of some boilerplate, and also this code could transparently support using a library like greenlet for true coroutines.
I think.
The code that allows this to happen is in the intersection of &amp;quot;typechecks&amp;quot;, &amp;quot;appears to work&amp;quot;, and &amp;quot;gives me the willies&amp;quot;.
Just now I got a bit more of the old Mythic code ported.
My plan there is to figure out porting the interactive frontend, and then adapt that to other systems.&lt;/p&gt;
&lt;p&gt;I realized that I should wrap things up, though, when I tried to copy a sentence over, and I typed it so it came out lpjiing lhsu tsgis.
I'm not getting any less sleepy, so I really should go to bed, especially since I'm going to lose an hour.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-03-07</title><link href="https://mwchase.neocities.org/coding-2020-03-07" rel="alternate"></link><published>2020-03-07T05:00:00-05:00</published><updated>2020-03-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-03-07:/coding-2020-03-07</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Here's an example where you make ten buttons in a loop!&amp;quot; Sheesh...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Not a really exciting day today.
I cleaned up some of my code and read more about JustPy.
I think I'm having trouble translating the arbitrary example code into stuff that's of interest to me.
I'm not up for trying too hard to do this tonight, but I should probably try to design the site I want to use this for, and then see about making it happen.&lt;/p&gt;
&lt;p&gt;I also looked around for similar frameworks, and I found &lt;a class="reference external" href="https://flexx.readthedocs.io/en/stable/index.html"&gt;Flexx&lt;/a&gt;, which I think could be useful for some other project ideas that I've had on the back burner for some time.&lt;/p&gt;
&lt;p&gt;Anyway, thinking about the reference stuff, I guess first I need to have some data to load up and check that it works the way I want it to.
For that, maybe it'd make sense to try using snippets of an existing reference grammar, so I'm not second-guessing myself about the content.&lt;/p&gt;
&lt;p&gt;Anyway, it's getting late, and I'm not going to try to stay up much longer.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-03-06</title><link href="https://mwchase.neocities.org/coding-2020-03-06" rel="alternate"></link><published>2020-03-06T05:00:00-05:00</published><updated>2020-03-06T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-03-06:/coding-2020-03-06</id><summary type="html">&lt;p class="first last"&gt;It's kimd of hard to play to my strengths in front-end development, but this blog manages it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;One thing that I've wanted with conlanging is something that makes it easy to interact with the language, to slice it in different ways, to trace the histories of words.
That is a lot of effort, such a thing would probably take months, minimum, but all the more reason to get started.&lt;/p&gt;
&lt;p&gt;I'm trying out a web interface for this, using a project I heard of recently called &lt;a class="reference external" href="https://justpy.io"&gt;JustPy&lt;/a&gt;.
JustPy sounds interesting to me because I am bad at JavaScript, and good at Python.
I've gotten through the first page or so of the tutorial, I think, and that's not  enough to make a call one way or the other.
One thing that I'm really not sure what I think about is the idea of using &lt;a class="reference external" href="https://tailwindcss.com/"&gt;Tailwind&lt;/a&gt;.
It might be relevant to note that the source code for this blog's CSS looks &lt;a class="reference external" href="https://mwchase.neocities.org/theme/css/main.scss"&gt;like this&lt;/a&gt;.
And that I enjoyed writing it.&lt;/p&gt;
&lt;p&gt;Anyway, that's enough talking for tonight.
So sleepy.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Conlanging 2020-03-05</title><link href="https://mwchase.neocities.org/conlanging-2020-03-05" rel="alternate"></link><published>2020-03-05T05:00:00-05:00</published><updated>2020-03-05T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-03-05:/conlanging-2020-03-05</id><summary type="html">&lt;p class="first last"&gt;Many troubling aspects...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Quick update on conlang stuff:
I haven't yet settled on a school of thought for syntax.
I've got notes that go in all sorts of directions.
Maybe what's important to me is transformations.
Or constructions.
Or argument types.&lt;/p&gt;
&lt;p&gt;I'm going to have to get this all settled down and organized, but I think to do that I'll need to switch this to the weekend and do something more bite-sized during the week.&lt;/p&gt;
&lt;p&gt;Also, I read enough about aspect that at this point I'm thinking &amp;quot;okay, let's try again and get it over with&amp;quot;.
I've got some more resources to go over if things end up really rough.&lt;/p&gt;
&lt;p&gt;Anyway, I'm struggling to stay awake, so I should stop doing that.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Conlanging 2020-03-04</title><link href="https://mwchase.neocities.org/conlanging-2020-03-04" rel="alternate"></link><published>2020-03-04T05:00:00-05:00</published><updated>2020-03-04T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-03-04:/conlanging-2020-03-04</id><summary type="html">&lt;p class="first last"&gt;Pondering writing an interactive website just so I can get nice tables, but edited in a text editor rather than through the browser.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Quick post today because things were kind of hectic and stressful, and I want to try to be more-or-less calm.&lt;/p&gt;
&lt;p&gt;I'm right now working on getting the (substantial) list of things that need to be done for Dabupan/The Tongue of Light written up in a single file.
I also spent a bunch of today pondering a good format for writing things up in, since I don't really enjoy using LibreOffice.
It's, like, it's fine.
It's fine.
It's not great.&lt;/p&gt;
&lt;p&gt;I've got some ideas for stuff to try there, but I'm going to need a bit more time to investigate.
I'm also reading up on different theories of syntax, and trying to figure out what makes sense for what I'm doing here.
My notes so far are kind of a combination of different schools of thought, but in more of a &amp;quot;didn't know what I was doing&amp;quot; than &amp;quot;principled&amp;quot; kind of way.
My hunch is that thinking about things in terms of transformations might make more sense from a diachronic perspective, but thinking in terms of constructions could be more useful synchronically.
I'm not sure if combining them like that works, but I think it'd be nice if it did.&lt;/p&gt;
&lt;p&gt;Anyway, anything further has to wait for tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Weekly Roundup 2020-03-03</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-03-03" rel="alternate"></link><published>2020-03-03T05:00:00-05:00</published><updated>2020-03-03T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-03-03:/weekly-roundup-2020-03-03</id><summary type="html">&lt;p class="first last"&gt;A very coding week.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I tried to work out the parts of speech in my made-up language, to hopefully avoid treating words in an ad-hoc way.&lt;/li&gt;
&lt;li&gt;Thursday: I asymptotically approached grappling with what the heck verbs are.&lt;/li&gt;
&lt;li&gt;Friday: I did an informal comparison of Poetry, flit, and enscons. I concluded that I prefer flit to Poetry, but I'll sometimes need something like enscons, at least temporarily. Four hours after the post went up, my PR to Poetry got approved. 🤷&lt;/li&gt;
&lt;li&gt;Saturday: I started switching from Poetry to flit.&lt;/li&gt;
&lt;li&gt;Sunday: I hacked on an auto-roller, and thought about style checkers.&lt;/li&gt;
&lt;li&gt;Monday: I revived some code that I'd put aside temporarily.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try using a &lt;a class="reference external" href="http://todotxt.org/"&gt;todo.txt&lt;/a&gt; for organizing work on conlanging, because it really hasn't been organized so far.
Also, I remembered that I'm trying to port the SCA to Python, so that might make its way into the coding.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Coding 2020-03-02</title><link href="https://mwchase.neocities.org/coding-2020-03-02" rel="alternate"></link><published>2020-03-02T05:00:00-05:00</published><updated>2020-03-02T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-03-02:/coding-2020-03-02</id><summary type="html">&lt;p class="first last"&gt;The level of my coverage metrics on this over the course of the day has me really freaked out about projects with 60% coverage. Like, what are they even testing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;More coding, pretty much.
I'm working on porting over previous versions of attempts at rollers.
I should see about showing this stuff off once I have good mutation testing coverage.&lt;/p&gt;
&lt;p&gt;I also grabbed a bunch more tabletop games today; I might look into writing auto-rollers for some of them, once I've adapted the stuff I've already written up for use.&lt;/p&gt;
&lt;p&gt;Anyway, it's once again later than I meant it to be.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-03-01</title><link href="https://mwchase.neocities.org/coding-2020-03-01" rel="alternate"></link><published>2020-03-01T05:00:00-05:00</published><updated>2020-03-01T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-03-01:/coding-2020-03-01</id><summary type="html">&lt;p class="first last"&gt;It just feels so good to be working on this stuff again.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Third coding entry this week, because I got just so excited about finally working on these projects again.
Nothing much to say about it, I guess.
I got coverage stats up from 2% to 90%.
Made some changes that I had planned for like a month.
I had some kind-of-janky code in there meant to work with my old Mythic V1 code, which I took out, but I want to try to bring it back.
When I do, I can make a cleaner implementation of that code.&lt;/p&gt;
&lt;p&gt;One thing I've been feeling from working with &lt;a class="reference external" href="https://wemake-python-stylegui.de/en/latest/"&gt;wemake-python-styleguide&lt;/a&gt; is that there are enough points where I'm looking at the documentation and getting frustrated, that I'd kind of like to try making my own style thing.&lt;/p&gt;
&lt;p&gt;Points to keep in mind for such a project:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Pick an auto-formatter, like &lt;a class="reference external" href="https://black.readthedocs.io/en/stable/"&gt;black&lt;/a&gt;, and don't warn for &lt;em&gt;anything&lt;/em&gt; that it handles. This includes line length and quote style. Basically, if it can be handled automatically, it should go in an auto-formatter, and if it can't, it... can't, and therefore shouldn't.&lt;/li&gt;
&lt;li&gt;I'd really like to figure out if it's possible to statically annotate scopes so as to indicate what kind of conventions, such as naming, to follow.&lt;/li&gt;
&lt;li&gt;It ideally should not crash when run against Sructured Data.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Is it mean of me to keep bringing that last one up?
Probably.
Will I stop?
Probably not.&lt;/p&gt;
&lt;p&gt;Anyway, I let writing this go late.
I should wrap up now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-02-29</title><link href="https://mwchase.neocities.org/coding-2020-02-29" rel="alternate"></link><published>2020-02-29T05:00:00-05:00</published><updated>2020-02-29T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-02-29:/coding-2020-02-29</id><summary type="html">&lt;p class="first last"&gt;Turns out things are more enjoyable when you're not constantly thinking about how your tools are doing extra &amp;quot;helpful&amp;quot; things that you don't want, not even a little bit.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I ended up just adapting a single project to flit today.
I pulled in a bunch of stuff from Structured Data, and discovered that my whole hack to get around &lt;tt class="docutils literal"&gt;pip install .&lt;/tt&gt; doesn't actually work on flit (yet, there's a PR), but the install is fast enough that it turns out not to matter in practice, at least for this project.
Now that I've got everything together nicely for this project, I just need to write tests for the code, and then I can start working on the various refactors I have in mind.&lt;/p&gt;
&lt;p&gt;I think the next repository I'll look into adapting is from my latest attempt to port/rewrite Ink.
In some ways that'll be a little tricky, because it's not that there are no tests, it's that the tests don't pass because I haven't ported enough logic over yet.
Oh well.&lt;/p&gt;
&lt;p&gt;At some point I'll want to try out mutation testing against something, but that requires tests, that work.
My best candidate is probably Structured Data.&lt;/p&gt;
&lt;p&gt;Once I've done as much with flit as possible (probably up to porting the Cell nucleus file for Python projects to use it), I'll try to learn SCons.
I wouldn't terribly mind putting that off.&lt;/p&gt;
&lt;p&gt;Speaking of putting things off, I need to post.
Now.&lt;/p&gt;
&lt;p&gt;(Last note, I feel like mentioning that my PR to Poetry finally got an approval shortly after the last post got published.
The merging is still blocked, which I don't feel like figuring out right now.)&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-02-28</title><link href="https://mwchase.neocities.org/coding-2020-02-28" rel="alternate"></link><published>2020-02-28T05:00:00-05:00</published><updated>2020-02-28T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-02-28:/coding-2020-02-28</id><summary type="html">&lt;p class="first last"&gt;Friendship ended with POETRY Now FLIT is my best friend&lt;/p&gt;
</summary><content type="html">&lt;p&gt;One of the long-standing problems developing Python projects has been the packaging libraries.
The default libraries are extremely flexible, but give users the ability to define nonsensical behavior, or omit vital data from the final package.&lt;/p&gt;
&lt;p&gt;With &lt;a class="reference external" href="https://www.python.org/dev/peps/pep-0517/"&gt;PEP 517&lt;/a&gt;, the situation changed.
Now, there's a standard to write packaging tools against, that gives them the ability to define packages in a declarative manner.
Various packaging alternatives have been developed, but I'm going to focus on just a few: &lt;a class="reference external" href="https://python-poetry.org/"&gt;Poetry&lt;/a&gt;, &lt;a class="reference external" href="https://flit.readthedocs.io/en/latest/index.html"&gt;flit&lt;/a&gt;, and &lt;a class="reference external" href="https://pypi.org/project/enscons/"&gt;enscons&lt;/a&gt;.
The first two focus on making it easy to develop simple projects, each taking a somewhat different approach, while enscons should allow for more complicated means of building, which is necessary for some of my projects.&lt;/p&gt;
&lt;p&gt;I'm most familiar with Poetry, because it was the first setuptools alternative I know of to support the src layout.
As such, that's what I used for a while.
However, in some ways it wasn't a good fit.
It has a number of features I ignored or worked against, such as managing virtual environments, and making editable installs of the project next to the dev dependencies, and some operations are extremely slow.
Part of my goal these next few days is to determine how much of the performance issues I ran across in Poetry several months ago are still a problem, and how specific they are to Poetry.&lt;/p&gt;
&lt;p&gt;My ultimate goal is to migrate most of my projects from Poetry to flit, and Dennis to enscons (and later to flit), but first I want to do some basic comparisons of the three tools.&lt;/p&gt;
&lt;p&gt;My basic plan is to make three separate projects the way I'd like to lay things out with each tool, and give them dependencies that pull a lot of stuff in.
Then, for each one, time &lt;tt class="docutils literal"&gt;pip install .&lt;/tt&gt; and the tool's build command, followed by pip installing the wheel.&lt;/p&gt;
&lt;p&gt;After going through the basics with the tools, I've come to the following conclusions:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;pip installing a wheel is about the same regardless of what produced it&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;pip install .&lt;/tt&gt; is kind of slow under flit&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;pip install .&lt;/tt&gt; is still &lt;em&gt;painfully&lt;/em&gt; slow under Poetry&lt;/li&gt;
&lt;li&gt;It is too late at night for me to figure out how to make enscons work. ... Okay, one more try.&lt;/li&gt;
&lt;li&gt;All right, I've concluded the following things about enscons: &lt;tt class="docutils literal"&gt;pip install .&lt;/tt&gt; is intermediate in speed between Poetry and flit, and the documentation is super confusing. &lt;tt class="docutils literal"&gt;python &lt;span class="pre"&gt;-m&lt;/span&gt; SCons&lt;/tt&gt; does not work &lt;em&gt;at all&lt;/em&gt;, but &lt;tt class="docutils literal"&gt;scons&lt;/tt&gt; appears to, so, note to my future self there.&lt;/li&gt;
&lt;li&gt;In summary, as janky as it is, the build-wheel-and-install &lt;em&gt;might&lt;/em&gt; still be worth it under flit, but I should probably judge that by adapting a project that uses it, and dropping it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I appreciate that enscons is there when I need it, but I hope to not need it much.
(Also, I'm assuming I can make it work with &lt;a class="reference external" href="http://coconut-lang.org/"&gt;Coconut&lt;/a&gt;, but I'm hoping that's a fair assumption.)&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Conlanging 2020-02-27</title><link href="https://mwchase.neocities.org/conlanging-2020-02-27" rel="alternate"></link><published>2020-02-27T05:00:00-05:00</published><updated>2020-02-27T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-02-27:/conlanging-2020-02-27</id><summary type="html">&lt;p class="first last"&gt;Almost ready to try to put everything together again...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I filled out my latest version of notes on conlanging some more today.
I noted some basic aspects of mood that I want to somehow implement, though I'm not sure how I want to do it, exactly.
My original idea was to have most aspect-mood information conveyed using auxiliary verbs, more or less, though I'm not sure if using an auxiliary to communicate the imperative mood is a thing much.&lt;/p&gt;
&lt;p&gt;One thing that just occurred to me as a possibility is to form contractions with pronouns and auxiliaries.&lt;/p&gt;
&lt;p&gt;Anyway, I thought I was going to finish this post twenty minutes ago and I spaced out.
I'm going to need to get better about getting sleep if I want to make more substantial posts...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Conlanging 2020-02-26</title><link href="https://mwchase.neocities.org/conlanging-2020-02-26" rel="alternate"></link><published>2020-02-26T05:00:00-05:00</published><updated>2020-02-26T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-02-26:/conlanging-2020-02-26</id><summary type="html">&lt;p class="first last"&gt;Getting right up to the edge of admitting I need to talk about some of this stuff soon.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I took another stab at working out the grammar of these made-up languages, this time taking the tack of documenting the parts of speech so I can try out different means of reasoning about the grammar.
Because grammatical peculiarities often have a historical basis, hopefully this will help when I get back around to attempting diachronics.&lt;/p&gt;
&lt;p&gt;Right now, I'm procrastinating a little when it comes to documenting the verbs, because aspect and mood are complicated.&lt;/p&gt;
&lt;p&gt;In any case, I'm really tired, so I'm going to call this post here.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Weekly Roundup 2020-02-25</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-02-25" rel="alternate"></link><published>2020-02-25T05:00:00-05:00</published><updated>2020-02-25T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-02-25:/weekly-roundup-2020-02-25</id><summary type="html">&lt;p class="first last"&gt;Going off in some direction.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: A little bit of conlanging background.&lt;/li&gt;
&lt;li&gt;Thursday: I got some more ideas down.&lt;/li&gt;
&lt;li&gt;Friday: I cut back on the scope of the changes I want to make to punq.&lt;/li&gt;
&lt;li&gt;Saturday: I made the changes. I don't yet feel comfortable openig a PR, for various reasons.&lt;/li&gt;
&lt;li&gt;Sunday: I mostly read, and thought about Python style guides.&lt;/li&gt;
&lt;li&gt;Monday: I read some more, and started writing some bizarre fanfiction.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to keep on trying to take it easy.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Diary 2020-02-24</title><link href="https://mwchase.neocities.org/diary-2020-02-24" rel="alternate"></link><published>2020-02-24T05:00:00-05:00</published><updated>2020-02-24T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-02-24:/diary-2020-02-24</id><summary type="html">&lt;p class="first last"&gt;Fey mood.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I seem to be planning and writing some ridiculous crossover fanfiction.
It might come together in a few months, or it might not.
For now, I'm just going to go where inspiration takes me.&lt;/p&gt;
&lt;p&gt;I spent most of today working on writeups for the fanfiction, so I've got no time to spend on this post right now.
Oh well.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2020-02-23</title><link href="https://mwchase.neocities.org/diary-2020-02-23" rel="alternate"></link><published>2020-02-23T05:00:00-05:00</published><updated>2020-02-23T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-02-23:/diary-2020-02-23</id><summary type="html">&lt;p class="first last"&gt;Taking it as easy as I can right now...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm recovering, I think.
I'm reading more than writing or doing any other such thing.&lt;/p&gt;
&lt;p&gt;One thing I've been thinking about is trying to put together some kind of a meta-style guide, and seeing whether existing style checkers for Python have the ability to implement what I write up.
I'm going to have to call this entry short.
I'm feeling kind of iffy right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2020-02-22</title><link href="https://mwchase.neocities.org/coding-2020-02-22" rel="alternate"></link><published>2020-02-22T05:00:00-05:00</published><updated>2020-02-22T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-02-22:/coding-2020-02-22</id><summary type="html">&lt;p class="first last"&gt;Simple, obvious, and wrong?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I spaced out doing other stuff today, so when I wanted to work on punq, I decided to just make the changes I had in mind and see what happened.&lt;/p&gt;
&lt;p&gt;It's sadly not quite as simple as I thought I was making it.
I took some time to make everything pass, but it's very much an &amp;quot;at what cost?&amp;quot; kind of deal.&lt;/p&gt;
&lt;p&gt;It's super late, so I don't want to elaborate right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-02-21</title><link href="https://mwchase.neocities.org/coding-2020-02-21" rel="alternate"></link><published>2020-02-21T05:00:00-05:00</published><updated>2020-02-21T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-02-21:/coding-2020-02-21</id><summary type="html">&lt;p class="first last"&gt;Trying to wrap up sooner...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was thinking about my proposed changes to punq earlier today, and suddenly realized that, in thinking about this, I'd somehow managed to be everyone in &lt;a class="reference external" href="https://xkcd.com/1172/"&gt;this xkcd comic&lt;/a&gt;, several times.
I was trying to design an over-complicated workaround for the fact that my desired usage of punq was sort of adjacent to the bug I found.&lt;/p&gt;
&lt;p&gt;So, today, I decided to do two quick things, since I've been really tired recently.
One was, I slightly rewrote the test I wrote against punq, so that it was a little more consistent with punq's other tests.
The other was, I replaced the &amp;quot;horrifying&amp;quot; part of my workflow with something that makes enough sense at runtime, I think, and sort of makes sense from a static analysis perspective.
Basically, instead of aliases, I'm differentiating types with NewTypes.
From a typing perspective, this is &lt;em&gt;technically&lt;/em&gt; backward, because I'm using the NewType as some kind of phantom superclass.
If this really bothers me, I can define an adaptor function something like&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# I didn&amp;#39;t test this.&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_typ&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;constructor&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Anyway, tomorrow I'll try to work on the more restricted ideas I came up with for punq today.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Conlanging 2020-02-20</title><link href="https://mwchase.neocities.org/conlanging-2020-02-20" rel="alternate"></link><published>2020-02-20T05:00:00-05:00</published><updated>2020-02-20T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-02-20:/conlanging-2020-02-20</id><summary type="html">&lt;p class="first last"&gt;Language is hard, yo.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I went over the little bit of text I wrote for Dabupan, and I've gotten some interesting ideas and thoughts out of it.
In no particular order:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The non-passivizing use of the copula (which I wasn't actually sure was a thing before)&lt;/li&gt;
&lt;li&gt;I want to copy the way Spanish has its words for &amp;quot;first&amp;quot; etc before the noun instead of after.&lt;/li&gt;
&lt;li&gt;I'm slightly more confused about aspect than I was before. I've got to hit bottom sometime!&lt;/li&gt;
&lt;li&gt;I got some ideas about dependent clauses. Except that the ideas make them somewhat less obvious to analyze as distinct from independent clauses, which I feel like is probably a good sign, because it means that I'm not exactly fitting into the molds of the languages I know.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To make progress here, I want to try to really get a handle on aspect and mood, and then try to create some diagrams.&lt;/p&gt;
&lt;p&gt;I just spent way too long trying to get a good workflow for ebooks on this laptop, oh well, better make the best of this.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Conlanging 2020-02-19</title><link href="https://mwchase.neocities.org/conlanging-2020-02-19" rel="alternate"></link><published>2020-02-19T05:00:00-05:00</published><updated>2020-02-19T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-02-19:/conlanging-2020-02-19</id><summary type="html">&lt;p class="first last"&gt;Okay, let's make this quick.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I drafted out the ideas of the historical figure I mentioned; I'm probably going to run them by other people before I commit to them.
Once I'm happy with the substance, I'm going to work on how to express the aspects and moods.&lt;/p&gt;
&lt;p&gt;Quick thoughts on the kinds of things I want to be able to express: cause and effect, proximity, some form of exclusiveness (Y was able to happen because X had stopped or completed), simultaneity, probably other things.&lt;/p&gt;
&lt;p&gt;Anyway, it is late.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Weekly Roundup 2020-02-18</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-02-18" rel="alternate"></link><published>2020-02-18T05:00:00-05:00</published><updated>2020-02-18T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-02-18:/weekly-roundup-2020-02-18</id><summary type="html">&lt;p class="first last"&gt;I think I was tired this week.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I started fleshing out the beliefs of the fictional culture that gave rise to the conlang, in the hopes that this would give me a more substantial hook for writing texts to render into the conlang.&lt;/li&gt;
&lt;li&gt;Thursday: I established the existence of one (1) fictional historical figure.&lt;/li&gt;
&lt;li&gt;Friday: I got myself up to speed on Structured Data, and started learning Lean for some reason.&lt;/li&gt;
&lt;li&gt;Saturday: I started sketching out ideas for a rework/maybe fork, maybe not, of punq.&lt;/li&gt;
&lt;li&gt;Sunday: I existed in time and space.&lt;/li&gt;
&lt;li&gt;Monday: I continued to exist in time and space.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I should figure out some way to pick up the pace in the solo RP stuff.
I've been working on it off and on, and right now it feels kind of... floaty, I guess.
It's possible that I've missed some rules related to plot progression.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Diary 2020-02-17</title><link href="https://mwchase.neocities.org/diary-2020-02-17" rel="alternate"></link><published>2020-02-17T05:00:00-05:00</published><updated>2020-02-17T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-02-17:/diary-2020-02-17</id><summary type="html">&lt;p class="first last"&gt;These days don't feel productive. I'm just kind of out of it, I guess.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I took some notes on punq just now.
I think the magnitude of changes to the interface is smaller than I thought, but it will take some pretty extreme internal adjustment to make it all work.&lt;/p&gt;
&lt;p&gt;Besides that, I didn't do much that was &amp;quot;creative&amp;quot; today, I don't think.
I think I'm just more in the mood to read stuff like weird RPG rulebooks, at least for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2020-02-16</title><link href="https://mwchase.neocities.org/diary-2020-02-16" rel="alternate"></link><published>2020-02-16T05:00:00-05:00</published><updated>2020-02-16T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-02-16:/diary-2020-02-16</id><summary type="html">&lt;p class="first last"&gt;Today sure was a day, I think.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm not totally sure what happened today.
I guess I was kind of unfocused, but I did get a bit done on everything I wanted to.
So, that's good?&lt;/p&gt;
&lt;p&gt;I think tomorrow I would like to take notes on how punq works, and how I'd like to change it.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Coding 2020-02-15</title><link href="https://mwchase.neocities.org/coding-2020-02-15" rel="alternate"></link><published>2020-02-15T05:00:00-05:00</published><updated>2020-02-15T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-02-15:/coding-2020-02-15</id><summary type="html">&lt;p class="first last"&gt;It's kind of hard for me to fit all of the ideas here in my head.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Another slow day in terms of the blog stuff.
I might see about stretching this over the weekend.&lt;/p&gt;
&lt;p&gt;I did do some design/planning for my punq changes/fork.
Mostly focused around realizing that I'm going to have to be very careful implementing all of this.
I'll just dump the notes I was taking in here.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Type References are used at definition time, at registration time, and at resolution time.&lt;/p&gt;
&lt;p&gt;Type References at definition time are resolved contextually.
Other type references are resolved globally.&lt;/p&gt;
&lt;p&gt;One-part names, resolved contextually, must &lt;em&gt;fall back&lt;/em&gt; to resolving against the builtins module.
Resolved globally, they must be resolved against the builtins module.&lt;/p&gt;
&lt;p&gt;Resolution involves locating a module, getting the name from it, and extracting the qualname.
The canonical name of a Type reference is the right-most segment in its name, followed by the canonical names of its &lt;tt class="docutils literal"&gt;__args__&lt;/tt&gt; values, if any.
Next, the &lt;tt class="docutils literal"&gt;__qualname__&lt;/tt&gt; of the actual class object.
Finally, the canonical names of the arguments to the type.&lt;/p&gt;
&lt;p&gt;Miscellaneous notes:
List[Any] -&amp;gt; list. In other words, if a generic type is subscripted entirely with Any, it should be replaced with its &lt;tt class="docutils literal"&gt;__origin__&lt;/tt&gt;.
It looks a little tricky to determine this.&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;
&lt;p&gt;int -&amp;gt; int:int
list -&amp;gt; list:list
List -&amp;gt; list:list
List[int] -&amp;gt; typing.List:typing.List:[int]
List[T] -&amp;gt; not implemented&lt;/p&gt;
&lt;p&gt;given Writer = Tuple[T, str], Writer[int] -&amp;gt; mod.Writer[mod.T, str]:typing.Tuple:[int]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-02-14</title><link href="https://mwchase.neocities.org/coding-2020-02-14" rel="alternate"></link><published>2020-02-14T05:00:00-05:00</published><updated>2020-02-14T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-02-14:/coding-2020-02-14</id><summary type="html">&lt;p class="first last"&gt;Super distracted.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, I thought today I was going to work out the details of the reworking I want to do of punq, and I did work out some good ideas in my head, but mostly I ended up getting reacquainted with Structured Data and getting the tests to pass again, and &lt;a class="reference external" href="http://wwwf.imperial.ac.uk/~buzzard/xena/natural_number_game/"&gt;learning Lean&lt;/a&gt; for some reason.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Conlanging 2020-02-13</title><link href="https://mwchase.neocities.org/conlanging-2020-02-13" rel="alternate"></link><published>2020-02-13T05:00:00-05:00</published><updated>2020-02-13T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-02-13:/conlanging-2020-02-13</id><summary type="html">&lt;p class="first last"&gt;I don't like writing short entries, but I also don't like feeling like I'm going to pass out.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Extensive conlanging was preempted by game night and then spacing out, but I got a bit done.
I came up with a historical figure who used a version of the conlang, so next I want to work on his writings.&lt;/p&gt;
&lt;p&gt;But for now, I need to get to bed asap.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Conlanging 2020-02-12</title><link href="https://mwchase.neocities.org/conlanging-2020-02-12" rel="alternate"></link><published>2020-02-12T05:00:00-05:00</published><updated>2020-02-12T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-02-12:/conlanging-2020-02-12</id><summary type="html">&lt;p class="first last"&gt;This has gotten a little ridiculous.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Quick entry, because yet again I let things go late.
I decided that I'd probably enjoy trying to come up with &amp;quot;translations&amp;quot; more if I came up with stuff from the fictional culture to use, rather than existing stuff.&lt;/p&gt;
&lt;p&gt;So, now I've got some idea of the beliefs and folklore of this fictional European region.
I'll have to develop them a bit more, because right now it's kind of shallow and broad in how it draws from stuff, which, fair, since I've been working on this for like ten minutes.&lt;/p&gt;
&lt;p&gt;Unfortunately, I'm already out of time.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Weekly Roundup 2020-02-11</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-02-11" rel="alternate"></link><published>2020-02-11T05:00:00-05:00</published><updated>2020-02-11T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-02-11:/weekly-roundup-2020-02-11</id><summary type="html">&lt;p class="first last"&gt;Orienting and re-orienting&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I realized that I needed to consider mood more in conlanging.&lt;/li&gt;
&lt;li&gt;Thursday: I summed up parts of the paper I've been referring to.&lt;/li&gt;
&lt;li&gt;Friday: I got my environment a bit more set up for coding.&lt;/li&gt;
&lt;li&gt;Saturday: I wrote tests demonstrating what I believe is a bug in punq.&lt;/li&gt;
&lt;li&gt;Sunday: I did a little bit of the solo RP stuff, and started thinking about how I'm assigning numbers to things, and other rules to mess with in some other context.&lt;/li&gt;
&lt;li&gt;Monday: I did stuff, and didn't have time to write about it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to do a bit of RP every day, and come up with something different for the weekend.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Solo RP 2020-02-10</title><link href="https://mwchase.neocities.org/solo-rp-2020-02-10" rel="alternate"></link><published>2020-02-10T05:00:00-05:00</published><updated>2020-02-10T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-02-10:/solo-rp-2020-02-10</id><summary type="html">&lt;p class="first last"&gt;Bite-size roleplaying.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Solo RP, I did a bit of it.
Now that I'm getting a bit better of a handle on the rules, I'm thinking I'll look at the system hacking stuff, just to see how far the system can be pushed.&lt;/p&gt;
&lt;p&gt;Writing things up tonight, I figured out some stuff about my character concept that's really obvious in retrospect.
He's trying to be the mentor character who seeks out the chosen one and unlocks their potential, but he's really young.&lt;/p&gt;
&lt;p&gt;It's getting kind of late, so I'm going to just cut things off now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Solo RP"></category></entry><entry><title>Solo RP 2020-02-09</title><link href="https://mwchase.neocities.org/solo-rp-2020-02-09" rel="alternate"></link><published>2020-02-09T05:00:00-05:00</published><updated>2020-02-09T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-02-09:/solo-rp-2020-02-09</id><summary type="html">&lt;p class="first last"&gt;Maybe I should pick a new topic for weekends and try to make this into more of a pick-up-and-play thing throughout the week...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I mostly took things easy today, but I did get a bit done with the solo rp.
I think I need some more experience handling normal misses.
I got a miss on a ward roll, and ended up thinking, &amp;quot;Uh, suffer -1 supply&amp;quot; and just going with that.
I feel like I don't have a sense of how I should be deciding what kind of consequence failure should have.
I suppose if it's negative, it's all right.&lt;/p&gt;
&lt;p&gt;Now that I'm getting a satisfactory amount written, I feel like maybe my procrastination impulses are getting channeled into other rules and design challenges for the auto-roller.
Like, maybe trying to get my ECS ideas into a fit state so I can try to build a character sheet in that out of the various &amp;quot;sort of let you just stick different rulesets together&amp;quot; systems I've been looking at, like Retrocausality or stuff from Word Mill.
Got to keep focused.
Play these things off each other, like the fact that I'm not really enthused about doing hobby work in Python until my PR to give Poetry a &amp;quot;please don't try to install the package in the development environment&amp;quot; mode goes through.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Solo RP"></category></entry><entry><title>Coding 2020-02-08</title><link href="https://mwchase.neocities.org/coding-2020-02-08" rel="alternate"></link><published>2020-02-08T05:00:00-05:00</published><updated>2020-02-08T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-02-08:/coding-2020-02-08</id><summary type="html">&lt;p class="first last"&gt;Turns out if I'm not sure what's the best way forward, &lt;em&gt;then&lt;/em&gt; I can write a test before an implementation.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today, I mostly got distracted by Exapunks again, but I also had a chance to put together a &lt;a class="reference external" href="https://travis-ci.com/mwchase/punq/builds/148016105"&gt;reproduction&lt;/a&gt; of the punq issue I had.&lt;/p&gt;
&lt;p&gt;This should help nail down the desired behavior, because I think I was kind of vague in the actual ticket.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-02-07</title><link href="https://mwchase.neocities.org/coding-2020-02-07" rel="alternate"></link><published>2020-02-07T05:00:00-05:00</published><updated>2020-02-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-02-07:/coding-2020-02-07</id><summary type="html">&lt;p class="first last"&gt;Augh, it's late again.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;After last week, I understand better how punq works in terms of type hints, and I believe it shouldn't work quite like it does.
However, I worry that my current solution may be more disruptive than the bugs I've found.&lt;/p&gt;
&lt;p&gt;As such, the first thing I want to do is put together a reproduction of the issue.
I believe it requires multiple modules to fully manifest, so I'll have to add a bunch of auxiliary junk to the test directory.&lt;/p&gt;
&lt;p&gt;I didn't actually do any of that today, because I was busy setting up more tooling.
Speaking of which, here's my current status with git:
At work, I managed to break every GUI I tried, so now I'm using the same three or so commands from the command line and trying not to think about it too hard.
For personal stuff, the GitHub Desktop client has been fine, in the past, but it doesn't seem to have a linux version, so I went and installed &lt;a class="reference external" href="https://hub.github.com/"&gt;hub&lt;/a&gt;.
I'll only be using it for other people's projects, like punq.
For my own, I prefer to use &lt;a class="reference external" href="https://hg-git.github.io/"&gt;hg-git&lt;/a&gt;.
For new projects that I don't feel like putting on GitHub, I'm using &lt;a class="reference external" href="https://pijul.org/"&gt;pijul&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Anyway, as I was saying, I was doing other things for a lot of the day, then focusing on this tooling, so I haven't yet added tests to punq to determine that there could be a bug.
That's step one tomorrow, and then, I'll try fixing it.
We'll see how it goes, but for now, I've let things go too late once again.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Conlanging 2020-02-06</title><link href="https://mwchase.neocities.org/conlanging-2020-02-06" rel="alternate"></link><published>2020-02-06T05:00:00-05:00</published><updated>2020-02-06T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-02-06:/conlanging-2020-02-06</id><summary type="html">&lt;p class="first last"&gt;Linguistics is still hard.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm not going to have a chance to do much today, because I was taking things easy, and then also watching a very silly movie.
Let's have a look at the aspect-moods in Yucatec.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Perfective: considering a completed action&lt;/li&gt;
&lt;li&gt;Imperfective: considering an ongoing or potential action&lt;/li&gt;
&lt;li&gt;Terminative: considering the consequences of an action, I think&lt;/li&gt;
&lt;li&gt;Progressive: considering a definite ongoing action&lt;/li&gt;
&lt;li&gt;Prospective: considering potential or ongoing actions&lt;/li&gt;
&lt;li&gt;Necessitive: considering a needed action&lt;/li&gt;
&lt;li&gt;Obligative: considering an action that must be carried out&lt;/li&gt;
&lt;li&gt;Assurative: considering an action that the speaker is assuring the listener will (did?) occur&lt;/li&gt;
&lt;li&gt;Desiderative: considering an action that the speaker wants to happen&lt;/li&gt;
&lt;li&gt;Penative: considering an action that nearly occurs&lt;/li&gt;
&lt;li&gt;Remote future: considering an action that happens with such remoteness that its happening is uncertain&lt;/li&gt;
&lt;li&gt;Proximate future: considering an action that happens soon after another action&lt;/li&gt;
&lt;li&gt;Immediate past: considering an action that happens soon before another action&lt;/li&gt;
&lt;li&gt;Recent past: considering an action that happens somewhat longer before another action&lt;/li&gt;
&lt;li&gt;Remote past: considering an action that happens long before another action&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The basic set of aspects I had in mind for Dabupan were perfective, imperfective, prospective, terminative, repetitive, habitual.
The moods I'd like to work with are indicative, imperative, subjunctive, honestly most of the moods up there seem pretty good, so I'll have to think about them more later.&lt;/p&gt;
&lt;p&gt;One idea I'm toying with is decoupling temporal or causal &amp;quot;distance&amp;quot; from &amp;quot;direction&amp;quot;, and perhaps representing that as some kind of connective.&lt;/p&gt;
&lt;p&gt;This is all still really confusing.
Maybe I'll understand things better after a few more reads (I still haven't read the paper all the way through), but I wonder if the &amp;quot;tenselessness&amp;quot; that I want to replicate is an emergent property of the language, rather than something I could just kind of, break up into distinct indepedent components and make sure they work on their own.
It's possible the paper says so one way or the other, and I just haven't gotten to it or understood.&lt;/p&gt;
&lt;p&gt;I get the impression that ideas of &amp;quot;tenselessness&amp;quot; and &amp;quot;temporal anaphora&amp;quot; are operating at a level of detail that I don't fully grasp.
The distinctions seem subtler than I initially expected.&lt;/p&gt;
&lt;p&gt;Okay, I have to stop now, it's super late and I'm not ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Conlanging 2020-02-05</title><link href="https://mwchase.neocities.org/conlanging-2020-02-05" rel="alternate"></link><published>2020-02-05T05:00:00-05:00</published><updated>2020-02-05T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-02-05:/conlanging-2020-02-05</id><summary type="html">&lt;p class="first last"&gt;I'm not sure how many times I've been told some of this stuff, but it's a lot.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I made a little more progress reading about Yucatec, and I realized something from the reading, that I think I must have been willfully ignoring somehow.
Aspect and mood are related, so I should be considering mood in the context of aspect, and I can't design them as totally orthogonal systems.
I mean I could, but it would be gratuitously unnatural, and harder to get &amp;quot;right&amp;quot; than combining them would be.&lt;/p&gt;
&lt;p&gt;If I'm reading the paper right, each &amp;quot;aspect-mood&amp;quot; marker implies a &amp;quot;status&amp;quot;.
The &amp;quot;statuses&amp;quot; are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;completive&lt;/li&gt;
&lt;li&gt;incompletive&lt;/li&gt;
&lt;li&gt;subjunctive&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm not up for it right now, but I think what I should do next is categorize the different AM markers by aspect and mood, and figure out how I want to express the concepts and which I want to grammatialize.&lt;/p&gt;
&lt;p&gt;One idea that occurs to me is that it might be interesting to condense &amp;quot;not X but rather Y&amp;quot; into a conjunction of some kind, which could be used to express concepts like &amp;quot;tried and failed&amp;quot; within the verb's arguments, instead of on the verb.&lt;/p&gt;
&lt;p&gt;For now, though, I should get ready for bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Weekly Roundup 2020-02-04</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-02-04" rel="alternate"></link><published>2020-02-04T05:00:00-05:00</published><updated>2020-02-04T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-02-04:/weekly-roundup-2020-02-04</id><summary type="html">&lt;p class="first last"&gt;Do printers have fumes? If so, I might be woozy from them.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I realized that I didn't have a firm enough grasp on aspect in general.&lt;/li&gt;
&lt;li&gt;Thursday: I started reading an actual paper instead of constantly rewatching some youtube videos. It's... a lot.&lt;/li&gt;
&lt;li&gt;Friday: I vagued about the wemake-python-styleguide.&lt;/li&gt;
&lt;li&gt;Saturday: I reviewed the Ironsworn rules, to notice that I missed a kind of roll to code. I also found probably-a-bug in punq.&lt;/li&gt;
&lt;li&gt;Sunday: I realized that I'd missed some of the rules to Ironsworn, which is a problem.&lt;/li&gt;
&lt;li&gt;Monday: I got myself a little more caught up on the rules to Ironsworn.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(The next day, spent several hours trying to print Exapunks feelies on a printer that reacts to double-sided printing by &lt;em&gt;freaking out&lt;/em&gt;, and also crashing, and also only half of some pages would print from linux???)&lt;/p&gt;
&lt;p&gt;Next week, I've got something I want to try in terms of coding.
I'll get to that when I get to it.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Solo RP 2020-02-03</title><link href="https://mwchase.neocities.org/solo-rp-2020-02-03" rel="alternate"></link><published>2020-02-03T05:00:00-05:00</published><updated>2020-02-03T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-02-03:/solo-rp-2020-02-03</id><summary type="html">&lt;p class="first last"&gt;A little procrastinatey, but hopefully this is the last of it for a while.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I took today easy again, but I did take the time to review most of the rules, and get reference material printed out and put in the binder I have. I might try transferring the rulebook to my e-reader, but probably not.&lt;/p&gt;
&lt;p&gt;I figured I'd wait to see if I had anything else to say.
I guess I don't.
Here's hoping I do better next weekend.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Solo RP"></category></entry><entry><title>Solo RP 2020-02-02</title><link href="https://mwchase.neocities.org/solo-rp-2020-02-02" rel="alternate"></link><published>2020-02-02T05:00:00-05:00</published><updated>2020-02-02T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-02-02:/solo-rp-2020-02-02</id><summary type="html">&lt;p class="first last"&gt;Someone has to know all of the rules, and it hasn't been me...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I had a bit of a rough day today, so instead of more RP, I reviewed the Ironsworn rules and founds some stuff that I missed.
The rules are put together well enough that I don't have anything blatantly wrong as a result of missing what I missed, and it so happens that I don't have a strong desire for a do-over of anything so far, but it's something to keep in mind for later.
I also noted one other roll that I'm going to have to add to the auto-roller.&lt;/p&gt;
&lt;p&gt;I'm thinking I'll print some stuff out and add a new section to my reference binder, because it is nice to be able to look over this stuff without having light blasted in my face.&lt;/p&gt;
&lt;p&gt;For now, though, I'll just read this stuff off my screen, and take care of printing it out tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Solo RP"></category></entry><entry><title>Coding 2020-02-01</title><link href="https://mwchase.neocities.org/coding-2020-02-01" rel="alternate"></link><published>2020-02-01T05:00:00-05:00</published><updated>2020-02-01T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-02-01:/coding-2020-02-01</id><summary type="html">&lt;p class="first last"&gt;I feel like maybe it should be doing the resolutions based on the defining module? Or, I guess typing defines things so it works well? I'll have to actually try it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I think I've been a little burned out on coding recently.
I guess it's partly that I'm frustrated because I don't want to use Poetry until my pull request against it gets merged and released, and it seems to me to be still in a kind of bikeshedding phase.&lt;/p&gt;
&lt;p&gt;If I want to do more, I should probably switch languages for a bit.&lt;/p&gt;
&lt;p&gt;To get something done, I reviewed my reference material for the old solo RP.
I basically just established that Risus uses d6s, and the rest uses mostly d10s and d100s, with a single d20 added as a result of the exensive mixing of sources for the fate check.
Most sections had at least a little bit that could be entered into a tabular data file.&lt;/p&gt;
&lt;p&gt;I was considering a bit the best practices for the library I'm putting together.
Because there's always at least some level of reliance on strings for the registrations, at least the way I write this stuff, the class names and aliases should probably be namespaced, which will probably look a little clunky.
I may want to look into changing how I do the dependency injection, since it's (almost) totally decoupled from the class definitions.&lt;/p&gt;
&lt;p&gt;For some context, here's what some of these classes look like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;
&lt;span class="normal"&gt;22&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@typing_extensions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;final&lt;/span&gt;
&lt;span class="nd"&gt;@attr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataclass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;slots&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;frozen&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Roll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Handle rolling a dice for some reason.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;

    &lt;span class="n"&gt;_random&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Random&lt;/span&gt;
    &lt;span class="n"&gt;_roll_log&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;RollLog&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__call__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;purpose&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Log the purpose of the roll, and the outcome.&lt;/span&gt;

&lt;span class="sd"&gt;        Args:&lt;/span&gt;
&lt;span class="sd"&gt;            top: The maximum value of the die to roll.&lt;/span&gt;
&lt;span class="sd"&gt;            purpose: The reason the die is being rolled.&lt;/span&gt;

&lt;span class="sd"&gt;        Returns:&lt;/span&gt;
&lt;span class="sd"&gt;            The outcome of rolling the die.&lt;/span&gt;
&lt;span class="sd"&gt;        &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_roll_log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Rolling &lt;/span&gt;&lt;span class="si"&gt;{purpose}&lt;/span&gt;&lt;span class="s2"&gt;.&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;purpose&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;purpose&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;roll&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;randint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_roll_log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Rolled &lt;/span&gt;&lt;span class="si"&gt;{roll}&lt;/span&gt;&lt;span class="s2"&gt;.&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;roll&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;roll&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;roll&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;This is written to be mostly compliant with &lt;a class="reference external" href="https://wemake-python-stylegui.de/en/latest/"&gt;wemake-python-styleguide&lt;/a&gt;, which I think is a combination of interesting ideas, overreach, and I'm pretty sure it still crashes on Structured Data.&lt;/p&gt;
&lt;p&gt;Anyway, I was just looking over the source code to &lt;a class="reference external" href="https://punq.readthedocs.io/en/latest/"&gt;punq&lt;/a&gt;, and I'm not convinced I understand its usage of type hints.
I'm going to have to experiment with it and see if I find some kind of shortcoming or edge case.
(Probably related to giving two classes the same name.)
But I'm too tired right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-01-31</title><link href="https://mwchase.neocities.org/coding-2020-01-31" rel="alternate"></link><published>2020-01-31T05:00:00-05:00</published><updated>2020-01-31T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-01-31:/coding-2020-01-31</id><summary type="html">&lt;p class="first last"&gt;Situation: there are fourteen competing style guides...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I wasn't really focused today, so I got just a little work done on the coding front.&lt;/p&gt;
&lt;p&gt;One change I wanted to make to the auto-roller code was to turn some of the code that I pulled in from the old Mythic setup into data files.
That will let me make the code much more compact, and stop wemake-python-styleguide from raising quite so many warnings/errors/whatever.&lt;/p&gt;
&lt;p&gt;Speaking of wemake-python-styleguide, I kind of disagree with some of the underlying philosophy, so I'm trying to put together my own ideas.&lt;/p&gt;
&lt;p&gt;One aspect that I'm currently kind of skeptical of is the sense I get of a one-size-fits-all approach.
Like that all code of a broad category is &amp;quot;basically the same&amp;quot;, and that means that if code in that category deviates from the set standard, either the code must be changed, or the standard has to be changed across the board.
I don't know if that's the actual process, that's just how it seems from my reading of the documentation and experience filing bugs so far.&lt;/p&gt;
&lt;p&gt;Speaking for myself, one idea that occurred to me is to have some kind of comment-based annotation syntax that could communicate verifiable assertions that it's not reasonable to expect the linter to check itself.
Like, &amp;quot;this class is an enum&amp;quot; or &amp;quot;this decorator applies classmethod&amp;quot; or &amp;quot;this is a context manager&amp;quot;.
Ideally, such things could have default configuration, and also some kind of per-project or library-based component, so there could be custom stuff like &amp;quot;this is an adt.Sum&amp;quot;.
(Structured Data convention is that Ctors are CamelCase, though I don't think anything actually enforces that; I could be wrong.)&lt;/p&gt;
&lt;p&gt;I'll have to look into this idea tomorrow.
Right now it's late and I'm sleepy.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Conlanging 2020-01-30</title><link href="https://mwchase.neocities.org/conlanging-2020-01-30" rel="alternate"></link><published>2020-01-30T05:00:00-05:00</published><updated>2020-01-30T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-01-30:/conlanging-2020-01-30</id><summary type="html">&lt;p class="first last"&gt;Dragging myself kicking and screaming into &amp;quot;learning how to study&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm working on understanding Jürgen Bohnemeyer's &lt;em&gt;Temporal anaphora in a tenseless language&lt;/em&gt;.
A summary of it was what got me wanting to make a language that relies on aspect rather than deictic tense.
Since I'm mostly self-taught when it comes to linguistics, it's pretty slow going, and I'm probably going to need to read the whole thing several times before I understand it well enough.&lt;/p&gt;
&lt;p&gt;One problem I think I'm having is that I was able to get by academically with terrible note-taking habits for too many years.
(See also, my comments from the Solo RP post a few days ago.)
Anyway, what this means is that right now it feels like I'm kind of cargo-culting the act of note-taking, based on my vague memories of other people's descriptions.
Is it helping?
We'll have to wait and see.&lt;/p&gt;
&lt;p&gt;Anyway, because I was doing other stuff tonight, that's all I really had time for.
Oh well.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Conlanging 2020-01-29</title><link href="https://mwchase.neocities.org/conlanging-2020-01-29" rel="alternate"></link><published>2020-01-29T05:00:00-05:00</published><updated>2020-01-29T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-01-29:/conlanging-2020-01-29</id><summary type="html">&lt;p class="first last"&gt;Linguistics is hard.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I took a stab at assigning Dabupan aspects to the sentences in Schleicher's fable, and I've come to two conclusions.&lt;/p&gt;
&lt;p&gt;One is that I need a better intuitive grasp on aspect, because I have confused myself mightily.&lt;/p&gt;
&lt;p&gt;The other is that I need a better idea of how I want to handle relative clauses, because my impulse was to mostly break them out into their own sentence.
I'm going to have to figure out how to make this work with aspect, and it's possible I'm going to need to redo some of the aspect verbs.&lt;/p&gt;
&lt;p&gt;Thinking about how I would paraphrase a relative clause that had associated aspects...&lt;/p&gt;
&lt;p&gt;&amp;quot;The man who builds a house&amp;quot;
&amp;quot;The man who is building a house&amp;quot;
&amp;quot;The man who builds houses&amp;quot;
&amp;quot;The man who constantly builds houses&amp;quot;
&amp;quot;The man who builds as house as a result&amp;quot;
&amp;quot;The man who caused this by building a house&amp;quot;&lt;/p&gt;
&lt;p&gt;These phrases don't sound invalid, but my inclination is that the second should be the easiest to say, and if I'm going to do that, I need to shuffle around the aspect verbs.&lt;/p&gt;
&lt;p&gt;So, what I need to figure out now is how to have imperfective be unmarked, and mark perfective.&lt;/p&gt;
&lt;p&gt;Another possibility is that I'll want to have multiple paradigms of aspect, depending on the lexical aspect of the meaning verb.&lt;/p&gt;
&lt;p&gt;This is all a lot to consider right now, and for the moment, I'll wrap up, and tomorrow do some more research.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Weekly Roundup 2020-01-28</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-01-28" rel="alternate"></link><published>2020-01-28T05:00:00-05:00</published><updated>2020-01-28T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-01-28:/weekly-roundup-2020-01-28</id><summary type="html">&lt;p class="first last"&gt;A little better than recent weeks, I think.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I figured out some details of the conlang, which is pretty much how these go lately.&lt;/li&gt;
&lt;li&gt;Thursday: I put together some stuff to work on in the coming week.&lt;/li&gt;
&lt;li&gt;Friday: I tried out a... design pattern, I guess.&lt;/li&gt;
&lt;li&gt;Saturday: I switched my blog publishing pipeline over to my new laptop, and tried to remember how things worked in the previous solo RP.&lt;/li&gt;
&lt;li&gt;Sunday: I made an appreciable amount of progress on the current solo RP.&lt;/li&gt;
&lt;li&gt;Monday: &amp;quot;Yeah! Suffering!&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'll try to keep things up.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Solo RP 2020-01-27</title><link href="https://mwchase.neocities.org/solo-rp-2020-01-27" rel="alternate"></link><published>2020-01-27T05:00:00-05:00</published><updated>2020-01-27T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-01-27:/solo-rp-2020-01-27</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;Yeah! Suffering!&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So I was saying yesterday that the last thing I did in the session should have triggered a compel roll.
Well, I did that, and...&lt;/p&gt;
&lt;p&gt;So one consequence of Ironsworn's rules is that any time you make an action roll, there is a one percent chance that the outcome will be incredibly bad, and no bonus can mitigate it.
I think one indicator of how much I've bought into Ironsworn's ideas is that my response to getting that roll was &amp;quot;Yeah! Suffering!&amp;quot;&lt;/p&gt;
&lt;p&gt;So, now there's a guy who wants to kill my character.
As one does.&lt;/p&gt;
&lt;p&gt;I didn't get a chance to do too much more because we had a bit of a rough night, and I want to take it easy, but I feel like I'm kind of over the hump now.
Of course, we've got more stuff planned for next weekend, but I don't want to worry about that right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Solo RP"></category></entry><entry><title>Solo RP 2020-01-26</title><link href="https://mwchase.neocities.org/solo-rp-2020-01-26" rel="alternate"></link><published>2020-01-26T05:00:00-05:00</published><updated>2020-01-26T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-01-26:/solo-rp-2020-01-26</id><summary type="html">&lt;p class="first last"&gt;Session 1: attained!&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I put myself up to it, and worked on the solo RP for a bit over an hour, with a little time in there to code up oracle rolls, which are basically just percentiles where sometimes it matters if the digits match.&lt;/p&gt;
&lt;p&gt;There were some nice twists and details in what I got written.
(Although, I just noticed that I should have ended with a Compel.
I need to have a better handle on all of the moves.)&lt;/p&gt;
&lt;p&gt;I think maybe I should contrast this with my earlier attempt to use Risus.
Now, I got further with Risus than I have so far, but thing going on with Risus is that the NPCs are constructed pretty much like the PCs, which isn't too cumbersome from a bookkeeping perspective because you could fit several character sheets on an index card.
However, it does mean that the GM is somewhat expected to run NPCs like a stable of PCs, which turns out to be kind of awkward when the entire game is one person doing a bunch of mental juggling.
Some of the commentary I've seen on Ironsworn points out that NPCs can't use combat moves, which is fine by me, since it gets rid of some weirdness I encountered running Risus solo.&lt;/p&gt;
&lt;p&gt;Although I suppose part of the weirdness I hit is down to my general tendency to forget that &lt;em&gt;writing things down&lt;/em&gt; is a thing.
Maybe if I'd actually determined an initiative order...&lt;/p&gt;
&lt;p&gt;In any case, this is feeling good so far, and I'm gratified that I actually got some amount written.
I'm going to call the entry a little early and read for a bit, because I don't want to take things up to or past the wire again.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Solo RP"></category></entry><entry><title>Coding 2020-01-25</title><link href="https://mwchase.neocities.org/coding-2020-01-25" rel="alternate"></link><published>2020-01-25T05:00:00-05:00</published><updated>2020-01-25T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-01-25:/coding-2020-01-25</id><summary type="html">&lt;p class="first last"&gt;I switched over to the new laptop. It was an experience.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, there's still some work to do to migrate all of my stuff over to this laptop, but I got the blog publishing working.
And I'm not just saying that because this wouldn't be online if I were wrong.
I tested this beforehand.&lt;/p&gt;
&lt;p&gt;Anyway, I've got my roller ready for tomorrow, so for now I'm going to plan out some stuff to mess around with.
The previous solo RP rules I was using were some somewhat aggressive homebrew, that also just straight-up included some entire systems.
I'm going to start by planning how to pull stuff into my auto-roller repo from all that.&lt;/p&gt;
&lt;p&gt;First, one thing I realized, is that to get wemake-python-styleguide happy, I'm going to need to put some of the tabular data this is going to use, into data files that get parsed at runtime.&lt;/p&gt;
&lt;p&gt;Anyway, let's see what I need to model Risus.
Risus has several kinds of roll.
Unopposed rolls use a number of d6 determined by the character, to try to beat a difficulty number set by the GM.
Because the rules give multiple targets for a single example (that is, one example features different targets for different levels of success), the &amp;quot;beats&amp;quot; logic should probably live at a different level than the &amp;quot;roll the dice and add them up&amp;quot; logic.
This core logic is the same for the combat system, the main differences being around the interpretation of the outcomes.
The one thing that needs to be added is &amp;quot;roll some number of dice, and drop all non-6 results&amp;quot;.&lt;/p&gt;
&lt;p&gt;That should be sufficient for the parts of Risus I was using.
I'll move on for now.&lt;/p&gt;
&lt;p&gt;The remainder of the reference binder I put together is a blend of The Adventure Crafter and Mythic, that I don't fully remember some of the details for.
Let's see how I was using this.
So, the starting Chaos Factor is set to 5, which is the norm for most themes; I don't remember if I was going to enforce the minimum Chaos Factor of the Mystery theme.
Anyway, it starts by generating a turning point for the initial scene.
There's no Chaos roll initially.
Anyway, generating a turning point gets heavily into Adventure Crafter stuff.
I think it would be comparable effort to doing the rest to write the rest of the reference up in prose.&lt;/p&gt;
&lt;p&gt;I think what I'll do for next time is get the current folder properly version-controlled, make an effort to get my old code in, and then start adapting material.
Make sure to have tests of some kind.&lt;/p&gt;
&lt;p&gt;Anyway, I would have preferred a little more coding or planning and a little less setting-up-my-environment tonight, but hopefully I don't need to do that again.
I'd better wrap things up for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-01-24</title><link href="https://mwchase.neocities.org/coding-2020-01-24" rel="alternate"></link><published>2020-01-24T05:00:00-05:00</published><updated>2020-01-24T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-01-24:/coding-2020-01-24</id><summary type="html">&lt;p class="first last"&gt;I need to switch all the way over to the new laptop.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, the battery in this is getting weird enough that I need to make the switch to publishing with the new laptop.&lt;/p&gt;
&lt;p&gt;Anyway, last week I reread a blog post that gave advice for a design pattern to use with Python.
I recognized the problem it was solving as one that I'd had with a previous project, to make an auto-roller for some RPGs I wanted to play solo.
Basically, I was uncomfortable with the idea of hardcoding a reference to a particular global value, like the &lt;tt class="docutils literal"&gt;random&lt;/tt&gt; module.
I had similar issues when I wanted to have some functions &amp;quot;emit&amp;quot; information about what they were doing.
And then I wanted to sometimes control the indentation...
I ended up with a weird grab-bag of parameters that various functions took, only to forward along to the next function in the call chain.&lt;/p&gt;
&lt;p&gt;I don't want to go into details about the post right now (it's late, again; I'll try to start writing stuff up earlier tomorrow), but reading it was sort of the point in the infomercial where it shifts to color.
Using the techniques in the post, I was able to pass fewer parameters in a way that gave me more robust behavior.&lt;/p&gt;
&lt;p&gt;Before I started on this post, I did some informal testing of an auto-roller for Ironsworn, so that's ready for the weekend, and now I can freely tinker with this; maybe try to convert the reference guide I put together for my previous solo effort to code.&lt;/p&gt;
&lt;p&gt;Again, I'll go into more detail tomorrow, but this technique is really great when it makes sense.
My biggest reservation with it is that it looks... kind of weird.
Oh well, I'm done for tonight, super sleepy.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Conlanging 2020-01-23</title><link href="https://mwchase.neocities.org/conlanging-2020-01-23" rel="alternate"></link><published>2020-01-23T05:00:00-05:00</published><updated>2020-01-23T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-01-23:/conlanging-2020-01-23</id><summary type="html">&lt;p class="first last"&gt;Time management. Ennh?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Another day that took a bunch out of me, not sure why this time.
Anyway, I didn't get much done conlanging, but I did decide that I'd like to work with longer text in my attempts to create glosses.
So, I've got &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Schleicher%27s_fable"&gt;Schleicher's Fable&lt;/a&gt; copied into my reference document, and I'm going to try to work from that.&lt;/p&gt;
&lt;p&gt;If the stuff I'm going to try this weekend to deal with procrastination works out, I'll see what I can apply to working on this next week.&lt;/p&gt;
&lt;p&gt;Anyway, I need to get to bed ASAP, and I'm not quite ready, so, time to go do that.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Conlanging 2020-01-22</title><link href="https://mwchase.neocities.org/conlanging-2020-01-22" rel="alternate"></link><published>2020-01-22T05:00:00-05:00</published><updated>2020-01-22T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-01-22:/conlanging-2020-01-22</id><summary type="html">&lt;p class="first last"&gt;Lesson learned: Write something, and maybe you'll get more writing done than you expected. Also, maybe don't do this at 11:30 PM.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I wasn't up for conlanging today, so I'm going to quickly mention some ideas I had shortly after the last post, for trying to deal with the issue.&lt;/p&gt;
&lt;p&gt;Somewhat weird option: put the meaning verb in the genitive, since the genitive doesn't exist on its own in normal sentence structure.&lt;/p&gt;
&lt;p&gt;Somewhat bulky option: put it in the accusative, but require some form of determiner for all noun phrases.
The latter part sounded to me like an interesting touch, regardless of whether I go with that actual solution.
It would basically be like &amp;quot;some of the other languages I know, but more&amp;quot;.
&amp;quot;My thing&amp;quot;? No, &amp;quot;The my thing&amp;quot;.
(All right, &amp;quot;The thing of mine&amp;quot;.)&lt;/p&gt;
&lt;p&gt;In any case, if the verb isn't taking a determiner because it's not a noun phrase, then that means I could put it in any case I want.
I choose... nominative.
That way, when a verb is participating in this system, it's always nominative, regardless of the aspect.&lt;/p&gt;
&lt;p&gt;That is my initial feeling on this idea.&lt;/p&gt;
&lt;p&gt;Anyway, that's way more than I expected to get accomplished here today, good job me, I need to get ready for bed now, wow, so tired.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Weekly Roundup 2020-01-21</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-01-21" rel="alternate"></link><published>2020-01-21T05:00:00-05:00</published><updated>2020-01-21T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-01-21:/weekly-roundup-2020-01-21</id><summary type="html">&lt;p class="first last"&gt;Using linux milestone: messing up command sequences on the Macbook&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I realized that I hadn't though through all of the implications of my conlang ideas.&lt;/li&gt;
&lt;li&gt;Thursday: I came up with some ideas for how to resolve the weirdness.&lt;/li&gt;
&lt;li&gt;Friday: I made progress on the port.&lt;/li&gt;
&lt;li&gt;Saturday: I made more progress on the port.&lt;/li&gt;
&lt;li&gt;Sunday: I got really close to getting started with the RP.&lt;/li&gt;
&lt;li&gt;Monday: I admitted that I'm procrastinating.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm not sure how much I'll get done, because there's some big company meeting.
Hopefully that doesn't jar things too much.
I've got a plan for dealing with procrastination when the time comes.
We'll see how that goes.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Solo RP 2020-01-20</title><link href="https://mwchase.neocities.org/solo-rp-2020-01-20" rel="alternate"></link><published>2020-01-20T05:00:00-05:00</published><updated>2020-01-20T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-01-20:/solo-rp-2020-01-20</id><summary type="html">&lt;p class="first last"&gt;Okay, I've got a problem.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I took some time today to make sure I knew the rules for Ironsworn moves in general, and swearing an iron vow in particular.&lt;/p&gt;
&lt;p&gt;Then, instead of actually applying them, I did another iteration on one of my occasional little projects, which is trying to code up a nice dice roller to compensate for the fact that I don't have any dice handy besides some d6s that I think technically don't belong to me, and I never think to look for a ready-made application.&lt;/p&gt;
&lt;p&gt;I'll go into more detail about what I wrote in a few days, I think it's pretty interesting, but it's not on topic for this post.&lt;/p&gt;
&lt;p&gt;Anyway, I'm now pretty confident that I've been procrastinating, and I should work on it.
I don't know how best to deal with it, but, and this is going to sound bad, I've got almost a week to look into it.
With that in mind, I've just googled an article to read tomorrow, because I want to try to get this taken care of sooner than later.&lt;/p&gt;
&lt;p&gt;I don't know what to say, besides that I don't think I have any excuses not to get right into this next week.&lt;/p&gt;
&lt;p&gt;We'll see.
Anyway, it's super late already, and I should sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Solo RP"></category></entry><entry><title>Solo RP 2020-01-19</title><link href="https://mwchase.neocities.org/solo-rp-2020-01-19" rel="alternate"></link><published>2020-01-19T05:00:00-05:00</published><updated>2020-01-19T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-01-19:/solo-rp-2020-01-19</id><summary type="html">&lt;p class="first last"&gt;Asymptotically approaching starting the dang campaign.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;(I'm going to hope that if I ever do any kind of collaborative RP, I can manage to get all the prep down into at most a week.)&lt;/p&gt;
&lt;p&gt;I was mostly ignoring the stuff I usually do today, but I did take a look at the Ironsworn rules, and put together everything I think I need for the fiction component of swearing the initial iron vow.&lt;/p&gt;
&lt;p&gt;Why yes, I &lt;em&gt;have&lt;/em&gt; heard of Zeno's paradoxes of motion.&lt;/p&gt;
&lt;p&gt;Anyway, I'm going to hope that I've done enough that tomorrow I can just take care of any rolls I need to do, and then start working on the stuff after character creation.&lt;/p&gt;
&lt;p&gt;For now, though, I sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Solo RP"></category></entry><entry><title>Coding 2020-01-18</title><link href="https://mwchase.neocities.org/coding-2020-01-18" rel="alternate"></link><published>2020-01-18T05:00:00-05:00</published><updated>2020-01-18T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-01-18:/coding-2020-01-18</id><summary type="html">&lt;p class="first last"&gt;I sure am using a new laptop.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm still feeling kind of rough, but I got some work done on the port.
It's just kind of a slow process of figuring out the code a little, then getting a bit more ported.
Nothing terribly interesting to report; the original code would probably benefit from a linting pass and taking full advantage of version control.
(If there are commented-out bits of code in your source file, you're not taking full advantage of version control.)&lt;/p&gt;
&lt;p&gt;I'm still getting to grips with the new laptop (I still haven't put in the effort to make the publishing pipeline cross-platform).
I've been tempted to switch up some stuff pretty drastically, but I think what would be best would be to use it enough to figure out which thing legitimately bothers me the most, then work on addressing that.
Try to improve my user experience in priority order, or something.
Also, I should get backups set up before I do anything too drastic.&lt;/p&gt;
&lt;p&gt;(Also, at some point I'm going to be developing in Python really seriously, and I'm going to have to transfer my custom keybinds over.
It's weirdly inconsistent from person to person what behavior is sensible or unintuitive, but I know what bothers me, and I'm on borrowed time until I need to put my &amp;quot;sane_reindent.py&amp;quot; script somewhere that Sublime can get at it.)&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-01-17</title><link href="https://mwchase.neocities.org/coding-2020-01-17" rel="alternate"></link><published>2020-01-17T05:00:00-05:00</published><updated>2020-01-17T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-01-17:/coding-2020-01-17</id><summary type="html">&lt;p class="first last"&gt;Getting ready to code involves a lot of fiddling with package managers.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was in kind of a haze by the time I got to work on anything blog-worthy, so I mostly just tried to get my coding environment somewhat set up.&lt;/p&gt;
&lt;p&gt;I don't know if there's anything particularly interesting for me to say about what I did.
It was mostly running curl-sh commands and copying over stuff I had installed through Sublime Text's package manager.
There are a few loose ends I need to take care of, like installing some of the command-line tools needed to actually implement some of the packages I just installed, but I'm way too tired to work through the basic set of steps involved there.
I'll try to do actual coding tomorrow, but for now, I need to unwind more.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Conlanging 2020-01-16</title><link href="https://mwchase.neocities.org/conlanging-2020-01-16" rel="alternate"></link><published>2020-01-16T05:00:00-05:00</published><updated>2020-01-16T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-01-16:/conlanging-2020-01-16</id><summary type="html">&lt;p class="first last"&gt;At some point I should research the different ways natural languages handle this kind of thing. Maybe they use a less confusing system than I locked myself into via &amp;quot;aesthetics&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, I ended up focusing on other stuff today, but I'm going to try to work through some of the stuff I was worried about yesterday, really quickly.&lt;/p&gt;
&lt;p&gt;There are several verbs that can be used in an aspectual sense, which combine with another verb to form the meaning.
The meaning verb is in the infinitive form, then declined like a noun.
Aspect verbs can be divided into &amp;quot;transitive&amp;quot; and &amp;quot;intransitive&amp;quot;.
Intransitive aspect verbs treat the meaning verb as an extension of the subject.
Transitive aspect verbs treat the meaning verb as a direct(?) object.&lt;/p&gt;
&lt;p&gt;The problem, then, is, what happens when the meaning verb needs an object?
I could imagine a specific preposition for marking the &amp;quot;displaced&amp;quot; noun phrase, or the meaning verb could attach to the direct object somehow, rendering them as a single phrase.
I'd be interested with the possibilities there, but I'll have to figure out how it works with relative clauses.
I mean, it could be that the &amp;quot;transitive aspect verbs&amp;quot; basically act on a relative clause.
I think that sounds interesting.&lt;/p&gt;
&lt;p&gt;At some point, I'll have to take stock of how I've ended up doing things, since I've diverged pretty heavily in some respects from my initial drafts.&lt;/p&gt;
&lt;p&gt;Anyway, I can't write any more tonight.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Conlanging 2020-01-15</title><link href="https://mwchase.neocities.org/conlanging-2020-01-15" rel="alternate"></link><published>2020-01-15T05:00:00-05:00</published><updated>2020-01-15T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-01-15:/conlanging-2020-01-15</id><summary type="html">&lt;p class="first last"&gt;It's apparently somewhat surprising to actually apply every idea I had for this together...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was mostly taking it easy and replaying puzzle games today, but I did some work on The Tongue of Light, or rather its immediate ancestor language.
When I actually started putting stuff together, I realized I'd rather use stative verbs, and have a way to transform verbs into nouns that can be in noun phrases, than to have adjectives be inherently nounlike.
I'll have to think over the implications of this, but I think it addresses some concerns I had about natural ways of expressing simple ideas.&lt;/p&gt;
&lt;p&gt;I'll try to go into a little detail...
Basically, there are several aspect distinctions that get drawn, and they're all periphrastic.
The thing was, I was trying to have the aspectually-modified verb act as an object to the aspect verb, which meant I was ending up with confusing combinations of noun case.
Switching to stative verbs made the sentences shorter and left them with fewer parts to worry about getting to agree.&lt;/p&gt;
&lt;p&gt;Now that I lay all of this out, I see it's possible that I might have just pushed off the complexity, and maybe I can formulate a sentence that has the exact same issues.
(Try constructing sentences with &amp;quot;to help&amp;quot;, for example, and see if they still make sense. I have a suspicion that I'll end up extending the use of a word I came up with for a slightly different purpose. This has happened a few times already, and it's nice when it does.)
I should also make sure that using stative verbs to modify nouns still makes sense to me.&lt;/p&gt;
&lt;p&gt;In any case, I hope I explained that well enough; I should maybe start being specific in my examples.
Next time, or next week, maybe.&lt;/p&gt;
&lt;p&gt;(I also started working on porting the blog publishing pipeline to out-of-the-box Ubuntu. I believe the only change I needed to make was to have a different command for generating the notifications, but that's probably not enough, somehow. I'll also need to remember to install the various dependencies, including sass, whatever I'm using to compress the images, some stuff for pyenv... It's probably not too much...)&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Weekly Roundup 2020-01-14</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-01-14" rel="alternate"></link><published>2020-01-14T05:00:00-05:00</published><updated>2020-01-14T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-01-14:/weekly-roundup-2020-01-14</id><summary type="html">&lt;p class="first last"&gt;I was under some stress last week. It showed.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I put together a table.&lt;/li&gt;
&lt;li&gt;Thursday: I wrote some sample sentences.&lt;/li&gt;
&lt;li&gt;Friday: I figured out that the stuff that SCA² was doing with globals could mostly be done more easily with multiple returns.&lt;/li&gt;
&lt;li&gt;Saturday: I got more SCA² porting done in a way that I'm optimistic about.&lt;/li&gt;
&lt;li&gt;Sunday: I made a little bit of progress in naming characters and places.&lt;/li&gt;
&lt;li&gt;Monday: I got a little closer to finishing up the last part of my character sheet.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I think I might end up getting even less done on these fronts.
I've got to migrate to the new laptop and figure out my workflows for it, which is a bit of an adjustment.
Among other things, I need to manually transfer my repos, since my NAS doesn't seem to sync dotfiles by default.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Solo RP 2020-01-13</title><link href="https://mwchase.neocities.org/solo-rp-2020-01-13" rel="alternate"></link><published>2020-01-13T05:00:00-05:00</published><updated>2020-01-13T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-01-13:/solo-rp-2020-01-13</id><summary type="html">&lt;p class="first last"&gt;I did a thing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Not much work done today.
I was focused on getting my new laptop set up; this is still from my old one, because one thing I didn't handle was getting repository metadata copied over.&lt;/p&gt;
&lt;p&gt;For the solo RP, I worked on the iron vow my character is going to swear to kick things off.
I'll have to work out how to represent this on the sheet and such, but I can't focus on that right now.
I need to get ready for bed.
I wish this weekend had been more relaxing.
Oh well.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Solo RP"></category></entry><entry><title>Solo RP 2020-01-12</title><link href="https://mwchase.neocities.org/solo-rp-2020-01-12" rel="alternate"></link><published>2020-01-12T05:00:00-05:00</published><updated>2020-01-12T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-01-12:/solo-rp-2020-01-12</id><summary type="html">&lt;p class="first last"&gt;I couldn't figure out what to put here.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Things are going to be kind of disorganized for a while.
I'm trying to migrate to a new laptop, and it's not a smooth transition, because I can't just grab everything and switch it over.
I'm trying to do that with the data, and the fans in the new laptop are Not Having It, but the bigger problem is figuring out proper replacement applications.
Sometimes it's straightforward, and sometimes it's... not.&lt;/p&gt;
&lt;p&gt;Anyway, let's see about having some outlines for the solo rp backstory.&lt;/p&gt;
&lt;p&gt;Okay, I filled in some names, events, and geography.&lt;/p&gt;
&lt;p&gt;For now, this'll do.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Solo RP"></category></entry><entry><title>Coding 2020-01-11</title><link href="https://mwchase.neocities.org/coding-2020-01-11" rel="alternate"></link><published>2020-01-11T05:00:00-05:00</published><updated>2020-01-11T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-01-11:/coding-2020-01-11</id><summary type="html">&lt;p class="first last"&gt;This might &lt;em&gt;technically&lt;/em&gt; be the third time...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Things are going okay with the porting effort.
I started over, and I've gotten further now, with fewer obvious roadblocks.
Now that I understand the code better, I did attempt some &amp;quot;refactors&amp;quot;, which may have been a bad decision, but eh.
What's left to do is to fill in some of the functions and write some scaffolding for creating the data.&lt;/p&gt;
&lt;p&gt;Not much else to say on this.&lt;/p&gt;
&lt;p&gt;I also went into the standalone ECS project I mentioned a while ago, and reversed one of the decisions I made in the port.
The idea there is to make it easier in the future to support stuff like indices and other modifications to a component's storage.
All there was to do for this now was to create a wrapper class that can have optional arguments added later.
Pretty simple.&lt;/p&gt;
&lt;p&gt;Anyway, I'm done for the night.
Extremely done.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-01-10</title><link href="https://mwchase.neocities.org/coding-2020-01-10" rel="alternate"></link><published>2020-01-10T05:00:00-05:00</published><updated>2020-01-10T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-01-10:/coding-2020-01-10</id><summary type="html">&lt;p class="first last"&gt;This code could really benefit from some features that may have come out after its last revision.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Most of the stuff that was bothering me this week is taken care of, though some of the stuff that's left is a bit of a doozy.&lt;/p&gt;
&lt;p&gt;I was doing other stuff to unwind again, but I just had a breakthrough on SCA².
It looks like most of the globals can be replaced by multiple returns.
Which means I wouldn't need the temporary variables to hold the values, because I can just &lt;em&gt;pick different names&lt;/em&gt;, or &lt;em&gt;not assign to names in the first place&lt;/em&gt;.
I think I'm making much better progress now that I know what I can basically ignore.&lt;/p&gt;
&lt;p&gt;I'm currently sticking to the higher-level side of this, which means figuring out the &lt;tt class="docutils literal"&gt;CatSub&lt;/tt&gt; function.
I guess it needs some way to refer to the categories.
Oh well, I'll try to figure this out tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Conlanging 2020-01-09</title><link href="https://mwchase.neocities.org/conlanging-2020-01-09" rel="alternate"></link><published>2020-01-09T05:00:00-05:00</published><updated>2020-01-09T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-01-09:/conlanging-2020-01-09</id><summary type="html">&lt;p class="first last"&gt;It's hard to work on stuff I like when it's such a pain to work on stuff I need.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I had kind of a weird and unpleasant day today.
UPS behaved completely typically.
If they pull this again tomorrow, I'm going to spend Friday on the porch, no matter the weather.&lt;/p&gt;
&lt;p&gt;Anyway, I was doing other stuff to unwind today, but I put together a bunch of sentences that should give me some grasp on syntax.
I'll gloss them with placeholder words, then try to diagram the glosses and see if I can come up with something consistent.
I started writing the glosses and then I realized that I don't seem to have transcribed my notes on aspect, and it's dark, so I don't want to do it now.&lt;/p&gt;
&lt;p&gt;Tomorrow, I think I'll try to write up the SCA² before going back to porting it, because my efforts last week were kind of confusing me.
I might try forcing myself to reason locally, but I'm not feeling great about that idea when there are so many globals.
Best try to document each function I'm interested in.
Also, once I do port, maybe accept some un-idiomatic code for the sake of getting things together enough to write tests, then refactor.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Conlanging 2020-01-08</title><link href="https://mwchase.neocities.org/conlanging-2020-01-08" rel="alternate"></link><published>2020-01-08T05:00:00-05:00</published><updated>2020-01-08T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-01-08:/conlanging-2020-01-08</id><summary type="html">&lt;p class="first last"&gt;Until today, I forgot I could link to the LCK website.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;This week started off kind of stressful, so I didn't end up focusing much on conlanging today, but I did put together a table of &lt;a class="reference external" href="https://www.zompist.com/kitgram.html#otherpron"&gt;correlatives&lt;/a&gt;, so that I have a checklist of pronouns to come up with, more or less.
Right now, I'm kind of thinking about this language in terms of how it expresses the Europeanisms that it acquires, and that turns out to make a bunch of decisions for me.
I feel like this area is going to need a lot of focus, because the use of &amp;quot;correlatives&amp;quot; is one of the things that will make this language resemble German a lot, and in a way that English does somewhat, which means that I need to look for degrees of freedom to allow me to express features like &amp;quot;Forming questions the way English does&amp;quot; without making it a relex.
Fortunately, some of the stuff I'm putting in has implications I'm just now realizing, that make some things look really different.&lt;/p&gt;
&lt;p&gt;I should wrap it up now.
My schedule tomorrow is super weird, at least by my standards.
I think tomorrow I'd like to try developing some idea of the evolution of syntax.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Weekly Roundup 2020-01-07</title><link href="https://mwchase.neocities.org/weekly-roundup-2020-01-07" rel="alternate"></link><published>2020-01-07T05:00:00-05:00</published><updated>2020-01-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-01-07:/weekly-roundup-2020-01-07</id><summary type="html">&lt;p class="first last"&gt;Things are going well.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I got almost enough sound changes for a baseline of &amp;quot;here's how to get between the phonologies and phonotactics&amp;quot;.&lt;/li&gt;
&lt;li&gt;Thursday: I worked a bit on the history of the grammar.&lt;/li&gt;
&lt;li&gt;Friday: I decided on trying to port the core of SCA² into some kind of library.&lt;/li&gt;
&lt;li&gt;Saturday: I started on the porting effort. It's not going super-fast, but it's going.&lt;/li&gt;
&lt;li&gt;Sunday: I made some decisions on my character build, and also got more information into my actual character sheet (which is a Lua file, because the idea of doing that always makes more sense to me than maybe it should.)&lt;/li&gt;
&lt;li&gt;Monday: I got my character concept worked out enough that I felt comfortable writing stuff in-character.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to keep it up.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Solo RP 2020-01-06</title><link href="https://mwchase.neocities.org/solo-rp-2020-01-06" rel="alternate"></link><published>2020-01-06T05:00:00-05:00</published><updated>2020-01-06T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-01-06:/solo-rp-2020-01-06</id><summary type="html">&lt;p class="first last"&gt;Almost there!&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got everything I need for my Ironsworn character sheet, except that I haven't actually sworn the iron vow relating to my inciting incident.
I've got things mostly figured out, it's just that I want to actually write up the leadup to the incident in-character, which I've started doing.
More substantial progress, it's great.&lt;/p&gt;
&lt;p&gt;I'm not going to share too much of what I've written yet, since what I just now wrote is rough-draft quality, much like... virtually every blog post I publish.
Hm.
Well, I'm still not sharing it now, is the point.&lt;/p&gt;
&lt;p&gt;I hadn't actually worked out what the process for this was going to be like, so we'll kind of have to see how much I write when, but I'm really glad to have as full a picture of the beginning of the arc as I do now.&lt;/p&gt;
&lt;p&gt;I'm going to try to wrap things up early tonight, because I've got, like, work tomorrow, and my sleep schedule is still kind of iffy.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Solo RP"></category></entry><entry><title>Solo RP 2020-01-05</title><link href="https://mwchase.neocities.org/solo-rp-2020-01-05" rel="alternate"></link><published>2020-01-05T05:00:00-05:00</published><updated>2020-01-05T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-01-05:/solo-rp-2020-01-05</id><summary type="html">&lt;p class="first last"&gt;Slow but definite progress, again, again.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Now that I'm putting the weekend aside for working on the Solo RP stuff, I got enough focus to finally nearly finish up my character sheet for Ironsworn.
I've just got to decide on any other starting bonds I want, and figure out my inciting incident.
I think I just got it.
Hm.
I'll sleep on it.
Anyway, I'll try to get this finalized tomorrow.&lt;/p&gt;
&lt;p&gt;For now, I should, once again, sleep.
It's kind of annoying how that needs to happen over and over.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Solo RP"></category></entry><entry><title>Coding 2020-01-04</title><link href="https://mwchase.neocities.org/coding-2020-01-04" rel="alternate"></link><published>2020-01-04T05:00:00-05:00</published><updated>2020-01-04T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-01-04:/coding-2020-01-04</id><summary type="html">&lt;p class="first last"&gt;Slow but definite progress, again.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm working on porting SCA².
It's not looking like it'll be especially hard to do it; the JavaScript code isn't doing anything too exotic.
The big hurdle I have to clear every once in a while is that the coding style is not what I would do in Python, but it's a lot less thought to port things over directly than to try to work out how I would have done it.&lt;/p&gt;
&lt;p&gt;Right now, I'm working on the parser/interpreter for the DSL.
I think I'd like to factor those apart, probably.&lt;/p&gt;
&lt;p&gt;Anyway, I'm sure things will work out.
I just need to pace myself until my sleep schedule gets un-ruined from being on vacation.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Coding 2020-01-03</title><link href="https://mwchase.neocities.org/coding-2020-01-03" rel="alternate"></link><published>2020-01-03T05:00:00-05:00</published><updated>2020-01-03T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-01-03:/coding-2020-01-03</id><summary type="html">&lt;p class="first last"&gt;What if I try to do a thing that sounds manageable, rather than crazy-ambitious?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, Mark Rosenfelder's &lt;a class="reference external" href="https://www.zompist.com/sca2.html"&gt;SCA²&lt;/a&gt; basically provides a nice interface for bulk application of string rewriting operations written in a &lt;abbr title="domain-specific language"&gt;DSL&lt;/abbr&gt;.
There are options for how to display the output, an interface for saving the rewrite rules, and concepts of predefined and nonce categories.&lt;/p&gt;
&lt;p&gt;I'm interested in getting the core functionality into a form that can be somehow pipelined or otherwise automated.
This means not trying to port all of the functionality one-to-one.
Rather than applying a sequence of rules to an ordered lexicon, I'd like to port the logic for &amp;quot;applying a single rule to a single entry&amp;quot;.
The rest of the functionality can be built up naturally.&lt;/p&gt;
&lt;p&gt;My plan, then, is to first port the existing DSL-based implementation, and then work on taking it in a direction that makes sense to me.
For example, the &lt;abbr title="International Phonetic Alphabet"&gt;IPA&lt;/abbr&gt; divides phonemes up according to features.
Perhaps phonemes could be specified like that, and allophonic variation specified as well, since I assume allophones exert influence on sound change, especially when they're in complementary distribution.
I am not a linguist, however.
Anyway, that's for later.&lt;/p&gt;
&lt;p&gt;My task for tomorrow is to write up the core logic of SCA², so I can port it soon.&lt;/p&gt;
&lt;p&gt;My task for now is to sleep.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Coding"></category></entry><entry><title>Conlanging 2020-01-02</title><link href="https://mwchase.neocities.org/conlanging-2020-01-02" rel="alternate"></link><published>2020-01-02T05:00:00-05:00</published><updated>2020-01-02T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-01-02:/conlanging-2020-01-02</id><summary type="html">&lt;p class="first last"&gt;I also might look into trying to base something off Ned Batchelder's Cupid library to render diagrams for this stuff.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I planned out some of the grammatical history today, but we traveled back today, so that took another chunk of time.
I'm hoping I'll be in better shape for this next week now that I'm home again.
I've got to focus right now on un-messing-up my sleep schedule so I can get to work tomorrow.&lt;/p&gt;
&lt;p&gt;After that, it's coding, and I think I might look into the SCA² tool; it'd be really nice to have something like it that worked on files.&lt;/p&gt;
&lt;p&gt;I can't think of anything more to write and I probably shouldn't.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Conlanging 2020-01-01</title><link href="https://mwchase.neocities.org/conlanging-2020-01-01" rel="alternate"></link><published>2020-01-01T05:00:00-05:00</published><updated>2020-01-01T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2020-01-01:/conlanging-2020-01-01</id><summary type="html">&lt;p class="first last"&gt;I was worried that the changes I had in mind would be &amp;quot;not enough&amp;quot;, then I realized the ancestor for &amp;quot;trra&amp;quot; would be, like, &amp;quot;tīnrā[something]&amp;quot; so I just need to work out the &amp;quot;something&amp;quot; and I should be good.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;For the last night of the new year, I put in some more work on my weird sort-of-joke conlang.
I've put together a draft collection of sound changes, not yet organized into a proper sequence, that should properly convert from the ancient to the modern phonology.
Probably of more interest is putting together the histories of particular words.
I think what I need to do is figure out at which points major bits of grammaticalization happened (like the development of the case system), and break up the sound changes so they take the words to each such event, and apply any required changes manually.
Figuring out how to apply those changes automatically is the major hurdle to clear to get nice tooling around this process.&lt;/p&gt;
&lt;p&gt;One thing I'd like to do is port the &lt;a class="reference external" href="https://www.zompist.com/sca2.html"&gt;SCA²&lt;/a&gt; tool to run offline.
I tried this one before, and got tripped up by the way the code was written.&lt;/p&gt;
&lt;p&gt;Anyway, I should wind down for now, then get into grammatical history tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Conlanging"></category></entry><entry><title>Weekly Roundup 2019-12-31</title><link href="https://mwchase.neocities.org/weekly-roundup-2019-12-31" rel="alternate"></link><published>2019-12-31T05:00:00-05:00</published><updated>2019-12-31T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-12-31:/weekly-roundup-2019-12-31</id><summary type="html">&lt;p class="first last"&gt;You wouldn't think not going to work would leave me so little time for posts, and yet...&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I did some research for conlanging.&lt;/li&gt;
&lt;li&gt;Thursday: I did a little conlanging work while writing the post, but not much else.&lt;/li&gt;
&lt;li&gt;Friday: I tried to automate away some of the work required for conlanging. It didn't work.&lt;/li&gt;
&lt;li&gt;Saturday: I put the entry up way early. The entry explained that I was putting up the entry way early.&lt;/li&gt;
&lt;li&gt;Sunday: I thought some about the direction I'd like to take my minecraft skyblock stuff. And the blog.&lt;/li&gt;
&lt;li&gt;Monday: I gave automating linguistic evolution another try, before deciding I'd need a better understanding to attempt it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try out the idea I had on Sunday.
I'll try... conlanging, coding, solo RP, and we'll see how that treats me.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Diary 2019-12-30</title><link href="https://mwchase.neocities.org/diary-2019-12-30" rel="alternate"></link><published>2019-12-30T05:00:00-05:00</published><updated>2019-12-30T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-12-30:/diary-2019-12-30</id><summary type="html">&lt;p class="first last"&gt;Doing things the hard way, because I'm not sure how to get to the easy way.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I played a little more skyblock, and made some progress.
I'm pretty bottlenecked on infrastructure.
My temptation is to rush Applied Energistics and try to set up autocrafting for common components.
I don't know if that would actually work, especially since I don't have any kind of unified power system.&lt;/p&gt;
&lt;p&gt;I tried to put together a helper library for modeling linguistic evolution, but it turns out parts of such a thing are very complicated, and I need more hands-on experience with what I'm trying to make shortcuts for.&lt;/p&gt;
&lt;p&gt;So, I'm right now trying to put together a bunch of examples, manually.
It's going to be pretty nuts, I can tell, but hopefully I'll learn something from it.&lt;/p&gt;
&lt;p&gt;I'll get back to that for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-12-29</title><link href="https://mwchase.neocities.org/diary-2019-12-29" rel="alternate"></link><published>2019-12-29T05:00:00-05:00</published><updated>2019-12-29T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-12-29:/diary-2019-12-29</id><summary type="html">&lt;p class="first last"&gt;I should really make some screenshots of this, huh.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got in super late last night, so my prediction was validated.&lt;/p&gt;
&lt;p&gt;Anyway, I got to thinking, maybe I'd like to switch back to working on a per-day kind of thing, see if that feels good.
Six days I need.
Coding.
Solo RP.
Conlanging.
Maybe split the days up into pairs.&lt;/p&gt;
&lt;p&gt;I'll try that starting next week.&lt;/p&gt;
&lt;p&gt;For now, I spent most of today playing the more Minecraft.
It's been the &lt;a class="reference external" href="https://www.curseforge.com/minecraft/modpacks/equivalent-skies"&gt;Equivalent Skies&lt;/a&gt; modpack.
I believe I've gotten past the very basics, and now that I have miniaturization crafting, I now have the option to shove stuff into compact machines.
But I think I don't want to shove stuff in if it's like Immersive Engineering and it's kind of meant to have associated decorations and such.
I kind of have this idea of having floating islands focused around each mod, where for example there'd be a tree for Botania, a wizard tower for ThaumCraft, some kind of factory for Immersive Engineering, and maybe just a giant smeltery tank for Tinkers Construct.&lt;/p&gt;
&lt;p&gt;What I have to figure out is, which mods don't want to be shoved aside.
I think it's Botania, ThaumCraft, and Immersive Engineering for sure, and I don't know what else.
ProjectE itself, I guess.&lt;/p&gt;
&lt;p&gt;I also want to somewhat future-proof this whole concept, so I don't need to do really obnoxious changes when I hook up everything into an AE2 network.&lt;/p&gt;
&lt;p&gt;I'm thinking I'll have the Botania island just clockwise from the mob farm, the ThaumCraft island clockwise from that, and the Immersive Engineering island clockwise from that.
I wish I knew how big to make these, but maybe I can just make sure to mostly expand them away from my spawn point.
Anyway, I've got some Actually Additions and Integrated Dynamics machines where this plan would put ThaumCraft, so I'll have to break those down and put them elsewhere.
Maybe have a big compact machine for the mostly stand-alone kind of single-block machines, and have dedicated compact machines for crystallization and each empowerer recipe.
I'm regularly throwing around absurb amounts of EMC from a tiny farm (Hopping bonsai slime trees on orange soil. So good, since the 9-slime block is ore-dictionaried.), so I'm not particularly bothered by the idea of making a bunch of empowerer multiblocks.
Maybe if I stick them together somewhat, I can get a whole bunch into one block and just route stuff using item conduits.&lt;/p&gt;
&lt;p&gt;I'll try to make some progress on this tomorrow, and also throw something together for the conlanging.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-12-28</title><link href="https://mwchase.neocities.org/diary-2019-12-28" rel="alternate"></link><published>2019-12-28T05:00:00-05:00</published><updated>2019-12-28T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-12-28:/diary-2019-12-28</id><summary type="html">&lt;p class="first last"&gt;Preemptive not-much-to-write-about&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I found out this morning about some traveling that's happening today, so I'm posting this early to get a post for this day in.
So early, that all I have to say is that I added a few more roots to try in my conlanging efforts, and I'll try them out sometime after I post this.&lt;/p&gt;
&lt;p&gt;Good afternoon.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-12-27</title><link href="https://mwchase.neocities.org/diary-2019-12-27" rel="alternate"></link><published>2019-12-27T05:00:00-05:00</published><updated>2019-12-27T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-12-27:/diary-2019-12-27</id><summary type="html">&lt;p class="first last"&gt;Me, a mathematician: &amp;quot;Wow, exponential growth is terrifyingly potent.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, I decided to try generating a subset of all possible roots in Ancient Dabupan according to my current rules.
I keep on putting restrictions on what's generated, and it's still &lt;em&gt;a lot&lt;/em&gt;.
I'm going to need to develop some kind of skill for isolating representative samples to inspect in more detail, because I don't want to go in-depth &lt;em&gt;and&lt;/em&gt; in-breadth with a bunch of un-tested sound changes on thousands of roots.
I think I need to, like, pick one to start with, see what it does, and guess which ones could end up different.
Then pick one of those, and try to get coverage that way.&lt;/p&gt;
&lt;p&gt;I think I'll have to clean up my outline first.
I've been working in a kind of grab-bag section at the very end of it, and it's kind of a mess.&lt;/p&gt;
&lt;p&gt;I'm going to call this entry now, and try to do the cleanup after I post it.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-12-26</title><link href="https://mwchase.neocities.org/diary-2019-12-26" rel="alternate"></link><published>2019-12-26T05:00:00-05:00</published><updated>2019-12-26T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-12-26:/diary-2019-12-26</id><summary type="html">&lt;p class="first last"&gt;Slow progress: because I can't always have fast progress.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;As I sort of anticipated yesterday, traveling today made it hard to get much done, but I did make some good progress on some of the details of the proto-language, so I should be able to write up how I want it to work, and then start messing around.&lt;/p&gt;
&lt;p&gt;I'll try and do that now.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Done.
It's like a cooking show, but really underwhelming.
Anyway, I've got some rules to try out, so tomorrow, I'll try them out.&lt;/p&gt;
&lt;p&gt;Also, I just disabled all comments on my old blog, because shut up, spambots.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-12-25</title><link href="https://mwchase.neocities.org/diary-2019-12-25" rel="alternate"></link><published>2019-12-25T05:00:00-05:00</published><updated>2019-12-25T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-12-25:/diary-2019-12-25</id><summary type="html">&lt;p class="first last"&gt;Turns out I'm not quite ready to just jump in and start trying to do stuff. Maybe tomorrow. Although I am traveling tomorrow...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;A little calmer of a day today.
I mostly spent it playing Minecraft, but I also put in some more high-level conlanging work.
I think what's happening there is that I don't quite understand some of the stuff motivating my goals well enough to jump in.
Some of the high-level summaries of &amp;quot;Euroversals&amp;quot; on Wikipedia are pretty abstract, so I've been reading over the original &lt;a class="reference external" href="http://www.anglistik.uni-freiburg.de/seminar/abteilungen/sprachwissenschaft/ls_kortmann/Courses/Kortmann/Variation/index_html/2008-05-27.8724094854"&gt;Haspelmath article&lt;/a&gt; to get a better idea, for example, of what an &amp;quot;equative&amp;quot; is, and how stuff like &amp;quot;так&amp;quot; and &amp;quot;как&amp;quot; relate to it.&lt;/p&gt;
&lt;p&gt;Getting a good idea of what is and isn't typical in languages is interesting.
I kind of want to, once I nail down more details, develop a distant relative language that didn't take on SAE features.
(Although it probably is worth noting that one way I'm maybe kind of cheating to make this more exotic is, if something is common outside of Europe and therefore not a Euroversal, that gives me license to not use it. Even though this doesn't really make sense. So, if I'm not specifically trying to do that, the result might end up having some superficial resemblances to European languages that the first language lacks.)&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2019-12-24</title><link href="https://mwchase.neocities.org/weekly-roundup-2019-12-24" rel="alternate"></link><published>2019-12-24T05:00:00-05:00</published><updated>2019-12-24T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-12-24:/weekly-roundup-2019-12-24</id><summary type="html">&lt;p class="first last"&gt;I should stop starting these after 10 PM&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I started figuring out what I'd need to do for my current conlanging project.&lt;/li&gt;
&lt;li&gt;Thursday: I was super tired for no apparent reason.&lt;/li&gt;
&lt;li&gt;Friday: I was super tired for an apparent reason.&lt;/li&gt;
&lt;li&gt;Saturday: I made a little progress.&lt;/li&gt;
&lt;li&gt;Sunday: I did a bunch of stuff. Some of these entries I did super-late and rushed them out.&lt;/li&gt;
&lt;li&gt;Monday: I wrote almost nothing because of early holiday celebrations.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to approach this stuff with a little more discipline.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Diary 2019-12-23</title><link href="https://mwchase.neocities.org/diary-2019-12-23" rel="alternate"></link><published>2019-12-23T05:00:00-05:00</published><updated>2019-12-23T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-12-23:/diary-2019-12-23</id><summary type="html">&lt;p class="first last"&gt;Christmas came early and I got distracted from writing an entry.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Hi.
Still alive.
Mostly played Minecraft.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-12-22</title><link href="https://mwchase.neocities.org/diary-2019-12-22" rel="alternate"></link><published>2019-12-22T05:00:00-05:00</published><updated>2019-12-22T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-12-22:/diary-2019-12-22</id><summary type="html">&lt;p class="first last"&gt;Once the big holidays are past, I should try using Pomodoro or something again.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Things I did today:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;A bunch of writing&lt;/li&gt;
&lt;li&gt;Minecraft&lt;/li&gt;
&lt;li&gt;A little bit of work conlanging&lt;/li&gt;
&lt;li&gt;Figuring out what I need to design an AI system inspired by the paper on F.E.A.R.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm not going to say anything about the writing.
I'm doing well enough in Minecraft that I think I can spare the resources to put ridiculous ALLCAPS signs on everything like it's a sixties Batman set (back when they had sets).
On the conlanging front, I just applied the sound change I want to try, to see how it looks.
I would like to come up with some more varied roots to try it with, and also to have something to do this with that makes it easier than just typing stuff manually into a word processor for every conjugation.
For the AI, I think the notes I have are good enough to turn it into a design, but I haven't yet written up a design, and I would like to.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-12-21</title><link href="https://mwchase.neocities.org/diary-2019-12-21" rel="alternate"></link><published>2019-12-21T05:00:00-05:00</published><updated>2019-12-21T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-12-21:/diary-2019-12-21</id><summary type="html">&lt;p class="first last"&gt;Took things easy, but made some progress.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't exactly do a ton of work today, but I found some promising sound changes to base stuff on.
The whole endeavor feels somewhat abstract.
I think I'm going to have to just experiment with some possible words and see what comes out.&lt;/p&gt;
&lt;p&gt;Nothing more to say right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-12-20</title><link href="https://mwchase.neocities.org/diary-2019-12-20" rel="alternate"></link><published>2019-12-20T05:00:00-05:00</published><updated>2019-12-20T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-12-20:/diary-2019-12-20</id><summary type="html">&lt;p class="first last"&gt;I know exactly why I was so tired.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;We were on the road again today, and as usual, it took a lot out of me, and as usual, I didn't anticipate this or plan for it in any way.&lt;/p&gt;
&lt;p&gt;I did get some work done though.
I went over the factored out ECS code from Dennis, ran Mypy over it, fixed some bugs that found, and got the strictness as high as I can manage for now.
It kind of seems like it's still accepting some stuff that it really shouldn't, but I haven't figured out how to express the constraints that would justify accepting my code, so it sort of cancels out.
Sort of.&lt;/p&gt;
&lt;p&gt;Hopefully I'll be up for getting more done tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-12-19</title><link href="https://mwchase.neocities.org/diary-2019-12-19" rel="alternate"></link><published>2019-12-19T05:00:00-05:00</published><updated>2019-12-19T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-12-19:/diary-2019-12-19</id><summary type="html">&lt;p class="first last"&gt;I don't know why I was so tired.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I spent most of today fighting to remain conscious, ended up keyed-up in the afternoon, and now I'm really tired.
I'm putting together more stuff for conlanging.
Short sample sentences and breaking them down into necessary roots.
I'm going to have to spend a day where I'm better-rested than this, coming up with the history of each root.
This is hard work.&lt;/p&gt;
&lt;p&gt;And I'm done for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-12-18</title><link href="https://mwchase.neocities.org/diary-2019-12-18" rel="alternate"></link><published>2019-12-18T05:00:00-05:00</published><updated>2019-12-18T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-12-18:/diary-2019-12-18</id><summary type="html">&lt;p class="first last"&gt;Laying groundwork for my made-up, sort-of-a-joke language.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I still don't quite have a handle on how to do time management in the winter, I think, so I did some quick conlang work in the last hour or so.
I basically just transcribed some of the basic stuff I wrote down.
Moving forward, I'd like to have some sample sentences that hold my interest, so I think my best bet is to make samples for Dabupan instead of The Tongue of Light, and have the samples be of the debates over the reforms.
So, first write stuff up in English so I have some idea of the words I want, figure out back-derivations to the &amp;quot;earliest attested form&amp;quot;, determine the meaning of the root at that time, and figure out which sound changes occurred when.&lt;/p&gt;
&lt;p&gt;This sounds like it's going to be a lot of much harder work than my usual stuff, so I'll just have to put aside some time every day, I guess, and chip away at it.&lt;/p&gt;
&lt;p&gt;Quick timeline thought: Ancient Dabupan is &amp;quot;analytic&amp;quot;, Old Dabupan is &amp;quot;agglutinative&amp;quot;, Dabupan is &amp;quot;fusional&amp;quot;.
I think I'll just copy the lexicon around a bunch until I've got four sections to work with.
That'll be it for tonight, it's pretty late now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2019-12-17</title><link href="https://mwchase.neocities.org/weekly-roundup-2019-12-17" rel="alternate"></link><published>2019-12-17T05:00:00-05:00</published><updated>2019-12-17T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-12-17:/weekly-roundup-2019-12-17</id><summary type="html">&lt;p class="first last"&gt;What you have to understand is, I made * a lot* of progress on Baba Is You&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I got unstuck regarding the Ink issue I filed.&lt;/li&gt;
&lt;li&gt;Thursday: I realized that the C# design uses rollback all the time.&lt;/li&gt;
&lt;li&gt;Friday: I did kind of a grab bag of tasks. And things that weren't really tasks.&lt;/li&gt;
&lt;li&gt;Saturday: I did some design work for the Ink port, but I haven't had the focus yet to check it and put it into practice.&lt;/li&gt;
&lt;li&gt;Sunday: I posted.&lt;/li&gt;
&lt;li&gt;Monday: I got distracted from everything else I've been doing to try turning part of the Dennis code into its own library.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'd be up for some more conlanging, reviewing the current slice of Ink Py design, or fleshing out ideas inspired by the paper on F.E.A.R.'s AI.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Diary 2019-12-16</title><link href="https://mwchase.neocities.org/diary-2019-12-16" rel="alternate"></link><published>2019-12-16T05:00:00-05:00</published><updated>2019-12-16T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-12-16:/diary-2019-12-16</id><summary type="html">&lt;p class="first last"&gt;Taken by a fey mood!&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I reread a &lt;a class="reference external" href="https://alumni.media.mit.edu/~jorkin/gdc2006_orkin_jeff_fear.pdf"&gt;GDC paper from 2006&lt;/a&gt; on procedural NPC AI, and that gave me the urge to mess around with that general idea.
I decided, based on gut feeling mostly, that the first thing I wanted to do for this was to port out and update the &lt;abbr title="Entity Component System"&gt;ECS&lt;/abbr&gt; engine from &lt;a class="reference external" href="https://mwchase.neocities.org/category/dennis"&gt;Dennis&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Getting the code to a state where I think it should work took most of the day.
I'm not exactly sure how I want to progress once I have it in a working state (with tests, typechecking, and published on PyPI).
I can either try to put together a rudimentary world model, or port other bits of Dennis piecemeal until I've got enough to put it all together into &amp;quot;a game&amp;quot;, then hack on top of that.&lt;/p&gt;
&lt;p&gt;I don't have anywhere to go from that, so I might as well mention the changes I made.
Looking through the Ink codebase has me kind of soured on the concept of &amp;quot;zero-argument constructors for objects that get all of their state injected in deserialization&amp;quot;, so I redid the constructor to handle much of the logic that is done in the deserialization routines in Dennis, and also added a helper to do most of the work needed for serialization.
One of the weird janky bits of Dennis's implementation is that the component fields were wrapped in a descriptor that contained a tiny bit a metadata, and all access to the components was done by dynamically generating attribute names to use with getattr.
Essentially, it was a layer of syntactic sugar that wasn't actually really visible outside the module where it was defined.
This doesn't really make sense.
Since I kept the idea of a &amp;quot;Component&amp;quot; base marker class, I just had it detect when class attributes were subclasses of the marker class, and assemble a dictionary at instantiation time.
This approach might end up being harder to typecheck, but I'm pretty sure that the version in Dennis now only typechecks because all of the getattr stuff is implicitly tossing out &lt;tt class="docutils literal"&gt;Any&lt;/tt&gt; values that then get coerced to the expected type implicitly.&lt;/p&gt;
&lt;p&gt;Okay, it's getting late.
I have to call this now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-12-15</title><link href="https://mwchase.neocities.org/diary-2019-12-15" rel="alternate"></link><published>2019-12-15T05:00:00-05:00</published><updated>2019-12-15T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-12-15:/diary-2019-12-15</id><summary type="html">&lt;p class="first last"&gt;Lowest-effort post without being sick, I think.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Oops.
I did a bunch of things today that didn't lend themselves to blog posts, and I don't want to reach for anything now, so, I'm just posting this to post something.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Ink-Py 2019-12-14</title><link href="https://mwchase.neocities.org/ink-py-2019-12-14" rel="alternate"></link><published>2019-12-14T05:00:00-05:00</published><updated>2019-12-14T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-12-14:/ink-py-2019-12-14</id><summary type="html">&lt;p class="first last"&gt;Short entry because head hurty.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I worked a little bit on Ink today.
I &lt;em&gt;think&lt;/em&gt; I've established that my implementation of the function I'm investigating now will be simpler, but I'm not totally confident.
Unfortunately, I'm really not up to looking at screens any more today, so I have to call this now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Ink-Py"></category></entry><entry><title>Ink-Py 2019-12-13</title><link href="https://mwchase.neocities.org/ink-py-2019-12-13" rel="alternate"></link><published>2019-12-13T05:00:00-05:00</published><updated>2019-12-13T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-12-13:/ink-py-2019-12-13</id><summary type="html">&lt;p class="first last"&gt;I'm skipping over a lot of Ink's caching logic, so it's probably going to chug once it actually, like, works.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Worked on a bunch of stuff today.
Discussed my open PR/feature request against Poetry.
Started rewriting the step code in Ink Py to be a bit more like the source, which is why this post is in the category it's in.
I made a solid start there, but I need to take some time to be careful about how I'm doing this, because it's pretty confusing.
Anyway, I started working on a reference for The Tongue of Light, and got &lt;a class="reference external" href="https://im-in.space/&amp;#64;mwchase/103298235112936675"&gt;distracted by bad kerning&lt;/a&gt;.
Then, when I wanted to be writing this entry, I got &lt;a class="reference external" href="https://vastnope.wordpress.com/2017/04/21/this-is-a-very-wikipedia-sentence/"&gt;distracted by looking up who made weird edits to Wikipedia, and commented about it on my old blog for some reason&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I also played a bunch of Baba is You, which remains a very confusing game.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Ink-Py"></category></entry><entry><title>Ink-Py 2019-12-12</title><link href="https://mwchase.neocities.org/ink-py-2019-12-12" rel="alternate"></link><published>2019-12-12T05:00:00-05:00</published><updated>2019-12-12T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-12-12:/ink-py-2019-12-12</id><summary type="html">&lt;p class="first last"&gt;The C# design walks out of the shadows saying &amp;quot;We're not so different, you and I&amp;quot; and I bolt from the room.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Looking at the way Ink figures out how far to advance in outputting a line, I see that I've been thinking about it all wrong, because I wasn't taking lookahead into account.
Little bit of tunnel vision on my part.
My experiences with rollback in an imperative context, when I'm the one responsible for implementing it, have been kind of a nightmare.
But, all I really need to know is that it's on the table, and then I can sketch out the logic, and clean up the functions that I put together kind of wrong.
Looks like some of implementing this will involve putting new fields on the state to make it a linked list thing.
Oh well.&lt;/p&gt;
&lt;p&gt;One thing that's kind of bothered me about this porting effort is, their C# feels really verbose relative to my Python.
I have to assume the fact that I'm not porting comments plays a role, but even still, it feels like I'm often teasing out a simpler structure.&lt;/p&gt;
&lt;p&gt;Regardless of whether my opinions have anything to do with reality, I've just got to push on with this over the next few days.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Ink-Py"></category></entry><entry><title>Ink-Py 2019-12-11</title><link href="https://mwchase.neocities.org/ink-py-2019-12-11" rel="alternate"></link><published>2019-12-11T05:00:00-05:00</published><updated>2019-12-11T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-12-11:/ink-py-2019-12-11</id><summary type="html">&lt;p class="first last"&gt;Getting extremely close, trust me.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;After some minor back-and-forth on the bug I filed (the bug was definitely a bug, and my proposed fix is technically correct and, so far as we know, harmless, but the actual impact of the bug is low, and the question is, is there any way at all to trigger it against extant code? My answer is a solid maybe.) I made a judgment call and moved forward a little further with the porting effort.&lt;/p&gt;
&lt;p&gt;I'm going to figure out what comes next (basically, I need to refresh my memory about where the logic is that handles string concatenation for output purposes), and then get to bed.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Ink-Py"></category></entry><entry><title>Weekly Roundup 2019-12-10</title><link href="https://mwchase.neocities.org/weekly-roundup-2019-12-10" rel="alternate"></link><published>2019-12-10T05:00:00-05:00</published><updated>2019-12-10T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-12-10:/weekly-roundup-2019-12-10</id><summary type="html">&lt;p class="first last"&gt;Excellent correlation as usual between a stressful week and not having much to write about.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I thought about what I'd like to accomplish in terms of conlangs.&lt;/li&gt;
&lt;li&gt;Thursday: I speculated about what kind of conlanging techniques would make sense for me and what I want to accomplish.&lt;/li&gt;
&lt;li&gt;Friday: My laptop did weird stuff and I didn't do much.&lt;/li&gt;
&lt;li&gt;Saturday: It was an eventful day, but you don't get to hear about the events.&lt;/li&gt;
&lt;li&gt;Sunday: I looked at Ink just enough to go &amp;quot;here's a new thing that freaks me out just by existing&amp;quot;&lt;/li&gt;
&lt;li&gt;Monday: I decided to go back to taking a break from Ink-Py.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to put together a lexicon for The Tongue of Light in, I don't know, LibreOffice or something.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Diary 2019-12-09</title><link href="https://mwchase.neocities.org/diary-2019-12-09" rel="alternate"></link><published>2019-12-09T05:00:00-05:00</published><updated>2019-12-09T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-12-09:/diary-2019-12-09</id><summary type="html">&lt;p class="first last"&gt;Sometimes coding means looking at something that is clearly wrong, but the overall system works, and getting really worried.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was doing more taking-things-easy today, so I don't have much to write about.
I was looking at Ink, and I'm kind of apprehensive about porting &lt;tt class="docutils literal"&gt;TrySplittingHeadTailWhitespace&lt;/tt&gt; until I get feedback on the bug I filed.
Basically, it's not working as intended, but it's not obvious to me whether there's some compensating factor elsewhere in the code, or if this individual bit of design is wrong.
If I want to make progress on this stuff, I might have to see about running the tests and attempting to fix some of this myself and see what breaks, if anything.&lt;/p&gt;
&lt;p&gt;We'll see how things shake out tomorrow.
I'll try to figure out a good flow for working on conlang stuff, because I don't have as much license to complain about other people's code or tooling with that.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Ink-Py 2019-12-08</title><link href="https://mwchase.neocities.org/ink-py-2019-12-08" rel="alternate"></link><published>2019-12-08T05:00:00-05:00</published><updated>2019-12-08T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-12-08:/ink-py-2019-12-08</id><summary type="html">&lt;p class="first last"&gt;Usually when I file bugs I try to lay out the expected behavior. Not so with Ink.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't do too much today, mostly took it easy, but I did look over the Ink code some, file yet another bug based on code inspection, and port some code over.&lt;/p&gt;
&lt;p&gt;I don't have any definite idea of how much effort/progress I'm going to have here in the coming days.
I guess I'm kind of viewing this as &amp;quot;this might be cool to have for messing with Dennis&amp;quot;, but I don't want to work with Dennis until I have a 1.0-worthy release of Structured Data, and I don't want to do too much more there until Read the Docs has support for Python 3.8, which, according to the configuration documentation, it doesn't have yet.
And I have no interest in trying to expedite that when there's already projects beta-testing it.
I could try to get into the beta, but I don't feel like it.&lt;/p&gt;
&lt;p&gt;I think maybe sometime I should experiment with different formats for this kind of &amp;quot;daily code update&amp;quot; thing.
For now, I'm going to curl up with my e-reader.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Ink-Py"></category></entry><entry><title>Diary 2019-12-07</title><link href="https://mwchase.neocities.org/diary-2019-12-07" rel="alternate"></link><published>2019-12-07T05:00:00-05:00</published><updated>2019-12-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-12-07:/diary-2019-12-07</id><summary type="html">&lt;p class="first last"&gt;I think I've been staring at this for like ten minutes trying to figure out &amp;quot;a bunch of stuff happened, but I don't want to put any details in a blog post&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today was an extremely eventful day that left me kind of wiped out.
I'm not going to go into any more detail, or try to get anything more done with my projects.&lt;/p&gt;
&lt;p&gt;I did sketch some rough ideas about diagramming Dabupan/The Tongue of Light, but I think I should work on creating glosses for example sentences before I put too much effort into nailing things down at an abstract level.&lt;/p&gt;
&lt;p&gt;I'll try to pick up the pace a bit tomorrow, depending on how things are then.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-12-06</title><link href="https://mwchase.neocities.org/diary-2019-12-06" rel="alternate"></link><published>2019-12-06T05:00:00-05:00</published><updated>2019-12-06T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-12-06:/diary-2019-12-06</id><summary type="html">&lt;p class="first last"&gt;Something's up with the rendering on my laptop, sometimes.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;My laptop was kind of unreliable today, and then we traveled after dinner, so I didn't have a chance to do much.&lt;/p&gt;
&lt;p&gt;I'm thinking about declension in The Tongue of Light and its ancestral forms.
I've got some ideas, but I'm going to have to draft some actual words to figure out what works, I think.&lt;/p&gt;
&lt;p&gt;Not up for thinking any more; I'll try to make up for it tomorrow if I can.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-12-05</title><link href="https://mwchase.neocities.org/diary-2019-12-05" rel="alternate"></link><published>2019-12-05T05:00:00-05:00</published><updated>2019-12-05T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-12-05:/diary-2019-12-05</id><summary type="html">&lt;p class="first last"&gt;Setting up some folders to hold this stuff...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was kind of worn out today, and I'm not sure why.
In any case, I did some work coming up with historical details for the conlang I've been talking about, which I'm going to give the working title of The Tongue of Light.
I'm basically trying to focus on the particular form that I want to work with, but occasionally noticing that it's easiest to think about certain things I want in terms of a history.&lt;/p&gt;
&lt;p&gt;Now, in the past, when I've seen advocacy for using proto-languages in conlanging, I was usually interpreting that like &amp;quot;get the proto-language all set, then apply changes, and see where it ends up&amp;quot;.
That seems to me like it'd work in the context of following the story of a nation, but I never really liked trying to do that.
For this project, where the idea is kind of to have a fictional moment in time where the language has a particular form, the idea of taking a more ad-hoc approach seems more appealing.
Like &amp;quot;Okay, this bit is kind of irregular, so it ought to be derived from a more intuitive paradigm in the past, like so&amp;quot;.
I should probably figure out how best to represent a timeline of changes before I go too far, because it would be kind of awkward if I ended up needing to have a bunch of essentially unrelated changes happening all at once somehow.&lt;/p&gt;
&lt;p&gt;Okay, that's enough writing for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-12-04</title><link href="https://mwchase.neocities.org/diary-2019-12-04" rel="alternate"></link><published>2019-12-04T05:00:00-05:00</published><updated>2019-12-04T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-12-04:/diary-2019-12-04</id><summary type="html">&lt;p class="first last"&gt;Trying to get my bearings, and also I don't have much to say about what I've done.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;It seems I'm still taking a break from Ink-Py, so today I worked on conlang stuff while being cooped up inside because of the snow.&lt;/p&gt;
&lt;p&gt;I don't have much specifically to show for the SAE idea, though I'm sketching stuff out for it.
I think I'll make this a short entry and just mention the conlangs I'd like to make progress on.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;There's the SAE-inspired one. I feel like the sketches so far are the most thought-out grammar I've done.&lt;/li&gt;
&lt;li&gt;For the Ironsworn solo campaign, I'd like to have a naming language that has: consonant-heavy codas, syllabic sonorants, gemination, and a runic abugida. To get a better idea of how I want to go with it, I should study Scandinavian languages.&lt;/li&gt;
&lt;li&gt;For the Adventure Crafter/Mythic/Risus solo campaign, I've got a few languages I want to work out. The language of the less-ancient ancients, the language of the nation that used to occupy the desert, the language of the protagonist and the current majority population, the language of a nation that borders both of them, and maybe a few other miscellaneous ones.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Looking at the amount of stuff that I'm thinking &amp;quot;I'd like to get to this, but I'm currently not&amp;quot;, I think I might be a little burnt out.
I'm going to have to take it easy, which shouldn't be too hard.
Aside from the fact that we've got some more travel in the near future, and right now everything is &lt;em&gt;so cold&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2019-12-03</title><link href="https://mwchase.neocities.org/weekly-roundup-2019-12-03" rel="alternate"></link><published>2019-12-03T05:00:00-05:00</published><updated>2019-12-03T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-12-03:/weekly-roundup-2019-12-03</id><summary type="html">&lt;p class="first last"&gt;It would have been cool if I'd consciously decided to take a break, but it's fine, probably.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I got most of the auxiliary stuff for the Ink Python VM working, though some of it isn't working quite the way I think it should be.&lt;/li&gt;
&lt;li&gt;Thursday: I ported a test, and it failed. I tried to get it working.&lt;/li&gt;
&lt;li&gt;Friday: I figured out that I need (&amp;quot;need&amp;quot;) to make design changes to Ink as I port.&lt;/li&gt;
&lt;li&gt;Saturday: I made the changes.&lt;/li&gt;
&lt;li&gt;Sunday: I thought I might have gotten far enough for the test to pass, but I did not. I figured out what needed to happen next.&lt;/li&gt;
&lt;li&gt;Monday: Instead, I started working on a conlang that may or may not be a clever idea, I don't seem to be able to decide.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, some mix of more conlanging, getting back to Ink, and &lt;em&gt;hopefully&lt;/em&gt; Ironsworn.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Diary 2019-12-02</title><link href="https://mwchase.neocities.org/diary-2019-12-02" rel="alternate"></link><published>2019-12-02T05:00:00-05:00</published><updated>2019-12-02T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-12-02:/diary-2019-12-02</id><summary type="html">&lt;p class="first last"&gt;No coding today, I guess.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So I don't really remember what I did today besides go shopping, and like an hour ago start writing up ideas for a conlang that is basically a really subtle troll.
The concept for it started when I heard about the concept of &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Standard_Average_European"&gt;Standard Average European&lt;/a&gt;.
Because English is part of the sprachbund, it seems to me like the &amp;quot;Euroversals&amp;quot; could be useful to English-speaking conlangers who don't want their language to sound particularly &amp;quot;European&amp;quot;, or to someone working on an auxiliary language.&lt;/p&gt;
&lt;p&gt;I had the idea of &amp;quot;what if I leaned into this as hard as possible, when it comes to stuff that people mentioned, but I take whatever approach I feel like for everything that isn't specifically mentioned (or that I really don't feel like having)&amp;quot;&lt;/p&gt;
&lt;p&gt;So far, the result is looking like a mix of &amp;quot;that is exactly what English does&amp;quot;, &amp;quot;that's what some languages that aren't English do&amp;quot;, and &amp;quot;I only assume there's a natlang that does that because I'm not &lt;em&gt;that&lt;/em&gt; creative&amp;quot;, which is probably the best that can be hoped for, given the constraints I gave myself.&lt;/p&gt;
&lt;p&gt;Anyway, I absolutely need to go to bed now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Ink-Py 2019-12-01</title><link href="https://mwchase.neocities.org/ink-py-2019-12-01" rel="alternate"></link><published>2019-12-01T05:00:00-05:00</published><updated>2019-12-01T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-12-01:/ink-py-2019-12-01</id><summary type="html">&lt;p class="first last"&gt;The test actually went through to completion before failing a few times today! Wow!&lt;/p&gt;
</summary><content type="html">&lt;p&gt;No real surprises working through Ink Py. I still don't have the test passing, but it's progressing further.
I think it might actually almost pass if I can get through this command implementation, but maybe not.&lt;/p&gt;
&lt;p&gt;Answer from the future: Nope!
The next step is to actually format the output for display, which is something that I tried to factor out of the traversal logic, and into a separate presentation step (good, I think), which I haven't yet tried to implement (less good).&lt;/p&gt;
&lt;p&gt;I know every entry on this has been like, here's a new thing that doesn't work, but formerly, absolutely none of this worked, and after each entry I got a bit more working.&lt;/p&gt;
&lt;p&gt;Anyway, once I have a test passing, I'm going to look into refactoring stuff because my &lt;tt class="docutils literal"&gt;__init__.py&lt;/tt&gt; is a giant horrifying grab-bag.
Then, I might consider putting the still highly-incomplete code up online to show off.
In spite of my insistence on making the immutability enforced at runtime, and some overly-clever concepts, there are some things I'm noticing that I think could make the C# Ink leaner and better-organized.
(For one, some of my Path implementation corresponds to parts of the InkObject implementation, because the function in question basically just manipulates Paths.
For another, I don't currently see how the &lt;tt class="docutils literal"&gt;_startOfRoot&lt;/tt&gt; Pointer ever wouldn't have a null container.
And also there's some internal functions that never get called.)&lt;/p&gt;
&lt;p&gt;In any case, now I know what to try to implement tomorrow: coercing internally generated text to nicely rendering text.
Hmm.
Oh dear.
My &lt;tt class="docutils literal"&gt;push_to_output_stream()&lt;/tt&gt; function isn't nearly gnarly enough.
I guess that's the first thing to address.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Ink-Py"></category></entry><entry><title>Ink-Py 2019-11-30</title><link href="https://mwchase.neocities.org/ink-py-2019-11-30" rel="alternate"></link><published>2019-11-30T05:00:00-05:00</published><updated>2019-11-30T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-11-30:/ink-py-2019-11-30</id><summary type="html">&lt;p class="first last"&gt;Adequate progress!&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Grinding away at this some more.
I've ditched the Pointer type, and now I'm working on native function calls.
There's probably going to be some awkwardness there because I haven't really implemented the boxed value types yet (I've got basic implementations of some of them), but the next priority to getting them set up is getting the &amp;quot;evaluation stack&amp;quot; implemented.&lt;/p&gt;
&lt;p&gt;I'm not sure I have much to say on that.
I basically just did what I described yesterday, and that stuff seems to work.&lt;/p&gt;
&lt;p&gt;And maybe I can't think of anything to say because it's kind of hard to focus when I hang out with my in-laws for extended periods.
I'll be happy to get back home tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Ink-Py"></category></entry><entry><title>Ink-Py 2019-11-29</title><link href="https://mwchase.neocities.org/ink-py-2019-11-29" rel="alternate"></link><published>2019-11-29T05:00:00-05:00</published><updated>2019-11-29T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-11-29:/ink-py-2019-11-29</id><summary type="html">&lt;p class="first last"&gt;This is a really big initial hump, but I'm confident.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I didn't work on this much today, because Thanksgiving, but I understand the C# codebase for Ink enough to know that I'm going to need to make some obnoxious changes if I want to keep up my current design sensibilities.&lt;/p&gt;
&lt;p&gt;Basically, I'm trying to work solely with immutable data, because that's easier for me to think about, but that means no cyclic references, which means no parent references, which means anything that uses them needs a rewrite.
In practical terms, I believe this means I need to ditch the concept of a &amp;quot;Pointer&amp;quot;, and replace all of the Pointers in the ported codebase so far with AbsolutePaths.
And possibly references to the root.&lt;/p&gt;
&lt;p&gt;&amp;quot;Max, aren't the problems you're running into with this approach essentially self-inflicted?&amp;quot;&lt;/p&gt;
&lt;p&gt;I'm attempting this port because I want to, so &amp;quot;because I want to do it&amp;quot; is a valid reason to do anything as part of the effort.&lt;/p&gt;
&lt;p&gt;Anyway, I could make fancy changes to the Container layout to try to &amp;quot;optimize&amp;quot; stuff, but my best bet for getting anywhere with this is to focus on making the code as simple as possible.&lt;/p&gt;
&lt;p&gt;And I can't make things simple without a clear head, so I've got to call this now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Ink-Py"></category></entry><entry><title>Ink-Py 2019-11-28</title><link href="https://mwchase.neocities.org/ink-py-2019-11-28" rel="alternate"></link><published>2019-11-28T05:00:00-05:00</published><updated>2019-11-28T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-11-28:/ink-py-2019-11-28</id><summary type="html">&lt;p class="first last"&gt;A quick entry because I was just iterating on a single test for a while.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The first test I ported now gets more done before it fails, but I'm still working out how things actually get initialized.&lt;/p&gt;
&lt;p&gt;I'm in the middle of working out how the initial StoryState gets assembled, and I'm pretty confident that &lt;tt class="docutils literal"&gt;StoryState.rootContentContainer&lt;/tt&gt; will always be &lt;tt class="docutils literal"&gt;null&lt;/tt&gt;.
I've figured out, I think, what happens to get the pointer to have the correct value, and I'll try to trace all of the relevant logic later.&lt;/p&gt;
&lt;p&gt;I'm too sleepy now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Ink-Py"></category></entry><entry><title>Ink-Py 2019-11-27</title><link href="https://mwchase.neocities.org/ink-py-2019-11-27" rel="alternate"></link><published>2019-11-27T05:00:00-05:00</published><updated>2019-11-27T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-11-27:/ink-py-2019-11-27</id><summary type="html">&lt;p class="first last"&gt;Computers, everyone...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Ink-Py status: I've got documentation building, but not in, like, a useful way.
I've shoved everything I can think of into the noxfile.
Right now I've got a distinct step for generating all compiled story files up front, which is... kind of slow.
Getting the coverage data to generate correctly appears to require a bunch of stuff that it really shouldn't.&lt;/p&gt;
&lt;p&gt;I've added a test, but since I just ported the test straight over from the C# codebase, getting it to pass requires either implementing a whole bunch of functionality, or, like, taking the lazy way out like I guess TDD says I'm supposed to.
Honestly, I'd rather just port stuff over as much as possible and see what that gets me.
My hope is that getting one test to pass will take most of the effort, since this one test touches a lot of functionality.&lt;/p&gt;
&lt;p&gt;I spent most of the day trying and failing to trim down the coverage configuration, so I can't get any further tonight on trying to make the new test pass.
We'll see what I have time for tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Ink-Py"></category></entry><entry><title>Weekly Roundup 2019-11-26</title><link href="https://mwchase.neocities.org/weekly-roundup-2019-11-26" rel="alternate"></link><published>2019-11-26T05:00:00-05:00</published><updated>2019-11-26T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-11-26:/weekly-roundup-2019-11-26</id><summary type="html">&lt;p class="first last"&gt;Fine week, rough days.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I was very tired because of meetings, but I put in some work on Poetry.&lt;/li&gt;
&lt;li&gt;Thursday: I put in some more work on Poetry, and also worked on my Ironsworn solo campaign a little.&lt;/li&gt;
&lt;li&gt;Friday: I got the PR against Poetry in. A little more Ironsworn, and we watched more goofy horror movies.&lt;/li&gt;
&lt;li&gt;Saturday: I started trying to port Ink to Python again, and didn't make it too far. I did, however, figure out which of my Sublime Text plugins was &amp;quot;sabotaging&amp;quot; my Python files.&lt;/li&gt;
&lt;li&gt;Sunday: I tried to take a different approach to porting Ink to Python.&lt;/li&gt;
&lt;li&gt;Monday: I made a new category for trying to port Ink to Python. This would be my third attempt in as many days. ¯\_(ツ)_/¯&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Today I had a late lunch, and it &lt;em&gt;wrecked me&lt;/em&gt;.
I came home, collapsed in bed for like an hour and a half, and woke up really disoriented.
Really glad I'm theoretically able to take things easy for the next week or so.&lt;/p&gt;
&lt;p&gt;Next week, I'm going to work on porting Ink's tests to the Python interface I'm prototyping, and also I'd like to try &lt;em&gt;actually starting the Ironsworn campaign&lt;/em&gt;.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Ink-Py 2019-11-25</title><link href="https://mwchase.neocities.org/ink-py-2019-11-25" rel="alternate"></link><published>2019-11-25T05:00:00-05:00</published><updated>2019-11-25T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-11-25:/ink-py-2019-11-25</id><summary type="html">&lt;p class="first last"&gt;I tried to come up with a pun on &amp;quot;ink&amp;quot; and &amp;quot;snakes&amp;quot;, and I got nothing.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Things are a little out-of-control right now, but I'm trying to stop it from getting to me.&lt;/p&gt;
&lt;p&gt;I'm starting a new category today because I seem to be going in on this whole &amp;quot;Hey, let's try porting Ink to Python again&amp;quot; idea, and that's fine with me.&lt;/p&gt;
&lt;p&gt;I've tried a few times in the past, and my efforts have mostly just led to bug reports and PRs against the C# version.
(I actually forgot about the PRs, and was really confused for a little bit, seeing the &amp;quot;Contributor&amp;quot; badge on GitHub.)&lt;/p&gt;
&lt;p&gt;What tripped me up in previous attempts was not, as other people's attempts might have it, that Python just isn't practical for implementing a VM like Ink.
I would argue that PyPy stands as a counter-example to that sentiment.&lt;/p&gt;
&lt;p&gt;My big issues adapting the C# codebase centered around non-local reasoning, circular references, dead code, and a lack of familiarity/ease on my part with some C# features.&lt;/p&gt;
&lt;p&gt;For the last point, I just want to understand things well enough to come up with an equivalent in Python.&lt;/p&gt;
&lt;p&gt;The other points can be summarized as: I don't know whether a given section of code is actually used, I don't know how many times a given field is set and with what range of values, and some pairs of objects are so tightly coupled that it's not clear to me which one of them &amp;quot;should&amp;quot; have a given bit of functionality.&lt;/p&gt;
&lt;p&gt;That probably seemed mean, but it's the truth.
I really was looking at some functions thinking &amp;quot;Okay, what on earth is the equivalent of this in Python? Like, I can't translate this directly for all possible ways this function could be called, so I'll have to specialize it for potentially each of the call sites, of which there are... none. Well, that was a waste of time.&amp;quot;&lt;/p&gt;
&lt;p&gt;So, the fundamental thing I was doing wrong in my previous attempts was, I was trying to directly translate an internal bit of code before I had the context on how it was used.&lt;/p&gt;
&lt;p&gt;Now, some people advocating for particular practices to improve software quality really like tests.
&amp;quot;Write your tests first!&amp;quot; they say.
&amp;quot;Tests are the most important code, because you can use them to recreate correct product code, but you can't derive correct tests from your product code!&amp;quot;
I haven't had the guts to take them up on the second assertion, but it looks like my best bet for getting this project off the ground.
Focus on designing an interface that I can do local reasoning about, then port the tests to handle that interface.&lt;/p&gt;
&lt;p&gt;Here's where I am on that currently:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I've got a file full of stub functions with type signatures that are approximately correct. I may tweak them depending on how I write the convenience functions.&lt;/li&gt;
&lt;li&gt;I copied 100+ Ink snippets out of the test suite for Ink. I've got some steps put together that should handle converting the snippts to story json, but I haven't ported the tests over yet.&lt;/li&gt;
&lt;li&gt;I've created a Poetry project for this, and got it building. The dependencies still need to be adjusted, and I haven't written most of the noxfile, but this step is something like an hour of fiddling around, tops.&lt;/li&gt;
&lt;li&gt;I'm going to need to add coverage, in particular.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hopefully in a week or so, I'll be able to put up the very, very early prototype code for public consumption.
Nothing else to be done right now, though.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Ink-Py"></category></entry><entry><title>Diary 2019-11-24</title><link href="https://mwchase.neocities.org/diary-2019-11-24" rel="alternate"></link><published>2019-11-24T05:00:00-05:00</published><updated>2019-11-24T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-11-24:/diary-2019-11-24</id><summary type="html">&lt;p class="first last"&gt;Let's try porting from the outside in.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today we watched &lt;em&gt;Them!&lt;/em&gt;, which is some pretty good 50s schlock.
Maybe we should see what else is out there in terms of movies named after pronouns.&lt;/p&gt;
&lt;p&gt;Anyway, I later tried some more to adapt Ink's code, and I'm now heavily suspecting that I'm going to need to try prototyping something that follows the very high-level interface, and work with that a bit until it makes sense to me, because I don't really use programming languages that treat field access like C# does.&lt;/p&gt;
&lt;p&gt;I'll try and sketch out some of the ideas I have here.&lt;/p&gt;
&lt;p&gt;At a very abstract level, a Story can be serialized or deserialized.
It can be in a state where it can produce lines of text, or choices, or it can be ready to follow a choice.&lt;/p&gt;
&lt;p&gt;Now, following a choice will add lines of text.
(Last I checked, in the reference implementation, none of the text is saved, so procedural text gets regenerated.
I'll check that now.
Yep, still a footgun.)&lt;/p&gt;
&lt;p&gt;I'm going to sketch some of this on paper.&lt;/p&gt;
&lt;p&gt;Okay, I've got a very informal state machine diagram that represents an extremely opinionated system without many external capabilities.
Seems like a good target for prototyping.&lt;/p&gt;
&lt;p&gt;And now I've got a separate file for prototyping this stuff, and it's got some code in it.&lt;/p&gt;
&lt;p&gt;I guess the next thing to work on is the serialization and deserialization, because it's not really an implementation of Ink if it can't work with the save format.&lt;/p&gt;
&lt;p&gt;Although...
I also need to change around the interface to reflect the different responsibilities I'm giving different parts of the system.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-11-23</title><link href="https://mwchase.neocities.org/diary-2019-11-23" rel="alternate"></link><published>2019-11-23T05:00:00-05:00</published><updated>2019-11-23T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-11-23:/diary-2019-11-23</id><summary type="html">&lt;p class="first last"&gt;Technology!&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Tonight, I was mostly messing with trying to port the Ink runtime to Python.
I'm going the route of doing heavy refactorings as I go, which is a definite gamble, but the source code in this case is more likely to be in a valid state than previous times I've attempted that.&lt;/p&gt;
&lt;p&gt;Unfortunately, I got myself seriously wound up because Sublime Text was being Helpful™ again.
I eventually determined that the behavior that was bothering me was the isort plugin working as designed, so, um, I would not recommend the isort plugin?
It will ignore your project settings, sometimes, I think?
Basically it was a huge pain and I'm glad I figured out what was sabotaging my files.&lt;/p&gt;
&lt;p&gt;Hopefully from now on everything should be more predictable, but that just, really sucked for a while there.&lt;/p&gt;
&lt;p&gt;I can't be up much longer.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-11-22</title><link href="https://mwchase.neocities.org/diary-2019-11-22" rel="alternate"></link><published>2019-11-22T05:00:00-05:00</published><updated>2019-11-22T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-11-22:/diary-2019-11-22</id><summary type="html">&lt;p class="first last"&gt;Fingers crossed.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I put in the PR against Poetry.
We'll see how that goes.
Hopefully there's some feedback soon.&lt;/p&gt;
&lt;p&gt;I did some testing against Structured Data, and discovered that my interpretation of some of Mypy's internal documentation was incorrect, which is a pain.
I saw the following and thought &amp;quot;I can use this to make an invariant protocol for matching types!&amp;quot; and that doesn't seem to be true.
&amp;quot;We may encounter expressions whose values are specific classes; those are represented as callables (possibly overloaded) corresponding to the class's constructor's signature and returning an instance of that class.  The difference with Type[C] is that those callables always represent the exact class given as the return type&amp;quot;
RIP.&lt;/p&gt;
&lt;p&gt;I fleshed things out a tiny bit with Ironsworn.
I'm still trying to wrap my head around the relationship between the story I want to tell and the vows that would go into it.&lt;/p&gt;
&lt;p&gt;Besides all of that, today we watched Children of the Corn II, which...
Okay, it's a sequel to a supernatural horror movie, and you may ask &amp;quot;Does it ramp up the supernatural weirdness, or does it try to give a scientific explanation for everything?&amp;quot;
The answer is yes.
That was a weird movie.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-11-21</title><link href="https://mwchase.neocities.org/diary-2019-11-21" rel="alternate"></link><published>2019-11-21T05:00:00-05:00</published><updated>2019-11-21T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-11-21:/diary-2019-11-21</id><summary type="html">&lt;p class="first last"&gt;Hopefully the PR will at least serve as a rough guideline for what the feature &lt;em&gt;should&lt;/em&gt; do.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I spent a bunch of time squinting at Poetry's source code, and now have a prototype that shouldn't break in the manner that the previous prototypes would have broken.&lt;/p&gt;
&lt;p&gt;After a lot of effort, I've figured out how to write some basic tests.
As I compose this entry, I'm rerunning the test suite with a new test.
If it doesn't pass, I'll be very sad and confused.&lt;/p&gt;
&lt;p&gt;Update: it didn't pass, but the reason why is clear enough that I'm just mildly unhappy.
I fixed the problem, and if it still fails, then I'll be annoyed and confused and such.&lt;/p&gt;
&lt;p&gt;Hey, it passed.
That's one test down, at least two more to go.&lt;/p&gt;
&lt;p&gt;The basic test I did was that a package with only runtime dependencies specified can opt into not installing anything.
Let's list some more cases:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Only development dependencies, should all be installed&lt;/li&gt;
&lt;li&gt;Mix of independent dependencies, only develop should be installed&lt;/li&gt;
&lt;li&gt;Incompatible dependencies, should successfully install develop&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And complementary tests against the mason component.
I also note that I missed adding the field's default value to the &amp;quot;complete&amp;quot; fixture.
I'll get that now.&lt;/p&gt;
&lt;p&gt;Besides Poetry, I made some progress on my ongoing session 0 of solo Ironsworn.
I'm right now trying to figure out the right balance of things to put in my starting vows.&lt;/p&gt;
&lt;p&gt;The big thing I want to figure out with Ironsworn is, how do I want to track the character sheet stuff?
ANM has the character sheets (which are tiny) stuffed into a Lua file next to the plotlines.
I could probably do something similar easily enough for Ironsworn.&lt;/p&gt;
&lt;p&gt;Okay, I've started on a textual character sheet.
I'm going to have to go over the rules some to get the details of some sections right, but it looks basically fine.&lt;/p&gt;
&lt;p&gt;And that's enough for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-11-20</title><link href="https://mwchase.neocities.org/diary-2019-11-20" rel="alternate"></link><published>2019-11-20T05:00:00-05:00</published><updated>2019-11-20T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-11-20:/diary-2019-11-20</id><summary type="html">&lt;p class="first last"&gt;It's going to be kind of a pain to chase all of the data dependencies, I suspect.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was in meetings for over three hours today.
My constitution can't handle that.&lt;/p&gt;
&lt;p&gt;Anyway, I started trying to really figure out how to work with Poetry's existing test libraries.
I basically discovered that my first attempt at implementing &amp;quot;dev-mode&amp;quot; was probably pretty wrong.
The interfaces and documentation, I haven't seen any reason to doubt them yet, but the changes I made to the core are likely to interact poorly with *checks notes* nearly everything.&lt;/p&gt;
&lt;p&gt;With that in mind, I'm going to have to try again, because there's just no way this first attempt is right.
No time for that now, because I'm tired.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2019-11-19</title><link href="https://mwchase.neocities.org/weekly-roundup-2019-11-19" rel="alternate"></link><published>2019-11-19T05:00:00-05:00</published><updated>2019-11-19T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-11-19:/weekly-roundup-2019-11-19</id><summary type="html">&lt;p class="first last"&gt;I got a little distracted, but eh.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I started working on a solo Ironsworn game.&lt;/li&gt;
&lt;li&gt;Thursday: I'm less stressed, and I'm working on PRs to Poetry.&lt;/li&gt;
&lt;li&gt;Friday: One of the PRs proved unnecessary for reasons that I honestly still don't get.&lt;/li&gt;
&lt;li&gt;Saturday: I waited too long to write the entry.&lt;/li&gt;
&lt;li&gt;Sunday: I wrote code, but not tests.&lt;/li&gt;
&lt;li&gt;Monday: I wrote documentation, but not tests.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I had better write some tests.
Also, I've been messing with porting Ink to Python (I tried this a while ago, and mostly just filed bugs against the reference implementation).
Maybe I'll do something there, especially once I think I'm done with the Poetry PR.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Diary 2019-11-18</title><link href="https://mwchase.neocities.org/diary-2019-11-18" rel="alternate"></link><published>2019-11-18T05:00:00-05:00</published><updated>2019-11-18T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-11-18:/diary-2019-11-18</id><summary type="html">&lt;p class="first last"&gt;Just a whole bunch of scribbling that doesn't go neatly into a blog post.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;All right, here's how things went today: I wrote documentation for the changes I made in my PR to Poetry, I still didn't write tests because I need to look over the existing tests to figure out what they even do, and I started a completely new writing project that I won't talk about in any further detail.&lt;/p&gt;
&lt;p&gt;Also, I just now, like an hour ago, started trying to refresh my memory on music theory in a more structured way.&lt;/p&gt;
&lt;p&gt;It'd be cool if I had a longer entry, but I was once again just mostly taking it easy today.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-11-17</title><link href="https://mwchase.neocities.org/diary-2019-11-17" rel="alternate"></link><published>2019-11-17T05:00:00-05:00</published><updated>2019-11-17T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-11-17:/diary-2019-11-17</id><summary type="html">&lt;p class="first last"&gt;I tend to think at length about things, then do the actual thing really quickly.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got a prototype of the changes I was requesting to Poetry for the feature request that wasn't just a case of &amp;quot;Oh, you need to actually tell it to do the thing you thought you were telling it to do.&amp;quot;
(I'm honestly not sure why adding the wildcards makes it work differently.)
Anyway, prototype of the config changes.
It's going to need some tests:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;That everything that doesn't involve using the installed project still works when the option is enabled.&lt;/li&gt;
&lt;li&gt;That Poetry still works as a PEP 518 build system when the option is enabled.&lt;/li&gt;
&lt;li&gt;That dev and runtime dependencies are allowed to conflict when the option is enabled.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That's the obvious stuff.
This wasn't a huge change, so hopefully it doesn't have non-trivial ramifications.&lt;/p&gt;
&lt;p&gt;Hm.&lt;/p&gt;
&lt;p&gt;I'm not sure what the best way is to inject the setting.
That's what I'll have to look into next.&lt;/p&gt;
&lt;p&gt;I'd like to try to get this over with, and make some progress on the various writing projects that I'm juggling.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-11-16</title><link href="https://mwchase.neocities.org/diary-2019-11-16" rel="alternate"></link><published>2019-11-16T05:00:00-05:00</published><updated>2019-11-16T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-11-16:/diary-2019-11-16</id><summary type="html">&lt;p class="first last"&gt;Taking it easy, but also staying up way too late...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;So, I got some feedback on one of the Poetry issues I filed.
As I mentioned yesterday, it's basically that include paths in Poetry have some (to me) weird levels or syntax, &lt;em&gt;or&lt;/em&gt; the thing that I thought was the obvious way to use them doesn't work.
I mean, it doesn't always work like that, but maybe it always doesn't work like that?&lt;/p&gt;
&lt;p&gt;So, all that's left is to start messing with the whole &amp;quot;install as little as possible idea&amp;quot;.&lt;/p&gt;
&lt;p&gt;I got distracted from writing this, so I can't write much more.
Oh well.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-11-15</title><link href="https://mwchase.neocities.org/diary-2019-11-15" rel="alternate"></link><published>2019-11-15T05:00:00-05:00</published><updated>2019-11-15T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-11-15:/diary-2019-11-15</id><summary type="html">&lt;p class="first last"&gt;Sometimes it turns out that what I want is basically magic...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Spitballing the improvements I want made to Poetry...&lt;/p&gt;
&lt;p&gt;For the dev-only concept, there needs to be some kind of configuration option added, and I think it needs to be read in the Installer, and it'll do something like &lt;tt class="docutils literal"&gt;root = root.clone()&lt;/tt&gt; and then &lt;tt class="docutils literal"&gt;del &lt;span class="pre"&gt;root.requires[:]&lt;/span&gt;&lt;/tt&gt;.
I'm not sure how many ways there are to get at logic that needs to take this into account.&lt;/p&gt;
&lt;p&gt;For the vcs exclude override concept, there are a few ways to go, but I think the lowest-friction is to remove generated &amp;quot;exclude&amp;quot; entries if there is an &lt;em&gt;exact match&lt;/em&gt; in &amp;quot;include&amp;quot;.
Okay, this actually looks really painful, because the current code doesn't engage with the ignore file from the vcs directly; &lt;em&gt;all it gets&lt;/em&gt; is a concrete list of ignored files.
The easiest way is probably some kind of &amp;quot;no-seed&amp;quot; option that just messes with the beginning of &lt;tt class="docutils literal"&gt;find_excluded_files&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;I went elsewhere and rubber-ducked the issues here in more detail, and came to the conclusion that it's probably easier to just roll my own tool.
Very slightly probably.
I'm not going to do &lt;em&gt;that&lt;/em&gt; now, so I'm going to settle for making some more activity on the issues.
I will, instead, try to implement the solutions I came up with and posted in the bug comments.
Just, not right now.
Tomorrow.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
&lt;p&gt;ETA: Turns out I just wasn't specifying the include paths &lt;em&gt;hard enough&lt;/em&gt;, so that leaves just one bug to put in a PR for at some point.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-11-14</title><link href="https://mwchase.neocities.org/diary-2019-11-14" rel="alternate"></link><published>2019-11-14T05:00:00-05:00</published><updated>2019-11-14T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-11-14:/diary-2019-11-14</id><summary type="html">&lt;p class="first last"&gt;No word yet on whether these features fit the vision for Poetry ¯\_(ツ)_/¯&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I think I'm doing a little better managing my stress; I made some terrible jokes earlier today that I think indicate that I'm doing well enough to come up with them.&lt;/p&gt;
&lt;p&gt;Anyway, making a little progress with Ironsworn.
I've decided that my character is focused on wits; I haven't picked out the other stats.
He has a boyfriend, and everyone has anime hair.
I don't know if some kind of live feed of my priorities here would make sense to anyone else, but hey, solo play.&lt;/p&gt;
&lt;p&gt;Not much else to report.
There are some feature requests I filed against Poetry that I'm going to try to put in PRs for to see if that gets forward motion on them.
First I need to go through the basic checklist of setting up the repo and running the tests.
Maybe I'll get that started in the next few days, maybe not.
Let's see... looks like both PRs would be based off the &lt;tt class="docutils literal"&gt;develop&lt;/tt&gt; branch.
Both are focused around adding configuration options, or at least changing how the configuration is interpreted.
And that's all I want to think about for now, because I'm tired.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-11-13</title><link href="https://mwchase.neocities.org/diary-2019-11-13" rel="alternate"></link><published>2019-11-13T05:00:00-05:00</published><updated>2019-11-13T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-11-13:/diary-2019-11-13</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;No, I can't keep watching this movie, I'll turn stupid!&amp;quot; &amp;quot;Okay, but, that is what we do.&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;On the Ironsworn front, I've got the truths of the setting chosen.
For this game, I'll be playing in a version of the Ironlands that leans pretty heavily on the angle of &amp;quot;advanced civilizations brought low by a magical apocalypse&amp;quot; angle, in which a lot of the enemies will be empowered by corrupted artifacts the Ironlanders accidentally brought with them.&lt;/p&gt;
&lt;p&gt;I didn't work on it much tonight because we watched A Sound of Thunder, which was just... so much nonsense.&lt;/p&gt;
&lt;p&gt;I'll try to get all the materials to actually play together tomorrow.
I'll have to see if I feel like making specialized roller functions like I have for Mythic in the past, or just following flowcharts like I am for Mythic in my other writing project.&lt;/p&gt;
&lt;p&gt;I don't have anything to report on the Ink front; I'll think about it after I post this, and see if I come up with any prototypes.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2019-11-12</title><link href="https://mwchase.neocities.org/weekly-roundup-2019-11-12" rel="alternate"></link><published>2019-11-12T05:00:00-05:00</published><updated>2019-11-12T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-11-12:/weekly-roundup-2019-11-12</id><summary type="html">&lt;p class="first last"&gt;I continue to be amazed at the stuff that I did &amp;quot;only&amp;quot; six days ago. What is a sense of time?&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I finally psyched myself up to work on &amp;quot;structure types&amp;quot;. This is basically a way to represent the types that go into the matches that make it possible to Actually Do Things with Structured Data, so they're kind of a big deal for getting type analysis support at some point.&lt;/li&gt;
&lt;li&gt;Thursday: I got Structured Data much better typed, although there's a serious issue that I still haven't addressed.&lt;/li&gt;
&lt;li&gt;Friday: I finished working on Structured Data, and resolved to take another break, then eventually try to do the plugin.&lt;/li&gt;
&lt;li&gt;Saturday: I dealt with a whole big light-sensitive thing.&lt;/li&gt;
&lt;li&gt;Sunday: I realized it was unresolved stress.&lt;/li&gt;
&lt;li&gt;Monday: I resolved some of the stress.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try working on some new projects.
Maybe get back to some of the others later.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Diary 2019-11-11</title><link href="https://mwchase.neocities.org/diary-2019-11-11" rel="alternate"></link><published>2019-11-11T05:00:00-05:00</published><updated>2019-11-11T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-11-11:/diary-2019-11-11</id><summary type="html">&lt;p class="first last"&gt;Doing better...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I took care of a bunch of things that were bothering me, so now I'm a little calmer.&lt;/p&gt;
&lt;p&gt;That kind of took all day, though, so now I'm just planning ahead.
I'm thinking I'd like to try to do a solo run of &lt;a class="reference external" href="https://www.ironswornrpg.com/"&gt;Ironsworn&lt;/a&gt; to get a feel for the system.
Also, I was just trying to answer someone's questions on the &lt;a class="reference external" href="https://github.com/inkle/ink"&gt;Ink&lt;/a&gt; engine, and I came up with some interesting ideas from pondering what they were trying to do.&lt;/p&gt;
&lt;p&gt;For now, though, I have to put in the effort to make Monday but not-totally-awful.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-11-10</title><link href="https://mwchase.neocities.org/diary-2019-11-10" rel="alternate"></link><published>2019-11-10T05:00:00-05:00</published><updated>2019-11-10T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-11-10:/diary-2019-11-10</id><summary type="html">&lt;p class="first last"&gt;Not feeling great. I'm trying to work on it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Ugh.
I hadn't dealt with all of the stress I've been under.
I don't know if I have yet, but I think I'm doing better.
I also think my laptop is getting a little finicky.&lt;/p&gt;
&lt;p&gt;I think I'm going to have to make a serious effort to do writing, because all of the stress got me feeling creatively blocked.&lt;/p&gt;
&lt;p&gt;So, I've made some plans for later, but sleeping soon sounds like a good idea.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-11-09</title><link href="https://mwchase.neocities.org/diary-2019-11-09" rel="alternate"></link><published>2019-11-09T05:00:00-05:00</published><updated>2019-11-09T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-11-09:/diary-2019-11-09</id><summary type="html">&lt;p class="first last"&gt;There is almost no light in here, it's the middle of the night, and I'm wearing sunglasses. I'm probably fine.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;My head hurts real bad right now.
I'm trying to deal with it, but part of that is going to have to be wrapping up soon.
I don't have the ability to focus.
I'm going to jot down some quick thoughts elsewhere for later, then try to be good enough at doing things to get ready for bed.&lt;/p&gt;
&lt;p&gt;And, I can't handle things any more.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Algebraic Data Types 2019-11-08</title><link href="https://mwchase.neocities.org/algebraic-data-types-2019-11-08" rel="alternate"></link><published>2019-11-08T05:00:00-05:00</published><updated>2019-11-08T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-11-08:/algebraic-data-types-2019-11-08</id><summary type="html">&lt;p class="first last"&gt;Hopefully all of the annotations I've added actually make things clearer.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I spent a lot of time today improving the strictness on the type annotations.
I'm currently looking into something that I looked for a command-line option for and didn't see, but maybe I just missed it, which is to note when things could take type variables, but dont.
I took care of some of that, but it feels like slower going that some of the other improvements I've made.&lt;/p&gt;
&lt;p&gt;Anyway, I think I should take yet another break from working on Structured Data, because I am yet again mired down in its guts.
When I get back into it, I should work on the plugin, because I don't think I can advance the state of the codebase much more without making it actually analyze the types.&lt;/p&gt;
&lt;p&gt;I forgot to mention, but I was somewhat sick today, just enough that wandering down into the guts of this codebase was probably all I was good for today anyway.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Algebraic Data Types"></category></entry><entry><title>Algebraic Data Types 2019-11-07</title><link href="https://mwchase.neocities.org/algebraic-data-types-2019-11-07" rel="alternate"></link><published>2019-11-07T05:00:00-05:00</published><updated>2019-11-07T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-11-07:/algebraic-data-types-2019-11-07</id><summary type="html">&lt;p class="first last"&gt;Some of this stuff was &amp;quot;eh, good enough&amp;quot;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Okay, I've made a serious dent in the mypy coverage holes for Structured Data.
Now the main thing left is that I still haven't worked out what I want to do for how the &lt;tt class="docutils literal"&gt;Descriptor&lt;/tt&gt; classes return different proxies based on which class they're accessed from.&lt;/p&gt;
&lt;p&gt;I ended up feeling kind of sick today, so I don't have the energy to figure out if there's anything else I want to talk about now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Algebraic Data Types"></category></entry><entry><title>Algebraic Data Types 2019-11-06</title><link href="https://mwchase.neocities.org/algebraic-data-types-2019-11-06" rel="alternate"></link><published>2019-11-06T05:00:00-05:00</published><updated>2019-11-06T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-11-06:/algebraic-data-types-2019-11-06</id><summary type="html">&lt;p class="first last"&gt;I ended up going down quite a rabbit hole tonight.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I mostly hung around doing other things today, but I did put in some effort with the concept of &amp;quot;structure types&amp;quot;.
It was kind of tricky at times, and, unfortunately, I'm pretty sure I was working on the easy part.
I basically did explicit implementations for Patterns, CompoundMatches, and &amp;quot;Literals&amp;quot;.
Next I need to work out the proper format for representing the ability to destructure tuple subclasses.&lt;/p&gt;
&lt;p&gt;I'll try it tomorrow, but this could get ugly.&lt;/p&gt;
&lt;p&gt;Anyway, once I've got this done to my satisfaction and I've done another pass with mypy on stricter settings, I'll take another break before returning to the question of how to implement the descriptor owner-based branching logic from the higher-level side of things.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Algebraic Data Types"></category></entry><entry><title>Weekly Roundup 2019-11-05</title><link href="https://mwchase.neocities.org/weekly-roundup-2019-11-05" rel="alternate"></link><published>2019-11-05T05:00:00-05:00</published><updated>2019-11-05T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-11-05:/weekly-roundup-2019-11-05</id><summary type="html">&lt;p class="first last"&gt;The theme of this week was thinking really hard about Structured Data, then really hard about anything &lt;em&gt;but&lt;/em&gt; Structured Data.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I wrote tests for the new code in Structured Data, and a good thing, because it was broken.&lt;/li&gt;
&lt;li&gt;Thursday: I filed a mysterious pylint bug.&lt;/li&gt;
&lt;li&gt;Friday: I kept on adding type annotations to Structured Data.&lt;/li&gt;
&lt;li&gt;Saturday: I hit a snag in my efforts to get Structured Data typed, so I started playing Minecraft again.&lt;/li&gt;
&lt;li&gt;Sunday: I played a lot of Minecraft.&lt;/li&gt;
&lt;li&gt;Monday: I wrote a little, also, Minecraft.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I think I'll make an experimental branch off the current development branch in Structured Data, and start experimenting.
I should take it easy, but I'd like to have some idea of which of my ideas for typechecking the core matching logic have any promise.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Diary 2019-11-04</title><link href="https://mwchase.neocities.org/diary-2019-11-04" rel="alternate"></link><published>2019-11-04T05:00:00-05:00</published><updated>2019-11-04T05:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-11-04:/diary-2019-11-04</id><summary type="html">&lt;p class="first last"&gt;Guess I was closer to burnout than I realized. I'm really throwing myself into Minecraft.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did some writing today; wrote part of a rough draft of one idea, a basic outline of another, and some notes on the story I've been working on for a while, which by the way has the working title &amp;quot;Absolutely Nobody: Magic:&amp;quot;.&lt;/p&gt;
&lt;p&gt;Besides that, so much GregBlock.
I'll try to explain that some because I don't want to do any more writing right now.
GregBlock is a skyblock pack for Minecraft (that is, the intended experience of play is that the player spawns on a small island floating in empty space, with nothing but a tree, and has to build up to, usually, something crazy) based around GregTech, or rather a mod for 1.12 which is inspired by GregTech.&lt;/p&gt;
&lt;p&gt;I first encountered GregTech years ago, and I didn't have a good experience with it, and my inclination is to put the blame for that somewhat on pack authors taking kind of a kitchen sink approach.
GregTech would pretty aggressively rework recipes for other mods in an effort to put power levels under control and have a deeper tech tree.
For me, the most obvious manifestation of this was &amp;quot;You can't get at any of these cool toys, because the basically trivial recipe in the wiki doesn't match up with what the game says you need, which is, like, iridium chunks or whatever.&amp;quot;&lt;/p&gt;
&lt;p&gt;In any case, I haven't gotten too far in GregBlock; I've basically just done most of the beginning quests, and started making steam-powered machines.
Of the mods I was familiar with beforehand, the only one that I noticed crafting differences from the last time I played with it is Applied Energistics 2, which, &lt;em&gt;yeah no kidding&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The early game is a little tough (without a saw, a log is worth 2 sticks instead of 8), but it doesn't take much to ramp up.
Now I just need to figure out what to focus on next in the context of &amp;quot;Now I can make basic machines.&amp;quot;&lt;/p&gt;
&lt;p&gt;Anyway, I can't write any more, so I'm done.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-11-03</title><link href="https://mwchase.neocities.org/diary-2019-11-03" rel="alternate"></link><published>2019-11-03T04:00:00-05:00</published><updated>2019-11-03T04:00:00-05:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-11-03:/diary-2019-11-03</id><summary type="html">&lt;p class="first last"&gt;Taking it extremely easy and also I can't take long to write this or I won't get a good amount of sleep.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today I thought about Structured Data a little and played the Gregblock modpack &lt;em&gt;a lot&lt;/em&gt; and now it's midnight and there's nothing else to say, bye now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Algebraic Data Types 2019-11-02</title><link href="https://mwchase.neocities.org/algebraic-data-types-2019-11-02" rel="alternate"></link><published>2019-11-02T04:00:00-04:00</published><updated>2019-11-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-11-02:/algebraic-data-types-2019-11-02</id><summary type="html">&lt;p class="first last"&gt;Looking at some of my runtime semantics like &amp;quot;How on Earth can I express this in the type system?&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, instead of taking a break, I took one more pass at adding annotations to Structured Data.
I don't think I can do any more until I figure how to design stuff like Structures.&lt;/p&gt;
&lt;p&gt;Besides that, I mostly played Minecraft today, which got me distracted until now, so I'm writing this way too late, again.&lt;/p&gt;
&lt;p&gt;Here is the plan for tomorrow: probably more Minecraft, but also writing instead of Structured Data.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Algebraic Data Types"></category></entry><entry><title>Algebraic Data Types 2019-11-01</title><link href="https://mwchase.neocities.org/algebraic-data-types-2019-11-01" rel="alternate"></link><published>2019-11-01T04:00:00-04:00</published><updated>2019-11-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-11-01:/algebraic-data-types-2019-11-01</id><summary type="html">&lt;p class="first last"&gt;I think today's cumulative commit messages might be longer than this post.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've been adding more type annotations to Structured Data because there was a lot of low-hanging fruit, and now there isn't, as much.
Here's what I know of what's left:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Annotations that I'm pretty sure require the concept of a &amp;quot;Structure&amp;quot; type to accomplish.&lt;/li&gt;
&lt;li&gt;Annotations that appear to require recursive types.&lt;/li&gt;
&lt;li&gt;Annotations that are so hard to type, I think I need to redesign the functions in question.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm going to have to take another break from this stuff, then grind through the eighty or so annotations that remain, classifying them so I can figure out how much of a pain this is going to be.&lt;/p&gt;
&lt;p&gt;Well, I waited way too long to write this entry, so I need to stop it now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Algebraic Data Types"></category></entry><entry><title>Algebraic Data Types 2019-10-31</title><link href="https://mwchase.neocities.org/algebraic-data-types-2019-10-31" rel="alternate"></link><published>2019-10-31T04:00:00-04:00</published><updated>2019-10-31T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-10-31:/algebraic-data-types-2019-10-31</id><summary type="html">&lt;p class="first last"&gt;I've been designing this for so long that I don't know how anyone else would react to it...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I managed to do a good enough minimization of the pylint bug I alluded to yesterday, so now my concern is adding functionality, because I can't even tell where I should put disables to make the bug go away for now.&lt;/p&gt;
&lt;p&gt;Let's see about adding some methods...&lt;/p&gt;
&lt;p&gt;Okay, I'm making minor improvements, which are requiring improved Mypy annotations.
I think I might need to get back into adding more type annotations, because I think I've gotten much of the codebase to make a lot more sense with them.&lt;/p&gt;
&lt;p&gt;For now, though, I'll have to mostly take it easy, because I've been having kind of a rough week.
Hopefully I won't end up filing any more bugs against tools.
Working on Structured Data has had me filing bugs against three different tools, so far.
Maybe more, if I forgot any.&lt;/p&gt;
&lt;p&gt;Anyway, I can't be awake much longer.
Good night.&lt;/p&gt;
</content><category term="Algebraic Data Types"></category></entry><entry><title>Algebraic Data Types 2019-10-30</title><link href="https://mwchase.neocities.org/algebraic-data-types-2019-10-30" rel="alternate"></link><published>2019-10-30T04:00:00-04:00</published><updated>2019-10-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-10-30:/algebraic-data-types-2019-10-30</id><summary type="html">&lt;p class="first last"&gt;Pylint is giving me over 50 warnings and a score above 9. This code base might be big.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Took care of some more coverage holes in Structured Data, and bugs that I found in them, on account of that was draft/prototype code.
I should probably ask about testing the new docs building stuff, because it's all set to go on my end.
I'll get to that tomorrow, maybe.
For now, I'd like to improve its pylint score some, and try to get a reproduction for some of the weird pylint bugs that I'm seeing; it seems to be misreporting line numbers, or making up errors entirely.&lt;/p&gt;
&lt;p&gt;The moral of the story is don't let me use your stuff, probably.&lt;/p&gt;
&lt;p&gt;Anyway, I took way too long to write this, so, again, no ending.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Algebraic Data Types"></category></entry><entry><title>Weekly Roundup 2019-10-29</title><link href="https://mwchase.neocities.org/weekly-roundup-2019-10-29" rel="alternate"></link><published>2019-10-29T04:00:00-04:00</published><updated>2019-10-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-10-29:/weekly-roundup-2019-10-29</id><summary type="html">&lt;p class="first last"&gt;Somewhat unfocused, and I honestly thought I'd taken a longer break from Structured Data.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I made a bit more progress on Structured Data, then took a break.&lt;/li&gt;
&lt;li&gt;Thursday: I did a bit of writing.&lt;/li&gt;
&lt;li&gt;Friday: I got my guitar out of the closet, which is like the farthest point in this apartment from any other point.&lt;/li&gt;
&lt;li&gt;Saturday: I tried to tune the guitar, and complained about composition software.&lt;/li&gt;
&lt;li&gt;Sunday: I remembered that MuseScore exists, and has a low barrier to entry for trying out basic stuff.&lt;/li&gt;
&lt;li&gt;Monday: I ended up focusing on Toki Pona mostly, and not focusing on actually posting the entry.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to try to do the following with Structured Data:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Get that last 1.03% of coverage missing on my local branch taken care of.&lt;/li&gt;
&lt;li&gt;See about volunteering to test the new ReadTheDocs stuff, if it's not already out by then.&lt;/li&gt;
&lt;li&gt;Get mutation coverage into a nice state.&lt;/li&gt;
&lt;/ul&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Diary 2019-10-28</title><link href="https://mwchase.neocities.org/diary-2019-10-28" rel="alternate"></link><published>2019-10-28T04:00:00-04:00</published><updated>2019-10-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-10-28:/diary-2019-10-28</id><summary type="html">&lt;p class="first last"&gt;Haha whoops I don't think I posted this.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I guess today I was mostly focusing on Toki Pona, maybe.
I've got a rough draft of a condensed reference document based on the book.
I'm probably going to have to try some of that mind-map thing I remember people pushing years ago, to figure out how to actually lay it out.&lt;/p&gt;
&lt;p&gt;I did a little bit with music.
I think I still haven't found a way of working that's really natural to me.
Maybe try coming up with nonsense poems that suggest some kind of melody to me, and seeing how I think that should be notated.&lt;/p&gt;
&lt;p&gt;Other than that, tried to catch up on some responsibilities.
Initial results were... ehhh...
Oh well, we're working on it.&lt;/p&gt;
&lt;p&gt;I'm thinking about getting back to Structured Data.
It kind of depends on how I feel once the work week starts back up, but I'm feeling a little less burnt out currently.&lt;/p&gt;
&lt;p&gt;It's getting late and I'm sleepy, nothing more to do right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-10-27</title><link href="https://mwchase.neocities.org/diary-2019-10-27" rel="alternate"></link><published>2019-10-27T04:00:00-04:00</published><updated>2019-10-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-10-27:/diary-2019-10-27</id><summary type="html">&lt;p class="first last"&gt;I feel like this would feel more like taking it easy if I hadn't slept in so extremely.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Just kind of messed around today.
Did a bit of writing.
Gave MuseScore a shot for composition, and put together a few measures that didn't sound awful.
I'll probably stick with MuseScore, but do initial work by hand.
I'd like to get good with something like CSound, but MuseScore is better for, like, doing stuff right now.
I also took another look at Toki Pona, and skimmed over the book way too fast.
I'm going to try starting over and focusing on sentence structure, while doing flash cards for remembering words.
Hopefully I'll get this all in a week or so.&lt;/p&gt;
&lt;p&gt;If I don't get to bed now, I'm going to regret it, so...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-10-26</title><link href="https://mwchase.neocities.org/diary-2019-10-26" rel="alternate"></link><published>2019-10-26T04:00:00-04:00</published><updated>2019-10-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-10-26:/diary-2019-10-26</id><summary type="html">&lt;p class="first last"&gt;Big lesson of today: do not play guitar on a couch, at least not on mine&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Finally started playing guitar again, and there are just so many basics that I have to relearn, so I guess I'll be doing that.&lt;/p&gt;
&lt;p&gt;I also messed around more with music theory stuff.
Alternative tunings/scales.
Maybe at some point I'll figure out how to make them sound good.
Which might be easier if I could figure out a workflow that wasn't using pure sine waves.
It kind of feels to me like the manuals for the composition software I've tried out just, like, throw me into the deep end.&lt;/p&gt;
&lt;p&gt;And then hold me underwater.&lt;/p&gt;
&lt;p&gt;Maybe if I switch between different systems for long enough, I'll assemble enough fragments of basic knowledge to figure out how to make actual instruments play arbitrary frequencies.&lt;/p&gt;
&lt;p&gt;I've got nothing else for now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-10-25</title><link href="https://mwchase.neocities.org/diary-2019-10-25" rel="alternate"></link><published>2019-10-25T04:00:00-04:00</published><updated>2019-10-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-10-25:/diary-2019-10-25</id><summary type="html">&lt;p class="first last"&gt;Today's contribution to my musical development: leaning over and stretching my arm out really far.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I took things easy on the creative front again today.
The big thing I did was decide &amp;quot;you know what, I'm going to try again to learn guitar&amp;quot; so I got it out of storage, which was a bit involved, because it was literally at the back of an overflowing closet.
I'm not actually sure what I was stepping on.
I'm not sure what ended up rubbed on my clothes, either.&lt;/p&gt;
&lt;p&gt;Anyway, that's out here now, and hopefully it'll shame me by its presence into tuning it and relearning how to play it.&lt;/p&gt;
&lt;p&gt;I guess that has to be it, because it's late now and I'm not interested in pushing myself.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-10-24</title><link href="https://mwchase.neocities.org/diary-2019-10-24" rel="alternate"></link><published>2019-10-24T04:00:00-04:00</published><updated>2019-10-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-10-24:/diary-2019-10-24</id><summary type="html">&lt;p class="first last"&gt;I didn't mean to get quite so little done, but oh well.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did a bit of writing today.
A tiny bit of trying to compose songs, and a little bit more progress on the thing with The Adventure Crafter.&lt;/p&gt;
&lt;p&gt;One thing that kind of slowed me down with the latter was, I managed to get into a situation that was leaning harder on me than usual to make judgment calls, and it took me a while to make a call that felt right.&lt;/p&gt;
&lt;p&gt;Do I have anything else to say on this?
I guess not.
I should wrap up, like, now.&lt;/p&gt;
&lt;p&gt;Now.&lt;/p&gt;
&lt;p&gt;Now.&lt;/p&gt;
&lt;p&gt;... Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Algebraic Data Types 2019-10-23</title><link href="https://mwchase.neocities.org/algebraic-data-types-2019-10-23" rel="alternate"></link><published>2019-10-23T04:00:00-04:00</published><updated>2019-10-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-10-23:/algebraic-data-types-2019-10-23</id><summary type="html">&lt;p class="first last"&gt;Hopefully, I won't come up with yet another must-have feature with spiraling requirements.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've implemented the dispatch and underlying types for &lt;a class="reference external" href="https://github.com/mwchase/python-structured-data/issues/40"&gt;issue 40&lt;/a&gt;, and I've tested the dispatch, but I haven't tested the types.
I'm kind of feeling like I don't have the wherewithal to come up with sensible test cases for classmethods and staticmethods right now, so I might need to call things here and take that break I mentioned.&lt;/p&gt;
&lt;p&gt;Once I worked out exactly what the responsibilities were of the different classes that got coordinated, putting together the new wrappers was pretty simple, though I did need to change things a few times because I'd made some arbitrary choices that didn't make sense, on reflection.
(For example, the wrappers originally ignored the instance argument entirely, but if that's passed, then it must be the case that whatever is returned &lt;em&gt;should not&lt;/em&gt; have a &lt;tt class="docutils literal"&gt;when&lt;/tt&gt; method.)&lt;/p&gt;
&lt;p&gt;There are good odds that I'm missing something important that'll come to light in testing, but I can't look for that right now.
I need to focus on relaxing and dealing with some stress I have in my life right now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Algebraic Data Types"></category></entry><entry><title>Weekly Roundup 2019-10-22</title><link href="https://mwchase.neocities.org/weekly-roundup-2019-10-22" rel="alternate"></link><published>2019-10-22T04:00:00-04:00</published><updated>2019-10-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-10-22:/weekly-roundup-2019-10-22</id><summary type="html">&lt;p class="first last"&gt;I think I've been focusing too hard on Structured Data for too long.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I made the noxfile faster, and started removing and revising features.&lt;/li&gt;
&lt;li&gt;Thursday: I prepared to switch Structured Data to require Python 3.8.&lt;/li&gt;
&lt;li&gt;Friday: I removed some features and modules from Structured Data that were only there because it wasn't on Python 3.8.&lt;/li&gt;
&lt;li&gt;Saturday: I got kind of distracted, and didn't accomplish much.&lt;/li&gt;
&lt;li&gt;Sunday: I started working in earnest on GitHub issues I filed against Structured Data.&lt;/li&gt;
&lt;li&gt;Monday: I got it down to just a few issues.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to change gears a bit, then try to finish up the last of the GitHub issues I care about right now.
Then, change gears again.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Algebraic Data Types 2019-10-21</title><link href="https://mwchase.neocities.org/algebraic-data-types-2019-10-21" rel="alternate"></link><published>2019-10-21T04:00:00-04:00</published><updated>2019-10-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-10-21:/algebraic-data-types-2019-10-21</id><summary type="html">&lt;p class="first last"&gt;Not sure if how little I needed to rewrite my tests was a good sign, or a bad sign.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I ground through a bunch of stuff for Structured Data, so what's left to work on for now is:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Implement wrappers for built-in descriptors, and dispatch to them in the public decorator interface&lt;/li&gt;
&lt;li&gt;Convert the &lt;tt class="docutils literal"&gt;data&lt;/tt&gt; classes into mixins with a default implementation (have mixins, but no convenience methods)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I've pared the outstanding GitHub issues I care about to 32, and 40.
I hope I can get these done before I feel like I &lt;em&gt;have&lt;/em&gt; to take a break from this, but I can't guarantee that to myself.&lt;/p&gt;
&lt;p&gt;I'm feeling kind of crummy, actually, so I'm going to wrap up early.
Good night.&lt;/p&gt;
</content><category term="Algebraic Data Types"></category></entry><entry><title>Algebraic Data Types 2019-10-20</title><link href="https://mwchase.neocities.org/algebraic-data-types-2019-10-20" rel="alternate"></link><published>2019-10-20T04:00:00-04:00</published><updated>2019-10-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-10-20:/algebraic-data-types-2019-10-20</id><summary type="html">&lt;p class="first last"&gt;So many tests that need to be written...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Only did Pomodoro for a bit today, but I made some progress on writing.
Before that, in the morning, I did more music theorycrafting, which was probably not too productive.
I read some more manuals on various things, but didn't make too much headway.&lt;/p&gt;
&lt;p&gt;On the Structured Data front, I put together a library for that enum enhancement I've been wanting.
It's not published yet, because I haven't put in the time to get it to a similar standard to the repos I like.
I also started on the various placeholder-related reworks.
I've got a rough outline of how I want things to go:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Do single dispatch from Methods (I'm around here. I've got tests passing, but there are coverage holes, type errors, and lint failures)&lt;/li&gt;
&lt;li&gt;Reunite Functions and Methods&lt;/li&gt;
&lt;li&gt;Implement wrappers for built-in descriptors, and dispatch to them in the public decorator interface&lt;/li&gt;
&lt;li&gt;Convert the &lt;tt class="docutils literal"&gt;data&lt;/tt&gt; classes into mixins with a default implementation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This all fits more-or-less into the following issues on GitHub: 32, 33, 36, 37, 40.
Once I have those done, I think I'll take another break from working on Structured Data.&lt;/p&gt;
&lt;p&gt;And, that's enough being-awake for today.
Good night.&lt;/p&gt;
</content><category term="Algebraic Data Types"></category></entry><entry><title>Diary 2019-10-19</title><link href="https://mwchase.neocities.org/diary-2019-10-19" rel="alternate"></link><published>2019-10-19T04:00:00-04:00</published><updated>2019-10-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-10-19:/diary-2019-10-19</id><summary type="html">&lt;p class="first last"&gt;Bit of a frustrating day.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today, I ended up really distracted.
I watched a bunch of videos on music theory, which had me wanting to try composing again.
Some of the stuff I was looking at I can explain by &amp;quot;well, I wanted to learn new tools for this&amp;quot;.
Other stuff, I was looking at just because.&lt;/p&gt;
&lt;p&gt;I didn't &amp;quot;get much done&amp;quot;, but the bigger problem was that I was aggressively multi-tasking, which is really bad for actually accomplishing things.&lt;/p&gt;
&lt;p&gt;Let's see:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I was messing with xenharmonic scales, and ended up with one that I'm curious if it can be made any good; I followed sensible-sounding rules to end up at a weird-looking scale.&lt;/li&gt;
&lt;li&gt;For trying stuff out with xenharmonic (and possibly algorithmic in general) composition, I decided to try learning &lt;a class="reference external" href="https://csound.com/"&gt;CSound&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;I was taking another look at &lt;a class="reference external" href="http://tokipona.org/"&gt;Toki Pona&lt;/a&gt;, just because.&lt;/li&gt;
&lt;li&gt;I didn't do any work on the story I've been writing.&lt;/li&gt;
&lt;li&gt;I didn't work on any Structured Data issues.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tomorrow, I'm going to try using the Pomodoro Technique or something, because there is &lt;em&gt;no point&lt;/em&gt; in rapidly alternating between two conlang primers and a reference manual for a programming language that reminds me of what little I know of Fortran.&lt;/p&gt;
&lt;p&gt;All in all, this could have gone better, and I'll try to do better.
Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Algebraic Data Types 2019-10-18</title><link href="https://mwchase.neocities.org/algebraic-data-types-2019-10-18" rel="alternate"></link><published>2019-10-18T04:00:00-04:00</published><updated>2019-10-18T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-10-18:/algebraic-data-types-2019-10-18</id><summary type="html">&lt;p class="first last"&gt;Two of my commit messages from this are just &amp;quot;Yeet&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I updated a bunch of the code for Python 3.8.
The code is a lot nicer now.
Now I just need to wait for the tools to catch up, because it seems like everything I've tried has managed to be at least a little buggy.&lt;/p&gt;
&lt;p&gt;Let's see what order I have to work on things...&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Design new placeholder-related behavior&lt;/li&gt;
&lt;li&gt;Create alternative non-data descriptor classes for class- and static- methods&lt;/li&gt;
&lt;li&gt;Collapse function and method back together, if possible&lt;/li&gt;
&lt;li&gt;Use a single factory function in the external interface&lt;/li&gt;
&lt;li&gt;Improve type annotations&lt;/li&gt;
&lt;li&gt;Mutation testing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tomorrow I'll try prototyping backends for the placeholder stuff.
The basic idea is that if there's no placeholder, then it can act like a totally normal function, but if there is a placeholder, anywhere, then it needs to perform single-dispatch.
This should mean that the registration concept becomes unnecessary, and the same idea can be accomplished via a cache.&lt;/p&gt;
&lt;p&gt;Once all that is done, it's time to check the helper-for-enums idea out again, and then I think the natural place to go is to start trying to port Dennis from Coconut to Structured Data.&lt;/p&gt;
&lt;p&gt;I can't be awake any longer, again.
Good night.&lt;/p&gt;
</content><category term="Algebraic Data Types"></category></entry><entry><title>Algebraic Data Types 2019-10-17</title><link href="https://mwchase.neocities.org/algebraic-data-types-2019-10-17" rel="alternate"></link><published>2019-10-17T04:00:00-04:00</published><updated>2019-10-17T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-10-17:/algebraic-data-types-2019-10-17</id><summary type="html">&lt;p class="first last"&gt;Sort of weird that some of these projects apparently didn't touch 3.8-dev, but whatever. I shouldn't judge.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;It'd have been nice if I'd done some writing today, but, oh well!
(I did do some worldbuilding, just to deal with some questions that were bothering me, but that really shouldn't make it in unprompted.)&lt;/p&gt;
&lt;p&gt;I mostly focused on getting ready to cut over to Python 3.8 as soon as possible, so I can be on that, drop 3.7, and drop some of the cruddiest bits of the library as it stands.
Everything I care about is all ready to go... except for ReadTheDocs.
(And, apparently, mutmut, by way of pony, which should be working on Monday, apparently.)
I dunno... I guess I can let it spend a few days or weeks or whatever refusing to render my documentation.
But that's unaesthetic.&lt;/p&gt;
&lt;p&gt;Hm.
I think I'll just make a branch for the update, and merge it whenever.
Because I want to excise my kludgy decorators as soon as I can.&lt;/p&gt;
&lt;p&gt;So, I've got a branch cut, and updated requirements.
I'll start pulling out code in the next few days.
And merge it whenever the tooling is ready.&lt;/p&gt;
&lt;p&gt;I need to get ready for bed now, though.
Good night.&lt;/p&gt;
</content><category term="Algebraic Data Types"></category></entry><entry><title>Algebraic Data Types 2019-10-16</title><link href="https://mwchase.neocities.org/algebraic-data-types-2019-10-16" rel="alternate"></link><published>2019-10-16T04:00:00-04:00</published><updated>2019-10-16T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-10-16:/algebraic-data-types-2019-10-16</id><summary type="html">&lt;p class="first last"&gt;Trying to remember if I've used emoji in a commit message before.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The noxfile is much zippier now.
I had to make some similar changes to what Dennis has.
I'd assumed the problem then was some kind of interaction with Poetry, but apparently &lt;tt class="docutils literal"&gt;pip install .&lt;/tt&gt; is just Like That?
I've also got a helper script that gets the mutation testing done in like ten minutes.
Which is awesome.
Now I can run the tests and, like, read an article or something, instead of, run the tests, eat a full meal, watch some videos, still not done, what is happening...&lt;/p&gt;
&lt;p&gt;I'm working on shoring up the features in Structured Data, and that means removing some of them, because I do not understand them well enough to fully implement them.&lt;/p&gt;
&lt;p&gt;This was a little unsettling, because removing the features didn't alter the tests or coverage any.&lt;/p&gt;
&lt;p&gt;I don't have anything else in mind and I'm really tired, so, good night.&lt;/p&gt;
</content><category term="Algebraic Data Types"></category></entry><entry><title>Weekly Roundup 2019-10-15</title><link href="https://mwchase.neocities.org/weekly-roundup-2019-10-15" rel="alternate"></link><published>2019-10-15T04:00:00-04:00</published><updated>2019-10-15T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-10-15:/weekly-roundup-2019-10-15</id><summary type="html">&lt;p class="first last"&gt;Nice productivity bump from not working on it for a bit.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I went from not having clear ideas for writing, to having SO MUCH idea, and it was a little disorienting.&lt;/li&gt;
&lt;li&gt;Thursday: But I got it under control. I also filed a bunch of bugs against Structured Data.&lt;/li&gt;
&lt;li&gt;Friday: I played Minit and it kind of messed with my head.&lt;/li&gt;
&lt;li&gt;Saturday: I did writing with The Adventure Crafter, and not on the blog.&lt;/li&gt;
&lt;li&gt;Sunday: I shifted focus back to Structured Data a bit.&lt;/li&gt;
&lt;li&gt;Monday: I translated the parts of the toxfile I cared about to a noxfile, (which, among other issues, slightly hoses requires.io because now all my testing dependencies are strings in a Python file, oops; I should probably make requirements files for those and do &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;session.install(&amp;quot;-r&amp;quot;,&lt;/span&gt; &amp;lt;blah&amp;gt;)&lt;/tt&gt; (Note from later: I went and did the thing.)) and spent a bit over a day getting that working well. Still a little mystified by the awful performance of &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;session.install(&amp;quot;.&amp;quot;)&lt;/span&gt;&lt;/tt&gt;, and not sure what the right way is to do that quickly. (Like, is it a pip thing, or...)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I try and figure out how some of this stuff should actually work.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Algebraic Data Types 2019-10-14</title><link href="https://mwchase.neocities.org/algebraic-data-types-2019-10-14" rel="alternate"></link><published>2019-10-14T04:00:00-04:00</published><updated>2019-10-14T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-10-14:/algebraic-data-types-2019-10-14</id><summary type="html">&lt;p class="first last"&gt;Not the most desirable outcome.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I did a little writing today, but mostly I translated the tox template into a noxfile.
This took all day to get right, and required careful finesse to get working on my machine.
I'm currently doing a mutation run to see how the changes I made shook out.
Current impressions: not great, but maybe I can make some improvements.&lt;/p&gt;
&lt;p&gt;I got bored with how long this is taking, so I went and made the improvements.
I can't tell if it did anything, but it really should have.
Less IO, fewer virtual environments, fewer sessions.
Probably the right way to go with this would be to take this one hot path, and write a shell script for it or something.
Maybe have a nox session just for setting up the test environment.
Maybe throw together a tiny wrapper in Rust because I don't want to figure out how to do string processing in bash.&lt;/p&gt;
&lt;p&gt;These are interesting ideas that I am currently too sleepy to do justice to.
I can at least get things set up to develop for it, though.&lt;/p&gt;
&lt;p&gt;I say that, and then I go and get a project set up that has all of the high-level functions needed, and would compile, but wouldn't actually do anything, because I'm too sleepy to implement the helper functions.&lt;/p&gt;
&lt;p&gt;There's nothing more to be done now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Algebraic Data Types"></category></entry><entry><title>Diary 2019-10-13</title><link href="https://mwchase.neocities.org/diary-2019-10-13" rel="alternate"></link><published>2019-10-13T04:00:00-04:00</published><updated>2019-10-13T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-10-13:/diary-2019-10-13</id><summary type="html">&lt;p class="first last"&gt;Preparing for some severe refactoring...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;A little more writing.
I should try to work on this some in the afternoons.&lt;/p&gt;
&lt;p&gt;Anyway, I think I'm about ready to start acting on those bugs I was filing against Structured Data.
First area to focus on: redoing the testing configuration, and possibly the &lt;abbr title="continuous integration"&gt;CI&lt;/abbr&gt; configuration as well.
After that, addressing some of the holes in the specification.
I'll probably do the mutation testing changes last, because I'm going to be messing with the coverage anyway as a result of adding functionality.
I'm really excited for those changes, though.
I think there's a good chance they could take the turnaround time on mutation testing to under 5 minutes, and hopefully no longer than 10 minutes.
Although, they'll also mean adding more tests, so it might cancel out.
We'll see.&lt;/p&gt;
&lt;p&gt;Back to writing, I'm going to have to work on getting the pace up, because I'm still kind of getting blocked or slowed, and it's a little frustrating doing that with stuff like Mythic and The Adventure Crafter, because I'm like &amp;quot;Come on, I want to know what happens next! Oh, wait, I'm supposed to be doing that.&amp;quot;&lt;/p&gt;
&lt;p&gt;Anyway, it's closing in on midnight, so, good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-10-12</title><link href="https://mwchase.neocities.org/diary-2019-10-12" rel="alternate"></link><published>2019-10-12T04:00:00-04:00</published><updated>2019-10-12T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-10-12:/diary-2019-10-12</id><summary type="html">&lt;p class="first last"&gt;I did it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I got some writing done just now.
I finished up the scene I was talking about earlier, so now it's time to move on from that and develop it.&lt;/p&gt;
&lt;p&gt;I don't have much else to say.
I was able to get this writing done, but now I'm tired.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-10-11</title><link href="https://mwchase.neocities.org/diary-2019-10-11" rel="alternate"></link><published>2019-10-11T04:00:00-04:00</published><updated>2019-10-11T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-10-11:/diary-2019-10-11</id><summary type="html">&lt;p class="first last"&gt;Tired...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Didn't do much today.
I played a bunch of Minit, and I think it's messing with my head a bit, so I need to chill out some.&lt;/p&gt;
&lt;p&gt;I entered some more bugs against Structured Data.
I'm going to have a time of it when I start addressing this stuff.&lt;/p&gt;
&lt;p&gt;Anyway, I also thought some about writing.
I'm not ready to move on from the current scene; I'll need to think about it more later to figure out some of the stuff that one of the characters does, and to make sure I actually hit all of the beats I rolled.&lt;/p&gt;
&lt;p&gt;I'm spacing out.
I guess that means I'm done.
Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-10-10</title><link href="https://mwchase.neocities.org/diary-2019-10-10" rel="alternate"></link><published>2019-10-10T04:00:00-04:00</published><updated>2019-10-10T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-10-10:/diary-2019-10-10</id><summary type="html">&lt;p class="first last"&gt;I should figure out how to write formal specifications for Structured Data, since the coverage is excellent but there are still bugs.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Getting things done early tonight.
I made some headway on figuring out the next scene in the story.
I got a high-level outline, and now I'm filling it in because some of the outline is too vague.
One thing I'm liking about using The Adventure Crafter is that, because it gives all of the plot aspects associated with a scene ahead of time, I can basically use it as a checklist instead of just focusing on what I've just now written, and what I can write next.
It's freed me up to draft at whatever level of detail I feel is necessary, because I can refer to the plot details and just ask the question &amp;quot;Have I sufficiently addressed all of these?&amp;quot;
If not, I know what I need to work on.
If so, I can wrap up for now and move on.&lt;/p&gt;
&lt;p&gt;I also like how it has me developing characters in ways I wouldn't necessarily think of on my own.
Without the random rolls, I probably wouldn't have thought &amp;quot;Okay, this wanderer character who doesn't really talk about where he came from, let's have someone from his past coincidentally turn up.&amp;quot;
But that was the most natural interpretation of the rolls I got, and the resulting character... I don't know what anyone else would think of him, but I'm happy with him.&lt;/p&gt;
&lt;p&gt;Other stuff I did today...
Now that I'm not deep in the guts of Structured Data, I went and filed five or so bugs in reflection of the fact that various parts of the design on recently-added stuff are wrong or underspecified.
I'm going to see how much further I can push this whole &amp;quot;thinking about what I'm doing&amp;quot; thing, and then maybe get back into the code on the weekend.&lt;/p&gt;
&lt;p&gt;Okay, that's enough for now, I feel like.
Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-10-09</title><link href="https://mwchase.neocities.org/diary-2019-10-09" rel="alternate"></link><published>2019-10-09T04:00:00-04:00</published><updated>2019-10-09T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-10-09:/diary-2019-10-09</id><summary type="html">&lt;p class="first last"&gt;Be nice to your procgen algorithms. They are working very hard.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I was doing other stuff earlier, so when I went to write, I got as far as &amp;quot;I need to roll up a scene that is similar to 'the characters proceed through the desert under cover of night'&amp;quot;, except focusing on the ill will between one of the revolutionaries and the local thugs, some kind of coercion being applied to a &amp;quot;rude ruler&amp;quot; who is &amp;quot;connected to&amp;quot; the main character, the discovery of a mysterious artifact, a covert observer, and discovery of a lie.&lt;/p&gt;
&lt;p&gt;The Adventure Crafter can be &lt;em&gt;a lot&lt;/em&gt;, is what I'm getting at.
It's not that I don't think I can do this, I just probably can't do it right now.
I'm starting to see why, as a GM tool, it's recommended to use it ahead-of-time.&lt;/p&gt;
&lt;p&gt;In any case, I decided to work on this today, and that's what I got done.
I'll try to do more later, of course.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2019-10-08</title><link href="https://mwchase.neocities.org/weekly-roundup-2019-10-08" rel="alternate"></link><published>2019-10-08T04:00:00-04:00</published><updated>2019-10-08T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-10-08:/weekly-roundup-2019-10-08</id><summary type="html">&lt;p class="first last"&gt;Getting closer and closer to a sensible interface. Shame it's probably &lt;em&gt;super&lt;/em&gt; slow.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I started working on red-black trees using Structured Data.&lt;/li&gt;
&lt;li&gt;Thursday: I finished the first iteration of red-black trees, which generated yet another feature idea to try to improve the ergonomics.&lt;/li&gt;
&lt;li&gt;Friday: I thought more about type-checking.&lt;/li&gt;
&lt;li&gt;Saturday: I revisited the feature idea, then realized my initial concept was way too complicated.&lt;/li&gt;
&lt;li&gt;Sunday: I got the feature done, then looked into addressing coverage gaps.&lt;/li&gt;
&lt;li&gt;Monday: I closed as many gaps as I felt comfortable with, then went to bed as soon as I could.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I want to take a break for a bit to focus on writing, then come back and work on improving the type coverage.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Algebraic Data Types 2019-10-07</title><link href="https://mwchase.neocities.org/algebraic-data-types-2019-10-07" rel="alternate"></link><published>2019-10-07T04:00:00-04:00</published><updated>2019-10-07T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-10-07:/algebraic-data-types-2019-10-07</id><summary type="html">&lt;p class="first last"&gt;Honestly not sure if I want the MatchDict to keep being a thing. It's kind of a painful level of boilerplate next to the new wrappers, but in the case of doing a match &lt;em&gt;within&lt;/em&gt; a function...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today, I got the mutation coverage as thorough as I feel like right now.
6 surviving mutants out of 485.
Now I'm going through and making incremental improvements to the typing.&lt;/p&gt;
&lt;p&gt;Then an hour ago, I thought &amp;quot;I'll get this over with quickly.&amp;quot; and ended up working a little, but mostly spacing out, so I'm going to call this now because I see where this is going.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Algebraic Data Types"></category></entry><entry><title>Algebraic Data Types 2019-10-06</title><link href="https://mwchase.neocities.org/algebraic-data-types-2019-10-06" rel="alternate"></link><published>2019-10-06T04:00:00-04:00</published><updated>2019-10-06T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-10-06:/algebraic-data-types-2019-10-06</id><summary type="html">&lt;p class="first last"&gt;Still raising my eyebrows at crashing with &lt;tt class="docutils literal"&gt;AssertionError: unreachable&lt;/tt&gt;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I spent most of today polishing the implementation for placeholders, and doing general minor improvements to the codebase.
Among them was rewriting one function so that it doesn't crash newer releases of Mypy.
My code is extremely normal.
I should probably cut another release soon, but the more I add type annotations, the more I think that I'd like to put together something to represent the type relations around structural matching.&lt;/p&gt;
&lt;p&gt;So, my plan right now is to go over the mutmut results seeing how I can close gaps in testing, then make the type checking as strict as I can manage for now.
Once I get to a good stopping point, cut a release and continue working on Rosetta Code stuff.
Maybe actually make a commit to that repo at some point.&lt;/p&gt;
&lt;p&gt;I can't figure out what I meant to say next, and it's late, so...&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Algebraic Data Types"></category></entry><entry><title>Algebraic Data Types 2019-10-05</title><link href="https://mwchase.neocities.org/algebraic-data-types-2019-10-05" rel="alternate"></link><published>2019-10-05T04:00:00-04:00</published><updated>2019-10-05T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-10-05:/algebraic-data-types-2019-10-05</id><summary type="html">&lt;p class="first last"&gt;Genuinely unsure if this library will make sense to anyone else by the time I'm done with it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;It took very little time for me to give the red-black tree draft some almost-decent implementations of various methods, so that's set to go soon.
Looking at it inspired me to take care of an old PR I'd forgotten about, and to open a new one for one of the features I'd concluded would be nice-to-have.&lt;/p&gt;
&lt;p&gt;I quickly realized, however, that I'd been glossing over a bunch of details.&lt;/p&gt;
&lt;p&gt;Basically, one of the current warts with the match-based function definitions is that it's not currently possible to define the matches inside the class definition.
It would be &lt;em&gt;nice&lt;/em&gt; if there were a way to specify a placeholder that could get processed at some point after the main body of the &lt;tt class="docutils literal"&gt;__init_subclass__&lt;/tt&gt; method, so that the placeholder effectively gets replaced with the class that was just set up.&lt;/p&gt;
&lt;p&gt;Now, because the stack iteration Just Works™, I'd forgotten about the whole &amp;quot;arbitrary nesting&amp;quot; aspect to structure definitions.
Thinking about it more, I almost feel like maybe the correct solution is to just pass a callback that takes the class as a value.
Then, the post-process would just be &amp;quot;if there's a callback, insert it but defer checking, and pass the class to it when ready.&amp;quot;&lt;/p&gt;
&lt;p&gt;This seems like a solid approach to take, tomorrow, when I'm well-rested.&lt;/p&gt;
&lt;p&gt;(In case I forget, the Property setter structure should wrap the overall structure in a callback if either argument is a callback.
And I guess the Function should wrap and defer if &lt;em&gt;any&lt;/em&gt; argument is a callback.)&lt;/p&gt;
&lt;p&gt;Anyway, I'm tired, once again.
Funny how that works.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Algebraic Data Types"></category></entry><entry><title>Algebraic Data Types 2019-10-04</title><link href="https://mwchase.neocities.org/algebraic-data-types-2019-10-04" rel="alternate"></link><published>2019-10-04T04:00:00-04:00</published><updated>2019-10-04T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-10-04:/algebraic-data-types-2019-10-04</id><summary type="html">&lt;p class="first last"&gt;Somewhat unusual day today, so things got disrupted, and I don't have much to show for it, but oh well.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I took things easy today, so there isn't much to report, but I thought more about how to deal with structures in a typed way.
Pretty sure it'll take a combination of generics and protocols that I'm not sure actually works, and also stuff with TypedDict that I'm pretty sure will need a separate plugin just to make things work as expected.&lt;/p&gt;
&lt;p&gt;I think I'll try to move toward developing in branches, because some of the changes I have in mind could be a huge pain if they're not isolated.&lt;/p&gt;
&lt;p&gt;Okay, I can't stay awake any longer.
Good night.&lt;/p&gt;
</content><category term="Algebraic Data Types"></category></entry><entry><title>Algebraic Data Types 2019-10-03</title><link href="https://mwchase.neocities.org/algebraic-data-types-2019-10-03" rel="alternate"></link><published>2019-10-03T04:00:00-04:00</published><updated>2019-10-03T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-10-03:/algebraic-data-types-2019-10-03</id><summary type="html">&lt;p class="first last"&gt;There's probably a tiny typo that renders the whole thing incorrect under excruciatingly specific circumstances.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I just completed the first draft of a direct translation of some functional red-black tree code from Haskell to Python with Structured data.
It's about 5-6 times longer than the source material, some of which is attributable to the way Structured Data's interface interacts with Python conventions.
A previous attempt was a bit longer, but had some functionality that the draft does not currently implement, &lt;em&gt;but also&lt;/em&gt; it cannot implement some of the functionality that the new version will be able to.&lt;/p&gt;
&lt;p&gt;Heavy usage of the &lt;tt class="docutils literal"&gt;function&lt;/tt&gt; decorator reveals some challenges that type checkers will have to handle:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;There needs to be an idea of a &amp;quot;structure type&amp;quot; that corresponds to, and at runtime is an instance of, a tuple or an ADT class. Fortunately, none of the other matchers use instances like that.&lt;/li&gt;
&lt;li&gt;In the &lt;tt class="docutils literal"&gt;when&lt;/tt&gt; decorator, there needs to be a connection made between pattern names and function arguments.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hopefully the last feature I come up with for Structured Data: an attribute constructor that makes placeholders representing &amp;quot;the current class&amp;quot; and which can be used in &lt;tt class="docutils literal"&gt;when&lt;/tt&gt; decorators instead of exfiltrating the function from the class scope.&lt;/p&gt;
&lt;p&gt;Speaking of features, I should get back to that enum helper idea, probably make that its own library, unless I realize it somehow interacts with defining a &lt;tt class="docutils literal"&gt;Sum&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;Product&lt;/tt&gt; class.&lt;/p&gt;
&lt;p&gt;Time got way away from me.
I need to stop now.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Algebraic Data Types"></category></entry><entry><title>Algebraic Data Types 2019-10-02</title><link href="https://mwchase.neocities.org/algebraic-data-types-2019-10-02" rel="alternate"></link><published>2019-10-02T04:00:00-04:00</published><updated>2019-10-02T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-10-02:/algebraic-data-types-2019-10-02</id><summary type="html">&lt;p class="first last"&gt;When I think about it, it's kind of impressive how many tools the Structured Data codebase outright breaks.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Quick entry because I let myself get distracted and I have to move fast to get enough sleep after this.&lt;/p&gt;
&lt;p&gt;I'm working on adapting immutable red-black tree code from Haskell to Python with Structured Data.
The conversion is pretty straightforward, though the Python is somewhat wordier because the means of function definition is basically embedded as a DSL.
It doesn't bother me yet, but I don't know what other people would think.
I think if I can get all of the features done for this, I'd like to look into using it as a basis for starting to get the Mypy plugin working, because that's the basic barrier I have to using this in more projects, the fact that code using Structured Data in no way typechecks.
(And Structured Data itself has... problems... with recent versions of Mypy, last I checked.)&lt;/p&gt;
&lt;p&gt;Anyway, I'm done now because I have to be.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Algebraic Data Types"></category></entry><entry><title>Weekly Roundup 2019-10-01</title><link href="https://mwchase.neocities.org/weekly-roundup-2019-10-01" rel="alternate"></link><published>2019-10-01T04:00:00-04:00</published><updated>2019-10-01T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-10-01:/weekly-roundup-2019-10-01</id><summary type="html">&lt;p class="first last"&gt;I got distracted implementing a red-black tree, and need to be in bed, like, five minutes ago.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I explained some math that I don't know if anyone else cares about.&lt;/li&gt;
&lt;li&gt;Thursday: I started getting sick.&lt;/li&gt;
&lt;li&gt;Friday: I continued being sick.&lt;/li&gt;
&lt;li&gt;Saturday: I recovered from being sick.&lt;/li&gt;
&lt;li&gt;Sunday: I got back into writing a bit.&lt;/li&gt;
&lt;li&gt;Monday: I finished with Structured Data for now, and made a joke about tooling that I waffled over the day after I published the entry.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, I'm going to work on more Structured Data examples.&lt;/p&gt;
&lt;p&gt;(Seriously, should it have been &amp;quot;Yuki Nagato Georg&amp;quot; or &amp;quot;Typing Georg&amp;quot;, and instead of an ellipsis, should I have said &amp;quot;who lives in a cave&amp;quot; or &amp;quot;who lives in a barely-furnished apartment&amp;quot;, followed by &amp;quot;and types thousands of lines of code a second&amp;quot; or something?)&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Algebraic Data Types 2019-09-30</title><link href="https://mwchase.neocities.org/algebraic-data-types-2019-09-30" rel="alternate"></link><published>2019-09-30T04:00:00-04:00</published><updated>2019-09-30T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-09-30:/algebraic-data-types-2019-09-30</id><summary type="html">&lt;p class="first last"&gt;Yuki Nagato Georg ... was a statistical outlier and should not have been counted.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;After working on other stuff for a while, I was able to return to Structured Data and grind some metrics down.
The metrics are all too good to improve, currently, so I'd like to try using the new features I added.
I'll get to that in a little bit.
Speaking of metrics, though, I ran &lt;a class="reference external" href="https://radon.readthedocs.io/en/latest/"&gt;radon&lt;/a&gt; against this codebase, and according to the Halstead metrics, the whole codebase could be done in like four minutes.
I would pay good money to see someone type at the speed required to accomplish that.
(Seriously, I think something's wrong with how it's counting the operators and operands.
The GitHub issues back me up on this.)
Anyway, all of the new features that messed with the metrics, also gave mutmut about 70 new mutations, a bit over a dozen of which got through.
(Or... came back to life?
That bit's weird.)
I don't have the fortitude to address them right now, so I'm going to focus on doing and redoing Rosetta code stuff.&lt;/p&gt;
&lt;p&gt;Anyway, I can't think of anything else to add, so this post must be done.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Algebraic Data Types"></category></entry><entry><title>Diary 2019-09-29</title><link href="https://mwchase.neocities.org/diary-2019-09-29" rel="alternate"></link><published>2019-09-29T04:00:00-04:00</published><updated>2019-09-29T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-09-29:/diary-2019-09-29</id><summary type="html">&lt;p class="first last"&gt;Constantly putting off figuring out whether what I'm doing is actually a good idea.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today, I did some writing where I tried actually using the reference material I've been putting together for the past week or so.
It worked fine, although I did have to errata some rules interactions I hadn't anticipated.&lt;/p&gt;
&lt;p&gt;I also made some changes to Structured Data to hopefully make individual pieces of the code easier to understand.
Honestly, I can't tell if it helped, but it occurs to me that I have seen some projects take the &amp;quot;define things internally and re-export&amp;quot; approach, so that's heartening.
If I go all the way with that (which would really help some metrics), I'll probably have to ditch the whole &amp;quot;type facade&amp;quot; idea, or else go all in on that as well.
I don't know which I really prefer.
Either way, I'm probably going to have to keep up the &amp;quot;split of into modules&amp;quot; thing, and possibly start adding more folders.&lt;/p&gt;
&lt;p&gt;I've got to wrap up.&lt;/p&gt;
&lt;p&gt;Oh, also, my code is so horrifyingly un-idiomatic that I had to pin Mypy to an earlier version and file a bug, because the latest stable and dev both crash with &lt;tt class="docutils literal"&gt;AssertionError: unreachable&lt;/tt&gt; which is &lt;em&gt;clearly&lt;/em&gt; false.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-09-28</title><link href="https://mwchase.neocities.org/diary-2019-09-28" rel="alternate"></link><published>2019-09-28T04:00:00-04:00</published><updated>2019-09-28T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-09-28:/diary-2019-09-28</id><summary type="html">&lt;p class="first last"&gt;As a teenager I would get really sick and trim boxtops. Same deal, just less relevance to helping people.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Still really tired, so I did more stuff that I wasn't taking the time to do earlier, like separating out the writing project so it works better in the text editor, doing basic typo passes, and taking notes on all of the names I made up.
I also got the pages I printed punched, in the binder, and flagged for easy reference, as well as some important bits highlighted.
I will totally be ready to get back into writing once I stop being, like &lt;em&gt;super&lt;/em&gt; tired.&lt;/p&gt;
&lt;p&gt;I also rewrote a Python module that I originally rewrote from some code I found on the internet.
The code is concerned with adding tail calls to Python as a library.
I guess my thinking was, I feel bad, and refining this code kind of gives that specific feeling of badness form, because this code is basically just nothing but a bad idea.
That's why I put a lewd Elder Scrolls reference in the name of it, so the only people it can hurt are people who use it &amp;quot;&amp;quot;&amp;quot;ironically&amp;quot;&amp;quot;&amp;quot;.&lt;/p&gt;
&lt;p&gt;I don't feel like writing any more here.
Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-09-27</title><link href="https://mwchase.neocities.org/diary-2019-09-27" rel="alternate"></link><published>2019-09-27T04:00:00-04:00</published><updated>2019-09-27T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-09-27:/diary-2019-09-27</id><summary type="html">&lt;p class="first last"&gt;I don't recommend any part of this.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I'm sick and tired right now, so today I did stuff that didn't need too much thought, like printing stuff out for later, and finally renaming Seed.&lt;/p&gt;
&lt;p&gt;I'm feeling even worse now than I did yesterday, so that's it.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-09-26</title><link href="https://mwchase.neocities.org/diary-2019-09-26" rel="alternate"></link><published>2019-09-26T04:00:00-04:00</published><updated>2019-09-26T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-09-26:/diary-2019-09-26</id><summary type="html">&lt;p class="first last"&gt;Brain no work.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;It'd be cool if I had something to write, but I'm having a lot of trouble forming sequences of thoughts.&lt;/p&gt;
&lt;p&gt;I don't know why I'm so tired, but I am.&lt;/p&gt;
&lt;p&gt;I'm going to ramble a bit while I wait for this song I have playing to finish.&lt;/p&gt;
&lt;p&gt;I'm not sure what's up, exactly.
It seems like maybe my exercise today hit harder than usual.
I'm feeling unusually sore, and maybe that brought tiredness at the same time.
It's a possibility.&lt;/p&gt;
&lt;p&gt;I got nothing else.
Oh well.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-09-25</title><link href="https://mwchase.neocities.org/diary-2019-09-25" rel="alternate"></link><published>2019-09-25T04:00:00-04:00</published><updated>2019-09-25T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-09-25:/diary-2019-09-25</id><summary type="html">&lt;p class="first last"&gt;MATH&lt;/p&gt;
</summary><content type="html">&lt;p&gt;A few things happened today.
For one, I think I finally have proof that the recreational math idea I was messing with just doesn't work as far as I was trying to take it.
For another, Coverage released another alpha, and I realized that limit-coverage was broken outside of my specific use case, so I pushed out some quick fixes that didn't break my stuff, and &lt;em&gt;probably&lt;/em&gt; make things better; that it would be hard for them to make worse.
Discovered something about Coverage that I'm going to report as an issue when I have time to put together minimal reproduction.
It probably won't matter to most people.
I'm putting together notes for something on software metrics, but I'm not rushing that, because that's a topic that's not going anywhere.&lt;/p&gt;
&lt;p&gt;I figured I'd try to explain the recreational mathematics stuff, since I've mentioned it enough.&lt;/p&gt;
&lt;p&gt;First, some background:&lt;/p&gt;
&lt;p&gt;There are various conventions for representing numbers in base 10, using binary coding.
Basically, different systems for turning a few binary digits into a single decimal digit.
What inspired me was the &lt;a class="reference external" href="https://en.wikipedia.org/wiki/POSTNET"&gt;POSTNET&lt;/a&gt; system, in which each digit is assigned a number, and the numbers from 0 to 9 are represented as sums of exactly two of these numbers, with just one special case (4 + 7 = 0).
I found myself wondering under which circumstances a &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Constant-weight_code"&gt;constant-weight code&lt;/a&gt; could have a number assigned to each digit as in POSTNET, but with no special cases.&lt;/p&gt;
&lt;p&gt;Clearly, if just one digit is on, then the answer is to just give each digit a number, consecutively, up to the maximum.
This is basically a way of thinking about normal positional systems that ignores the specific symbols: 0 is the first light, 1 is the second, 2 is the third, and so on.
And if one digit is off, then it trivially corresponds to the case of one digit on, though getting the numbers to actually line up may require some fractional parts.&lt;/p&gt;
&lt;p&gt;We can call these cases of representing N symbols with N bits the trivial solutions to this idea.
What's of interest is representing &lt;em&gt;more than&lt;/em&gt; N symbols with N bits.
I have found two solutions to this (similar solutions can be obtained through symmetries, but they're the same structures): two of -1, 1, 2, 3, and three of -5, 2, 3, 4, 6, 9.
From my attempts to find a solution for four of eight numbers, I doubt there are any further non-trivial solutions; I would love to be wrong, and I'd especially love it if there's literature on this that I just failed to find.&lt;/p&gt;
&lt;p&gt;Before I get into the theory behind the computer search I did for the 4-of-8 case, I'll mention how things went doing stuff manually.&lt;/p&gt;
&lt;p&gt;2-of-4 was simple enough to do in my head.
I wasn't able to work out 3-of-6 by guessing, but I was able to express it as an extension of 2-of-4, and from there basically just solve some linear equations to find it.
I attempted to extend this result to 4-of-8, and I only got negative results.&lt;/p&gt;
&lt;p&gt;Unfortunately, my attempts weren't very rigorous, and it's hard for me to write them up in an airtight way, especially given what I found next:&lt;/p&gt;
&lt;p&gt;Computer search for the 4-of-8 case...&lt;/p&gt;
&lt;p&gt;Four out of eight digits would yield a base-70 code.
Testing every candidate for 3-of-6 is more-or-less fine.
Testing every candidate for 4-of-8... is not.
Something must be done to narrow down the candidates we look at, to come up with standards from which we can generate only the candidates that meet those standards.&lt;/p&gt;
&lt;p&gt;We can generalize the problem of finding numbers that add up to each number from 0 to 69 to adding up to 70 consecutive numbers, or further, to each number mod 70.
If there is a 4-of-8 coding that sums four numbers to obtain a number between 0 and 69, then there is a 4-of-8 coding that sums four numbers to obtain every number mod 70.&lt;/p&gt;
&lt;p&gt;Given every number mod 70, we can modulo them with much smaller numbers, to get every number mod 10, 7 times, or every number mod 14, 5 times.
Looking for candidates in these spaces is much faster than the full 70, because all 8 digits have a much smaller range of values, so the search is exponentially quicker.&lt;/p&gt;
&lt;p&gt;Supposing we had a solution, and we took its moduli mod 2, 5, and 7.
From the three sequences that result, we could recover the original solution.
Using 10 and 14 lets us optimize somewhat, because we know that evens have to match with evens, and odds with odds.
This lets us divide up candidate sequences by the number of even numbers they contain, and solve four smaller problems instead of one big one.
In addition, within each problem, we know that we can't match evens and odds, so that lets us discard more possibilities out of hand.
It so happens that none of the possibilities mod 14 repeat a digit, so we just need all by-value unique permutations of the possibilities mod 10.
A permutation of a 10, combined with a 14, uniquely identifies a candidate sequence mod 70, which can then be quickly checked.&lt;/p&gt;
&lt;p&gt;I ran the numbers, had code calculate everything, and... nothing.
No candidates meet the loosened standard of &amp;quot;each number mod 70&amp;quot;.&lt;/p&gt;
&lt;p&gt;Therefore, there's no coding for 4-of-8 that works like -1, 1, 2, 3, or -5, 2, 3, 4, 6, 9.
I don't know about higher numbers.
For all I know, the &amp;quot;problem&amp;quot; with 4-of-8 is just that 70 is congruent to 1 mod 3.
I think I can gather enough low factors of the next number, 252, to have a chance of doing a search in a reasonable time, but I don't want to try right now.&lt;/p&gt;
&lt;p&gt;So, that's how I spent my weekend.&lt;/p&gt;
&lt;p&gt;It's late, I should stop writing.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Weekly Roundup 2019-09-24</title><link href="https://mwchase.neocities.org/weekly-roundup-2019-09-24" rel="alternate"></link><published>2019-09-24T04:00:00-04:00</published><updated>2019-09-24T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-09-24:/weekly-roundup-2019-09-24</id><summary type="html">&lt;p class="first last"&gt;Legitimately surprised at how few days it took to accomplish these things.&lt;/p&gt;
</summary><content type="html">&lt;ul class="simple"&gt;
&lt;li&gt;Wednesday: I decided to try and showcase using Structured Data to solve problems.&lt;/li&gt;
&lt;li&gt;Thursday: I put together a proof of concept for using Structured Data, but it was iffy enough that I don't think I actually pushed it... I ended up deciding that my attempt justified getting the alternative function definition idea implemented.&lt;/li&gt;
&lt;li&gt;Friday: I sketched out designs for the function feature, and started working on condensing the various things I'm using as writing aids.&lt;/li&gt;
&lt;li&gt;Saturday: I discovered that I like laying out tree data in spreadsheets, did some more design work for Structured Data, and started messing with some recreational math.&lt;/li&gt;
&lt;li&gt;Sunday: I made progress on condensing stuff, and I put together a scary-looking prototype for the Structured Data feature. I pledged that I'd write tests for the feature and reimplement the prototype as required, rather than just paste it in and go.&lt;/li&gt;
&lt;li&gt;Monday: I just pasted it in and went. I also thought about some of the code metrics that services provide, and whether they make sense. Finally, all of the condensed rules are probably ready to print, but we're skeptical that the printer can handle it, so I'm holding off on printing it right now.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Since then, I've applied some of the stuff I learned implementing the function dispatch feature to simplify the implementation of the &lt;tt class="docutils literal"&gt;Product&lt;/tt&gt; class.
No definite results on the math front; I'm working on reducing the search space.&lt;/p&gt;
&lt;p&gt;Next week, I'd like to try doing some essay-writing on code metrics.
That might take a while.&lt;/p&gt;
</content><category term="Weekly Roundup"></category></entry><entry><title>Diary 2019-09-23</title><link href="https://mwchase.neocities.org/diary-2019-09-23" rel="alternate"></link><published>2019-09-23T04:00:00-04:00</published><updated>2019-09-23T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-09-23:/diary-2019-09-23</id><summary type="html">&lt;p class="first last"&gt;Not sure how to move code into new modules in a principled manner. I mean, I could just shotgun everything out into tiny modules, but that seems wrong.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Today, for Structured Data, rather than carefully adding tests for the new functionality, I just did the easier thing of pasting in the prototype and throwing tests at it until the coverage was acceptable.
Then added some functionality.
Then fixed long-standing bugs in the original code that all of this revealed.
And did some refactoring.
The rating services are still yelling over the code, stuff about how the modules should be smaller and some of the functions should have a lower cyclomatic complexity.&lt;/p&gt;
&lt;p&gt;I was reading various literature on cyclomatic complexity, and I don't have citations to hand, but the impression I got was that cyclomatic complexity is best used as a measure of &amp;quot;how hard the code would be to test&amp;quot;.
But I have a comprehensive test suite and mutation testing!
I don't need metrics about how hard a thing would be, when I can produce metrics about how close I am to achieving it!&lt;/p&gt;
&lt;p&gt;I'll still try to improve on the situation later, but I need to take some time to decide what &amp;quot;improvement&amp;quot; looks like.&lt;/p&gt;
&lt;p&gt;Aside from that, I think I'm done compressing down reference materials.
It's a bit under 50 pages, which just need to be printed out and marked up; I'll do that in the next few days.&lt;/p&gt;
&lt;p&gt;For now, I really need to wrap up (and stop tweaking the Structured Data code).
Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-09-22</title><link href="https://mwchase.neocities.org/diary-2019-09-22" rel="alternate"></link><published>2019-09-22T04:00:00-04:00</published><updated>2019-09-22T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-09-22:/diary-2019-09-22</id><summary type="html">&lt;p class="first last"&gt;Strong contender for &amp;quot;most horrifying code I have ever written&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've got the guidelines for the various rules mostly boiled down.
I just need to summarize the rules for The Adventure Crafter itself, and I should be set to turn all of this into a hardcopy reference.&lt;/p&gt;
&lt;p&gt;Aside from that, I put together a prototype for multiple-definition functions.
This code is... horrifying.
I noticed that I'd somewhat reinvented the wheel elsewhere in Structured Data, insofar as the &lt;tt class="docutils literal"&gt;inspect&lt;/tt&gt; module provides facilities to tell you how the arguments to a function &lt;em&gt;would&lt;/em&gt; be dispatched, given some &lt;tt class="docutils literal"&gt;*args&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;**kwargs&lt;/tt&gt;.
With this, I was able to:
Extract all non-variable-length arguments as a dictionary, convert it into a &lt;tt class="docutils literal"&gt;Matchable&lt;/tt&gt;, match it against a sequence of &lt;tt class="docutils literal"&gt;structure, function&lt;/tt&gt; pairs, and for the first match, extract all values from that into the variable-length arguments (erroring in the case of a collision), figure out how the target function would have just the keyword arguments dispatched, inject the variable positional arguments, if any, then actually generate the call.
I can't see any reason why it wouldn't work, except that it's so complex that it'll take significant effort to actually define &amp;quot;working&amp;quot;.&lt;/p&gt;
&lt;p&gt;I just now worked out some functionality I want that is too complicated to put in the prototype, so I'll have to try to &lt;abbr title="test-driven development"&gt;TDD&lt;/abbr&gt; it in.&lt;/p&gt;
&lt;p&gt;I hoped I would come up with something else to say, but I didn't.&lt;/p&gt;
&lt;p&gt;Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-09-21</title><link href="https://mwchase.neocities.org/diary-2019-09-21" rel="alternate"></link><published>2019-09-21T04:00:00-04:00</published><updated>2019-09-21T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-09-21:/diary-2019-09-21</id><summary type="html">&lt;p class="first last"&gt;&amp;quot;I hate WYSIWYG editors and overly fancy GUIs. Just let me work with the data in code form!&amp;quot; *lays stuff out in a spreadsheet* &amp;quot;&lt;em&gt;Okay, fine.&lt;/em&gt;&amp;quot;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I've spent most of today distilling down information from various sources; I'm basically aiming to collapse a couple hundred pages of sourcebook to a few dozen of reference, which I will print out and mark up.&lt;/p&gt;
&lt;p&gt;I started sketching out what the latest additions to Structured Data will look like, and then half an hour ago I got distracted with some recreational mathematics stuff that's currently looking like it's not going to pan out.&lt;/p&gt;
&lt;p&gt;Because of that, I have to end the post even more abruptly than I have been lately.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Diary 2019-09-20</title><link href="https://mwchase.neocities.org/diary-2019-09-20" rel="alternate"></link><published>2019-09-20T04:00:00-04:00</published><updated>2019-09-20T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.neocities.org,2019-09-20:/diary-2019-09-20</id><summary type="html">&lt;p class="first last"&gt;I almost think I would've preferred to get some of these rules in pseudocode...&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I came up with a bunch of designs for the new Structured Data feature I mentioned, and I think I've gotten to one that makes sense.
Mostly today, though, I upgraded my laptop, and started working on trying to consolidate Mythic-related materials so I can use it without cross-referencing between four or so different documents.
For some of this, there are so many conditionals involved that reading it in prose form makes my brain shut down.
I think I might have to write code to calculate this, just to figure out how to convert it to a nice table.
I just did that, and I think I've got it figured out.&lt;/p&gt;
&lt;p&gt;Basically, when you bring in homebrew on Variations II, it becomes necessary to calculate three different axes separately, even though they share some logic: yes/no, marginal/normal/extreme, and whether a random event occurred.&lt;/p&gt;
&lt;p&gt;Hopefully, I should get most of this sorted out in a few days.&lt;/p&gt;
&lt;p&gt;For now, I desperately need to get to sleep.
Good night.&lt;/p&gt;
</content><category term="Diary"></category></entry><entry><title>Algebraic Data Types 2019-09-19</title><link href="https://mwchase.neocities.org/algebraic-data-types-2019-09-19" rel="alternate"></link><published>2019-09-19T04:00:00-04:00</published><updated>2019-09-19T04:00:00-04:00</updated><author><name>Max Woerner Chase</name></author><id>tag:mwchase.