Saturday, January 31st, 2026 04:47 pm

I keep seeing the name 'Ratner' in connection with the Fantastic Flopping Vanity Movie - he's the director? - and apparently he is not the same Ratner who crashed the value of a chain of jewellers in the early 1990s:

Ratner made a speech addressing a conference of the Institute of Directors at the Royal Albert Hall on 23 April 1991. During the speech, he commented:
We also do cut-glass sherry decanters complete with six glasses on a silver-plated tray that your butler can serve you drinks on, all for £4.95. People say, "How can you sell this for such a low price?", I say, "because it's total crap."

He compounded this by going on to remark that one of the sets of earrings was "cheaper than a prawn sandwich from Marks and Spencer's, but I have to say the sandwich will probably last longer than the earrings". Ratner made a guest appearance on TV chat show Wogan the day after his speech, where he apologised and explained his joking remark that some of his company's products were "total crap". Ratner's comments have become textbook examples of why CEOs should choose their words carefully. In the furore that ensued, customers stayed away from Ratner shops.
After the speech, the value of the Ratner Group plummeted by around £500 million, which very nearly resulted in the group's collapse.

But, you know, at least a certain honesty there?

***

In happier business, there's a charming piece here by Jackie French (author of Diary of a Wombat about her real-life relationship with wombats, in particular the one who was the inspiration for the book.

A factoid exploded:

I hear her snort each time someone declares that wombat droppings are square. (They can be – but only when their food is dry. When it’s lush grass, they’re long and green.)

Saturday, January 31st, 2026 12:14 pm
Some more fills from the January long weekend. I’ve been collecting prompts, and hopefully will have time to play around with them in February. I’m in the mood to write very short fic; now I just have to find the time!


Terminator: TSCC, John and Sarah and Cameron )


Sinners, Lisa Chow )


Sharp Objects, Camille Preaker &/ Amma Crellin )


Hm, maybe my next round will be fluffy? Or perhaps not. :P
Saturday, January 31st, 2026 11:22 am
Local musical legend and TTC busker Jeff Burke is no more, and Toronto is a little duller without him.
Sunday, February 1st, 2026 12:41 am
Fandom: due South
Characters/Pairings: Benton Fraser/Ray Kowalski, Ray Kowalski & Ray Vecchio, Diefenbaker, Buck Frobisher, Maggie McKenzie
Rating: Mature
Length: 26,124 for the main fic, 28,647 for the series
Content Notes: Creator chose not to warn. This has at least a hopeful ending, but the fic is about zombies and Ray kills and eats at least one victim, plus there are some slightly gross descriptions in places. Way less gore etc. than most zombie stories, though.
Creator Links: mizface on AO3
Themes: Crack treated seriously, Friends to lovers, Friendship, Complete AU, Zombies, (Not really) character death, Epistolary fic

Summary: Ray Kowalski thought he had an okay existence: he had a place to call home, didn't have to worry about a job, and nobody bothered him. If it wasn't for the fact that he was a zombie, things would have been pretty good.

Then he met very much alive Benton Fraser, and his whole world was turned upside down.

Reccer's Notes: And the trifecta of cracky fantasy creatures: zombies. This story's based on the movie Warm Bodies, which also takes the cracky zombie premise kind of seriously, in a romantic way. Zombies are usually shown as mindless ravening hordes, but in this story both Rays have been zombified but haven't completely lost themselves. Here, zombies are called "the infected", and both Rays begin to mysteriously improve across the story, regaining more speech and cognitive ability. Apart from the relationship with Fraser that develops - and we also access Fraser's POV from his journal entries - there's a nice friendship between the Rays. There's one major story, followed by a number of short fics adding to the 'verse. A rather lovely and poignant take on zombies, that more seriously explores a possible at least partial recovery from that state, and developing relationships.

Fanwork Links: Ch-ch-changes, and the series

Saturday, January 31st, 2026 12:28 pm
Happy birthday, [personal profile] conuly and [personal profile] thursdays_child!
Saturday, January 31st, 2026 11:37 pm
Fandom: Stargate Atlantis
Characters/Pairings: John Sheppard/Rodney McKay, Katie Brown, David Parrish, Elizabeth Weir, Bates
Rating: Explicit
Length: 6499
Content Notes: No AO3 warnings apply
Creator Links: Hth on AO3
Themes: Crack Treated Seriously, First time, Friends to lovers, Humor, In vino veritas

Summary: Rodney toked pot that one time, but it never made him one of the cool kids.

Reccer's Notes: Okay, I'm stretching it a little thin in terms of the prompt, but any excuse to rec this charming, hot, and funny fic. The cracky premise is that Colonel John Sheppard, the military commander, is the drug czar of Atlantis, and Hth actually does sell it, while still keeping Sheppard in character. I'm very fond of "under the influence" stories, and this is lovely, as Sheppard inveigles Rodney to smoke pot with him and Rodney transforms from a pining nerd to being almost as cool as Sheppard. As so often, they've both been secretly attracted to each other for ages, and a bit of disinhibition (hitting Rodney harder as he's less used to it) speeds things along. It's a favourite story of mine with great dialogue, and a very fun read.

Fanwork Links: Be Cool

Saturday, January 31st, 2026 11:14 am

Ice hockey:

I'm trying to practice more regularly with Womens Blues on a Friday, this means I have 4 practices a week over 3 days (Friday nights are double-practice, with just over an hour between Womens Blues and Warbirds). I played for a joint Huskies-WBs game against UCL two weeks ago, and for Warbirds against Chelmsford Chargers last Saturday, immediately followed by watching Huskies play Oxford Vikings B. I had begun to fear that Huskies could only win when I wasn't physically in the building, so was very glad to be proved emphatically wrong by a 7-4 scoreline. Both Saturdays I went out with the students after the game, and ended up staying up way too late (worth it though, I love my teammates very much).

I have yet to play a winning game this season, across any of my four teams (Kodiaks, Warbirds, Huskies, Womens Blues). I'm still having fun every time I step onto the ice to play, and that's what matters. But I would really like a win any time now. This weekend for a change I have no games to play, but will be doing game ops for Tri-Base Lightning vs Peterborough Dynamo, followed by the same for Mens Blues vs Imperial Devils. Huskies are having a social watching the MBs and then going out (of course!). Next week I am driving to Sheffield with Womens Blues for a late night game Monday and taking Tuesday off work to recover.

Theatre:

I love living in the same city as the ADC Theatre, and especially getting a staff discount on the already reasonably-priced tickets. Two weeks ago I took Charles to see Hadestown: Teen Edition (that means they changed the register of some of the parts to make it easier for youth theatre to stage), along with Mick and Joye and a couple of my friends, and he loved it. This week we saw Noises Off together, which is as funny as I remembered. We've been through the rest of the current schedule and while I can't get to anything in February, we're hoping my schedule will let us get to a whole swathe of productions from March to May.

Languages:

Modern Irish classes have resumed for this term and I am still so very happy to be studying again, and also happy to have no compulsory homework or exams. Highlight of this week's classes: we were discussing plans for the weekend, and the professor gave us the Irish for "watching a hockey game", saying "as a Canadian, it's 'hockey' not 'ice hockey'".

I have both Pimsleur and Babbel apps to work on other languages (primarily French and Czech at the moment), but I'm struggling to make much time to use either of them at the moment, the university ice hockey season is so intense.

Reading: I'm continuing to make my way through the Rick Riordan backlist and enjoying the journey very much.

Saturday, January 31st, 2026 10:39 am


my spring flowers are in full bloom now, and there's more to come still

Saturday, January 31st, 2026 12:56 am
Our choir director, giving us pronunciation notes in rehearsal this week: "We don't want to say 'NIEW-born child,' it's too nasal for our character. NOO-born child. Like, 'ooh, a baby!'"
Me, filters obliterated: "Well, of course, you don't say 'ew, a baby!'"
A: *overhears me, cracks up, can't stop laughing for like the next three minutes*

*

H, upon arrival in Albuquerque: "... why is there snow in New Mexico?!"
Me: "It's a mile above sea level! It's like Denver!"
H: "I thought it was going to be like the Bay Area, or Phoenix."
Me: "I did tell you to bring a jacket."
H: "Isn't like how you always tell me to bring a jacket and I'm usually fine without?"
Me: "Do you wanna build a snowman?"
H: "NO."

*

Weather reports out of Boston are crowing over the second major snowstorm incoming this week, bombogenesis over the Atlantic, and many of my friends there are freaking out about how this is happening on such a similar schedule to Snowpocalypse 2015. Though the current bet is that it'll probably remain out at sea and miss the New England coast for anything but a few more sprinkles.

While I am actually a bit envious of all of the pictures of the deep, freshly-fallen snow people have been posting, I'm also really, really glad that I don't have to shovel snow anymore. That I don't have to penguin-walk everywhere trying not to slip on black ice. That when I bike home at night, my fingers may complain (I was wearing gloves!), but 25 years in New England taught me to layer a wool sweater and a puffer vest. That I'm plucking lemons off the tree from our front porch - in January - and incorporating them into lemon chicken for dinner and wild rice pancakes for breakfast. (Said wild rice pancakes: I took Molly Yeh's recipe and accidentally doubled the wild rice, added cardamom and lemon zest, and grabbed a jar of cloudberry compote for ease of portability/topping; brought them to a breakfast picnic with bike friends this morning instead of our usual coffee because of the general strike.)

In related news, boston dot com posted a list of Boston's top 11 biggest snowstorms by accumulation since they started keeping track, and I was there for most of them, ahahaha.

1. February 17-18, 2003 - 27.6". This was right after Andrew and I had broken up, and I was absolutely blaming the giant snowstorm on him, hahaha. 😁 I lived in an apartment in the Fenway at this point, so thankfully I didn't have to shovel, and aside from having to go to work, mostly got to sit in my apartment and mope dreamily out the window, like the heroine in a romance novel at the nadir.

4. March 31-April 1, 1997 - 25.4". I'd gone to Boston for the weekend with college friends and escaped back to the Pioneer Valley just as the snow started falling. College dorm living sitch, so I didn't have to shovel, but whatever they used to keep the paths vaguely clear smelled like rotting bananas and soy sauce, and this was the kind of thing I got to learn about in my first New England winter, hahaha.

5. Blizzard of 2005 - January 22-24 - 25.4". I'd moved to an apartment in Porter, didn't have to shovel, but we had prime views out our window of people stumbling to the White Hen. I would, however, move into a place with a private patio later that year, which would require me to begin shoveling myself out in order to take the trash out. At least I also began dating a guy who had to shovel himself out, and we could commiserate together!

6. February 8-9, 2013 - 24.9" . Our final winter in Roxbury, where most of our shoveling was stairs, but a loooot of them.
https://www.instagram.com/p/VkNcd8iRrS/?igsh=NTc4MTIwNjQ2YQ==
https://www.instagram.com/p/VkMsdvCRqB/?igsh=NTc4MTIwNjQ2YQ==
https://www.instagram.com/p/VhsUnoCRlF/?igsh=NTc4MTIwNjQ2YQ==

7. January 26-28, 2015 - 24.6".

9. February 7-9, 2015 - 23.1". These last two were part of Snowpocalypse 2015, and if you used one particular entrance to the Minuteman Trail to get to Alewife that winter, THANK ME AND [personal profile] hyounpark FOR SHOVELING, because the snowplow drivers kept dumping all the neighborhood snow in the culdesac at the foot of our street and blocking path access! (As is, we couldn't get our car out of the driveway until like May.) And no, we did not have a snowblower, no place to store one. I had buff-ass biceps that winter. :P

And now the word "shoveling" sounds like technobabble since I've used it so much this post.
Saturday, January 31st, 2026 07:30 am
Music: see post Picture: freas Location: Mood: distressed

Late January through early February is not a good time of year. My mother-in-law died January 20, 1999. My father died a little over two weeks later, on February 5th. In between, we had Challenger, 40 years ago on the 28th (last Wednesday), and Columbia, 23 years ago tomorrow. Meanwhile people are being killed in the US by the Mad King's gang of thugs. So, in order:

  1. The Stuff that Dreams are Made Of -- written for my father, but applies equally well to my late mother-in-law, Shirley Hentzell. I sang it for him a couple of months before he died.
  2. Keep the Dream Alive Written a couple of days after the Space Shuttle Challenger disaster. That was the second Challenger song I wrote; the first was Thrill-Seeker's Waltz. Sorry about that.
  3. Rainbow's Edge written specifically for my father. tl;dr: Dad was highly influential in the field of infrared spectroscopy. See the notes at the end of the lyrics page for more details.
  4. Rocket Rider's Prayer was written in 1986. The line in the fifth verse, beginning "better pray to Hell's own Pluto..." was not intended to be prophetic of what happened to Columbia.
  5. Bruce Springsteen - Streets Of Minneapolis (Official Audio)

Recordings on Bandcamp hopefully in about a week.

Friday, January 30th, 2026 09:06 pm
I walked past the house of 5 lions today, and a slightly scruffy grey and white longhaired cat with a tipped ear was asleep on the cover on the bed of their truck. A sign of spring.

The dog seemed ready to go for a walk to the park today but sadly someone had left slivers of raisin bread at the foot of a street tree and she kept wanting to circle back to them. I couldn't get her to go past or around the temptation, and I couldn't risk letting her eat them; even if they aren't laced with rodenticide, the raisins are bad for dogs. So we came back after several attempts. Poor dog.
Friday, January 30th, 2026 09:12 pm
This week I learned about the Golden Poppy Award! I'd never heard of it before.
The California Independent Booksellers Alliance (CALIBA) presents the 2025 Golden Poppy Awards in recognition of the most distinguished books written and illustrated by creators who have made California their home.

There's tons of categories, I made a direct dash to the Octavia E. Butler Award for science fiction, fantasy, and horror.
I dug into the Intergalactic Mixtape archives to see what reviewers were saying about these books, because this is one of my most favorite nerdy things to do. I had reviews for Automatic Noodle, The Night and the Moth, Notes from a Regicide, and Red City. Alas, I had none for Kill the Beast, which is interesting because it came out in October, after I had expanded my review sources. But! The mixtape is still a baby.

If you like reading multiple opinions of books, this may interest you! Read more... )
Tags:
Friday, January 30th, 2026 09:28 pm
The cold's been decently bad, certainly for us delicate Southern critters.  

The snow is, of course, insulated top and bottom by ice, or maybe it's insulating the ice. I do not know.  It got up over freezing significantly (41 F) yesterday... and hit 31 today, so what little had melted refroze.

But if you want to know just how bad it is in my city?  My mailman has not been by since the storm hit.

That bad.

Hope the rest of y'all are well.  Me, I have power, I have food in the house, and tea.  No worries.
Friday, January 30th, 2026 04:59 pm
Last December was the 11th annual Advent of Code programming event. Each day a new puzzle is released. The puzzle describes what you need to compute, provides an example input and output, and provides participants with a personal input file. After figuring out the answer for your input file, a second part of the puzzle unlocks, generally with a tougher or more involved version of the first part. The big change this year was only 12 days of puzzles, rather than a full 25-day advent. There was also no global leaderboard, because people were expending immense amounts of angst about people using AI to solve puzzles in a few seconds.

In the previous five years I've used AoC to learn a new programming language: Kotlin, Raku, Elixir, Julia, and PostScript. This year, I wasn't getting inspired with a single language I wanted to spend the month learning. I also thought I would be driving across the southwest and might end up programming on my phone at a campsite in the desert, so I started looking at languages I could edit and run in a Linux terminal on my Android phone without a huge install dependency. This led me to the theme of glue languages you might already have on your system. While most of them needed to be installed on my phone, the idea was that glue languages like AWK or jq are designed to be written quickly without too much typing, and don't need a memory-intensive compilation process. I've used a lot of these glue languages before, but I often find myself cargo cult programming and not really understanding the language's conceptual framework. For example, I used AWK for 20 years before I realized it could do something more than "print the Nth column of a space-separated input."

The glue languages theme worked out pretty well. I didn't end up programming on my phone (though I did a little shell exploration on my phone while riding transit), and instead spent the first week solving problems on my Chromebook in the living room of a youth hostel in San Francisco, where "Let's find something hacky that will solve things in an amusing way" was still a good fit. Thanks to funemployment I had plenty of time in October and November to build my standard "runner" infrastructure in several languages I wanted to use, which stretched some of my standing runner design choices. "Read the file, break into a list of lines, and pass the list to part1 and part2 functions" is, er, awkward in AWK, and neither Jsonnet nor jq can measure time.

Languages and Thoughts


AWK: day 5, day 7, day 12
AWK is a simple language for transforming text—particularly multi-field delimited text—frequently used when sed would be too painful. The general structure is "run this block of code when the current line matches this pattern," it automatically converts between strings and numbers, and it's got global variables so you can accumulate results and print them at the end. In recent years I've written some AWK code that's more complex than "print just the second column of ps", so I thought this might not involve as much language learning as I like to do in AoC, but AWK is just so good at what it does that it seemed prudent to build some runner infrastructure so I could whip a quick program out and go to bed. I did end up learning some things about AWK arrays, and I think the day 7 solution is kind of elegant.


dc: day 1 and day 6
dc is a stack-based "desk calculator" from back when people had reverse-Polish HP calculators on their desks. It's one of the oldest Unix programs (predating the C programming language), and writing code for dc feels a bit like writing in assembly. It's got two data types: numbers and strings. 256 memory registers are available, each identified by a single character. The registers are themselves stacks. Operators are one or two characters and spaces are only required to separate number literals, which is reasonable for arithmetic like 1 2 3 4*/+ but challenging to read for something like [la1+sa]sz, which is "store a macro in register z that increments the number in register a." My practice with stack programming in PostScript last year was helpful, but programming in dc is still a bit of a mind twist. Fortunately the f operator prints the stack, so it's easy to try out part of a program and see what effect it has on the stack. Since dc doesn't have a "read from standard input" operator, I used sed to turn my input file into a dc program, with macros declared at the start and a few print operators at the end. After my trip I discovered that dc is still under active development, with GNU dc gaining r and R operators to rotate several items on top of the stack. I'd used these in my program, but the macOS version on my 11-year-old Mac Mini hasn't upgraded yet, so I worked out how to implement top-3 rotation manually: [S1S2S3L2L1L3]sR [S1S2S3L1L3L2]sr.


gvpr: day 8, day 11
gvpr is an "AWK-like" language for processing graphs in Graphviz format. The dot and neato tools are very handy for visualizing your input file in AoC problems that can be represented as a directed or undirected graph. I became aware of gvpr on day 25 when I solved the main part of the problem by staring at a graph, and then wanted code to determine the size of graph subcompoents. The concept of "AWK for graphs" is appealing, but the execution is pretty painful. You know you might be in trouble when half of the time you Google for something about the language one of the top hits is a forum post titled I'm trying to use gvpr. Is that a mistake? with project devs basically saying "yes, it's poorly designed." I felt a weird sensation of writing code that looks at first like it's AWK, but as I got into details, it started to look more like programming in C. Sharp edges included a lack of safe defaults for missing attributes, awkward naming (which end of an edge is the head and which is the tail? the answer may shock you!), functions that don't respect variable scope, and the inability to use the AWK-like matching constructs if you build the graph programmatically rather than piped in as DOT. Oh, and it's kinda slow (or I could only figure out how to write an inefficient version for day 8).


jq: day 3, day 4
jq is a terse language for processing JSON input, in the tradition of tools like sed and awk. I've used jq a lot in recent years—it's great for playing with new APIs or pulling the one piece of data you need from a JSON download—but I still felt like I didn't entirely get it, particularly in correctly working with nested array data. jq is a functional language structured as pipelines, and if there's one thing a functional language loves it's small programming puzzles. On day 3 I got twisted up and spent a bunch of time banging my head on incorrect approaches. Day 4 I'd already solved inefficiently with shell pipelines, so it was a matter of functional translation and then recursive iteration. The language is still a little brain-twisty, but I think I've got the hang of it now.


Jsonnet: day 10
Jsonnet is a different purely functional language for transforming JSON input. It's inspired by an internal configuration language at Google, having removed some features that are widely considered a bad idea. Jsonnet is lazily evaluated and allows for infinite data structures: you can have an infinite array, but if you only ever access a few specific elements it won't try to figure out all the other values. It's written declaratively, and allows prototype-style inheritance: "make an object like that one, but override this property." Contrary to many of my former colleagues, I happen to enjoy the internal config language, and "find an excuse to use Jsonnet for something clever" was one of the reasons I chose to focus on glue languages this year. Part 1 of day 10 seemed like a good fit for Jsonnet's ability to make inferences, but I thought up an overcomplicated approach and kept overflowing either Jsonnet's internal stack or the underlying Go maximum stack size, depending on just how I ended up with excess recursion. I switched to Go (a language that's efficient and good at making coding mistakes obvious) and solved part 1, but then got stuck on part 2 for a couple weeks of trying to re-learn linear algebra. I still wanted to work out a Jsonnet implementation, but didn't want to figure out how to do recursive lazy matrix reduction on immutable objects, so I was pleased to read through an excellent tutorial on a bifurcation approach which reduced the problem search space in ways I was grasping for but couldn't figure out the first time. It still took some careful work to get this to work in Jsonnet, including discovering the undocumented tailstrict keyword and figuring out how to structure a tail recursive function with lazy evaluation and multiple if clauses. I fortunately chose to implement this on my Mac which had the Go Jsonnet implementation rather than the original C++ one on Debian-derived Linux. The Go interpreter finishes in a tedious minute and a half but the C++ interpreter gets completely stuck, as far as I can tell. (One downside of a lazy functional language is that the "print a debug message" function only outputs after the recursive function it wraps finishes, so "where is my program getting stuck" is tough to figure out.


Lua: day 10
Lua is a small language designed to be embedded in other programs that need an interpreter for user-written code. After two weeks of day 10 and linear algebra as my white whale, I finally got my Go implementation working. The code was full of failed attempts and half-commented-out functions, so I decided to transcribe the working solution to Lua and clean up the original Go later. I'm really glad I didn't try to do the whole month in Lua: it's got just enough to be a real language, but not enough to be very productive. Lua's only compound data type is the "table," an array that can have strings or numbers as keys. I've used languages like this before—PHP arrays are also "indexed arrays or hash maps" and JavaScript arrays are technically objects with indices as string property names—but this gets extra awkward in Lua. Integer indices are treated specially, so if you want to use it as a sparse hash map with numeric keys, you might not get all your data back when iterating. Object orientation is available, but if you want to use an object as a table key you need to go back and forth with string conversion, which gets slow. The standard library has a few useful string functions, but misses a lot of really handy utilities that you'd find in a language like Perl, Python, or Ruby. If "write your vimrc and plugins in Lua" is the compelling reason to switch to Neovim, I'll stick with Vimscript.


Perl
Perhaps the pinnacle of glue languages, Perl was the first programming language I ever got comfortable with. In high school and college I really enjoyed writing Perl code, and the quirky community around the language. In the last two decades I don't think I've edited a Perl file, but I've used it for plenty of one-liner scripts at the command line. I wrote a runner script for Advent of Code in Perl, but didn't end up using it this year. I was struck with how clunky some things felt. A simple Perl script is really slick at doing something for each line of all input files, but treating each argument as an independent list of lines—and reading stdin if no files were specified—was surprisingly verbose. Needing to explicitly use a reference (pointer) to pass a list as an argument (rather than having an operator to explicitly splat a list into multiple arguments) also felt awkward coming from any other programming language.


Ruby: day 12
Ruby was clearly inspired by Perl, but brings a strong object-oriented philosophy and borrows heavily from the functional programming community. This is a questionable inclusion as a "glue language," and many companies run multi-million user websites with just Ruby. But like other glue languages it's got functions to simplify common tasks, easy string processing, and a quick iterative development cycle. I wrote a bunch of Ruby a decade ago as part of a replacement for a Burning Man system, but then abandoned that effort. I had Ruby in my toolkit in case I encountered something that was going to be complicated, and when I read day 12's space packing puzzle while still exhausted from day 10, I decided I needed a language with a full suite of composite data types. The puzzle has a trick that I found distasteful: the example input is really hard, but if you add the right check the actual input is easy. I spent a long time trying to come up with potential optimizations and shortcuts for what I recognized was an NP-complete problem, but the code always seemed to run for an unreasonably long time on the example input. Once I realized the input trick (some lines were getting processed a lot faster than others), I got grumpy and posted a couple cheeky implementations in other glue languages. A couple weeks later I came back to the problem, since I had been enjoying trying to optimize the placement of puzzle pieces on a grid, and the ASCII art output was fun to look at. After some time learning to use the Ruby profiler, I ended up with a solution that only takes about 3 minutes on the example input, though it does leave out one axis of permutations that could in theory find a solution. Coming back to Ruby a decade later, I still like the language. It's got a few sharp edges, but I think it's still a good language to have in your toolkit. The irb interactive environment has also gotten really nice, providing syntax highlighting and autocomplete despite Ruby's very-dynamically-typed nature.


SQL (spatial): day 9
SQL is the world's most popular database query language, and there are several folks who use it to solve all AoC problems, though sometimes things get pretty awkward. The last couple years at work I spent a bunch of time working with spherical geometry, and got to know the ST_ (spatio-temporal) functions of the Simple Features standard. Google's SQL dialect and systems support these, and I even wrote a SQL function to compute the angle of the sun at the start of each GPS track in our dataset. I hadn't played with other spatial databases, though, so I bent my "you might already have installed" theme and my "standard library only" rule a bit and installed PostGIS for PostgreSQL and SpatiaLite for SQLite. When you've got a geometry library at hand, this puzzle is quite simple :-) Runtime is kinda slow, since it's doing a cross join of every point in the input. It's also important to remember that the "S" in "SQL" stands for "Structured" and not "Standard", so I had to write the query twice: SpatiaLite doesn't consistently follow SFS naming. My first attempt at day 9 was a fun use of ImageMagick a glue tool for image processing, but creating a 100,000 pixel square image (10 gigapixels) and taking slices of it was not a task my old Mac Mini was up to. I also tried using rsvg-convert in the hope that staying in vector space for image slicing would work, but it seemed to be rasterizing as well.


Z shell: day 2, day 4, day 6, day 12, and runner infrastructure for niche languages
I've been using zsh as my login shell for more than a quarter century, but I still need to look at the man page whenever I need to do something more complex than a foreach loop. Day 2 was solved entirely with zsh builtins. Day 4 launched a pipeline of 6 commands within a loop, using head | tail | cut | tr | xargs printf to extract 3x3 sections of a grid. This took 45 seconds to run on part 1 (and 12 minutes on Android: forking a process is expensive, kids!), so I switched to jq for part 2. Day 6 used a grep | cut | pr | sed pipeline, but the loop didn't have as many iterations, so it wasn't untolerably slow. The use of dc in day 6 was just so I could be cute and not do arithmetic in the shell.


Go: day 10
This definitely doesn't count as a "glue language that might already be on your system," but it's my fallback for puzzles where I get stuck or my approach is too slow in an interpreted language. Day 10's second part requires finding the minimum number of steps to reach a goal in a rather large possible search space. I experimented with a lot of approaches to reducing the search space, and took advantage of Go's treatment of fixed-size arrays as value types to optimize performance as much as I could. Most of my approaches were some variant of "keep a priority queue of states to explore," and memory use would often grow to tens of gigabytes. Some of the lines in the input could reach a solution pretty quickly, and other lines were amenable to different approaches to space exploration. I kept a cheat map of the answer for lines I'd previously found, which let me run my program for several hours on lines I hadn't yet solved, then stop when it hit a troublesome line and try a different approach without spending hours redoing old work. Running for days is a clear sign that I didn't have the right solution, but "find a solution and then optimize" is usually a good strategy. In the end I only had half a dozen unsolved lines out of 191, but those didn't seem amenable at all to any form of state-space exploration. In the solutions thread for another day, I saw a tangential reference to day 10 as a system of equations and said "Of course!" I'm not very good at recognizing linear algebra problems, and very shaky at writing code to solve them. One challenge for linear programming in Advent of Code is that everything is an integer (and in this problem, no negative numbers), while most matrix solvers assume real numbers. Over the course of a couple days I re-read my linear algebra textbook and Wikipedia pages about Gaussian elimination. I adapted it to an integers-only system of linear equations implementation, but still got hung up on some of the inputs because the scalar factor between two rows would result in non-integer values somewhere. Through more Internet research I learned that integer linear programming (rather than the more general linear programming) is what I was doing, and wound up writing code to compute the Hermite normal form, though I then realized that making full use of the HNF matrix would get complicated. I also tried Octave and Scilab (two open-source Matlab-like languages) which count as more "glue-like." Octave refused to do matrix solving on integer-typed data. I found a library for Hermite computation for Scilab but decided that path was getting too complicated and went back to writing Go code. Eventually I realized that I could produce a triangular matrix by just repeatedly subtracting rows with a value in the column; eventually it'll end up with 1-1=0 to eliminate a cell. This finally got an answer to the whole input with just a few minutes of runtime, and later profiling and tweaking got it to the 2-digit seconds range after realizing I could swap column positions and reduce the number of free variables. I definitely spent way too much time on this bugbear of a problem, but it at least it was educational, and I'm funemployed with lots of time.


Languages I wanted to try
I've encountered a few glue languages that looked pretty interesting, but I didn't get a chance to try them out. dt is billed as "duct tape for your Unix pipes," clearly a glue language. I'd encountered it last year when researching stack-based languages; unfortunately the Nix packaging system wouldn't compile on my old Mac, so I gave up on the install. Clearly it's not yet at the "might already be on your system" level. I've seen someone (turns out to be the language's maintainer) in the r/adventofcode subreddit solving all problems with the m4 macro language, which I've mostly encountered as "the language used to generate your Sendmail config file." I spent some time reading an m4 language guide, and learned that doing math is complicated. I considered setting up in case there was a good text-transformation puzzle, but seeing that even loop constructs need a library I decided to save that bit of brain-bending for a future date. I also wanted to try Noulith, a language that wasn't actually written for the purpose of Advent of Code, but just as well could have been. I spent some time reading the docs while traveling, but didn't have time to get the interpreter set up to try it out. Maybe I'll give it a shot in 2026.
Friday, January 30th, 2026 10:26 pm
There's been a bit of a fuss today about the unveiling of a third Edinburgh tram line route. And my thoughts about it aren't simple enough to stick into a link title, so I thought I'd ramble a little.

Firstly, it seems to me that this is not a council announcement of anything. The map is plastered with the repeated word "concept". It contains both Picardy Place and York Place (Picardy Place was created when York Place was removed, when the tram extension was carried out in 2023). I've seen discussions that it's based on an old version of the existing routes taken from Wikipedia.

The source is a Scotsman article, rather than a council publication. And even then the coverage is mostly taken from a speech given at the Rail in Scotland conference - where the council's transport convener said he "was excited at taking a closer look" - but it's not the main priority. Certainly there's nothing on the council's news page mentioning it.

So I'm not convinced that this is more than a "Here's an interesting possibility"

Secondly, I'm not convinced it's viable financially. Which isn't to say that trams, in general, can't be worthwhile. If Edinburgh hadn't badly botched the construction of the first tram line then it would be well in profit now. But that tram line runs from one of the most densely populated parts of the city (Leith Walk) to one of the business hubs (Gyle and Gogar), through some of the most touristy stretches (Princes Street).

Much though I love the idea of a tram that literally stops in my road and goes to both the airport and Portobello, nearly the whole route is low-density. The bus route that is closest to it is the 38, which is so low-use outside of rush hour that it's a single-decker that has to be subsidised.

Admittedly, it's cheaper to build than a new tram line, as it's mostly a question of re-using the old train line. But I'd like to see a concrete business case for it, that checked that the number of potential users would support running tram-trains along that route.