• 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: Blogging Tools - Podcast Clip Favourites

    Finishing off the favourite podcast clips feature. Continue reading β†’

  • 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.

  • 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. πŸ€¦β€β™‚οΈ

  • 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.

  • 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
  • Devlog: Blogging Tools - Podcast Clip Favourites

    Working on saving podcast clips from Blogging Tools into a Hugo site, done in the “lab notes” running commentary approach. Continue reading β†’

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

  • 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.

  • 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.

  • 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. 😏

  • πŸ”— 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.

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

  • πŸ”— 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.

  • 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.

  • 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.

  • “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.

  • 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.
  • 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.

  • 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).

  • 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.
  • 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.

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

  • 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.

  • Bash scripts truly are the duct tape of the computing world.