Looks like I’ve already written more posts this year than I have last year — 846 vs 843 — and there’s still two and a bit more months left. Not that this is a goal, but I’m wondering if I’ll hit 1,000 posts just in this year.

I’m a little surprised I haven’t seen this sooner. Paper-looking sign with dynamic information on it? I think this is an eInk display. If so, it’s the first time I’ve seen it used this way.

Auto-generated description: A bus stop display screen shows the arrival time for bus route 510 to Essendon, which is 9 minutes away.

Devlog: Godot Game - More On Level 3-1

Continuing the build out of the zone 3 in level 3-1. I’ll start with a platform that is self rising when the player jumps on it. Always a classic; and honestly, I think the start of the level can use that. Lift does feel a little slow. I boosted the speed from 70 to 90. Also started added floating balloons with mines around this part of the level, since those elements were introduced in zone 2.

Hmm, I wonder if I should make a variant of the red balloon with mine. The mines will kill you, but the player can safely land on the top of the red balloon. I’m wondering if a variant that is unsafe for the player could be useful. Maybe a “spiky balloon” type. It can be attached to the grey mine I made for level 2-2.

Alternatively, I can make it a different colour and just...

Interesting that given a bag containing both a laptop and a 1 litre water bottle, it’s the water bottle, not the laptop, that determines whether the bag is heavy or not (based on how much water it contains).

Devlog: Godot Game - The Back Third of Level 3-1

Working on Blogging Tool was a nice little break but I’m back on my Godot game. I’m trying to get the layout of level 3-1 finished. I’m actually not very happy with the back 60% of this. For you see, world 3 is meant to be a mountainous world, with more pits and more vertical levels. Much of this is to be seen in 3-2, with 3-1 being merely the foothills of the range the player is expected to climb. And part of this is that this level was originally the second one, but some players I shared this with said the difficulty curve ramped up a little too much. So I’ve moved it in world 3. making it the 5th level of the game.

So the first part of the level sort of double backs on itself as the player is to negotiate some pretty careful jumping with moving platforms...

Now that PTV and VicRoads are being merged into a single department, new signage with the Transport Victoria logo is starting to appear. Can’t say I’m loving it right now, but it took a while for me to like the PTV logo, and now I’ll be sad to see it go (if it does go).

A blue sign indicates directions to Flinders Street Station, Yarra River, and platforms, with the Transport Victoria logo

Speaking of logos for government agencies, it looks like the State Electricity Service is coming back in some capacity, complete with its original logo. I haven’t seen the SES logo since the ’90s.

It’s so easy to remember the times you wish you did something, verses doing something that turned out right. Such is the human condition, I suppose. Well, this is one of those times I wish I did something. Should’ve listened to my instincts at the time. And now I have to fix it. 🤦‍♂️
Quick tip for anyone using TLDraw: if you want to export part of a diagram rather than the whole page, select the objects you want to export, then in the menu select “Edit → Export as → PNG (or whatever)”. Useful for those that are keeping multiple diagrams on a single page.

Devlog: Blogging Tools - Podcast Clip Favourites

Back on Blogging Tools. Gave up on trying to set a remote ref: all the ones I’ve tried were not working. Looking at the examples it looks like I can call Push with defaults (apart from authentication which looks like I’ll require with my repo). Gave it a try and that looks like it worked. I peeked in the source code and the default ref that work was the following:

DefaultPushRefSpec = "refs/heads/*:refs/heads/*"

Turns out by adding refs/remote/origin/… I was using the default pull ref. I suppose I should learn more about how Git works in this respect. But later, it’s working now. That’s all I need. Finishing off the Blogging Tool side of things by moving all the hard coded values to the config, and I think this is ready to go.

Turning to the Hugo site. I’ve started a new site from scratch,...

Devlog: Blogging Tools - Podcast Clip Favourites

Inspired by the way Ron Jeffries writes about his work, as well as by Martin Hähnel attempt at this, I thought for this instalment of Devlog I’ll try a more “lab notes” approach. This means a potentially more mundane and less satisfactory description of project work today: less showing of what was accomplished, and more of a running commentary. I wanted to see if I liked this style of writing, and if it helped me or slowed me down. Preliminary results were mixed: it did slow me down, but I found it enjoyable. I’ll try this a few more times to see how I feel about it.

Today’s coding session is to continue the work of adding saved favourite podcast clips from Blogging Tools. Previously this was a standalone application connected to a database, but along with the tech stack used to build this falling out of active support,...

Well that’s one way to get people to stop using AI: release an US-only, iPhone-only app that becomes all the rage; then when the dust settles, release it world wide and on Android. By that time people (i.e. me) would’ve completely forgotten about it. It happened to Sora 1. 😏

Thinking more about the writing of Ron Jeffries, I’m left to wonder: how does he do this? I’ve only tried doing something similar a few times but I find myself getting lost in the task. To context switch from IDE to your “lab notes” would mean a stilted form of progression. And when I do write notes, they tend to be bullet points, not the flowing prose we have here.

Is that what we’re seeing here? Someone constantly switching from code to notes ever few minutes? Or is there something I’m missing here? Maybe this is a full day’s worth of work. Maybe it was bullet points and Ron turned it into prose prior to publication. Or is narration and transcription software involved?

Either way, it would be interesting to know more about this.

Cannot disagree more with the idea of merging all programming languages into one syntax. That’s like saying getting rid of all natural languages and have everyone speak Esperanto, getting rid of all styles of visual art and have everyone paint with Cubism, etc. Programming languages are more than just a means of computation, there are a means of expression steeped in a level of how abstract one wants to think. Assembly is required when you’re talking to the machine, but it would be a nightmare to work at that level when one is trying to write shell scripts. Likewise, a type system like Haskell’s is ideal when one is exploring types in general, but would be a huge pain when one needs to write a throw away script.

And you are forgetting people’s taste. One could argue the closest language we have to a “universal syntax” is JavaScript. But JavaScript sucks. Sorry, but I do not like that language. It inhabits that range of being used for everything and good at nothing. It’s a necessary evil in my books, nothing more.

I can’t see AI completely replacing coding jobs for a long while, probably during my career. I’m sure it’ll replace some manual work, but as long as people are involved, they will have their own preferences on how to program a computer. And that’s how it should be. You won’t find code listings it in a gallery, but it’s still an artefact of humans.

Went to a matinee today: the Australian National Youth Ballet’s performance of the Nutcracker. Quite good.

🔗 Martin Hähnel: Write Like You’re Ron Jeffries

The meandering pace of solving a problem, of how ideas develop and how people create are not replaced by the slick surface of the perfect how-to in which everything seemed to have worked on the first try, was clear from the beginning. Jeffries’ texts […] document the doing in the making, learning in the making. It makes it obvious that that which is presented is very often not how it was derived.

It would be nice to do more of this style of writing.

I thought that any coffee is better than no coffee, but I’ve discovered that’s not entirely true. Not only is bad coffee bad in its own right, it also takes away the reason for getting coffee at places you know are good. Ah well, live and learn.

Interesting development in the world of Go: in 1.26, the new() function will now accept expressions, not just types. This returns a pointer to the value, which will be useful for those types that use pointers for their fields:

type User struct {
   Age *int
}

user := User{}
var age int = 10
user.Age = new(age)

It also works for literal values, so that temporary age variable is strictly not necessary, although the linked post does state that it requires some consideration for types. Having user.Age = new(10) will work without issue as new will return a *int; but if Age were a *uint, you’ll get a type error.

I go on about unnecessary pointer types in the past (and will probably continue to do so in the future). To me, it’s just one of those paper-cuts you encounter in your day to day that you know can be made easier. So I consider this a welcome change. It’s not going to same me a ton on code, but every little bit helps.

🔗 Brandon’s Journal: Save Your Writing

Some good advice about saving your previous creations, even if you feel you’ll never look at it again. Maybe you won’t, but if it’s writing, what’s a couple of megabytes in this world swimming in storage? Move it out of sight if you must, but don’t delete it.

Updating my Kubernetes skill level from “elementary” to “enough to be dangerous.”

Breakfast at St. Ali coffee, in South Melbourne.

A cozy restaurant interior features wooden tables and chairs, with a corner shelf stocked with bottled water and takeout containers.
A podcast about podcasting and they post a frickin’ YouTube video instead of an audio file on their website? What is this world coming to?! Hand-wringing emoji. (Show redacted to protect the guilty).
The worst part of working with technologies like Kubernetes is that there’s no feedback when you forget something. I got no error when I was deploying a Role and RoleBinding for a service account that didn’t exist. Managed to spot it before embarking on a lengthy, auth-related wild-goose chase.

Well it’s been a fun day slamming my head against the wall trying to get Kubernetes and AWS working, but I shouldn’t be hasty. I need to leave some head slamming for tomorrow.

Auto-generated description: Two people are depicted in a retro, pixelated style under a humorous text about tech stacks and YAML files.

“Get out more” goal for October achieved. ✅

Boardgames at the Melbourne Central Lion Hotel again. Tonight just Codewords. One of these days I’ll stay longer than 1.5 hours.

Why do I even buy umbrellas? They’re never in the bag when they’re necessary. 🌨️

Bit more on lifts in Godot today. Re-engineered how the whole thing works: now everything is driven by the stationary lift doors. Each door has a reference to a lift and a target door. This makes the lift carriage itself rather passive: it will continue to reparent the player as before, but it no longer needs to track activations or have animating doors of it’s own. The doors just tell it where and when to go.

This has got proper targeting working so that a lift can now move between a pair of doors. It also allows for the player to call for the lift when it’s not positioned at the doors already. There are a few more dependencies amongst the various entities, but I think it makes for a more robust system.

I’ve been really enjoying the soundtrack of Tunic recently. Would I go all the way to London to watch a symphonic rendition of it? Tempting. If I was in London, maybe. But, being halfway across the world…

🔗 Robert Birming: The world’s worst blogger

I moved my blog from Bear to Micro.blog because, as I put it, it “started to feel limited”. I had begun creating photo albums, a status log, and some other stuff. It became harder and harder to manage…

So I moved [to Micro.blog]. A place with great features for adding photo collections, logging books, writing both long posts and short ones without titles. All just a click away…

Now that I have all these possibilities, I can’t seem to do it. No matter how I try, it never feels right to mix things up. And when I tried running two blogs on the same platform, it just got confusing.

I can’t pretend to fully understand Robert’s feelings, but I that I’ve gone through similar feelings myself: wondering if this bit of content should be on this blog, or that one should be there, etc. And always looking at the next shiny thing glittering on the horizon: a new CMS I haven’t tried, a fresh theme. There’s always something else to look at.

And I think much of this is all a distraction from a worry that took me a while to acknowledge: is what I write of interest to anyone? If I were to write about this, will they get upset or board? Who am I to waste their time on writing about topics that are of no interest to my readers?

​I’m trying to get better at not worrying too much about this. Although I can’t fully know what others are thinking, I have at least one data point that can provide me an answer to this, which is being a reader of blogs myself. And I’m aware that not everything I get from my feeds is going to interest me. That’s fine, I’ll just skip over that one post and wait for the next one. I’d probably prefer that over someone splitting their posts across multiple feeds and knowing that I’m only getting part of what they’re writing.

So if I were to provide some advice to Robert, it’s to try and simplify. Have a single site that others can subscribe to and write everything there. The hassle of deciding where to write isn’t really worth the worry. Plus your simplifying things for your readers, who want to read stuff from you. That’s why they’ve subscribed.

Anyway, like I said, I can’t pretend to fully understand the feelings. I definitely don’t think Robert is the “world’s worst blogger.” I enjoy reading his posts and I look forward to seeing them pop up in my RSS reader. I just hope this helps in some way. And I know how much easier it is to give advice than to follow it yourself. Go through my archive where I’ve spun out topics into separate blogs/CMS myself. All in all, keeping things simple is probably good advice for both of us.

We’re coming into that slightly annoying time of year where the mornings are too cold to travel to work without a coat, yet the afternoons are too warm to travel home with one.
Bash scripts truly are the duct tape of the computing world.

A bit more work on my Godot game, mainly building out mechanic for world 3. Tonight it was building an old-style lift with a caged door that the player can use to travel between different heights. Turned out really well.

Animating the door was a slog, and if that was all I achieved this evening, I would’ve considered that a success. But I had a bit of time to code up the lift too. I was unsure of how to approach this at first: I knew I wanted to turn off player movement and collisions and move the player (and camera) along with the lift.

This turned out to be easier than I was anticipating. When the player enters the lift, all motion on the player is disabled (this was done by setting a “disable_motion” boolean which would break out of the players progress loop early if true) and the player node is reparented to the lift. The lift then moves to the target, taking the player with it. At the destination, the player’s original parent is restored and motion is enabled again, allowing the player to move freely. I also had to turn off camera motion smoothing before I reparented the player as it seems like some offset vectors were incorrect for a frame and it had the camera shoot to the right. This is done when the door closing animation plays, before the node is reparented which happens just before the lift moves.

There’s still work to do. The z-order seems to be messed up when the lift reaches it’s destination (the player appears in front of the doors as they open). And at the moment, the lift only goes in one direction. But I’m really happy with what was achieved tonight.