đŸ Archived View for gemini.circumlunar.space âș users âș adiabatic âș scrawlspace âș 2024 captured on 2024-05-26 at 14:42:22. Gemini links have been rewritten to link to archived content
âŹ ïž Previous capture (2024-05-10)
âĄïž Next capture (2024-06-16)
-=-=-=-=-=-=-
This is scrawlspace. I scrawl in this space. Do not expect coherence or permanence here.
This has been making the rounds:
I hear lots of things about PFAs. None of them good, and, as far as I can tell, theyâre everywhere. I wish 3M the best of luck trying to phase them out of their products, unless they manage to screw up and replace them with things that are worse. I hear at least some BPA replacements are like that.
Iâm trying to imagine what life would be like if things that had PFAs in them werenât in use, at least for our food chain and things we touch regularly. (I canât say Iâd care if PFAs were used in plastic tubing in a water-cooled computer of mine.)
Man, I hope Iâm being overly paranoid, because some of these things are things Iâll miss.
I sure hope 3M finds a replacement for these things, because getting them out of our pretty much everything is going to make pretty much everything more annoying and more vulnerable to mid-supply-chain tampering.
Explanation of this postâs title on Track 1
Maciej Ceglowski has a new post on his blog:
In my feed reader, the whole piece starts out with the following, in italics:
In August 2020, the New York Times asked me to write an op-ed for a special feature on authoritarianism and democracy. They declined to publish my submission, which I am sharing here instead.
This preamble is absent from the published version. I wonder if the author got a wire crossed or two.
â
One aspect of being well-calibrated is keeping track of things and adjusting your perception of them as time goes by. I liked NASA when I was a kid. However, it appears theyâve managed to sink to modern levels of government-bureaucracy competence.
Sad, really.
As they used to say back when âthe blogosphereâ was a coherent entity, read the whole thing.
I am a fan of two body washes:
Trader Joeâs Tea Tree Tingle Body Wash
Neutrogena Rainbath Shower and Bath Gel
The first is my go-to. While the tingle may be either pleasurable (generally in the summer months) or an annoyance (generally in the winter months), itâs a reliable body wash with a pleasant scent.
The Neutrogena, by contrast, is something of a power tool. Itâs closer to weatherstripping for body oils and will get your hair clean and de-oil everything everywhere. The snag is that I canât slack on the rinsing â otherwise Iâll get irritated skin and have to smear slime on it for a week+ to get it to calm down again.
â
Enter Jeremyâs. You may remember my review of their first-generation razor blades back on 5/13/2023. Theyâve also got a line of shampoos and body washes:
Jeremyâs hair-products collection
As Iâm writing this, they have both a shampoo BOGO (buy one, get one free) and a body-wash BOGO bundle. I ended up getting a pair of shampoo bottles and a pair of body-wash bottles. I only have so much space in my shower, so I only brought out a bottle of body wash and put it out where itâd be handy.
Now, I usually use a bleachable white washcloth. It scrubs better than a bare hand and generally cleans better than a bare hand does. I ended up spurting an eight-count of Jeremyâs onto my washcloth, andâ
Weird. Itâs basically black goop.
I checked the bottle to reexamine the ingredients, and I guess thatâs what the charcoal is doing.
Eight squirts wasnât enough to get my washcloth nice and soapy, so I kept going until a 12- or 15-count.
One can place all pleasant body-wash scents on a spectrum:
Iâd place both the Tea-Tree Tingle and the Rainbath in the ânot bad for menâ neutral camp. This stuff, by contrast, seems to be in the bottom category, and if my mother were to use it, sheâd smell nice, but probably a little odd somehow.
Iâve never been a Duke Cannon âSmells Like Naval Supremacyâ enjoyer since I prefer body washes, so the sheer exoticness of the smell was fun.
So now Iâve got this black gunk in my washcloth. I lather it up, and while itâs not nearly as dark as it was, the washcloth is still darkened. Itâs like I got a bloody nose in the shower, continued soaping myself up while dripping blood, and then washed the blood awayâŠmostly. Except I havenât quite gotten the last remnants of blood out quite yet. Oh, and thereâs the color difference, as well.
Like I said, pleasant smell.
It seems to clean well.
Now to take it off.
One thing that Iâve come to appreciate in a body wash â or any soap â is how easily the thing comes off. After I finish showering, the last thing I want to be doing is giving myself a comically thorough rub-down for ten or fifteen minutes while my fingers wrinkle and the hot water dwindles to nothing.
Jeremyâs takes longer to get off my shoulderâs than my usual favorites.
This isnât a good sign. Iâve gotten spoiled by not-aggressively-softened water over the years, and it seems like Iâm having to spend an extra 50% rubbing my shoulders to get to a proper squeaky-clean state.
Same seems to go with all my other body parts, really.
The washcloth is still darkened, too. Iâm going to have to rinse this thing out super-well before letting it dry and sticking it in the laundry queue.
The kicker is when I was finishing up and noticing the bathtub was noticeably more slippery than it usually is after a soap-down. It stayed that way after swishing my foot around, too. I thought about my options, and decided to squirt a few pumps of Rainbath onto the tub and swish/scrub it around with my feet to restore the normal amount of grip that I enjoy. That did the trick, although Iâm not exactly pleased that I needed to use body wash to clean up body wash.
The washcloth, after a bit more rinsing, gets back to white, or at least white enough for me to put into the wash without me worrying itâll darken the other washcloths and the towels to boot.
An hour later, Jeremyâs still feels good on the skin, but Iâm trying to figure out how I can use the stuff safely without having to clean it out with another pump bottle of goop or purchasing a shower stool to sit in and using it religiously. I never thought trying out new personal-care products would be an adventure like this.
Update, a few days later, on 2024-05-19: I now have a dark ring-shaped stain on my bleachable-white washcloths. Happily, if I donât use 15 pumps and dial it back to 12 pumps, the tub floor doesnât become dangerously slick without aggressively washing off the body wash. The charcoal-and-pomegranate smell is still divine.
Theyâre a fantastic convenience, but not a requirement.
Dan Q., âDoes a blog have to be HTML?â
Iâd like to point out that JSON Feed does not require entries to have titles because one of its creators, Manton Reece, wanted a feed format that would properly support microblogging.
~inquiry notices a thing:
~inquiry, âPerhaps pure text is the best walled garden of all?â
Dan Q., âDoes a blog have to be HTML?â
And asks:
Why not just paste URLs? Is copy/paste *really* difficult?
Selecting the URL is the annoying part, really.
Itâs OK enough if Iâm using a computer with a proper mouse.
Itâs a little more annoying if the computer Iâm at only has a touchpad.
Itâs pretty annoying if Iâm on an iOS device.
Itâs giga-annoying if Iâm using Voice Control. Iâd have to use âshow gridâ and say probably four or five different numbers, then say âstart dragâ or something along those lines, and then say four or five different numbers to say where the drag ends.
I wouldnât even know where to begin if I were using VoiceOver and pretending to be blind.
I drop by geminispace.info regularly to see what new capsules are out there.
A day or two ago, I saw this at the top of a couple of pages there:
geminispace.info search engine will shut down on 1st June 2024.
While I havenât seen its new-capsules list feature anywhere else, there are other search engines that you can use:
Thereâs also DiscoGem if youâre looking for piecemeal automatic discovery:
If you operate a Geminispace crawler, thank you â you help people form connections without having to go through one of a tiny handful of aggregator services.
I needed to take an oddly-timed midnight constitutional. I didnât feel like retvrning to the 80s by taking in an L. L. Bean catalog, so I took my phone with me like I pretty much always do.
Iâm not much of a social-media guy, so I find things to do that donât involve reading othersâ posts. My current task is to go into my journal app and make corrections. Previously, on a real computer, I had corrected a bunch of wrongly-geotagged entries. I ended up needing to do this because if you commit an entry before you get a good GPS lock innawoods, you run the risk of committing a location thatâs miles away from where you are.
Now, Iâm just corralling all my work at the gym to one location: the gymâs proper name. Most of these locations are merely nearby. Of course, I donât exercise only at the gym. Hikes and neighborhood walks get put in the jock journal, too, so Iâm scrolling by hikes and walks and Ring Fit Adventure sessions as I update locations.
And then I get to an entry. It reads:
Exercise bike
3:46 PM · cardio:bike · Home
I donât HAVE an exercise bike at home. Did I do exercise-bike work at the gym, come home, and only then remember to input a journal entry for it?
Thereâs all sorts of interest in Geminispace in lower-weight protocols. One of them is JSON Feed:
Itâs functionally similar to Atom (although each formatâs individual entry isnât a perfect match for the other formatâs), but instead of being in XML which is overly complicated for this purpose (probably), itâs in JSON.
Now, suppose you consume feeds, and want to support JSON Feed instead of (just) Atom feeds. For all this work, how much can you expect to save?
I donât use full-text feeds, and I havenât yet deleted anything out of my feeds, so this is what you can expect:
> eza -l --no-user --no-time --no-permissions --no-git --sort size --reverse --bytes atom.* feed.* 80,366 atom.xml 78,915 feed.json 74,876 atom.minified.json 68,445 feed.minified.json 67,492 feed.yaml
Iâm kind of surprised the YAML source takes less space than the minified JSON. I guess those extra quote marks and commas and braces add up.
Still, the savings arenât earth-shattering. Hereâs what it would take to download the whole thing on a 33.6 kilobit/sec modem, which would routinely download at 2 KB/s at top speed back in the late 90s:
> numbat ââââ âââ âââââ âââ âââ âââ Numbat 1.11.0 ââââ âââ âââââ âââ âââ âââ https://numbat.dev/ >>> 67 kilobytes / (2 kilobytes/sec) 67 kilobyte / (2 kilobyte / second) = 33.5 s [Time] >>> 80 kilobytes / (2 kilobytes/sec) 80 kilobyte / (2 kilobyte / second) = 40 s [Time]
This isâŠnot what Iâd call an interactive speed. Itâs something youâd want to run in the background periodically, and switching to a lighter-weight format isnât materially helping. Iâd check to see what these would be under both gzip and brotli compression, but itâs not as if Gemini supports transfer encodings.
Of course, âshould I minify my Atom feed before publishing it?â and âShould I update my feed parser to support both Atom and JSON Feed?â are questions for pretty much entirely different audiences. Only a tiny handful of people maintain feed aggregators like Antenna and CAPCOM (although I think all of them also provide Atom feeds for their capsules).
Me, Iâm a fan of view-source sensibility, so Iâm not about to start minifying my feeds as part of the feed-build step. YMMV.
Background:
I didnât have a website of my own back in the day, but I went to the Internet Button ArchiveâŠ
âŠand saw lots of buttons.
This page would have made my machine absolutely CRAWL back in the late 90s. Thereâs no way itâd have been able to maintain a buttery-smooth 60 frames per second.
I was going to learn enough Zig in one low-energy afternoon to have a quick curl-style Gemini client, but Zig isnât as batteries-included as Deno is.
My main hangup, as far as I can tell, is in `std.crypto.tls.Client.init()`:
If youâre looking for some quick whuffie on the Web, you could do worse than to write a quick Gemini client in 100ish lines of Zig and put it where your favorite/least favorite/third favorite search engine can see it.
A guy made TypeScript better:
Effective TypeScript, âThe Making of a TypeScript Feature: Inferring Type Predicatesâ
If youâre the sort of person to read TypeScript release notes, youâll probably be interested in most of the post.
This bit jumped out at me:
By the time my PR was merged, my Notion doc ran to 70+ pages of notes.
Letâs back up a bit to the whole paragraph:
While learning my way around the codebase, I found it incredibly helpful to take notes. Which function did what? What questions did I have? What was I struggling with? What did I have left to do? This helped to keep me oriented and also gave me a sense of progress. In particular, it was satisfying to read questions I'd had weeks earlier that I now knew the answer to. Clearly I was learning! By the time my PR was merged, my Notion doc ran to 70+ pages of notes.
So if youâre trying to get your bearings in a large codebase and wondering âAm I taking too many notes?â, the answer is âprobably notâ.
Michael Nordmeyer has a post up:
Michael Nordmeyer, âThe Problem With Full-Content Web Feeds Todayâ
He likes full-text feeds for all the usual reasons, but he worries a bit about bloat for people who download the feed over and over again, as 130 KB over the wire seems a bit much for him.
One thing he does to keep the bloat down isâŠdelete old blog posts. Not always in publication order, probably: his oldest one thatâs still up on the site is dated 1/6/2008.
Two thoughts that came to mind:
âThe madman. The absolute madman.â
âBased.â
Still, I was wondering if he was overstating the amount of bytes transferred. I had a look at his site with HTTPie, andâ
> http https://michaelnordmeyer.com/feed.xml HTTP/1.1 403 Forbidden Alt-Svc: h3=":443"; ma=86400 Connection: keep-alive Content-Encoding: gzip Content-Type: text/html; charset=utf-8 Date: Mon, 29 Apr 2024 03:35:56 GMT Keep-Alive: timeout=5 Server: nginx Strict-Transport-Security: max-age=63072000; includeSubdomains Transfer-Encoding: chunked Vary: Accept-Encoding <html> <head><title>403 Forbidden</title></head> <body> <center><h1>403 Forbidden</h1></center> <hr><center>nginx</center> </body> </html>
Well, hmm. He seems to think that HTTPie is naughty, or something.
Letâs pretend to be me on my usual browser of choice:
> http --headers https://michaelnordmeyer.com/feed.xml "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1 Safari/605.1.15" HTTP/1.1 200 OK Accept-Ranges: bytes Alt-Svc: h3=":443"; ma=86400 Connection: keep-alive Content-Encoding: gzip Content-Length: 136473 Content-Type: application/xml; charset=utf-8 Date: Mon, 29 Apr 2024 03:39:06 GMT ETag: "662eb0da-21519" Keep-Alive: timeout=5 Last-Modified: Sun, 28 Apr 2024 20:26:02 GMT Link: </feed.xml>; rel="canonical" Permissions-Policy: interest-cohort=(), browsing-topics=() Referrer-Policy: strict-origin-when-cross-origin Server: nginx Strict-Transport-Security: max-age=63072000; includeSubdomains Vary: Accept-Encoding X-Content-Type-Options: nosniff X-Robots-Tag: noindex X-XSS-Protection: 1; mode=block
Itâs got an ETag. Thatâs good:
A reasonably clueful feed reader (like NetNewsWire) or feed aggregator (like Feedbin) can just send a HEAD request to /feed.xml instead of a GET request to see if anything changed (probably not, if itâs checking once a day or more often than that).
Of course, reasonably clueful feed aggregators will check your feed only once on behalf of all its subscribers, and tell you how many people have subscribed to your feed in the headers somehow (probably the User-Agent string; I forget).
His nginx installation is also sending a gzip-compressed feed rather than uncompressed XML. The uncompressed XML is about half a megabyte, which is about 140 KB over the wire.
He could shave some more bytes off the transfer size if he were to minify the HTML and XML heâs sending out, but most lines in his feed are left-aligned and this wonât save a whole lot of data.
I like how he has an XSL stylesheet to explain feeds to people who arenât yet into feeds. I like Substack as much as the next guy, but Iâd rather read things in Unread than Mail.
I saw a tweet recently. Rather than subject you to a depression-inducing screenshot of a post on X thatâs been subject to five too many lossy-to-lossy conversions, Iâll reproduce it for you here:
[extraordinarily blurry picture of Kermit the Frog in a collared shirt, red tie, gray sweater, gray jacket, and gray broad-brimmed hat]
expatanon
@expatanon
Last two decades of software âinnovationâ
- pay forever and own nothing
- put it on our hard drive instead of yours
- redo legacy businesses with temporary VC $$ subsidies
- databases but shittier
- ape pics???
- retarded hallucinating chatbots
- 1000 twitters
[6:38 PM · 7/6/23 · 42.2K Views]
The hallmark of a good satirist is when he can get you to chuckle or even outright laugh even as heâs skewering things you like. Jon Stewart is in this category, if you ask me. Much of the above list is defensible, but thatâs a post â maybe â for another time.
Instead, Iâd like to focus on some unrelated innovations in softwareâŠdevelopment, at least:
In Ye Olden Days, each text editor ships with its own solution for understanding the files a user will edit with it. For example, hereâs BBEditâs longstanding solution to this problem â both âcodelessâ (specified in an XML plist) and code-based (you have to write Objective-C or something to get it to work):
Bare Bonesâ BBEdit Language Module Library
Of course, nothing else uses this. On the other hand, a handful of text editors and similar are able to consume Sublimeâs syntax files:
Sublime Text, âSyntax Definitionsâ
sharkdp/batâs README, âAdding new syntaxes / language definitionsâ
Microsoft, however, is built different. Since at least the 90s, it seems like theyâve been caring â by multiple orders of magnitude â more about making things nice for developers and people who program whose IQs are in the 100â120 range and already have their heads full of the problem domain and are likely to forget basic programming things, like what methods an instance of a string class has.
So, one of the things they developed for Visual Studio Code was the Language Server Protocol.
Eventually, they figured out that, to get a good in-editor experience, youâd want nothing less than the compiler of a language to be able to tell you which identifier youâre halfway done typing out. So you have the language provide an LSP, you have your text editor support LSPs, and then only one LSP needs to be written per language instead of each editor shipping its own custom bespoke 70% solution.
Of course, things arenât all wine and roses. I remember reading in a BBEdit release notes that the LSP spec differs from how VS Code does things, and everyone targets the 800-pound gorilla in the room than however the spec says things should happen. So wine may help, assuming youâre not into beer, cider, or hard liquor.
Still, this is way better than the old way.
gofmt probably wasnât the first thing to do this, but it seems to have made the whole thing popular.
People used to â and still do â argue about:
Some of these have obvious, but difficult-to-implement answers, like âtabs for indentation, but spaces for alignmentâ.
gofmt doesnât produce the nicest code, but you can type whatever crap you want and gofmt will make it look pretty good, even if it expands
if err != nil { return nil, err }
onto three lines instead of the mere one it deserves.
Prettier handles a lot of Web-adjacent languages that you might want to be formatted:
and if you like â or at least use â Python, thereâs black:
If you really trust your formatter, like I do `go fmt`, you might want to enable format-on-save in your editor. If you donât quite trust it in all cases, like I do for Prettier, you might want to have a mere format-this-file keyboard shortcut in your editor of choice.
â
Notably absent from the LSP/formatter revolution are lisps, probably because theyâve had that in Emacs for 30 or 40 years. If youâd like to do a lot of work to try and get people to try to write in languages where â))))))))))â is not an occasion for protracted screaming, you could do a lot worse than to write â or finish up â a pleasantly standalone formatter for Hy or Janet. Sure, all the cool kids use paredit, but âinstall, try, use, and like Emacsâ is a bridge too far for many, including yours truly.
I made a basic Gemini client in TypeScript-on-Deno:
// main.ts import { readAll } from "jsr:@std/io/read-all"; async function gimme(url: URL) { let port = Number.parseInt(url.port, 10); if (Number.isNaN(port)) { port = 1965; } const conn = await Deno.connectTls({ port, hostname: url.hostname, }); const reqString = `${url}\r\n`; const req = new TextEncoder().encode(reqString); conn.write(req); const resp = await readAll(conn); const s = new TextDecoder().decode(resp); return s; } if (import.meta.main) { for (const url of Deno.args) { console.log(await gimme(new URL(url))); } }
Paired with it is a deno.json:
{ "tasks": { "dev": "deno run --allow-net --unsafely-ignore-certificate-errors --watch main.ts gemini://gemini.circumlunar.space/users/adiabatic/", "atom": "deno run --allow-net --unsafely-ignore-certificate-errors --watch main.ts gemini://gemini.circumlunar.space/users/adiabatic/atom.xml", "json": "deno run --allow-net --unsafely-ignore-certificate-errors --watch main.ts gemini://gemini.circumlunar.space/users/adiabatic/feed.json", "news": "deno run --allow-net --unsafely-ignore-certificate-errors --watch main.ts gemini://geminiprotocol.net/news/atom.xml" } }
Itâs as dumb as a box of rocks, but you can run commands like
deno task dev
and see real life Gemini output, complete with the initial header line. As a complete surprise, it helped me figure out why Lagrange wasnât figuring out that my Atom feed was an Atom feed.
The folder itâs in is called âgurlâ. Thereâs probably a halfway-decent âcurlz for the girlzâ joke in there somewhere, but polishing that into something chuckle-worthy is beyond my abilities today.
curl, a command line tool and library for transferring data with URLs
In case anyone else wants to play with it and gets twitchy about licenses even for code put out there by pseudonymous Internet randos, Iâve released the thing as CC0, which is a fancy public-domain dedicationâŠalthough really, the WTFPL is likely a better fit, thematically.
I keep coming back to a thing:
solderpunk, âA smol.earth update on Earth dayâ
Computers aren't fundamentally evil by any means, we are not out to vilify them, but the view taken by our technohippy predecessors (whose "Whole Earth" moniker has obviously inspired us), that they are fundamentally empowering and liberatory devices, "personal freedom machines", is a hard pill to swallow in 202x.
Iâm not much of a smol.earth guy myself, although we do have points of agreement. This post is something of an exploration on how the smol.earth crowd is at least onto something, even though (it seems) Iâm diving in deep into one aspect of a ten- or twenty-point desiderata list and ignoring all the rest.
Anyhow.
âFundamentally liberatoryâ. Hmm.
Letâs think about personal computing first, and then, maybe in a later post, think about mainframes/cloud computing run by and for other people. Polya says to solve a simpler problem first, right?
Previously, Iâve discussed Steve Jobsâ âbicycle for the mindâ meme. (Use your clientâs find-in-page functionality for âbicycleâ in the pages for this year (2024), last year (2023), and the year before (2022)). But what else could computers be?
A conduit for the Khala, I suppose.
One simple way to keep your personal computer use liberatory is to use your computer and computing devices in ways that havenât changed much since the mid-80s, or, at the latest, the mid-90s.
Sure, you might prefer using voice recognition (which will happily gobble up as much computing power as you can throw at it to improve accuracy), but sticking to using a computer as a largely-solitary thinking-and-writing-and-organizing-and-mathing device preserves, I think, personal computing as something liberatory, provided youâre not letting yourself get sucked into playing Solitaire for hours on end.
A while back, I listened to a thing:
In short, Skrbina thinks that Uncle Ted is really onto something. I recommend listening to the whole thing.
I forget if Hsu asks, near the end, whether any group following Uncle Tedâs values (sticking to a sociotechnological level found in Renaissance Italy) is necessarily going to need to become a protectorate of some other much higher-tech power with modern weapons, while Skrbina stammers out a non-answer response. Itâs been a while.
Anyway. Today, I read a thing:
solderpunk, âA smol.earth update on Earth dayâ
Thereâs a lot in there, and many interesting parts are entangled with other interesting parts. I have thoughts on them, and Iâll probably end up writing stuff about them. I like Earth, and think itâs a fine base of operations to start interplanetary and interstellar exploration and colonization from. See my ââWe need to get bagels on Marsââ quip from back in 2022.
But, back to the smol.earth update:
If you don't feel the points that follow in your bones yet, the smol.earth is probably not yet for you:
[âŠ]
We believe computing is unsustainable in the long term and that it needs to ultimately disappear from the world, but we are condemned to live *our* lifetimes surrounded by computers which we feel compelled to use.
Funny, I know of a guy whoâs kind of doing that.
Hereâs his website:
Morlock Publishing â uplifted dogs, AI, anti-gravity, libertarian rebels, and big guns
And hereâs his X account:
His pinned post shills his book:
amazon.com: Travis J. I. Corcoran, _Escape the City_
The Amazon page also links to the second book in the series. Iâm not sure how many are planned.
Of course, there are entire groups of people, at least in North America, who have something resembling the smol.earth attitude toward technology:
This appears to be the logical endpoint of the smol.earth philosophy, and if youâre serious about it, you might want to try becoming one of the few converts to, uh, Amishness and save yourself the awkwardness of being only halfway in the modern world.
As discussed below on 4/14/2024 in âBeating the rushâ, Iâve set up a Debian machine.
One thing I use a lot on macOS is option-key shortcuts for characters that arenât on my keyboard, like curly quotes and em dashes.
X11 hasâŠthe Compose key. It is supplemented by ibusâs ââ§u dead key.
x.org, âXlib Compose Keys for en_US.UTF-8â
GitHub, âUnable to unset Unicode code point shortcut (ctrl+shift+u) with GtkIMContextWaylandâ
Compose (â) is not unpleasant given what it tries to do. You tap a key youâve bound to Compose, then you type a sequence of keys to get what you want. For example, to get a proper curly apostrophe, type â>', or â'> (oftentimes itâs not picky about order).
Oddly enough, you cannot type the Compose glyph with the Compose key. You can, however, type it by pressing ââ§u, releasing all that, and then typing 2384, and finally a space to let ibus know youâre all done with the key.
You will be unsurprised to learn that â is U+2384.
I was able to type this entire entry on Debian, but I donât have a good way to generate the entry for this update in the capsule feed source. I guess Iâll have to commit this edit, then push it up, then pull it down to a Mac, add the entry, and then push and publish and announce.
Phooey.
I listened to a couple of episodes of Twenty Thousand Hertz (hereafter 20KHz). Theyâre kind of a pair:
20KHz, âTa-da! Itâs Windows!â
20KHz, âWindows_Logon.wavâ
Most podcasts donât really need all that great audio to be able to listen to them well. 20KHz is an exception: I try to be in a position to listen to it, at least, with my AirPods Pro with noise cancellation on. This means ânot while drivingâ, if nothing else.
Iâll wait here for a bit while you queue them up in your favorite podcast player and get around to listening to them. Both should take less than an hour combined (make sure to disable your podcast clientâs speed acceleration if you use a thing like that).
[smooth-jazz elevator music plays]
While the first episode doesnât go into the complete history of Windows audio, it does play TADA.WAV for you, which was what you would have heard as a startup sound on Windows 3.0.
Oddly enough, startup sounds seemed to be mostly for the cool factor starting in Windows 95. The host of the podcast says that startup sounds are an indication that your computer is ready to go after maybe a minute or two of a boot-up process, but I generally have memories of Windows only being partially ready to go by the time the logon sound plays â generally, a bunch of other backgroundy things that live in your notification area (âsystem trayâ) still need time to get started before the system really has all its startup tasks out of the way.
Now, we here in Geminispace tend to like older technology for all sorts of reasons. Iâm here to tell you that the Windows NT 4.0 startup sound was VERY cool back in the mid-90s.
If you want to ease into mid-90s cool, you would be well served to listen to this episode beforehand, which goes into the peak of early-80s cool:
20KHz, âItâs not TV. Itâs HBO.â
Of course, podcasts arenât great for video. You can see the intro sequence here:
I have what Iâve been calling a âWindows machineâ. Itâs from 2012 or somesuch and has been serving me reliably for years.
Of course, itâs old enough to not support Windows 11, and October 14, 2025, isâŠwell, years away.
I spent some time thinking, and eventually decided to rip the band-aid off early and switch to an operating system that would be supported for longer than a year and a half.
I chose Debian Stable, because Iâm boring and barely use the machine anyway and donât need much thatâs particularly new.
I had a look at Mint, but thereâs something surprisingly off-putting about trying to copy Windows XP while (rightly) ditching the Fischer-Price color scheme that we all hated in the mid-2000s. Modern GNOME at least kind of tries to do its own thing, to mixed success.
Of course, Stable doesnât come with everything I want. Sure, Visual Studio Code can get installed and get on the autoupdate train, but I have a bunch of other things that I like to use that are either older in Stable or just plain not there.
Many of these programs I managed to install into ~/.local/bin, like eza and helix. Others I just did without.
Eventually I was told by the NPM website to either install NPM via a tarball or to use Homebrew.
Which I already use on my Macs.
âBut I already have a package managerâ, I thought.
âBut I donât like having to manually poll websites for updated versions of softwareâ, I also thought.
âŠhaving two package managers still feels weird, but itâs nice to have my usual toys available and updating in the usual manner. Iâm keeping my fingers crossed that the two collections of things donât bonk heads somehow.
A new Visual Studio Code update came out today. They added custom labels for open editors:
Visual Studio Code updates, March 2024 (version 1.88): Apply custom editor labels
If your capsule is laid out like mine, you have a LOT of index.gmi files. If you have more than one open, Visual Studio Code will also include (in smaller, dimmer text) the parent directory of the file to clue you in to which is which, but if you have only one open, youâre stuck guessing or trying to lean on your memory.
Enter custom editor labels.
My .vscode/settings.json now looks like this:
{ "[gemini]": { "editor.quickSuggestions": { "other": "off" } }, "workbench.editor.customLabels.patterns": { "**/index.gmi": "${dirname(0)}/" } }
This makes it so scrawlspace/2024/index.gmi (the file Iâm editing now) shows up as â2024/â in the tabs at the top of the editor. If I have multiple index.gmi files in folders with the same name, I get smaller, dimmer text as a disambiguator still.
In case youâre wondering, the other option in there disables VS Code from popping up text suggestions in normal prose. I donât need autocomplete for words like âandâ.
There is a description of orthogonal persistence out there. You should read the whole thing. However, we are more interested in the coda at the end:
âOrthogonal Persistence, the Modelâ: âCoda: Friendly vs Unfriendly Persistenceâ
You may recognize its author, François-RenĂ© Rideau, as âthe Houyhnhnm Computing guyâ. You may also recognize him as âthe guy who takes Urbit seriously, but takes issue with its persistence modelâ. You may also recognize his X handle of @ngnghm.
Back to the coda. He writes:
In todayâs world (2024), all your data persists⊠on your enemiesâ servers. The big corporations and bureaucracies that try to manipulate you know everything about you, and run AIs to analyze your behavior to manipulate you even more into buying their stuff and obeying their orders. They use Manual Persistence, but they can afford thousands of database experts and system administrators to make it work at scale, so as to spy on hundreds of millions of human cattle.
I like the cut of his jib, but he hasnât sold me on it yet. At least now, I can predict what will get persisted to disk depending on what I do. While text editors that do not preemptively save anything to The Cloudâą these days are rare, one can open up vi in a window and type to his heartâs content knowing that nothing will be committed anywhere until he types :w and then a filename.
Meanwhile, Rideau somehow does not see a system where every interaction with it is permanent and indelible as a liability. Being unable to write so much as âfuck fuck fuck fuck fuck fuckâ without it persisting forever on disk makes me want to get a large notepad and a cross-cutting shredder â and notepads are much less effective bicycles for the mind than computers are.
Maybe the solution is as simple as having all document-based applications (text editors, spreadsheets, calculators) have Private Mode like browsers do now, but Iâm not sold yet.
Background reading:
Solderpunk, âAnnouncing OFFLFIRSOCH 2024â
Iâm not about to write a program in a month, but I have collected a bunch of programs that, by and large, work offline:
I think thereâs at least three math things in there already, and I havenât gotten to the bottom of the page yet.
My go-to for unit-aware math is Soulver, though:
Soulver, the notepad calculator
If you have programming chops, you may want to consider improving an existing program before making one of your own.
I stumbled over a thing recently:
jamesg.blog, â100 things you can do on your personal websiteâ
Some of these things look like fun things, or at least interesting things. On the other hand, many of them seem like nothing less than chores:
* Add an RSS feed so people can subscribe to your blog.
* Add a print stylesheet.
* Style code snippets in posts on your blog with a syntax highlighter (i.e. Prism.js).
An RSS feed is actually useful to some fraction of your audience, but writing print-specific styles seems like a thankless chore.
Yes, Iâm tired. I used to have the energy and interest to do stuff like this, but not anymore.
I will, however, add one item to the list:
Nothing quite communicates âthis thing used to be here, and now itâs notâ like a custom 410 Gone page. A 404 Not Found page doesnât convey intentionality like 410 Gone does.
(The Gemini equivalent for 410 Gone is 52, in case you were wondering.)
Prior reading:
JeanG3nie, âWhen a walled garden becomes a preserveâ
Money graf:
At this point, Apple's refusal to allow another browser engine on it's platforms might be the only thing keeping Chrome from being able to fully dictate the direction of the web.
I certainly say this, but I prefer Apple things to Google things. Iâm not a neutral third-party.
John Gruber has a look into what changes under the Digital Markets Act over in the EU:
John Gruber, âAppleâs Plans for the DMA in the European Unionâ
The relevant bit:
One point of confusion is that some aspects of Appleâs proposed DMA compliance apply to the App Store across all platforms (iPhone, iPad, Mac, TV, Watch, and soon, Vision), but other aspects are specific to the iOS platformâââwhich is to say, only the iPhone.
And then thereâs Appleâs relevant page:
Apple, âUsing alternative browser engines in the European Unionâ
iOS 17.4 introduces new capabilities that let iOS apps use alternative browser engines â browser engines other than WebKit â for dedicated browser apps and apps providing in-app browsing experiences in the EU.
Two things of note:
iOS
(as opposed to iOS and iPadOS)
in the EU
So unless youâre ignoring iPhone users outside the EU, you, as a website developer, canât just tell your iPhone-using visitors to download Chrome-with-Blink-in-it and come back. Even if youâll happily do the work, people up the chain of command who are more business-minded wonât have a net financial incentive to say âlet the Apple people download Chrome and then they can visit our siteâ. Youâll have to put in the time to make the site work right in Safari.
This state of affairs largely preserves Appleâs ability to defend its ecosystem and users from Googleâs snooping. After all, if you have to use Googleâs browser to do almost anything on the web other than browsing a handful of indie sites, thatâs a clear-cut monopoly and makes real consumer choice all but impossible. Anti-consumer-choice monopolies, of course, are the kind of thing governments say theyâre against, at least when theyâre in the private sector.
I first encountered the phrase âlet him cookâ on a Twitch stream where the streamer speedruns The Legend of Zelda: Breath of the Wild. Generally, when one cooks food in this game during a speedrun, itâs to make up large batches of food, and you canât un-make an omelet, so thereâll be a chorus of LETHIMCOOK in chat to get other people to, at least temporarily, not try to get the streamerâs attention for a bit.
My second encounter with the phrase, or something like it, was close, but a bit less literal.
Linkus7 on YouTube â Can you beat every dungeon without the paraglider in Tears of the Kingdom?
If you avoided getting the paraglider, then there more than a few places where your options to continue on are basically one of these two:
The second of these options is way less entertaining, so a guy whose day job is âentertainerâ who does so by playing games naturally tries for the first option.
Itâs in this context that he says âlet me cookâ â but here, heâs not asking Twitch chat to not try and get his attention. Heâs asking them to hold their horses while he tries to work out a solution to falling down a 2,000-meter hole without dying from the sudden stop at the end.
â
âŠand then I saw âlet X cookâ on X, coming from the HTMX account:
@htmx_org on stored procedures driving UI
i don't like the idea of stored procedures driving UI mainly due to the mechanics of updating them (version control, etc) but i'm willing to let them cook because eliminating the app server/db hop is one of the last big, obvious perf wins in most web apps...
(This is in the context of a hypothetical âReact Database Componentsâ. If you donât want to click through, imagine a stored procedure in your database that returns a snippet of JSX, and inside that is a list of todo items all wrapped in li elements, and the bundle is wrapped in a ul element.)
Still, thereâs the phrase
let them cook
If you find yourself looking for a way to reserve judgement on an idea until implementations of the idea get better fleshed out and/or better-spaded so the upsides and downsides are better understood, you could do worse than to haul out this turn of phrase.
Background information:
I played Diablo 3 for a bit.
One of the things that I noticed was that once I got to endgame content, I could mostly shut my brain off while I was killing demons. However, I had to pause podcasts and give my full attention to what I was doing when I was selling all the loot that I had accumulated, because âdo I keep this or do I sell thisâ was something that took all of my decisionmaking faculties and wasnât something I could just outsource to my brain stem.
I thought about this for a bit when pondering the process of cooking in The Legend of Zelda: Breath of the Wild and Tears of the Kingdom. If you want a particular effect, or a particular level of an effect, you canât just shut your brain off â oftentimes you have to look up specific ingredients and their potencies and maybe use an online calculator to find out if you can make something that will give you a level-3 buff for as long as you think youâll need it for.
Niklaus Wirth passed recently, and so his âA Plea for Lean Softwareâ has been making the rounds:
Niklaus Wirth â A Plea for Lean Software (February 1995)
I actually read it in full. Itâs not long. A bunch of people have posted excerpts they agree with. He ends with a list of lessons learned from Oberon. These are mostly sensible, although #5 is a bit suspect. My takes:
â
HoweverâŠ
Wirth is writing this at the beginning of 1995. Windows 95 was to come out that summer, and Windows 3.1 is already out there for normal people, and Windows NT 3.5 has been out for a few months already. Oberon, his pride and joy, was written between 1986 and 1989, back when Riker was clean-shaven and Windows hadnât hit 3.0 yet. Windows didnât get popular until Windows 3.0.
Back to Wirth. The speed of development of Oberon is impressive:
Designed and implementedâfrom scratchâby two people within three years, Oberon has been since been ported to several commercially available workstations and has found many enthusiastic users, particularly since it is freely available.
Oberon, to its (minor) credit, appears to have both color and graphics, although itâs not obvious from the screenshot that any kind of graphical paint program is possible in it. Presumably the giant squiggly can be generated with text, like SVG or POV-Ray. This will be relevant shortly.
Where Wirth seems to go off the rails is near the beginning of his article. There, he lays out his idea of what are â in 1995 â mere nice-to-haves:
Uncontrolled software growth has also been accepted because customers have trouble distinguishing between essential features and those that are just ânice to haveâ. Examples of the latter class: those arbitrarily overlapping windows suggested by the uncritically but widely adopted desktop metaphor; and fancy icons decorating the screen display, such as antique mailboxes and garbage cans that are further enhanced by the visible movement of selected items toward their ultimate destination. These details are cute but not essential, and they have hidden cost.
In modern terms:
Later, he continues:
increased complexity results in large part from our recent penchant for friendly user interaction. Iâve already mentioned windows and icons; color, gray-scales, shadows, pop-ups, pictures, and all kinds of gadgets can easily be added.
Modernizing:
â
Personally, Iâd like to have seen a debate between Niklaus Wirth and, say, Jakob Nielsen of the Nielsen Norman Group. Both men have an anti-frippery bent, but the usability proponent is going to have a much broader idea of what work needs to be done to make systems usable for normal people who arenât computer experts and also people who have one or more computing-relevant body parts that donât work right, like eyes or arms.
While text-to-speech systems seem to be mostly a solved problem on even wrist-worn consumer hardware, speech-to-text seems to be a problem that will happily consume whatever computing resources you can throw at it â up to and including machine-learning models that will take up like half your RAM on a 32-GB machine with an M3 Apple Silicon processor in it.
References:
If you want to read older entries, hereâs the page for the previous year:
If you want to stay abreast of updates, have a look at this capsuleâs colophon. It links to the capsuleâs JSON Feed and Atom feed.
Additionally, the following URL will always redirect to the current year, assuming I havenât forgotten to update the redirect after making the first post of the year:
â