• I never considered myself someone who believed that Go must’ve had generics from the start. I appreciated that the designers added them to the language, but I though I’d could be just as effective writing Go code if they chose not to.

    I don’t believe that anymore.

    I’ve found generics in Go to be a major improvement to the language. It now means that I can now use higher order functions that operate on collections, like “map” or “filter”, in a more natural way. I got use to these functions while working in languages that had them (Python, Ruby, JavaScript, Java 1.8) and they’ve been so useful that I wished Go had them as well.

    There was no technical reason for Go not to have these functions, but they would have had to use the interface{} type to be useful, meaning that there was no type safety built-in and your code would be littered with type assertions. This was such a turn-off that most of the time I didn’t bother with considering higher order functions, and just wrote a for loop by hand to convert types in one slice to types in another slice. Trivial to write, but just so boring.

    Now with generics, these higher order functions can be made type safe, and there is no longer a need for type assertions to use them. These made them viable once more, and I’ve found myself using them a fair bit recently. Not having to write yet another for lop has made coding fun again.

  • 🔗 The Magic of Small Databases

    I kinda want this but for internal databases. There’ve been several times at work where I’ve had to collect semi-structured information in a spreadsheet or a wiki page comprised solely of tables. There’s always some loosely defined convention around how to represent it (use this colour to indicate this particular state) or when it should be changed (change this label to “In Review” until these people have seen it and then change it to “Confirmed”).

    One example is how we manage releases: which services we’re pushing out and what commits they are, which environments it’s been deployed to or tested in, whether the other teams or the person on-call are aware of it and have signed off, etc. This is all managed in wiki pages that follow a standard layout, and it’s… okay. It was a convention that has grown out over time as we were working out our release procedure. And it made sense keeping it relatively informal as we were trying to work out our groove. But that groove has been formed now, and it would be nice to formalise the process. But doing so means that there’s a lot of manual labour keeping these release documents correct and up to date. And since it’s all in a centrally managed wiki, it’s difficult to automate away things that are managed by other systems like our code repositories.

    A tool that can be hosted on-prem which will allow anyone to spin up a new document-base database (either for the team or themselves), define a very loose schema and some views, and put a very simple workflows and code macros would be great. The trick is trying to walk the line that separates something that basically is like a hosted version of Excel verses something that will require so much setup work that no-one will bother with it. I’d imagine that’s a tricky balancing act to follow.

  • Saw the following quote while reading this article:

    You could fill a book with all I know, but with all I don’t know, you could fill a library.

    — Unknown

    Quite profound.

  • It’s 2023 now and podcasts are still saying that I should Google so-and-so to see an article they’re citing, instead of just putting a link in the show-notes. I understand that this is mainly because Apple’s podcasting app doesn’t support HTML with links. Maybe once they’ve stopped burning money on their podcast subscription play that seems to be going nowhere, they can take a look at fixing this. We’ve got linking technology now; we shouldn’t be afraid to use it.

  • On a train now peeking at someone’s laptop. His desktop is completely covered in document icons. And I mean completely, as in there’s no room for any more.

    I’ve never seen this before. It’s both amazing and shocking at the same time.

  • Busses should use the tram lines more. I remember being taught that if a bus was driving on a tram line, it must be treated like a tram. This gives them dedicated lanes and certain priorities over cars. Don’t know why busses don’t do this.

  • Passing by the Vegemite factory on the way to work. You usually get a whiff of its signature smell when you walk by, but today it was particularly strong.

    Corner of the Vegemite factory
  • Ah, my Smart Response XE developer kit has arrived. Time for a new project.

    Smart Response XE handheld device, and headers and leads to connect it to a computer

    Just to be clear: the top two items that are still in their packaging were not part of the dev kit. I got those separately.

  • Achievement unlocked: first spam email offering to identify and fix vulnerabilities in one of my GitHub projects (it’s open source: if there are any vulnerabilities, just raise a PR).

  • I hate the term “business logic.” Is there a better noun-phrase for things the software is meant to do that doesn’t sound corporatey? I guess “user flow” or “user experience” could work, but not everything I deal with involves the user directly.

    Another alternative that came to me: “application logic” or “app logic”. Testing this out: “make sure the app logic doesn’t change.” Hmm, that’s not bad either.

  • Currently reading: Temeraire by Naomi Novik 📚

    About half way through the first chapter but already very captivating. Started strong right out of the gate. HT to pluralistic.net, where it was highly recommended.

  • On the subject of birds, I was looking at my status.lol statuses this morning. There are only a handful on there but I saw these two and it made me smile. I obviously posted them while I was looking after my sisters cockatiels last November.

    Two status.lol statuses made 2 months ago: one saying 'Can't work, Too many parrots on hand (1, which is > 0)' and the other saying 'Ok, parrots off hand. Back to work'
  • Putting up a new print today.

    Framed print of an Eastern Rosella

    Original is by a local artist, although I didn’t get their name.

  • This is going to be an unpopular opinion but I cannot stand the MacOS development experience. I wanted to start a new project, a MacOS SwiftUI project, and once I went through the New Project flow, the first thing that happens is the preview craps out because the login to AppStore Connect cannot provision a certificate. To generate the preview of the “Hello World” app that was just created. Call me old fashion but the need to provision a certificate to generate a preview is a little unnecessary.

    How do experience MacOS developers deal with crap like this? Honestly, I really feel for them devs going through all the shitty hoops Apple throws their way, as if attempting to build anything is a threat to their trillion dollar company. They really need to get some perspective.

    Anyway, I’ll settle on using Go and Wails. I know how unpopular Electron-style apps are in the broader MacOS community (Wails doesn’t bundle Chrome so it’s not quite the same thing) but it’s a stack without any BS that I can rely on.

  • My 2023 Word

    I think I’ve settled on my 2023 word of the year: generous. Specifically (although not exclusively) generous in the projects I work on. I’m always working on some form of software in my spare time, but most of the time I keep this software just for myself. I want to do less of this, and start sharing it with others. You could say that I want to get better at shipping, but shipping to me is making the software usable for what it’s designed for, and for many of the projects I build, it’s only designed for me and my needs. Shipping’s for myself is no longer enough, I want to start shipping for others.

    Continue reading →

  • Looking at the “backlog” of things to work on for Dynamo-Browse before I set it aside. I’ll fix a few bugs and add a few small features that I’ve found myself really wanting. The short list is as follows:

    • Fix the activity indicator that is sometimes not clearing when a long running task is finished.
    • Fix a bug in which executing a query expression with just the sort key does nothing. I suspect this has something to do with the query planner somehow getting confused if the sort key is used but the partition key is not.
    • Fix a bug where set default-limits returns a bad value.
    • Add a way to describe the table, i.e. show keys, indices, etc. This should also be made available to scripts.
    • Add a way to “goto” a particular row, that is select rows just by entering the value of the partition and optionally the sort key.

    I’ll start with these and see how I go.

    Oh, and one more thing: I will need to kill my darlings, namely the other commands in the “audax” repository that I’ve hacked togeather. They’re mildly useful — one of them is used to browse SSM parameters and another is used to view JSON log files — but they’re unloved and barely functional. I’ll move them out of the “audax” repository and rename this repo to “dynamo-browse”, just to make it less confusing for everyone.

  • I think I’ll take a little break from Dynamo-Browse. There’s a list of small features that are on my TODO list. I might do one or two of them over the next week, then cut and document a release, and leave it for a while.

    I’m still using Dynamo-Browse pretty much every day at work, but it feels a little demotivating being the only person that’s using it. Even those at work seem like they’ve moved on. And I can understand that: it’s not the most intuitive bit of software out there. And I get the sense that it’s time to do something new. Maybe an online service or something. 🤔

  • Updates To My Online Presence

    Making some changes to my online presence.

    The first is moving my knowledge base site from a set of HTML pages generated from a bespoke tool to one managed by Hugo. I wrote about that already so there’s nothing new to report here, apart from changing the domain name: I guess I finally fell out of love for “tecknow.space”. The new domain is simply technote.wiki. I originally wanted “technotes.wiki” — note the S — but I ran into a few problems trying to set this up in Netlify. While waiting for help on this, I gradually grew to like “technote.wiki” as a domain: not only does it contain notes about technology and development, it alludes to the phrase “take note”, which I find cute (although part of me is wondering if it’s time to stop looking for “cute” domain names).

    Continue reading →

  • Discovered that the cafe I go to offers raisin toast. It’s too early for hot cross buns but the last couple of days have been relatively cool and my autumn dietary cravings kicked in a little early (it’ll warm up again in about a week so we’ll see how long they actually last).

  • Might be time for a new, larger monitor. The one I’m using now, a 12 year old Samsung SyncMaster P2250, has worked well for me (apart from turning itself on during the night for no particular reason). But it felt really cramped working on it yesterday, and not for the first time.

  • I’m cautiously optimistic that upgrading my iPad to iPadOS 16.2 has fixed the keyboard issue I’ve been experiencing. It’s been two days and I haven’t needed to reconnect the keyboard or restart the iPad. Hoping it was just a software problem all along.

    Update: Ok, I may have spoken too soon. It started flaking out again during lunch. Slightly better than it was a few days ago, but still problematic.

  • 🎙 Really Specific Stories: John Siracusa

    As an avid fan of all of John’s podcasts, I’ve been looking forward to this episode of Really Specific Stories for a while. I’m please to say that @martinfeld does not disappoint. A fantastic listen.

  • I wonder if finding anything related to Kubernetes sidecars, cluster configuration, or tools boring or unnecessary is a career limiting move.

    Update: After spending a bit more time thinking about this, I’m wondering if the reasons why things like this get so complicated is a mixture of:

    • Larger teams getting split into smaller ones, and needing a way for them to work more or less independently without stepping on each other’s toes,
    • Leaning towards the security side on the security vs. convenience (or rather simplicity) continuum,
    • Saying “It’s what Google/Amazon/Spotify/whoever does” without taking into account that they’re got 100x more developers and 10,000,000x more users than we do.

    And this complexity tends to cascade onto itself: throwing one more tool in means that we need to secure it, which means more configuration, which means that we need a tool to manage that, which adds more security, and on and on it goes.

    This is not helped by people always looking out for the new and shiny. It might be because I’m getting old and cynical but that appeal is wearing off on me.

    And yeah, people could make the argument for why we need each one of these. It’s the classic “the road to hell is paved with good intentions” situation here.

  • Feature for web-browsers: a keyboard shortcut to go to the last tab that had input focus. Would be useful when you find yourself switching through tabs to look something up, like a link, while at the same time drafting an answer that will make use of it in another tab.

  • Spent 15 minutes going through newsletters looking for a Go package I wanted to use. I really need a proper system to track these package of interest. Maybe I should use one of the 10 different systems I’ve thought of to do just that.

    P.S. Feedbin’s search works pretty well.

  • This Coulda Been A Podcast

    Started listening to a “podcast” published as a YouTube video.

    I don’t like that this is how people choose to publish their shows. I can understand why that do, since people now use YouTube just to listen to music and other audio content. But for a podcast, the presence of video suggests to me that this is something that I need to actually watch. That simply listening to the audio while letting it play in another tab is not the best way to consume it, lest I miss something visual.

    Continue reading →

  • 🔗 The Shit Show

    What gets me about Twitter killing access to third-party clients is the lack of comms to the developers. No shutdown timeline. No chance to let the devs communicate this to their users. Nothing but cowardly silence. How utterly disrespectful!

  • I also saw an interesting water-bird this morning. Don’t know what species it is. Looks a bit like a Pied Cormorant but the colour around the eyes and beak is wrong. I tried to take a picture but it flew off and the best photo I got, one with a high digital zoom, is quite muddy.

    Unidentified water-bird perched on a tree
  • While walking this afternoon, I met a small flock of gang-gang cockatoos. A gang-gang gang if you will. And yes, I have been sitting on that line for the past week or so. 🙂

    Female gang-gang in an oak tree Male gang-gang in an oak tree
  • Hand-made, Home-cooked

    “Here, buy this sandwich. It’s hand-made.

    “Well, it’s machine made. But hands made the machines.

    “Well, hands made the machines that made the machines.

    “But it’s a home-cooked receipt.

    “Well, it’s a home-cooked inspired recipe. We did have to get some input from nutritionists and focus groups. And a few of our stakeholder had to approve the list of ingredients we used. But we think it’s close enough.

    “Anyway, enjoy.”

    Continue reading →

  • I’ve turned off cross-posting to my work journal in Micro.blog. I think it will help me write a little freely there. I just cannot shake the feeling that I’m spamming people with uninteresting notes on the progress of personal projects by including those post in this timeline.

  • Finally bit the bullet and got scripting working in Dynamo-Browse. It’s officially in the tool, at least in the latest development version. It’s finally good to see this feature implemented. I’ve been waffling on this for a while, as the last several posts can attest, and it’s good to see some decisions made.

    In the end I went with Tamarin as the scripting language. It was fortunate that the maintainer released version 1.0 just as I was about to merge the scripting feature branch into main. I’ve been trying out the scripting feature at work and so far I’ve been finding it to work pretty well. It helps that the language syntax is quite close to Go, but I also think that the room to hide long-running tasks from the user (i.e. no promises everywhere) dramatically simplifies how scripts are written.

    As for the runtime, I decided to have scripts run in a separate go-routine. This means they don’t block the main thread and the user can still interact with the tool. This does mean that the script will need to indicate when a long running process is occurring — which they can do by displaying a message in the status line — but I think this is a good enough tradeoff to avoid having a running script lock-up the app. I still need to add a way for the user to kill long-running scripts (writing a GitHub ticket to do this now).

    At the moment, only one script can run at any one time, sort of like how JavaScript in the browser works. This is also intentional, as it will prevent a whole bunch of scripts launching go-routines and slowing down the user experience. I think it will help in not introducing any potential synchronisation issues with parallel running scripts accessing the same memory space. No need to build methods in the API to handle this. Will this mean that script performance will be a problem? Not sure at this stage.

    I’m also keeping the API intentionally small at this stage. There are methods to query a DynamoDB table, get access to the result set and the items, and do some basic UI and OS things. I’m hoping it’s small enough to be useful, at least at the start, without overwhelming script authors or locking me into an API design. I hope to add methods to the API over time.

    Anyway, good to see this committed to.

  • Oof, I really feel for those third party developers responsible for Twitter clients. It’s not their fault that Twitter’s API is down, but it sucks that it’s their problem. Considering’s Twitter’s treatment of them over the last 10 years, it’s commendable that they stuck it out.

  • Also, if you like Oxygene Pt. 4 rearrangements, here’s one I made several years ago. Not as faithful to the original as the one linked to in the last post. Trying to recreate the patches would have taken some time, plus it was an opportunity to see how a few changes would sound.

  • 🔗 Jean-Michel Jarre’s “Oxygene Pt. 4” in 19kb of JS code

    A pretty good recreation of Oxygene Pt. 4. Also, I’ll have to explore this tool a little more.

    Via waxy.org.

  • Hustle Writing

    There was one other thing that was a bit distasteful about those posts on how you can further your career by being a technical writer, and it had to do with how they formatted their writing.

    Many of them were not afraid to include a lot of emphasis. And when I say a lot, I mean a lot. As it whole phrases or even entire sentences. They did it quite often. Sometimes in bold. Actually, quite often in bold. And once or twice, they even used both bold and italics.

    Continue reading →

  • I’ve fallen down a bit of a rabbit hole today reading posts about how you can get ahead in your technical career by writing online. A lot of suggestions in these posts, some which made a lot of sense: check you spelling and grammar, write to a routine/deadline, don’t be afraid to rewrite, etc. All fine and good.

    But there were also suggestions that just made me groan. Some of them involved dealing with Twitter a lot more: cross-posting your content there, tweeting things that are “too small” to be a blog post, etc. And one writer suggested getting feedback on drafts before you publish them. This one amused me because the writer compared this to pair programming, something I’m not a huge fan of. That’s probably why I found this suggestion off-putting.

    All of these are understandable in principal, especially if your goal is to get readers and build an audience. And that’s not really what I want from a blog, at least not from the ones I have right now. I keep them for fun and because I want a place to document and share my experience and ideas. If they were to help my career, that’s great, but I don’t really expect them to.

    But hearing about what’s involved in writing for developing my career gives me pause in starting a blog like this. I’m not sure I like the idea of posting to Twitter (or Mastodon, or any other platform other than the blog itself) or getting my content reviewed before I publish it. Surely one’s not required to do this to be successful technical writer, right?

  • Froth and Bubble

    Woke up in the early morning with this poem in my head:

    In this world of froth and bubble,
    Two things stand like stone;
    Kindness in other peoples’ trouble,
    Courage in your own.

    I first read this in a young adults novel some good 25 years ago, and over the years it’s come back to me several times. I guess you can say it resonates.

    Continue reading →

  • I don’t know what’s causing the ongoing issue with my iPad keyboard folio. Sometimes I can resolve it by fixing the alignment of the pogo pins, so it might just be a connection issue. But then why does restarting the iPad, without doing any adjustments, fix the issue?

    Oh, and full writing points to me for shoving the word “issue” into every sentence. 🤪

  • Every time I scroll through the history in a Slack channel, I get the notice suggesting that I use search. But the reason I don’t use search is because I can’t come up with search terms that would help me find the message I’m looking for. So until Slack starts supporting search queries along the line of “a message that contains a screenshot of a spreadsheet made around the time there was a huddle call for about an hour with about 80% of the people in this channel,” maybe they should stop showing this notice.

    😀 Us unfortunate Slack users.