The Books of 2023

I haven’t read that many books in 2023… what you see in this lil’ bookcase are all of them. (I empty it out every year and then watch it fill up slowly…) I guess there’s about *guesstimates* 60-ish? I guess it’s been more of a comics year than a book year.

Below is a list of the ones I found er either interesting or annoying, I guess? At least I found them memorable.

Oh, and I’ll snap pics of the first three pages, because that’s how I determine whether to read a book or not: I start reading and see whether it seems OK. (I never read the back cover because what’s the point of reading an ad anyway?)

The Last Days of California by Mary Miller.

I read a short story by Miller in the Paris Review, and it was awesome. So I got this novel, and it wasn’t. I guess I found the subject matter slightly boring (an evangelical family making a trip to California before the world ends), but it was just kinda meandering… Not in an unpleasant way — I rather liked the book — but I was underwhelmed.

Red, White & Royal Blue by Casey McQuiston.

I saw the movie, and it was so much fun. So I got the novel, and it’s … tedious? Yeah, tedious. I mean, I guess McQuiston can string sentences together, but that’s about it. It goes on and on and on and I got fed up with it toute de suite.

Hawkmoon by Michael Moorcock

I bought a bunch of fantasy books recommended by China Mieville, and this was one of them. It’s horrible! Just the worst. Perhaps Mieville read it when he was 10 or something? This book collects several novels, but I bailed after the first.

I Am Homeless If This Is Not My Home by Lorrie Moore

I absolutely love Moore’s short stories (I mean — absolutely), but her novels are slightly more… uhm… I dunno. Not as awesome? I mean, she’s so brilliant at writing on a word for word basis (always inventive, always witty) that it almost doesn’t matter? I’ll always buy her books.

The Grip of Film by Gordy Lasure by Richard Ayoade

I’ve been on an Ayoade (and related) binge the past few years — I’ve read all his books and seen his movies and watched the TV series he’s contributed to (like the Garth Marenghi series). He’s a smart cookie, and he can be very funny, but this book — which is a parody of a “book on film”, “written” by somebody who only likes 80s action movies — was a slog. I think I bailed about halfway through.

Iron Council by China Miéville

Hm… am I picking mostly books I wasn’t that impressed with for this blog post? I guess I don’t have anything to say at all about most books, but if they annoy me, I remember them better? Anyway, Miéville has written some good book (Perdito Street Station and The City and The City, for instance), but this was a pointless slog: They build a railway line for half the book, and then they return for the other half of the book.

The Book that Wouldn’t Burn by Mark Lawrence

This is hugely entertaining. It’s much harder to find well-written fantasy books than just about anything else, and this is well-written and exciting. So I got some other Lawrence books as e-books after reading this (the Red Sisters trilogy), and you get the feeling that Lawrence’s main motivation for writing those books was to write endless scenes of torture. So… I don’t think I’ll be reading any further Lawrence books than the ones in this series, because that shit’s just tedious.

Clockwork Boys by T. Kingfisher

This is a series that I see recommended All The Time on the Intertubes — is Kingfisher some kind of internet celebrity or something? Anyway, it’s awful — badly written, badly printed, stupid and boring.

Garth Marenghi’s Terrortome by Garth Marenghi

This is part of my Ayoade binge, but I guess he’s not involved with this one? It’s pretty funny, but goes on a bit too long.

The Book of Dust v1 and v2 by Philip Pullman

I quite enjoyed the His Dark Materials series, and these new ones set in the same universe are quite entertaining. They’re not flawless, though — the plot in one of the books is creepy to the max (and it’s not meant to be, I think). But still, very entertaining.

Answered Prayers by Truman Capote

My god, Capote’s tone could be really grating, couldn’t it? Reading this is like being at a gossipy party where somebody keeps gossiping at you about people you don’t know, don’t care about, and that don’t seem that interesting.

Remain Silent and Persons Unknown by Susie Steiner

When I’m hung over, I read mysteries, and finding well-written mysteries is almost as difficult as finding well-written fantasy books. But these are quite good.

Tsalmoth by Steven Brust

I love the entire Vlad Taltos series, and this was another banger.

Crosstalk by Connie Willis

Willis has one simple trick when plotting: People run around a lot and can’t find each other. That’s it. That’s what 85% of her books are about: People who can’t find each other. The rest is mostly people who don’t tell each other what they need to know, so that there’ll be more running around. This book was obviously written after Willis was stung by the critique of her previous novels: People have cell phones now. There’s no need to run around and not find each other. So she’s finally introduced cell phones, but it turns out that people forget to charge them and stuff, so she still has them running around and not finding each other.

The Last Supper by Rachel Cusk

The Outline novel was amazing, so I’ve been picking up her older books, and they’re mostly really interesting, too. This one is a travelogue about being in Italy, and Cusk’s writing is witty and thought provoking.

The Trees and Dr. No by Percival Everett

I read Erasure the other year, and I thought it was pretty amazing. The Trees is pretty good, but Dr. No is… er… OK, it starts out swell — it’s about a professor who specialises in nothing. That is, the physical concept of nothing. So we get lots of jokes about people misunderstanding him when he talks about nothing, and then there’s an evil billionaire and things are going swimmingly. Then it seems like he loses interest about half way through, and just starts piling on the silliness in the hopes that the novel will resolve itself, but instead it just kinda gets boring. Because silliness is a tough thing in a novel: Too much, and you lose faith in the novel.

(And I’m starting to think that Everett is a bit of a dick.)

Happy Trails to You by Julie Hecht

I think I’ve read all of Hecht’s fiction now, and I love it all. And this short story collection (which mostly feature the same character as from her other two books) is wonderful. And there’s an added bonus with Hecht’s books: You can read the Goodreads reviews and find several people horrified that somebody would write about these characters that they can’t identify with at all. Hilarious! Like this one:

The characters are completely foreign to me. More than halfway through the book I could not find a single aspect of either main character that I could relate to. Moreso, these characters just made me sad. Their idiosyncrasies are impenetrable, unrelenting, and just plain weird.

Beyond the Reach of Earth by Ken MacLeod

MacLeod continues his new space opera, and it’s great. So exciting.

Season of Skulls and Quantum of Nightmares by Charles Stross

And I guess the same can be said of Stross’ new books, too — they’re really entertaining. But perhaps not as exciting as they used to be.

Er… is that it? I guess it is.

Well, the ones I had something to say about, even if it was just a couple of sentences…

But there you go:

Bookcase emptied for a new, fresh year. And perhaps I should read more good books this year…

On Caching

Have you ever thought about caching? I mean, for web pages?

This isn’t going to be a rant, and there’s certainly not going to be a “call to action” here, but this is just something I’ve been going “*sigh*” about for decades, and I thought perhaps it might be time to ruminate a bit. Don’t feel obligated to read this! If this is an area you work in, you already know all this, and if you don’t, it’s not going to be of interest.

OK?

OK.

Since the beginning of time (i.e., the mid 90s) web browsers have been caching data to make web page rendering faster. (And in those days, to keep your modem bill down, I guess.) Caching is a good idea, but it makes development slightly more complex.

Let’s take an example web page, index.html, from my web site Mrs. Kwakk Wakk, purveyor of purported particulars to prince & proletarian:

<html>
  <head>
    <meta charset='utf-8'>
    <link rel='stylesheet' type='text/css' href='kwakk.css'>
    <script type='text/javascript' src='kwakk.js'></script>
    <link rel="shortcut icon" type="image/png" href="favicon.png">
  </head>
  ...

After loading this page, your browser (and any caches in between, like Cloudflare) will cache the kwakk.css and kwakk.js files. If I do any changes to these files, a normal reload of the site won’t reload them — you’ll still be using the old versions of these files. Some browsers have a “hard reload” function (in Firefox, it’s Shift-Control-R), but some don’t (mostly mobile phone browsers). And if you have Cloudflare in front of the site, that won’t help: I’d have to empty the Cloudflare cache before you’d see any changes.

“*gasp*”, I’m guessing you’re saying ironically now. “How does the web even survive with those shortcomings!”; laying it on really quick, aren’t you.

Well, things fix themselves after a while — these resources are usually only cached for a couple of hours, so “eh, whatevs” is the approach taken by most people who make simple web pages.

People who make “real” sites don’t have these problems, because they have a build step somewhere in their deployment scripts: They probably have a Javascript minifier, and they generate the CSS from whatever, and the HTML (if it’s even a static file) is generated from something else again, and the build script takes care to name each resource with a unique name, so that you get all the resources at the same time. This is why if you look at a major site, you’ll find that it loads Javascript files called things like u8bp0J-3GNE.js

But! I still stumble upon web shops here and there where I go “well, that looks odd”, and then I hit Shift-Control-R and everything magically looks better. Admittedly, a lot less often than I used to in the olden days (a lot!), but it happens, and then you know that they don’t have a deployment script that takes care of these things.

And this stuff is confusing to people who are just tinkering with their own little sites, and it makes for a frustrating development situation. I’ve seen people actually do things like this manually:

<link rel='stylesheet' href='kwakk.css?ver=1034'>

That is, they bump a number in their HTML files when they push a new version. That’s a miserable thing to have to do, and it’s error-prone, and it makes your VC history sad.

So what most people end up with (except for the majority that just ignore the thing, thinking “well, I don’t update my hobby site that often anyway”), is some sort of deployment script that does this automatically. For instance, just a simple sed script that replaces ?ver= with a timestamp or something. And that’s OK, except for Cloudflare not wanting to cache URLs that have query parameters (at least not on the free plan), so you have to put the versioning string somewhere else, but if you put it somewhere else, you have to keep changing the file name, or… you have to do some URL rewriting on your web site.

As an example, the kwakk.info site has:

<link href='/res/0/kwakk.css' rel='stylesheet'>

See that /res/0/? It’s rewritten by the deployment script to have a timestamp, and then I have an .htaccess file that says:

RewriteEngine On
# Versioned versions of JSON/JS/CSS.
RewriteRule res/([0-9]+)/([^.]+[.](json|js|css)) /$2 [L]

Now Cloudflare caches the files properly, and users get the proper versions of all the resource files.

So why am I writing this blog post anyway? This caching behaviour has been a problem for almost three decades, and nobody has come up with anything better than to make each individual web tinkerer come up with their own hacked-up solution. Would it be possible to come up with something that would just, like, work?

Probably not. But here’s a thought I had while trying to fall asleep the other day — what if the web server and the browser could cooperate a bit more?

OK, back to the original HTML:

<html>
  <head>
    <meta charset='utf-8'>
    <link rel='stylesheet' type='text/css' href='kwakk.css'>
    <script type='text/javascript' src='kwakk.js'></script>
    <link rel="shortcut icon" type="image/png" href="favicon.png">
  </head>
  ...

Now, the web server could parse this HTML and check the timestamp of the included files. I mean, I say “could” in a kinda hand-wavy way — there are problems if the HTML is generated on-the-fly: The server would then have to do some caching before parsing, and… But if it’s an actual file, then certainly convenient, efficient parsers exist, so…

Anyway, my sleepy-time idea would then be to output the information as a series of HTTP response headers. Perhaps something like:

Resource-Last-Modified: kwakk.css;Sat, 16 Dec 2023 17:58:38 GMT
Resource-Last-Modified: kwakk.js;Sat, 16 Dec 2023 12:52:45 GMT

Or whatever. And then the browser (and Cloudflare) could use this information to decide whether to reload the resource or not? And for other resources that may be loaded later dynamically, you could declare them like:

<meta rel="resource" "menu.svg">

And they’d get the same treatment…

I dunno. There’s probably a reason somebody hasn’t developed something like during the previous 30 years. I’m just typing this here so I don’t start thinking about it again the next time I go to bed.

And like I said, it’s a problem only for those people who like to tinker with their personal sites: People that have a build step somewhere (writing their entire site in Typescript with Tailwind, for instance) don’t have these issues that much. (Although I saw a newspaper site with an image of odd proportions the other week, due to somebody cropping an image after it was published or something… (Which reminds me of a thing I was thinking back in the 90s — why don’t web servers include the sizes of included images automatically somehow, and that could basically use the same mechanism as the one I sketched out here — but it would be more resource intensive. But just imagine: No more web pages where everything moves around after the browser loaded the images! (Yes, yes, I know about height and width in image tags, but that’s apparently still too hard for about half the web sites out there to include…)))

All computer stuff consists of cobbled together things, and things still somehow kinda work.

But in annoying ways.

Anyway. There you go.

So here’s a GIF of a cat.

Sony’s Passion is App Development

So — I use an Android phone for most stuff, but I use an Iphone Max for Duolingoing (because of reasons), and I was wondering whether I could listen to music from my Android phone as the same time that I was listening to the French-ey voices from the Doulingo app on the Iphone. There’s something in Bluetooth called “multipoint”, but it wasn’t clear whether that would give me what I wanted, but in any case, I’d have to install the Sony Headphone Connect app to enable it on my WH-1000XM5 headphones.

Gadget makers are notoriously bad at programming, so I wasn’t expecting this to be pleasant, but… oh lard.

I have indeed read the above (it was just a couple of sentences, after all), so I agree and “Start”.

I’m not reading all that. I’m happy for you though. Or sorry that happened. But I “Next”

“Disagree and proceed.”

Hey, didn’t I just disagree? OK, disagree with this second thing…

WTF?!? Another one?! Are these the same or different? I DISAGREE! START USING!

OK, I guess that’s fine.

No that’s not fucking fine! Notifications from this app? ICON BADGES? “Don’t allow”

Why not GET THE FUCK OUT

OK, now I’m “registered”… I hit “OK”

What?! Argh. “Later”

Er ok, I have nothing to restore?

Er, ok, “next”.

“LATER”

YES! LAST STEP! “NEXT”.

“LATERS!!!!”

AAARGH. And er… Cancel or OK? “OK”

YES!! Complete! Just a few steps after the final step!

And that’s a pretty minimal screen, but nothing’s happening. I wait a while, but nothing. So I exit the app and start again. Surely now I’ll be able to twiddle the setting.

Er… this apparently took so long time that it lost connection to the headphones.

And now… it wants to run me through the setup again!? NOOO

*phew* It’s not the same setup; it’s something else… So “LATER”

WHAT?! Complete!?!

Oh, except for this very informative grey box of information. I did wait for a while, but nothing happened. “Close”

OOOH! I have a menu.

YES! There’s the “Connect to 2 devices simultaneously” button I wanted to enable.

This is surely the best app you could conceive of to allow you to change the settings on your Sony WH-1000XM5 headphones.

And, no, it doesn’t actually seem to help with my use case. “Multipoint” seems to deal with having two phones connected to the headphones at the same time, so that you can switch between different sources rapidly. But it doesn’t actually allow playing audio from two sources at the same time? I just want some background music while Duolinging…

I’m not at all sure — this apparently is a totally unheard of use case or something, but perhaps there’s a way anyway? I don’t know.

There you go. Sony wasted my time, and now I wasted your time.

Paying it forward like a champ. I’m pretty sure that’s what it means.

(But to be serious for a second, I do realise that the app isn’t as horrible as it is just because it’s made by programmers who couldn’t program their way out of a moist paper towel. (Although that’s true, too.) All the “data usage” stuff they want people to agree with is so that they can sell the data about what you’re playing to whichever bottom-feeding ad agency bids the most — not so much that when you’re listening to Talking Heads that you get ads for really big suits, but so that when you’re listening to a Joe Rogan podcast, they’ll know to spray you with Ivermectin commercials on all platforms. And all the pointless “features” they want you to enable are presented as a gauntlet like this because they’ve found that when they let people enable them “by hand”, people don’t, and whichever VP in charge of whatever feature has a bonus that depends on metrics that say how “useful” that feature is. So you’ve gotta brow-beat people into enabling this stuff — somebody’s pay depends on it!

If you were really suspicious, you could suspect Sony of leaving the multipoint stuff disabled by default just so that people have to install the app — there aren’t any downsides to enabling it by default, after all: It just allows people to switch between connected devices faster.

Some people at Sony want this app to look like it does, and are rewarded for it, and they will have metrics to show how successful it is. But you have to ask — how many people go through this shit show and go “fuck this! Next time I’ll buy headphones from Apple: they just work”. But there’s no easy metrics for that tied to this app, is there? So it is what it is. At least it’s easy enough to uninstall the app after switching multipoint on.)