Spent most of the weekend going down various rabbit holes to get a Go application signed and notarised as a MacOS app. I’m trying to do this in a way that would make this easy to automate using GitHub Actions. This means things like no implicit access to the system keychain: I want to make a temporary keychain, add my secret stuff to it, then delete it once signing and notarisation is done.

It also means no XCode GUI either: command line stuff only. Not that I had much hope of using XCode here anyway, since this is a Go application.

But that’s fine, preferable even. I’ve never liked all the manual steps needed to get code signing work with XCode. What are you going to do when you change systems? Would you remember all the steps you took several years ago, when you last setup developer certificates?

So this is why I’m trying to get it working with the terminal. But it’s not easy. Lots of esoteric commands that I need to learn and be made aware of. Just hope it’s not a huge waste of time.

A really nice quality of life improvement you can make in Terminal.app: map Option-Backspace to ^W (Control-W, or \027) so that pressing it in the shell will delete one word to the left, like most other MacOS apps:

Key mapping preference pane within Terminal, with a new key mapping with the delete key and option modifier sends control W as text

Finished reading: Anything You Want by Derek Sivers 📚

An intriguing book. I’ve never used CD Baby but I did hear of it, and it was interesting reading how Derek approached building it. Kind of good to hear that it was as unconventional as you would imagine a “tech startup” to be. Good read.

I have an Android phone so Apple Maps is a non-starter right now. But one thing that makes me consider Apple Maps is Google’s insistence of pushing bike and scooter shares when I ask for walking directions to somewhere. This just reeks of commercialism. Oh, and you can’t turn this “feature” off. 😒

John Gruber in his article about Llama 2:

Second, I’m glad to see Facebook drop their awkward “LLaMA” letter-casing style.

Reminds me of when I once worked at a company that sold a product called “Project MeNtOR”. The capitalisation was important: it was the only way in which the name could be trademarked. I didn’t have much to do with that product but I feel sorry for those that had to write the name in emails or marketing copy, or even the product itself (it was a delivery process, which means lots of binders with documentation). Hope they had a keyboard macro handy.

Closed my Plausible account and have gone all in with Tinylytics by Vincent. Not because Plausible was a bad service. Far from it. But Tinylytics gives me what I need, plus the additional good vibes of using something a fellow Micro.blogger built and released.

Nothing kills momentum on a task with a tight deadline quite like being ask to do admin stuff like “produce an estimate”. Now you’re scheduling meetings, going through tasks, setting story-points, etc. Argh! I mean, I understand why: we’ve all got someone to report to (unless you own the business). But all this effort sucks up the time that we could use to actually do the work.

Found some really nice things about Netlify today.

I learnt that you can write server-side functions in Go. I knew that JavaScript functions were supported but I had no idea that Go was a possibility. This excites me as Go is my favourite backend language.

From my testing it looks like the build will use a go.mod file for dependencies if one exists in the project root directory (i.e. the repository directory), so you can include third-party packages. Embeds also seem to work as well.

The functions are executed using AWS Lambda. You can use aws-lambda-go-api-proxy if you prefer to use http.Handler from the standard library:

func helloHandler(w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(http.StatusOK)
    w.Write([]byte("Hello world"))
}

func main() {
    adapter := httpadapter.New(http.HandlerFunc(helloHandler))
    lambda.Start(adapter.ProxyWithContext)
}

I also learnt that you can protect individual sites with a password, so if I ever want to deploy something for myself, I don’t have to roll my own authentication. This is a paid feature, but you know what, Netlify has been pretty good at hosting my other sites for free it’s probably worth signing up for a pro account.

Thinking about Manton’s post about bookmark tags reminds me of a bit of UI I built for that admin tool I worked on way back when. It was in a section where the user would manage a set of file extensions associated with meteorology products1 that should be backed up for operational purposes.

It looks something like this:

Wireframe of dialog, with two fields. The top field a text field with the label file extensions, and the bottom three radio buttons: add to existing file extensions, remove from existing file extensions, and set to existing file extensions.

It will appear when the user has selected a bunch of products from a list, and clicked a button labelled “File Extensions”. The user can enter as many file extensions in the text field as they wished, separated by commas. The operation radio button determines how these will be merged with the product’s original set of file extensions. They’d either be added to the set, removed from the set, or the set will be replaced with the extensions entered here. Pretty basic stuff.

And yeah, it’s by no means a revolutionary bit of UI, and it didn’t do anything groundbreaking. In fact, I’m not sure if it was even used. I did write about it in the help docs, but who reads the manual anyway? 😉

And yet, I remember being pretty glad after building this. I guess because the alternative would’ve been not to make it possible to manage file extensions in bulk at all. Working with software tools today where you can’t do anything in bulk drives me up the wall, and adding the ability to do so here felt like a bit of a statement.


  1. Examples of products included observations, forecasts, radar images, etc. [return]

Oof, took me an extra hour to get into work due to train issues. At least I got a walk out of it. I feel for these poor souls, stuck on the train until the problem gets fixed.

People on a stationary train on a bridge.

Amazing how time just grinds almost to a halt when you’re stuck on a train because of signal failure.

I met someone I used to work with at the supermarket today. I’m terrible with names, and it’s been more than a decade since I’ve seen her, so I couldn’t remember her name at the time. I recalled something from my memory just now and a LinkedIn search confirmed I got it right. Little victories today.

Going through photos of my European trip, putting descriptions on them. Also updating my journal at the same time. I wish Day One supported photo captions. I have to settle for italic text below the photo if I want to add one. It’s left justified and just doesn’t look right.

🔗 XML is the future - Bite code!

I wanted to write something about fads in the software development industry when the post about Amazon Prime Video moving away from micro-services back to monoliths was making the rounds. A lot of the motivation towards micro-services can be traced back to Amazon’s preaching about them being the best way to architect scalable software. Having a team from Amazon saying “micro-services didn’t work; we went back to a monolith and it was more scalable and cheaper to run” is, frankly, a bit like the Pope renouncing his Catholic faith.

I didn’t say anything at the time as doing so seemed like jumping on the fad wagon along with everyone else, but I have to agree with this article that this following along with the crowd is quite pervasive in the circuits I travel in. I did witness the tail end of the XML fad when I first started working. My first job had all the good stuff: XML for data and configuration; XSLT to render HTML and to ingest HL7, a non-XML format used in the medical industry, which we mapped to XML and passed through an XSLT to extract patient information (yes, we really did that!); XForms for customisable forms. We may have used XSD somewhere as well. Good thing we stopped short of SOAP.

The whole feeling that XML was the answer to any problem was quite pervasive, and with only a few evangelists, it was enough to drive the team in a particular direction. And I wish I could say that I was above it all, but that would be a lie. I drank the cool-aid like many others about the virtues of XML.

But here lies the seductive thing about these technology fads: they’re not without their merits. There were cases where XML was the answer, just like there are cases where micro-services are. The trap is assuming that just because it worked before, it would work again, 100% of the time in fact, even if the problem is different. After all, Amazon or whatever was using it, and they’re successful. And you do want to see this project succeed, right? Especially when we’re pouring all this money into it and your job is on the line, hmm?

Thus, teams are using micro-services, Kubernetes, 50 different middleware and sidecar containers, and pages and pages of configuration to build a service where the total amount of data can be loaded into an SQLite3 database1. And so it goes.

So we’ll see what would come of it all. I hope there is a move away from micro-services back to simpler forms of software designs; one where the architecture can fit entirely in one’s head. Of course, just as this article says, they’ll probably be an overcorrection, and a whole set of new problems arise when micro-services are ditched in favour of monoliths. I only hope that, should teams decide to do this, they do so with both eyes open and avoid the pitfalls these fads can lay for them.


  1. Ok, this is a bit of an exaggeration, but not by much. [return]

Feature request for Micro.blog: have a way to recall a post entered into the Share Sheet when a user dismisses it. I wrote quite a lengthy post in one, and I lost it all when I accidently dismissed the Share Sheet. Doing that doesn’t feel great. 🙁

Best number plate seen on an electric car to date: CHGME. 🔋

I’m liking the new source browser in GitHub. Saves a decent amount of time for things like libraries where I just want to read the source. No more need for checking it out to a temp directory and opening it in an IDE just to get the code indexed.

Had the opportunity to see our new office today. It’s fabulous. Converted factory with exposed brick work gives it a startup feel. Lots of natural light as well. But the best thing is the commute: the small tram ride from Southern Cross is miles better than the bus. Looking forward to moving there.

The local Woolworths has rolled out what I believe to be E Ink price tags. I was hoping to start seeing E Ink used for things like this. The technology is perfect for this use case.

An E Ink display for tomato juice.

A colour E Ink display, with a yellow background, for tonic water.

It’s a little frustrating seeing code examples that don’t explain what the example is trying to demonstrate. I found an example for an oauth2 Go library but there’s nothing about what it’s an example of. Is it of an authentication server? A resource server? What’s it demonstrating?

And just like that, my ChatGTP luck has run out. Asked it to generate some example code this morning, and what it produced couldn’t compile and misses a few key steps in the logic. I guess it won’t be doing my job anytime soon (I still find it really useful though).

Any day I get to spend time with Ivy and Archie is a good day.

Giving a head scratch to Ivy, a white cockatiel, who's perched on a cage.Archie, a yellow cockatiel, perched on an opened cage door.

🔗 Musk feels the heat

A lawsuit, the last refuge of a scoundrel.

(With apologies to the Simpsons).

P.S. Like the new design of Birchtree.

🔗 Reddit mods fear spam overload as BotDefense leaves “antagonistic” Reddit

I wonder if anyone at Reddit’s C suite has ever been a moderator. That this API fisaco is affecting the tools that mods use to keep the community spam free and happy should give them pause. That they don’t care is an indication as to how detatched they are from those “on the ground”.

Finished reading: Do The Work! by Steven Pressfield 📚