• Rehearsal today. Haven’t got the PA equipment yet so I had to settle for 30 year old PC speakers. They worked better than expected, but they’ll probably struggle with a full garden.

    A keyboard synthesiser on a keyboard stand in a garden, connected to two small, yellowed PC speakers which are sitting on the ground to the right
  • More work on Mainboard Mayhem today. Had a bit more success getting the Windows build into a releasable state.

    First thing was the app icon. That blog post I talked about yesterday worked: I was able to set the icon of the executable. I did make a slight adjustment though. The post suggested using ImageMagick to produce the ICO file, but I wasn’t happy with how they looked. There were a lot of artefacts on the smaller icon sizes.

    So I looked around for an alternative, and found this package by Lea Anthony. He’s the maintainer of Wails, a cross-platform toolkit for making browser-based GUI apps in Go, sort of like Electron but without bundling Chrome. In fact, most of the build for Mainboard Mayhem was put together by reading the Wails source code, so I trust he knows what his doing. And sure enough, his package produced a nicely scaled ICO file from a source PNG image. Better yet, it was distributed as a Go package, so I could no need to install and shell-out to run it: I could just integrated it directly into the project’s build tool.

    Using rsrc to generate the SYSO file with the icon worked as expected: Go did pick it up and embed it into the executable. I did have some trouble getting the Go compiler to pick up these files at first. In short, they need to be in the same directory as the main package. So if you’re running go build ./cmd/thing, make sure the SYSO files are in ./cmd/thing. Other than that, no real issues here.

    Screenshot of Windows 10 file browser with mainboard.exe shown with the app icon, plus a few sdl DLLs
    A beautiful site: Mainboard.exe with the embedded app icon

    One last thing I had to deal with was the console window. Running a Go app in Windows shows the console by default. Perfectly fine for command line tools, but less so for games:

    Screenshot of Mainboard Mayhem running with the console window open in the background showing log messages
    Mainboard Mayhem with that annoying console window. Even the log messages are dull (well, unless you're working on the app).

    So I had to find a way to hide the console on launch. Since Mainboard Mayhem is using SDL, I’m actually using MinGW to cross-compile the Windows release on an Ubuntu build runner. The documentation for MinGW suggests adding -mwindows as a linker option to hide the console:

    # What I was doing before, which didn't work
    CGO_ENABLED=1 \
    CC="x86_64-w64-mingw32-gcc" \
    GOOS="windows" \
    CGO_LDFLAGS="-mwindows -L…" \
    go build -o dist/cclm/mainboard.exe ./cmd/cclm'
    

    This didn’t actually work when I tried it: launching the app kept bringing up the console. Turns out what I should’ve done was follow the advice of many Stack Overflow answers, and set -ldflags "-H=windowsgui" on the Go command:

    # This works
    CGO_ENABLED=1 \
    CC="x86_64-w64-mingw32-gcc" \
    GOOS="windows" \
    CGO_LDFLAGS="-L…" \
    go build -ldflags "-H=windowsgui" -o dist/cclm/mainboard.exe ./cmd/cclm'
    

    This works even without the -mwindows switch. Not completely sure why though. I guess MinGW is not actually being used for linking? Or maybe -m only works with C header files? Don’t know. 🤷 But doesn’t matter: the console no longer shows up on launch.

    Screenshot of Mainboard Mayhem running, but with no console window. File browser running in the background
    Mainboard Mayhem without the console window. A much nicer experience now.

    Finally, there was testing it all, and for this I just bit the bullet and set-up a Windows 10 virtual machine in Azure. The rate is something like $0.16 AUD an hour, an easy decision compared to spending time trying to get a VM with Windows 10 running on my machine.

    One remaining thing that’s slightly annoying is Windows Defender refusing to launch it after download, doing effectively the same thing as Gatekeeper on MacOS does:

    Screenshot of Windows Defender SmartScreen indicating that it's refusing to start an unrecognised app. A single button saying 'Don't Run' appears at the bottom of the dialog.
    Gatekeeper a.la. Microsoft.

    I’m sure there’s a way around it but it’s probably not worth learning about it at this stage. It’s easy enough to dismiss: click “More Info” and the click “Run Anyway”:

    Screenshot of Windows Defender SmartScreen indicating that it's refusing to start an unrecognised app, saying the name of the executable and that the publisher is unknown. Two buttons saying 'Run Anyway' and 'Don't Run' appears at the bottom of the dialog.
    Clicking 'More Info' gives you a way to launch the app.

    But other than that, I think the Windows version of Mainboard Mayhem is ready. I’ve updated the website to include the Windows archive if anyone’s interested.

  • Spent some time today on Mainboard Mayhem, trying to finish the Windows build. I’ve actually got Windows version of the game being built for a while now. I just haven’t published them, mainly because I haven’t got the app icon set-up yet.

    But this week, Golang Weekly had a link to a blog post by Mahmud Ridwan on how to do so. It looked pretty straightforward, so I thought I’d give it a try.

    And yeah, the instructions themselves were easy enough, and I wish I could say if they worked or not. But in order to test it, I need a Windows machine. And I don’t have one, and I wasn’t about to get one just for this.

    So I tried setting up Windows in a VM using UTM. I got this far:

    A blue Windows install screen within a MacOS window showing a spinner and the message 'Just a moment…' underneath

    Yeah, this infinite spinner has been staring at me pretty much all day. I got a Windows 10 installer ISO using CrystalFetch, and it seemed to work. But it just doesn’t want to boot up for the first time.

    Not actually sure what the problem is. The error message seems to suggest that it’s having trouble connecting to the internet. Might be that? Or maybe the installation didn’t complete properly? Could be anything. 🤷

    So no luck getting this tested yet. I’m wondering if it might be easier to forget virtualisation and just launch a Windows instance in the cloud somewhere instead.

  • 🔗 Age and the past

    One way to think about age – we become old when we think and talk more about the past than the future.

    Oooh. I feel a little seen. 🫣

  • Installed the latest version of Android today. One obvious change: the calculator app displays fractions in the result. And there’s no way to turn it off.

    This… doesn’t appeal to me. Not enough for me to change apps, at least not yet. But I wish there was a setting to change it back to decimals.

    The built-in calculator showing a result of 2.5 in decimals, and 2 1/2 in gray underneath.
  • Went to Castlemaine for a funeral this morning. For most of my life we would regularly go to Castlemaine to visit family. After today, it might be a while before I visit that town again.

  • Spending my free time adding photos to my travel journal and I’m starting to wonder if less is more. Maybe not having tens of photos crammed into a single entry, and only having a few good ones makes for a better entry overall.

  • 🔗 Using Web Components on My Icon Galleries Websites

    Lot of neat stuff referenced in this post, like htmx and web components. I’d like to try them in some capacity, like some small web project. Unfortunately, the only things I can think of building right now are things for my job.

  • I use to write up design documents directly in Confluence, as we use that as our knowledge base, but recently I’ve started drafting them in Obsidian. And it’s wonderful. So little friction with getting my thoughts down, especially when it comes to diagrams. Builtin support for Mermaid.js is great.

  • Launched Logic Pro and did some MIDI recording this evening. Here’s an except from “Top of the Morning” from Tubular Bells 3.

  • Yes, PA equipment organised: two speakers, a mixer, and cables. I’ll have to drive to Windsor to pick it up, which is a bit of a hike for me, but I’m glad that’s sorted now.

  • Goland updated to the latest, and the issue I was having with the debugger last week has been resolved. Curious how upgrading to Go 1.21 seems to freak an old version of Goland out when you hit a breakpoint. Would’ve have though that would be fine. But no matter, it’s all working again.

  • All aboard the Goland upgrade train. Calling at 2022.1.4, 2022.2.28, 2023.1.45…

  • If I can recommend one thing anyone with a PA hire service should do, it’s to have specifics of the equipment you offer for hire up on your website. Photos (front and back), size, whether it’s suitable for outdoors, etc. All this would be super useful for someone working out what they’ll need.

  • Been out all morning trying to find someone that does PA hire. Drove to three different locations I found on Google Maps. Two of them are no longer there, and one is only selling consumer audio instead. Now trying someone that does PA hire from their home. Good thing is that they’re close.

  • Looks like the Go debugger has already checked out for the week. I’m trying to debug this unit test and it’s refusing to start the app. It’s just showing me an eternal spinner.

  • Pixel Phones Are Not Dog-food, and That's a Problem

    John Gruber on the Pixel 8 launch event:

    It’s also impossible not to comment on just how much less interest there is in Google’s Pixel ecosystem. […] On the one hand I’m tempted to say the difference is just commensurate with how much better at hardware Apple is than Google. But I think there’s more to it than that. There’s something ineffable about it. There are aspects of marketshare traction — in any market — that can’t be explained by side-by-side product comparisons alone.

    Continue reading →

  • I’m shutting down Untraveller. I can’t resolve the tension of wanting a comprehensive, but really dry, account of a trip, vs. making it interesting for others to read. I think a Day One journal is more suitable for this.

    May keep the domain though. One of the rare ones that worked off the bat.

  • Vivaldi occasionally lockups when I bring up the context menu. I think it happens when it tries to makes a network request for the search icon.

    Portion of the Vivaldi context menu, with the menu item 'Search Ecosia for freeze up' front and center, with the Ecosia menu item

    I can remove the menu item if I wanted to, but I’d like to keep it around as I do find it useful. It would be nice to turn the icon off though.

  • Had to go to the new office today so I tried out the commute. The walk from Southern Cross to the office is exactly 20 minutes.

    Footpath of Spenser Street looking towards the river, with the hotel on the right and a W-class tram travelling up to Southern Cross
  • Organising travel documents for an upcoming work trip. I used to rely on Google Inbox for this. The way it ingested your itinerary and hotel booking was useful, but the thing I miss the most were the high quality banner images of your destination. Really nice touch.

  • Your Dev Environment is Not Your Production Environment

    There will be certain things you’re going to need to do in your development environments that you should never do in production. That’s pretty much a given: playing around with user’s data or potentially doing something that will cause an incident is generally not a good idea.

    But there are things you shouldn’t do in prod that you may need to do in dev. And make no mistake, there may be a legitimate need to do these things. Using Auth0 and only have a limited number of emails available for your test environment? You may need a way to quickly reset a user. Support billing in multiple countries and need to do a test in one of them? You’ll need a way to change the user’s countries.

    Continue reading →

  • It’s so much easier to post about how something others have worked on could be made better than it is to write about what I’ve been working on. I think there’s room for both on this blog, but I feel the balance is too many posts on the former and not enough on the latter. I’ll try to do better here.

  • Don’t want to turn this into the “look at what’s wrong with Atlassian’s software” blog, but I found another thing that annoys me about Confluence:

    A picker for a status label that is blocking the label in the table row below

    Clicking on a status label brings up a picker, giving you options to change the colour, etc. The picker appears below the label, which usually means it blocks the next thing I want to modify, like the status label in the row below. I need to dismiss the picker first before I can select the label I want to change next.

    It’d probably be better if the picker appeared above the label instead.

    This is also an issue with dates and links to Jira tickets as well, although with Jira tickets you’re required to make edits within a modal.

  • Given the number of times I make wiki pages that are little more than pseudo-databases-as-a-table, it would be nice if Confluence had a way to make this better. Maybe something like Notion databases, just to organise information a little neater than the free-for-all you get from tables.

  • Day 30: treasure

    This one’s inside a box without hinges, key, or lid. #mbsept

    An open cooked egg, on a muffin, with yoke dripping out onto the plate
  • Day 29: contrast #mbsept

    An aeroal photo of a city, Los Angeles, at night; with the city lights contrsting with the darkened bay
  • Day 28: workout

    It was a quiet evening in the gym that evening, which is unusual for a Thursday. I suspect that bolt of lightening that blew up a nearby transformer scared people away. #mbsept

    An empty gym, with machines for chest, back and legs vacant, a mural of kettlebells and TVs showing AFL in the back
  • After having some success getting my early QBasic programs running in the browser I had a bit of a look this morning to see if I could do the same for my Delphi apps. I found a project called BoxedWine which looks promising. Seems to be a minified version of Wine that that runs in browser using WASM.

    I downloaded the example and had a bit of a play around with a Tetris clone I built. It worked… to a degree. It was a little slow, and some of the colours were off. But it ran, and was actually usable.

    A screenshot of a Win32 Tetris clone running with BoxedWine running in Safari

    I did another test with an app that used OpenGL, which was less successful.

    A Windows style exception message indicating a null pointer running in Safari

    I think some of the OpenGL shared objects are not in the minified Wine distribution it was using. It might be possible to include them: there are instructions, and a few demos, on how to load files from the full Wine distribution on demand.

    Anyway, not sure if I’ll pursue this further but it was a fun little exercise nonetheless. I’m pretty impressed that this is even possible at all. The Web stack is pretty freaking awesome.

  • Day 27: embrace

    Photo credit goes to my sister, who captured this pair showing affection for each other. #mbsept

    Two sulphur-crested cockatoos perched on a wooden rail, with one preening the other
  • Day 26: beverage #mbsept

    A can of Mornington Peninsula Pale-ale poured into an ATP glass, placed in front of a coffee machine
  • Day 25: flare #mbsept

    Motorcycles and scooter travelling along a road at night, with a bus travelling behind them. Head-lights and the streetlights are flaring.
  • Day 24: belt

    Sometimes a 40 inch belt is just a 40 inch belt, as I realised when I bought mine (honestly, they should describe belt lengths as a range: 38 — 42 inches, for example). #mbsept

    Three belts lying diagonally on a brown sheet, with buckles facing the top-right side of the frame, with one belt extended beyond the other two
  • The day has arrived. After a meeting in the new office we were told to pack up our things. We won’t see them again until our desks in the new office are ready. 📦

    On my last bus ride home from Port Melbourne. Can’t say that I’ll miss it. 👋🚌

  • Lost another comment to Jira today. Oof! Don’t get attached to anything you write there. Jira will eat your comment and you’ll never see it again. 🙁

    You would’ve though, after 15 years of using Jira, that I’d learn this by now. 🤦‍♂️

  • Electrification of Melbourne Suburban Railways Plaque

    Found this plaque while passing through Southern Cross station this morning.

    Plaque about the Electrification of Melbourne Suburban Railways

    I didn’t have time to read it, and the subject matter looks really interesting to me (Trains? Power Lines? What’s not to love? 😀). I also don’t know how long it’ll be up for, and I’ve been burned in the past of not capturing something when I had the chance.

    So I’m posting photos of it here for posterity reasons. Enjoy.

    Continue reading →

  • I’ve got a bit behind my photos for the September Photo Challenge. I’ve got one for today that I’d really like to post. But I can’t do so until I post the days I’ve missed, lest they appear out of order. I better get on that.

  • I was planning to go into the office today. The train went two stops in before everyone was instructed to transfer to busses. Now on a train heading the other way so I can work from home instead. It’s great that this is now an option.

  • Day of firsts today. Had a session of indoors go-karts as part of a bucks party. Loads of fun. Won the wooden spoon (although only 3 second slower than the winner).

    An indoor go-kart track with a couple of karts doing a circuit My disposable wooden spoon
  • Started practice sessions again as I’ve been asked to play the piano at an event. I thought I’d try something new this time, and start recording them. Sometimes, during these sessions, I come up with an idea or arrangement that sounds pretty good to me. But a few minutes go by and I forget exactly how I got it to sound that way. When I try to recreate it later, it usually comes up short. So I want to find a way to avoid that happening here.

    Screenshot of Audio Hijack, showing Logic Pro and a mic input going to a recorder, and Logic Pro going to the output. Five existing recording sessions shown on the right pane.

    Audio Hijack is proving to be quite useful for this. I’ve got my webcam, which I’m using as a microphone, and Logic Pro being piped into a recorder. My (music) keyboard is hooked up via MIDI and I’m using Logic Pro as a live software synth (I prefer the piano patches there). The mic is for making a running commentary of what sounded good or not. I didn’t want to monitor of my speech but I did need to hear Logic Pro, so that’s piped directly to the output and through my headphones.

    This is the first session I’ve tried this and so far it worked well. Hardly stage quality — the mic is pretty ordinary, and picks up the action on the keyboard — but it’s good enough for what I need.