§

When you’ve got rid
of all the mosques
But the costs
of life still rise
and you’ve built
your fortressed borders
but the NHS still dies
and the Muslims are all gone
and your town’s a wall of white
but corporate vultures
are still pillaging
every facet of our lives
who will you blame then?
What will you have gained?
A badge for barbarism
against a backdrop of decay

https://mastodon.online/@streetartutopia/116589467147835803


Amaze Amaze Amaze


Andy Weir’s “The Martian” was the first book I ever read twice in a row. Andy Ihnatko recommended it on Twitter (remember when Twitter was good?) and so I checked it out from the library. I could not put it down. And I reread it immediately after finishing it.

“Artemis”, his second book, is good, but it suffers from having to follow “The Martian”.

“Project Hail Mary” is superb. I don’t think it is better or worse than “The Martian”, it is as good in different ways.

The movie version of “The Martian” is one of the better book-to-movie efforts. Like all movies, a certain amount of compression has to happen to fit the book into roughly two hours of movie. It is one of my favorite movies.

I saw “Project Hail Mary” a couple days ago in the theater. It is as good as everyone says. I think the movie is as good a representation of this book as “The Martian” movie was to its book.

In the words of Rocky, amaze amaze amaze.

Tonight while we were having dinner Sibylle showed me on her phone that you can now buy or rent “Project Hail Mary”. Guess what we watched this evening?

For all the space and technology and science in Andy Weir’s books, the humanness of the stories are the real draw. Go see “Project Hail Mary”, or rent it, or buy it, and you too will say amaze, amaze, amaze.


Menu Bar Denizens


From right to left (at the moment, anyway) here are the things in my Menu Bar.

Apple Menu Bar Items

Day Date Time
I have it set to show a three letter abbreviation for the day of the week, and also month. The time is 12h, i.e., AM and PM.

Settings
Standard “control panel” drop down dialog. I don’t think I’ve even modified what appears here.

Wireless
It’s a laptop that is always connected via WiFi. I like that Option-clicking on the icon provides detailed connection information.

Bluetooth
Headphones, AirPods, and keyboards are the devices I connect with over Bluetooth.

Battery
When my battery usage seems to be higher than normal I like that this tool gives you a list of the significant energy users.

Volume Mostly I like that at a glance I know whether or not my speakers are muted.

Time Machine
Once per hour snapshots of my data. Nice.

Focus Mode
I make good use of focus modes. I have a geographic one for my weekly cello lesson. If the day or time of the lesson changes, the focus mode still works. I also have a weekend one that quiets notifications from most apps. I use Apple’s Sleep tracking, which has its mode, and I have one that I turn on when I practice cello to prevent interruptions.

Passwords
I’m all in on the MacOS Passwords app. I used 1Password for years, but the increasing subscription cost and feature creep wore me out.

Application Menu Bar Items

Take Five
Allows me to keep tabs on what is currently playing. Nice that it recognizes YouTube videos, movies, and music.

SpameSieve I started using SpamSieve soon after getting my Titanium PowerBook G4 in 2002. Still use it for my domain email.

Tailscale I have Tailsacle on all my personal computers, and I have those IP addresses in my ssh config with aliases so it is simple to remote into any other computer from the one I’m one. Exit mode is great when traveling to route my traffic through my home connection.

Maestral
A Dropbox GUI replacement. I hard use Dropbox any more. When I do, I use Maestral rather than the device limited official client.

Podman Desktop
An alternative front end to Docker. Typically I only use it for databases when I’m toying around with some project that needs a data store. Often it isn’t even running.

RepoBar
The newest member of my Menu bar is RepoBar. It gives lets me monitor my GitHub repositories quickly and easily.

Even with 15 Menu bar items I still have about an inch of room before things would disappear under the dreaded notch. Should I ever get to that point I’ll look into Bartender or similar to organize the denizens.


Age Gating


I watch a bunch YouTube channels. Everything from sailing to woodworking to flying to programming. Frequently the YouTube algorithm suggests something I find interesting enough to watch, but not interesting enough to add to corpus of data YouTube has about me.

When there is a video or short that I want to look at without being “me”. I copy the link and open a private window and watch it there. This worked famously. Until today. This morning when I tried this trick I was presented with a YouTube sign in screen. Refreshing and trying again didn’t help. Some quick research informed me that YouTube has been rolling out age gating.

(I’m not going to get into the smoke-and-mirrors aspect of “protecting youth by requiring they enter an age”. It is really about tracking.)

Fortunately I collect email addresses. So I dusted off a dormant one and used that to sign into YouTube in another browser. My watching habits are still being tracked, and with some work you could trace your way from the second account back to me.

At least I’m not polluting my primary YouTube feed with one-offs.


Repairing the Ruins: Why AI Cannot Replace Education


For years I have thought that, if I were a teacher, I would allow the use of any source material the student desired, as long as it was attributed fully and correctly. Even before generative AI it was possible to “out source” creative work to some distillation of another’s work. Generative AI merely makes that outsourcing friction-less.

The teacher’s role accordingly becomes more important in the age of AI, not less. A real teacher is not merely a distributor of content. A real teacher is an experienced guide in inquiry: someone who knows what the student has not yet seen, what distinctions must be made, what confusion needs exposing, and what question should come next. The best classroom is not a transfer of information from one container to another. It is a living act of thought. That is why seminar, disputation, laboratory, tutorial and serious conversation retain their force even when information itself becomes cheap.


Jujutsu History Template


Jujutsu Version Control

Recently I’ve been using Jujutsu or jj for version control. It is, in effect, an alternate front-end to Git. There are any number of articles, tutorials and other online resources that can explain the finer details.

One feature I’ve been exploring more lately is Jujutsu’s ability to use templates to control how output is presented.

Compact history

I like a one-line history. jj provides that ability, but I was unhappy with the column order. Templates to the rescue. The following template shows the change id, then the commit id, the date and time, the author, and finally the description.

For the date and time I like to use the .ago() option to get relative time offsets. However the width of that information is variable, which ruins a nice table-like appearance. So I’ve opted for a 12-character format with a 24 hour clock.

The author on all of my own repositories is me, so having my name displayed on each line seems silly. The template compares the author email on the commit to my email address, and only displays the name if the two are different. Nice.

Here’s the template:

 
history = ["log", "-T", '''
  change_id.shortest(12)
  ++ " " ++ commit_id.shortest(12)
  ++ " " ++ committer.timestamp().format("%y-%m-%d %H:%M")
  ++ if(author.email() != "mark@zanshin.net",
      " " ++ author.email().local(),
      "",
    )
  ++ " " ++ if(description,
      description.first_line(),
      label("hint", "(no description set)"),
    )
''']

Put that into the [aliases] section of your configuration TOML. I have a bash alias setup to trigger this template. The results look like this:

Image of formatted jj log output:


Rust Language Immersion Course


Last November someone I follow on Mastodon posted about taking a week-long Rust programming course that used the Crafting Interpreters book as the project. At the I wished I could join in the fun.

A couple weeks ago she posted that the course was being offered again, for the last time. After thinking about it for a couple days I decided to sign up. It’s a five day course, Monday-Friday, from 9:30 am - 5:30 pm. The bulk of the time is spent crafting a rusty interpreter. The day starts with an overview of the next challenge in the book, and some ideas on how to best use Rust to solve them. Periodically through the day, there are more “lectures”.

I have definitely been immersed. I’m typically up by 6 or 6:30 am, so by the time the course day ends at 5:30 pm, I’ve put in a good 10 hours of work. I end up spending a couple more hours in the evening. I haven’t done this much focused programming in a long time.

Yesterday I spent the day creating the Abstract Syntax Tree (AST) portion of the project. Then in the evening I re-did most of it. My programming roots are procedural. The first dozen or so years of my career were spent writing COBOL. I’ve worked in Forte TOOL (a defunct 4Gl), and a smattering of scripting languages.

Where I am lacking is knowing about the helpers and syntactic sugar Rust provides. Wrapping my head around traits, or enums has taken some effort. My brute-force struct-for-every-statement approach worked, but it had far too much boilerplate code. Forcing my self to make use of enums and iterators made the code far more compact, and ultimately better.

That I have been programming for more then 45 years and I am still learning new tricks, new languages, and new ways to do things, is amazing. I was a mediocre student all through school. If you had told me back then that I would delight in learning new things, even esoteric things that I won’t ever use, for the joy of it, I wouldn’t have believed you.

I have book from the 1990s called “Thinking Body, Dancing Mind” (I think that’s the title). Being able to immerse myself in a week-long course, writing a programming language interpreter, in Rust, for fun is most certainly a case of dancing mind.


49 Years and Still Operating


The Voyager spacecraft are incredible. Nearly 49 years after launch and they are still functioning and still transmitting data. Simply astonishing engineering.


Crusty Interpreter


Several years ago I discovered Writing an Interpreter in Go and the sequel Writing a Compiler in Go, by Thorsten Ball. I managed to get most of the way through the first book. Thorsten did a superb job of explaining the concepts behind tokens, lexers, and parsing.

Several weeks ago Lindsey Kuper (@lindsey@resurse.social) talked about a week long class in creating an interpreter in Rust. The road map for this is Crafting Interpreters by Robert Nystrom.

A week or so ago, when she reposted a message from the creator and teacher behind the “Crusty Interpreter” course, I really wanted to take it. I am fascinated by Rust as a programming language, and I’m equally fascinated by interpreters and compilers. After pondering it for a while I decided to sign up.

Crusty Interpreter is a week-long, immersion style course. The short description for the course:

Challenge yourself by implementing an interpreter for a programming language that you don’t know (Lox) in a programming language that you might not know (Rust) from a book that uses a programming language that a lot of people used to know (Java).

Sounds like a blast. I didn’t take the operating systems course in college, so this is a change to catch up.

I likely won’t blog much about it during the week, but I hope to recap it once the course is over. Lindsey wrote about her experience in the course.


Greatest Car Review Ever