Today, people celebrate World Theatre Day, an event promoting live theater, which I wrote about in slightly more depth as a belated holiday, last year, from which I decided to recycle the header image. Live theater has had a rough few years, and while I don’t support the framing that the pandemic has ended, I do like seeing the people involved with theater getting paid again.

An Ancient Greek theater

I’d say that code tends to have less drama, but we all know that…shades the truth, somewhat.

General Maintenance

I don’t know how seriously I’ll try to promote it, yet, but since someone mentioned it to me in passing, I opened a LiberaPay account last night.

For now, I prefer Buy Me a Coffee ☕ for payments, since it (a) allows people to pay how they please, and (b) allows me to reward people without the system coming to a crashing halt to figure out tax changes. LiberaPay, for example, doesn’t have a way for me to send out e-mail with previews or announcements. However, I also admit that LiberaPay fits far better with my broad vision for my personal work: A non-profit owns it, and they created it—as a successor to GratiPay, itself the successor to GitTip—primarily for Open Source and Free Culture projects.

Therefore, if you’ve always wanted to throw money at me, but Buy Me a Coffee’s corporate status scared you away, you now have an alternative through the button below.

Like I said before, I don’t expect this to turn into a significant impact on my income, but I do like LiberaPay as a concept. And I honestly have no idea if some reader has sat quietly in Indonesia—where I get more traffic than I would expect, by the way, and would love for readers outside the English-speaking world would reach out—with some Rupiah burning a hole in their pockets, waiting for me to announce some way of contributing through Stripe. It sounds improbable, sure, but I have no idea…

Unpublished, but (Maybe) Interesting

As long-time readers might already know, I run a series of scripts on my computer to help automate things that I’ll definitely forget to do manually. This shows up publicly in small places, like the GitLab repository for blog assets, where I commit whatever I have in there on Tuesday evenings, when I stop checking e-mail. That script closes my e-mail client, makes some backups, and commits a series of repositories, as part of the same action, for example.

In this case, I have a device that periodically backs up its logs to my Google Drive account. And in my general quest to put data together into broader pictures, I want to make sure that I always have the latest version of that log.

Some searching led me to the latest gdrive. It takes some effort to acquire Google credentials to get the program running. But once you jump through those hoops, you can do things like this.

file=$(gdrive files list --skip-header | grep name_of_file | \
  head -1 | cut -f1 -d' ')
gdrive files download "$file"

Google Drive apparently keeps multiple versions of files, so this exploits the fact that the gdrive default output—which, yes, you can change—lists files by name, then in reverse-chronological order, to get the ID (the first column) of the latest file, then downloads it based on that ID.

You might note that the current version has a note that they have only implemented the most rudimentary functionality. I chose it over its predecessor, since (a) I only need rudimentary features, and (b) the older version wouldn’t run on my machine, reporting file-not-found errors on startup.

Like I hint at in the heading, you probably won’t see any work published using the gdrive utility, but I found it interesting and useful enough to share.

Strictly speaking, this doesn’t apply to any development that I’ve done. However, since it came as a surprise to me and took me a while to work around it, I figured that I should mention it to any readers finding themselves similarly stuck.

On Friday morning, I started to see this message, as git rejected my attempts to push changes to a repository.

Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
Please contact your system administrator.

Did someone eavesdrop on me? No, they didn’t, and no man existed in the middle.

Did someone do “something nasty”? Well, I don’t like to shame people for what excites them…

OK, administrators at GitHub updated their RSA host keys, hence the “remote host identification has changed,” at the top of the message.

Not knowing what happened at the time, I revoked my old key and generated a new one. However, this Mastodon toot describes the situation in more detail, and provides a more straightforward solution.

ssh-keygen -R

That refreshes the host identification, so you can go on with your life.

Actually, wait. I did make a (not so consequential) change, as a result of this.

GitHub Profile

GitHub - jcolag/jcolagJohn's GitHub README, since everybody else is making one... - GitHub - jcolag/jcolag: John's GitHub README, since everybody else is making one...

Prior to realizing that I had a problem with SSH keys, as described in the previous section, I tried figuring out why the key might have failed on my side. That led to some experiments.

One such experiment became a part of my script. For cases when I run it out of context, I load the relevant library variables before doing anything with keys.

eval "$(ssh-agent -s)"

This whole incident does remind me, though, that I should probably eventually update my GitHub profile with an “Action” based on when my blog RSS feed updates, rather than running a nightly script to check for updates.

You’ll also see a few unnecessary commits to the profile, while I tried to work out the problems with keys, and then the problems with my initial fix…

Entropy Arbitrage

GitHub - jcolag/entropy-arbitrage-codeThe Jekyll blog for - GitHub - jcolag/entropy-arbitrage-code: The Jekyll blog for

As mentioned in last week’s post, I needed to finish the code for sensitive images. Now, when I mark an image as sensitive—particularly on the Friday social media roundup posts, where I use images (if at all) that articles use as their headers—it’ll blur and reduce the contrast. As a result, you might identify major features in the image, but you can largely ignore it if the contents bother you. It needs surprisingly little CSS, these days.

.sensitive {
  filter: blur(0.5em) contrast(0.1);

You can “reveal” the image by hovering over it or clicking, so it should work as well on mobile. You can try it out immediately below, assuming that you read this on the blog, with an image that I’ve previously released here. I assume that those of you on RSS feeds only get the image itself, with no interactivity.

A low brick structure, overgrown with grass
A low brick structure, overgrown with grass
Image credit: by John Colagioia, CC BY-SA 4.0 International

In addition to that, I also updated the Prism code, so syntax highlighting in code blocks should look slightly better, and it now covers a much wider variety of programming languages, picking pretty much anything that I might use to write code. And unless it requires more setup that I haven’t figured out, it should highlight matching brackets/parentheses/braces/etc. when you hover on one, show “color chip” previews when code references a color, pop up previews for some other data types, and—you’ve already seen this in code snippets above—count line numbers.

You can get a sense of that, below, with some examples borrowed from various MDN, released—to the extent that licensing matters to a single line of CSS from various pages—under the terms of the Creative Commons Attribution Share-Alike 2.5 Generic license. (Again, if you don’t look at this on the blog, you probably only get default styling.)

irrelevant-style {
  background: linear-gradient(#e66465, #9198e5);
  color: rgb(129,71,48);
  transform: rotate(1rad);
  transition-duration: 2s;
  transition-timing-function: cubic-bezier(.29, 1.01, 1, -0.68);

Overall, it seems like a decent upgrade for only a small effort, and probably long overdue…

In addition, if you look at any of the tag pages, the list of posts now includes the same length estimates that you see on the index. I suspect that no readers actually need that, but I found myself working my way through prior posts and wanted an estimate of how much longer the task would take. 🤷

And finally, the script that auto-generates the shells of the social media roundup posts now includes the new “teaser” front-matter item for me to fill out, instead of making me remember to add it, every week.

Mastodon Tool Trunk

GitHub - jcolag/tool-trunkTools for (John's) Mastodon workflow. Contribute to jcolag/tool-trunk development by creating an account on GitHub.

While scheduling last week’s toots, I spent some time updating the output to send to Mastodon. It looks like it had some extra spacing in some statuses, and it didn’t consistently produce a valid alternative command, when necessary on failure.

The Tool Trunk also has the start of a new prototype in it, the Rummager—as in rummaging through the trunk—my extremely tentative vision for a Mastodon front-end that more closely conforms to how I want to read on social media. At this time, I intend to run it entirely out of the browser, rather than building a full server to only pass through API calls. I might change my mind, though, as I go, maybe a middle ground where I serve the page from a bare-bones web server.

As you might note, if you review the code so far, it’ll use Boring CSS, so that I don’t need to fuss over the design, for the duration.


I have some cleanup to re-test and publish, but once I get that out, expect me to return to the Rummager.

Speaking of which, might any readers know of an online—ideally free—database? I’d like for the Rummager to store little things, like a list of previously seen message IDs, but I don’t want to create a full server, since it would only store those message IDs and probably make API calls. If someone offers a service where I can send an API request to insert/select/delete, that would work far better.

Credits: The header image is Taormina BW 2012-10-05 16-05-05 by Berthold Werner, made available under the terms of the Creative Commons Attribution Share-Alike 3.0 Unported license.