Stunning day for bocce today. Finally nice to get some autumnal weather. Tournament ended with a draw, so no definitive winner for the 2024 season.

Ugh! I’ll use WhatsApp if I must because of network effects (i.e. my friends are there) but let me state for the record that I do not like it, nor the company that owns it. Wonder if I could persuade my friends to move to something else. The network runs deep so it might be a tough sell.
I kinda wish I had a nice “bespoke” keyboard. The Microsoft Sculpt I’m using is fine, and it keeps my RSI at bay. But it’s uninteresting. Seeing — and more importantly, hearing — the keyboard others are using at work, it would be nice to have something new.
Although, I guess I could get something for work to replace the Apple Magic keyboard I tollerate.
Pitch for the first act of a romance movie: a barista expresses their love for a customer via latte art. Maybe the customer’s sitting there, wishing for love, maybe with a friend. Then they get their drinks and the friend notices that there’s an awful lot of hearts there. The rest writes itself. ☕️
Ugh, using IMDB for anything is just awful. Would love to give Callsheet a try, if only I didn’t have an Android phone.
One of the tools I built for work is starting to get more users, so I probably should remove UCL and replace it with a “real” command language. That’s the risk of building something for yourself: if it’s useful, others will want to use it.
I will miss using UCL, if I do have to remove it. Integrating another command language like TCL or Lisp is not easy, mainly because it’s difficult to map my domain to what the language supports. Other languages, like Lua or Python, map more nicely, but they’re awful to use as a command language. Sure, they may have REPLs, but dealing with the syntax is not fun when you’re just trying to get something done. That’s why I built UCL: to be useable in a REPL, yet rich enough to operate over structured data in a not-crappy way (it may not be glamorous, but it should be doing), while easy to integrate within a Go application.
Of course, if I want to continue to use it, it needs some effort put into it, such as documentation. So which one do I want more?
This week’s earworm: Yooka-Laylee and the Impossible Lair (Original Game Soundtrack). Might be all the Godot stuff I’m doing at the moment. 🎵

I’d be curious to know why Microsoft renamed Azure Active Directory to “Entra.” That name is… not good.
Still wondering this.
🔗 U.S. could lose democracy status, says global watchdog
Seems to me like this week was a pivotal time for the US, when Trump started ignoring a court order to stop a deportation. Most pleases I follow seem to suggest that this was the final guardrail. With this falling, I’m now hearing people (i.e. podcasters) say that US is no longer a democracy. So that’s all it takes?
🔗 Enshittification as a matter of taste
It’s starting to look like taste is increasingly going to be important in this brave new world of slop and Enshittification.
Via: Manton Reece
Wow, do not use Confluence for anything you’ll need to export as PDF. The export cannot layout tables — it does things like slap the header in the middle of one page and the first row on the next — and the right margin is too far in that it crops the prose. Looks sloppy and unprofessional.
Can definitely recommend Aseprite for making simple pixel artwork. I’m using it now for making some sprites for my Godot game I’m working on. Reminds me of the time I used MS Paint for this during the 90’s era, back when it was closer to this than what it is now.

🔗 Make stuff, on your own, first
First. I don’t believe you create anything truly good with AI without first deeply your practicing craft in its absence. You have to hone your skills by making things without automation in order to perceive and understand what is truly good in your art. Otherwise the tools of automation will own you.
This point might be about ability, but I think it also applies to developing taste. You may get working code from an LLM, but do you know if it’s any good? Is it maintainable? If the shit were to hit the proverbial fan, would you be able to go on to fix it?
I know from my sessions playing with these things, the answer is usually not great. But being someone who’s been in the coding gig for 17 years, I know good code when I see it (or at least I like to think I do). But it took slogging through so much of it to develop that eye.
Via: Jim Nielsen’s Notes
The good news is that great writing is already all over the web. It’s just overwhelmed by all this platform-siloed, revenue-focused, engagement bullshit. It’s hidden among the sea of SEO-laden posts that flood the web. It’s bottled up on Medium or Substack, and other platforms that promise the exposure of social media.
It’s such a crime seeing great writing on platforms such as Medium or Substack. Yes, I know, I know: you’ve gotta make a living. But please, can it be on your own platform? Ghost is right there.
Via: rscottjones
Don't Be Afraid Of Types
Types in coding projects are good. Don’t be afraid to create them when you need to.
Another pro-tip for anyone writing in Go: multiple return values is nice but don’t over do it. Functions returning values that are related to each other are fine: think functions doing vector maths in 3-dimensions. Up to three values being returned along with an error, also fine (although I’d argue three is starting to push it). Anything else, consider returning a struct type.
Pro-tip: merge any changes to gRPC schemas only when you’ve got approvals to merge the implementation. Then merge both PRs at one time. Otherwise, you’ll have gRPC schemas that declare services that are not implemented. This is bad enough for clients but it’s worse for anyone working on the service.
A bit more Godot work this evening. I wanted to add a foreground layer of tiles that obscured in the player. This is for making false walls to hide secrets around the level. It took me a while to work out how to turn off collision of this foreground layer: there wasn’t really any way to do so within the designer.
Fortunately, this Github comment showing how to do so using a script worked like a charm:
extends TileMap
const foreground_layer = 1
func _use_tile_data_runtime_update(layer: int, coords: Vector2i) -> bool:
return layer == foreground_layer
func _tile_data_runtime_update(layer: int, coords: Vector2i, tile_data: TileData) -> void:
tile_data.set_collision_polygons_count(0, 0)
Only limitation seems to be that it will disable collision for the whole layer, but that’s perfectly fine with me.
There was a couple of things that happened here. The first is just simply, in 2013, I did not understand that the things I said had meaning. […] I saw myself at the time as just Steve, some random guy. If I say something on the internet, it’s like I’m talking to a friend in real life, my words are just random words and I’m human and whatever. It is what it is.
But at that time in my life, that wasn’t actually the case. I was on the Rails team, I was speaking at conferences, and people were reading my blog and tweets. I was an “influencer,” for better or worse. But I hadn’t really internalized that change in my life yet. And so I didn’t really understand that if I criticized something, it was something thousands of people would see. To me, I’m just Steve.
Via: Simon Willison