<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Dev on diary</title>
		<link>/tags/dev/</link>
		<description>Recent content in Dev on diary</description>
		<generator>Hugo</generator>
		<language>en-us</language>
		
		
		
			<copyright>shawn boyette</copyright>
		
		
			<lastBuildDate>Thu, 16 Jul 2026 00:11:19 -0600</lastBuildDate>
		
			<atom:link href="/tags/dev/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>Project updates and SteamOS exploration</title>
				<link>/posts/2026/0716-project-updates-and-steamos-exploration/</link>
				<pubDate>Thu, 16 Jul 2026 00:11:19 -0600</pubDate>
				<guid>/posts/2026/0716-project-updates-and-steamos-exploration/</guid>
				<description>&lt;p&gt;Firstly, everything mentioned in the previous post is done. I&amp;rsquo;m&#xA;especially happy with the solution I came up with for build-level&#xA;config in &lt;code&gt;fpc-ctl&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Config within the per-project shell script is removed, excepting a&#xA;pointer to the project&amp;rsquo;s JSON config file&lt;/li&gt;&#xA;&lt;li&gt;Everything that was in the script is moved to a &lt;code&gt;builds&lt;/code&gt; object in&#xA;the config&lt;/li&gt;&#xA;&lt;li&gt;The &lt;code&gt;configmap&lt;/code&gt;, which maps project configuration attributes to&#xA;build variables, has been extended&#xA;&lt;ul&gt;&#xA;&lt;li&gt;When a &lt;code&gt;configmap&lt;/code&gt; value contains &lt;code&gt;::&lt;/code&gt;, the right-hand side of the&#xA;value is treated as an override to the value given at the project&#xA;level&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;This has made it possible to cleanly have multiple builds (or even&#xA;subprojects) defined with a single config file, all managed by&#xA;&lt;code&gt;fpc-ctl&lt;/code&gt;.&lt;/p&gt;</description>
			</item>
			<item>
				<title>fpc-ctl and Thrasher Updates</title>
				<link>/posts/2026/0710-fpc-ctl-and-thrasher-updates/</link>
				<pubDate>Fri, 10 Jul 2026 21:03:33 -0600</pubDate>
				<guid>/posts/2026/0710-fpc-ctl-and-thrasher-updates/</guid>
				<description>&lt;p&gt;I did some work this week on the media side of Thrasher. I intended to&#xA;work on playlists, but my mind went elsewhere. Most of the changes&#xA;made were little cleanups, fixes, and catches. The one new thing was&#xA;making facets and people clickable in the web UI to run a query on&#xA;that facet or person. This was ported over to the music side of&#xA;things.&lt;/p&gt;&#xA;&lt;p&gt;I should probably run a new build on t.fp.n so that people can take&#xA;advantage of that, as well as the fact that the previous button now&#xA;acts like it does on pretty much all other music players (jumps to&#xA;beginning of current track unless you push it twice in two seconds).&lt;/p&gt;</description>
			</item>
			<item>
				<title>fpc-ctl, Anubis, and Forgejo</title>
				<link>/posts/2026/06-27-fpc-ctl-and-forgejo/</link>
				<pubDate>Sat, 27 Jun 2026 16:51:32 -0600</pubDate>
				<guid>/posts/2026/06-27-fpc-ctl-and-forgejo/</guid>
				<description>&lt;p&gt;Did a little bit of catch-up today.&lt;/p&gt;&#xA;&lt;p&gt;Created an Anubis ruleset which allows nothing without a challenge &amp;ndash;&#xA;previously I had been using the default ruleset, which excludes known&#xA;&amp;ldquo;bad&amp;rdquo; bots and challenged anything that looked like an actual browser,&#xA;but allowed presumed &amp;ldquo;good&amp;rdquo; things like &lt;code&gt;curl&lt;/code&gt; with no challenge.&lt;/p&gt;&#xA;&lt;p&gt;I admit that a part of me wonders if this is worthwhile, but most of&#xA;me thinks that making things even a touch more difficult for shitty&#xA;companies is the correct thing to do.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Devmode</title>
				<link>/posts/2026/06-22-devmode/</link>
				<pubDate>Mon, 22 Jun 2026 21:20:33 -0600</pubDate>
				<guid>/posts/2026/06-22-devmode/</guid>
				<description>&lt;p&gt;I started work today on playlists in Thrasher. It was mostly&#xA;groundwork and UI exploration, so that isn&amp;rsquo;t what this entry is about.&lt;/p&gt;&#xA;&lt;p&gt;This entry is about how happy I am with the new &lt;code&gt;devmode&lt;/code&gt; feature in&#xA;the &lt;code&gt;fpc-ctl&lt;/code&gt; script. It&amp;rsquo;s a simple idea, and a borrowed one&#xA;(including from Hugo, the static site generator that I use for this&#xA;blog). But it&amp;rsquo;s a really good one that saves a lot of time and faffing&#xA;about.&lt;/p&gt;</description>
			</item>
			<item>
				<title>General Updates (But Mostly Thrasher)</title>
				<link>/posts/2026/06-07-general-udates-but-mostly-thrasher/</link>
				<pubDate>Sun, 07 Jun 2026 22:25:46 -0600</pubDate>
				<guid>/posts/2026/06-07-general-udates-but-mostly-thrasher/</guid>
				<description>&lt;p&gt;I really fell off the updates there. Oops. While I&amp;rsquo;ve been away, I&#xA;have mostly been focused on Thrasher. A couple weeks of work went into&#xA;an overhaul/rewrite of the mobile UI.&lt;/p&gt;&#xA;&lt;p&gt;There was never an intent to evern have a mobile interface, as I am&#xA;horrible at UI programming generally, and I had no desire to try to&#xA;make something like Thrasher work on smaller screens. But not long&#xA;after getting the desktop version working, of course, I found myself&#xA;wanting to be able to take it with me. So I hacked together the most&#xA;minimal possible finger-friendly UI. It was seriously done in about 2&#xA;hours of initial effort, followed by maybe a day of tuning. And then&#xA;it sat for months while much bigger changes were made to the service&#xA;and the desktop client.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Thrasher Update</title>
				<link>/posts/2026/05-08-thrasher-updates/</link>
				<pubDate>Fri, 08 May 2026 23:02:30 -0600</pubDate>
				<guid>/posts/2026/05-08-thrasher-updates/</guid>
				<description>&lt;p&gt;So much work has happened here in the past couple weeks. First I&#xA;entered all my visual media into the DB and then erapped up all&#xA;initially planned media handling work.  returned to the music side.,&#xA;and a brief description of what has changed there is:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;The old, multi-port, multi-Srvr architecture is gone&lt;/li&gt;&#xA;&lt;li&gt;In its place is a single Srvr, on a single port, which is&#xA;session-aware&lt;/li&gt;&#xA;&lt;li&gt;Sessions are implemented with secure (as long as you&amp;rsquo;re using TLS),&#xA;HTTP-only cookies&lt;/li&gt;&#xA;&lt;li&gt;Users are now a required part of the system&lt;/li&gt;&#xA;&lt;li&gt;There is now a login/authentication flow&lt;/li&gt;&#xA;&lt;li&gt;These architecture changes introduced a race condition on the&#xA;Catalog instance&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&amp;hellip;which was resolved by having the Srvr maintain a set of extant&#xA;sessions, with a Catalog for each&lt;/li&gt;&#xA;&lt;li&gt;&amp;hellip;which caused a change in the Catalog, moving to cloning the DB&#xA;in-memory only optionally (and not by default)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Finally, sessions usefully survive Srvr restarts, if only minimally&#xA;so at the present time&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;And all of this work makes it possible to have things like playlists,&#xA;and playback that resumes across restarts, in the not-too-distant&#xA;future. It&amp;rsquo;s pretty cool.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Cleaning Day</title>
				<link>/posts/2026/cleaning-day/</link>
				<pubDate>Tue, 21 Apr 2026 10:14:19 -0600</pubDate>
				<guid>/posts/2026/cleaning-day/</guid>
				<description>&lt;p&gt;Yesterday, following my abortive attempt to get a Forgejo runner fully&#xA;operative, I did as I said I would in my previous post, and borrowed&#xA;the pre-commit hook from Petrel&amp;rsquo;s repo and put it in all three of&#xA;Thrasher&amp;rsquo;s repos.&lt;/p&gt;&#xA;&lt;p&gt;This led to a pretty big number of small changes, mostly from&#xA;&lt;code&gt;golangci-lint&lt;/code&gt; but also a few from &lt;code&gt;go fmt&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I didn&amp;rsquo;t do this initially, because Thrasher was &amp;ndash; initially &amp;ndash; a&#xA;quick-and-dirty project. A proof of concept, to see if a thing I was&#xA;interested in was possible. I suppose this means that it&amp;rsquo;s a real&#xA;project now, as if the fact that I use it constantly didn&amp;rsquo;t already&#xA;mean that.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Enabling Forgejo Runner</title>
				<link>/posts/2026/enabling-forgejo-runner/</link>
				<pubDate>Sat, 18 Apr 2026 20:48:07 -0600</pubDate>
				<guid>/posts/2026/enabling-forgejo-runner/</guid>
				<description>&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# get the runner image&#xA;podman pull code.forgejo.org/forgejo/runner:12&#xA;&#xA;# enable rootless podman socket, if not already done&#xA;systemctl --user enable --now podman.socket&#xA;&#xA;# generate initial config file&#xA;podman run --rm code.forgejo.org/forgejo/runner:12 \&#xA;  forgejo-runner generate-config &amp;gt; config.yml&#xA;# edit baseline config, and stow it somewhere&#xA;&#xA;# shell in to temp container, with socket given as bind mount, and&#xA;# register with forgejo instance, remembering that it needs to be&#xA;# on the forgejo network&#xA;podman run --rm -it --entrypoint /bin/bash \&#xA;  -v &amp;#34;${XDG_RUNTIME_DIR}/podman/podman.sock:/var/run/docker.sock&amp;#34; \&#xA;  --network forgejo code.forgejo.org/forgejo/runner:12&#xA;$ forgejo-runner register&#xA;$ cat .runner&#xA;$ exit&#xA;# edit contents of .runner into a file on the host; in the same place&#xA;# as the config file would be a good idea&#xA;&#xA;# start container with socket (w/usermapping), config file, and runner&#xA;podman run -d \&#xA;  --entrypoint &amp;#39;[&amp;#34;/bin/forgejo-runner&amp;#34;, &amp;#34;--config&amp;#34;, &amp;#34;/data/config.yml&amp;#34;, &amp;#34;daemon&amp;#34;]&amp;#39; \&#xA;  -v /PATH/TO/RUNNERFILE:/data/.runner -v /PATH/TO/CONFIG:/data/config.yml \&#xA;  -v &amp;#34;${XDG_RUNTIME_DIR}/podman/podman.sock:/var/run/docker.sock:U&amp;#34; \&#xA;  --name fjrunner --network forgejo code.forgejo.org/forgejo/runner:12&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This got me to a state with a working runner, which &lt;em&gt;tried&lt;/em&gt; to execute&#xA;a work flow, but it failed to checkout the code. The failure&#xA;definitely has something to do with the fact that both my Forgejo&#xA;instance and my runner are containers. They share a network in podman,&#xA;and they can communicate with each other (else runner registration&#xA;wouldn&amp;rsquo;t have worked), but then the &lt;em&gt;image on the runner&lt;/em&gt; fails to be&#xA;able to resolve the Forgejo container.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Devlog: Unbreak Day</title>
				<link>/posts/2026/devlog-unbreak-day/</link>
				<pubDate>Wed, 15 Apr 2026 20:01:01 -0600</pubDate>
				<guid>/posts/2026/devlog-unbreak-day/</guid>
				<description>&lt;p&gt;A couple weeks ago I migrated myself off Github and onto self-hosted&#xA;Forgejo. Today I took care of a lot of the consequences of that. I&amp;rsquo;ll&#xA;spare you the details, because it was just the same issue presenting&#xA;itself differently across mutliple project repos, namely:&lt;/p&gt;&#xA;&lt;p&gt;Golang names packages by their repository URLs.&lt;/p&gt;&#xA;&lt;p&gt;This is great as long as your code lives at Github, forever. It&amp;rsquo;s less&#xA;great when you decide to move everything from one place to&#xA;another. And yes, I know that you can alias packages; I did that once&#xA;before, back when I first started writing non-toy software in Go,&#xA;which was also around the time that I migrated &lt;em&gt;to&lt;/em&gt; Github, because it&#xA;finally felt safe to use as a stable platform.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Intro to Thrasher</title>
				<link>/posts/thrasher/intro-to-thrasher/</link>
				<pubDate>Mon, 13 Apr 2026 22:36:20 -0600</pubDate>
				<guid>/posts/thrasher/intro-to-thrasher/</guid>
				<description>&lt;p&gt;Since restarting this blog, I haven&amp;rsquo;t just &lt;em&gt;also&lt;/em&gt; restarted work on&#xA;old projects. I actually have a new one, which is quite far along. In&#xA;fact I use it pretty much every day, sometimes for hours at a time.&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s called Thrasher &amp;ndash; after the curved-billed thrashers who frequent&#xA;my yard, and the brown thrasher which is the state bird of my home&#xA;state, but don&amp;rsquo;t tell the curved-bills that last part &amp;ndash; and it&amp;rsquo;s my&#xA;media catalogue and music player.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Forgejo and Anubis</title>
				<link>/posts/2026/forgejo/</link>
				<pubDate>Thu, 02 Apr 2026 19:00:51 -0600</pubDate>
				<guid>/posts/2026/forgejo/</guid>
				<description>&lt;p&gt;Over the past few days I&amp;rsquo;ve read about, explored, and then set up a&#xA;local &lt;a href=&#34;https://forgejo.org/&#34; target=&#34;_blank&#34;&gt;Forgejo&lt;/a&gt;&#xA; instance as a self-hosted Github&#xA;alternative. I&amp;rsquo;ve also deployed the&#xA;&lt;a href=&#34;https://anubis.techaro.lol/&#34; target=&#34;_blank&#34;&gt;Anubis&lt;/a&gt;&#xA; scraper-blocking proxy in front&#xA;of all my websites.&lt;/p&gt;&#xA;&lt;p&gt;This is all a result of AI scraping. My decision to leave Github after&#xA;many years is because Microsoft announced that even private activity&#xA;would be used to train their Copilot bot. Meanwhile the rapacious&#xA;global scraping (and ignoring of &lt;code&gt;robots.txt&lt;/code&gt;) by other companies&#39;&#xA;bots led to my decision to implement Anubis.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Digging Up Carrot</title>
				<link>/posts/carrot/digging-up-carrot/</link>
				<pubDate>Sat, 28 Mar 2026 17:18:37 -0600</pubDate>
				<guid>/posts/carrot/digging-up-carrot/</guid>
				<description>&lt;p&gt;According to timestamps, I last worked on Carrot in 2022. That feels&#xA;about right, given how much reminding-myself I had to do in order to&#xA;make good changes to the code.&lt;/p&gt;&#xA;&lt;p&gt;Also, irritatingly, I clearly left off at the halfway point of a&#xA;refactor, where I was decoupling the lexer and parser into standalone&#xA;modules. I had done the lexer, I had not done a thing to the&#xA;parser. Arguably they don’t need to be separate at all, but I tend to&#xA;think that strong separation of concerns is always a good thing, even&#xA;when the end product is likely to appear monolithic.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Roget22 Is Back Again</title>
				<link>/posts/roget22/roget22-is-back-again/</link>
				<pubDate>Fri, 27 Mar 2026 09:47:43 -0600</pubDate>
				<guid>/posts/roget22/roget22-is-back-again/</guid>
				<description>&lt;p&gt;Well, after about a year of inactivity (partially my fault, partially&#xA;not) I’m back to the Roget 22 project. If you don’t remember what this&#xA;is about, I can hardly blame you; here’s the &lt;a href=&#34;/posts/roget22/roget22_is_back/&#34;&gt;post where I explained&#xA;things&lt;/a&gt;&#xA;.&lt;/p&gt;&#xA;&lt;p&gt;I’m not going to make any big predictions or lay out a lot in the way&#xA;of plans right now, but I did just re-read my last batch up devlog&#xA;entries, and some things have changed from my thinking at that&#xA;point. So here’s a list of what’s happening:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Roget22 Dev Diary 0003</title>
				<link>/posts/roget22/roget22-dev-diary-0003/</link>
				<pubDate>Sun, 24 Nov 2024 11:16:54 -0700</pubDate>
				<guid>/posts/roget22/roget22-dev-diary-0003/</guid>
				<description>&lt;p&gt;Sometimes when you work on something long enough you get tunnel&#xA;vision. This is a pretty well-known phenomenon, and I had a&#xA;particularly intense episode of it around the Roget22 project &amp;ndash; but I&#xA;now see a clearer, easier path to making things happen.&lt;/p&gt;&#xA;&lt;p&gt;Yes, compared to what I last wrote.&lt;/p&gt;&#xA;&lt;p&gt;I don&amp;rsquo;t think the why of it is particularly difficult to describe or&#xA;understand. Many years of dealing with bottomlessly problematic source&#xA;material led to the following assumptions:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Roget22 Dev Diary 0002</title>
				<link>/posts/roget22/roget22-dev-diary-0002/</link>
				<pubDate>Sun, 17 Nov 2024 22:57:04 -0700</pubDate>
				<guid>/posts/roget22/roget22-dev-diary-0002/</guid>
				<description>&lt;p&gt;I almost started scanning today, but I didn&amp;rsquo;t. Instead I sat down and&#xA;started working on the hairiest problem not caused by PG&amp;rsquo;s edits over&#xA;the years: references.&lt;/p&gt;&#xA;&lt;p&gt;In a modern paper edition of Roget&amp;rsquo;s, references to other headwords&#xA;look something like &lt;code&gt;TERM 584.2&lt;/code&gt; to indicate that for other terms&#xA;similar in meaning to &lt;code&gt;TERM&lt;/code&gt;, refer to sense 2 of headword 584.&lt;/p&gt;&#xA;&lt;p&gt;This is largely inherited from Roget&amp;rsquo;s original design of &lt;code&gt;argument &amp;amp;c 476&lt;/code&gt;, read as &amp;ldquo;for more terms like this meaning of &amp;lsquo;argument&amp;rsquo;, see&#xA;headword 476&amp;rdquo;. But there are also variants like &lt;code&gt;manifest &amp;amp;c (be evidence of) 467&lt;/code&gt; where the reader is pointed into a specific sense of&#xA;a headword by use of another term, because early editions did not&#xA;number the senses within a headword.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Roget22 is back (Dev Diary 0001)</title>
				<link>/posts/roget22/roget22_is_back/</link>
				<pubDate>Sat, 26 Oct 2024 12:51:12 -0600</pubDate>
				<guid>/posts/roget22/roget22_is_back/</guid>
				<description>&lt;p&gt;One of my longest-running projects is about to come out of dormancy,&#xA;again. The thing that would eventually get the name &amp;ldquo;Roget22&amp;rdquo; started&#xA;in, I believe, 2004, when I stumbled on the OCR&amp;rsquo;d text of the 1921&#xA;edition of Roget&amp;rsquo;s Thesaurus on the Project Gutenberg site.&lt;/p&gt;&#xA;&lt;p&gt;For the unfamiliar, I point you toward the &lt;a href=&#34;https://en.wikipedia.org/wiki/Project_Gutenberg&#34; target=&#34;_blank&#34;&gt;wiki&#xA;entry&lt;/a&gt;&#xA; for Project&#xA;Gutenberg (hereafter &amp;ldquo;PG&amp;rdquo;).&lt;/p&gt;&#xA;&lt;p&gt;According to the credits in the file, the original OCR job had been&#xA;done in 1984 at MICRA Corp. However, it turns out that MICRA is still&#xA;around, and their own website contradicts this on a few grounds:&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
