This is a blog that serves the dual purposes of the site blog, describing events in the history of this Web site, and my personal blog. All entries are listed below, most recent first.
You can subscribe using Atom (which your RSS reader almost certainly supports) if you want to see everything posted here.
Just serviced the machine that acts as my server, for this site and some other stuff. Had a RAID1 disk fail, and there was other stuff that needed to happen anyway. The RAID array is recovering now so I guess stuff will probably be slow while that happens. Not that it really matters that much.
Still yearning for Guix System... Reproducible systems 🥺 I want to be able to take root out of my backup sets and just back up my files and the configuration...
I've thought recently about malware, especially malicious kernel modules. Obviously, to load a malicious kernel module, you have to already be root, so the system is already pretty thoroughly compromised by that point, but a module can potentially make it much harder to detect the compromise so it's definitely useful to make them harder to load.
The TARDIS is meant to be a pocket dimension. But, if it weren't, if it were actually physically a larger space on the inside... What does general relativity tell us?
I renewed my OpenPGP keys; in fact, I set them to never expire. Seems pointless when the keys can be revoked anyway and renewing them doesn't actually change the key material itself.
There are a number of ways to style SQL code, varying in capitalization, indentation, etc. and frequently the style any given programmer, group, or project uses is very different from the style of their application code. Here's my typical style, as it is nowadays.
When people say Why should we be doing X when Y problem exists? I just get confused, because... we have multiple people who can be working on multiple different things at once. That's one of the benefits of having a society.
Pragmatic brain: Shaving my legs is an annoying, fiddly, time-consuming process that often results in cutting myself and creates chances of infection and ingrown hairs.
As we here in the US continue careening through an era of chaos and hope not to see a less-bungled repeat of the recent attempts to seize dictatorial power, let's remember one thing: Caesar came from the left, after Sulla came from the right. Keep an eye on the people you think are on your own side too.
I slowly begin to develop a stronger and stronger urge to declare outright war on short-form platforms and refuse to use anything with a hard character cap.
One of the most fundamental lessons we seem to keep re-learning is that one of the most important factors in protecting systems from being hijacked is the separation of data, which could be from untrustworthy sources, from control information, which has the power to make the system do specific things.
Maybe it's paranoid but I have a habit of never writing loop tests with equals or not-equals the last value, I always write while i is greater than zero or until n is less than or equal to x. Because, like, what if the loop overshoots? Or something? What?
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Earlier today I spent a bit of time rediscovering how you can frequently take XML data and make it palatable in a Web browser with no more than a couple dozen lines of CSS. Not the most accessible unfortunately, but for visual rendering ::before/::after and the content property are pretty powerful. And of course if you need more power and better accessibility there's always XSLT. And if you use fragment references in your <?xml-stylesheet?> declaration you can manage this with no external resource dependencies.
I've decided, after much thought and quite a bit of self-annoyance about the pretentiousness of it, to name myself Athena, after the Hellenic goddess of wisdom. I did actively fight this name in multiple ways before eventually deciding to go with it.
So, I was looking at a bill on congress.gov, and I got curious and looked at the XML - they publish the bills as XML and XSLT them client-side into HTML - and I discovered that the enacting clause (Be it enacted etc.) is not even in the XML. It's so canned they literally have it hard-coded in the XSLT stylesheets. (I found this amusing.)
So, quite a while ago, I wrote some fan fiction for the Homeworld games, having gotten into them for a while. I've finally done some final proofreading, and I've published them on my Archive of Our Own account (as I usually do with fanfic). Both of these focus on Karan S'jet's perspective, and make an attempt to explore the bizarreness of her relationship to the reality around her.
So... I must apologize for this concept in advance. I've thought, in some fediverse posts, about the concept of using Microsoft's XAML as the basis for a static site generator. This is an XML-based language Microsoft uses for declarative UI in .NET, among other things. Again, let me preface this all with an apology and a clear statement that this isn't really a serious idea, just the result of me getting too much of a concentrated dose of .NET at work.
This article by Julia Evans is a really nice and concise expression of a bunch of things I should really be doing (and maybe you too). I'll have to get the full zine when it comes out.
I spent a few minutes to hunt down and copy-paste a few bits and pieces of trans microfiction I've published on the fediverse, so now they're readable here in a little anthology.
This article by Anton Zhiyanov makes a lot of the points about SQLite that I'd like to make to people who haven't seriously considered it. There are other things too, but it's a good overview.
This post is a quick reminder that captions exist to provide an accurate transcription of content that would otherwise be inaccessible. Do not censor captions.
Just imagining an isekai main character who doesn't even try to hide it, "yes, yes, two plus two is four, thirty two divided by four is eight, the length of the hypotenuse of a right triangle is the square root of the sum of the squares of the other two sides, the square root of negative one is the imaginary unit, and the derivative of two X cubed is six X squared, now can we get to magic?"
<em> and <strong> are not "the correct way to do italic and bold," despite what WYSIWYG editors may have you believe. <em> is for emphasis, but if you need different text, say, the name of a ship, or a Latin word, <i> is still the right tool. Both elements exist because there is more than one reason to italicize things. If you want italics for purely stylistic reasons, there is yet another tool you should be using: <span style="font-style: italic">.
I had to fiddle with systemd for a while but I fixed a problem where ejabberd's /run directory wasn't getting created. The LDAP server starts after whenever it would normally happen, and ejabberd's account lives in LDAP for... reasons. Now it waits for the LDAP server to start and then creates it as part of the daemon startup.
Since I last blogged about my personal infrastructure, I've been up to a few things. I meant to write longer blog posts about each of these, but it's been a bit and I've forgotten quite a few details. Sorry. Here's some quick summaries, though.
Is there any significant difference between ul {display: flex;} and li {display: inline;}? The latter seems to require less additional work to remove the list markers, pad the items out, etc.
I like CGI. I know it's slow, but I never run at that scale. It's so simple. I can just write a response to standard output. I don't need to learn a framework, I don't need routing or HTTP parsing, I can just put a normal program on my server and it will work.
I'm working on Lillybooks again, I've implemented filtering based on CWs, and I'm moving token filtering into the database instead of an external filter file (this is better because it means less bouncing between SQL and Python).
More than once the Rust compiler has demonstrated a better understanding of good software architecture than me, and as a result of its complaints I ended up with a program that was not just safer but cleaner and more performant.
I decided to redesign my static site generator, XSite, because the way it worked previously was kind of limiting. So I threw out XSlots, my custom templating language, and switched to using XSLT for everything. My entire site is now generated with XSLT.
If I could revise the way keyboards work, they would have another two modifier keys, a Lock Screen key, and a Secure Attention key. Also Num Lock would be removed because the presumption would be that you always want to use the numpad as a numpad.
I really dislike the recent trend of taking command-line tools that were previously implicitly accessible to people with visual disabilities and piling unnecessary TUIs or terminal pseudographics on top so that the actual text stream becomes unreadable or nearly so.
I'm gonna have to get rid of these two Go programs. Just download the binary and move it to /usr/local/bin sounds nice until you realize you have to do that by hand every time they release a new version.
Does anyone know if it's safe to share a Guix /gnu/store directory between two operating systems on the same disk? It feels like it should be fine, but this kind of thing makes me nervous.
Occasionally I get a desire to install like a dozen Windows 2000 VMs and set them up in an Active Directory forest just to see how it worked before they piled 20 years of Innovation on top.
A little while ago, I wrote a couple of Fediverse posts about wanting a sort of broadcast pipe and subsequently a solution for implementing one without coordination of a list of recipients. (Those are Misskey links, so unless you have a high-powered machine I recommend copy-pasting the URLs into another Fediverse server's search box to load them there instead of opening them directly...)
If anyone has a recommendation for a Matrix client or a way of using Matrix via XMPP, I'd appreciate it. I've already ruled out Element, nheko, Quaternion, and FluffyChat, and I'd like to be able to handle encrypted conversations and rooms. I realize there's probably not one but I figured I should ask.
I want to stress to those unaware that BitTorrent can be, and often is, used for entirely legitimate purposes. It is a protocol for downloading large files in a scalable way. It's a good choice any time you want to make a big download available to lots of people simultaneously.
The following are legal in Linux (and most other Unix) filenames: ()[]<>$:;&@?`’“!=+*^%#~| and space. (Note here that I do mean Linux, the kernel, not any of the operating systems built on it.)
For some reason I automatically look at my PineTime whenever my phone buzzes in my pocket, even though I don't have notification forwarding and have never had a smartwatch that does it.
As you might have guessed, it wasn't quite as simple as typing scripts/publish to roll out the new version. I had to do a lot of troubleshooting of my deployment scripts, and my Apache configuration. But it seems to be working now! :)
On-and-off over the last little while, I've been rearranging and reworking a lot of this site, trying to turn it into an IndieWeb-style personal Web site instead of the previous no-particular-purpose site.
As a follow-up to XSite, I decided to split out my blogging tools into their own project and expand on them to build a proper blogging support package for XSite. I decided to keep blogging tools separate from the core XSite project out of a general pro-modularity attitude; a lot of static site generators bundle blogging in their base configurations, but there's no reason that functionality can't be separate. My approach is to keep XSite as the Python code that provides the core functionality like XSlots, XSLT support, datasets, etc., while implementing blogging support on top of it largely as XSLT and XSlots templates. Much of this work happened in the middle of the night, and often into the early hours of the next day, but I've datestamped it with the day I started each session.
As I planned in the 3.1 launch post, I've now implemented XSLT support in XSite. Using this tool, I've implemented some improvements to the site to restore some of the pieces that got cut to fit into XSite. This should improve accessibility, as well as making some things easier on myself.
If you're reading this, that means I've rolled out alm 3.1. This version is based on the XSite static site generator. I wrote this software myself, as is the expected rite of passage for programmers doing Web sites; it's based on XML and written in Python, with an eye towards both relative simplicity and a strict content structure. Currently, it's less than 300 lines of code, which feels small for how much it's managed to do.
Programmingwave is now hosted on Microsoft Azure! This move was prompted by some (months-long) DNS issues, and also me just wanting to play with Azure. I'm using Azure's Web App Service at the F1 free tier, which limits disk space, bandwidth, and features, but not so much as to actually pose a problem for a site this small (~210 KB for the entire site).
If you’re reading this post, that means Programmingwave.com 2.2 has launched. This version is an upgrade to Bootstrap 4.0 with a few minor fixes. There may be some bugs with the navbar, but it should be usable.
With the official release of Bootstrap 4, I am now working on Programmingwave.com 2.2 with Bootstrap 4. It should be a fairly simple migration, but there may be some hiccups. If you want, you can watch development of 2.2 here.