• 🔗 RS.S Joy

    This was shared in the Hemispheric View Discord a few days ago. A lot of really good blogs listed (enrolled? As in blogroll?) there. I took a look at it yesterday and was just ducking in and out of blogs for ages.

  • Must say rebinding the keyboard shortcut for Keyboard’s Maestro’s Clipboard Picker has been quite successful. It’s definitely easier to remember and invoke, and I’m using the clipboard picker a lot more now than I was previously (which was never).

  • Rubber-ducking: On Context

    I’m torn between extracting auth credentials in the handler from a Go Context and passing them as arguments to service methods, or just passing the context and having the service methods get it from the Context themselves.

    Previously, when the auth credentials just had a user ID, we were doing the former. But we’re now using more information about what the user has access to and if we were to continue doing this, we’ll need to pass more parameters through to the service layer. Not only does this make things a little less neater, it’ll mean the next time we do this, we’ll have to do the whole thing again.

    Continue reading →

  • Had a rubber-ducking session with myself between passing auth info within the Go Context through to the service methods, or passing them as explicit parameters.

    I decided to go with passing it as explicit parameters. It’s kinda painful to see both the auth info passed through in both the Go context and a parameter. But it will result in more readable code, and it does make it clear that this information is needed. Plus, we’re already doing this already in the codebase I’m working on already (previously it was just the user ID, but we’re going to be including some additional auth info alongside it).

    I am kinda glad that this tension has been resolved. It’s been weighing on me a little.

    Also, for a bit of fun, I wrote this rubber-ducking session in a post. Well, it’s not entirely for fun: that’s how I was able to work through the problem. But writing it as a dialogue and posting it online was fun.

  • Rubberducking: On Context

    I’m torn between extracting auth credentials in the handler from a Go Context and passing them as arguments to service methods, or just passing the context and having the service methods get it from the Context themselves.

    Previously, when the auth credentials just had a user ID, we were doing the former. But we’re now using more information about what the user has access to and if we were to continue doing this, we’ll need to pass more parameters through to the service layer. Not only does this make things a little less neater, it’ll mean the next time we do this, we’ll have to do the whole thing again.

    Continue reading →

  • It would be nice if the CSV diff in Gitlab had a “row order not important” mode, in that any changes in row order are treated almost like whitespace changes. It won’t be something that’ll apply to all CSV files. But more often that not, the CSV files I deal with are not dependent on any row order.

  • Oof, turns out you can’t trust a browser to tell you the right MIME type for a file upload. I expected some logic involving magic numbers, but it just looks like a mixture of guessing based on file extension, deferring to the OS, and giving up and sending you application/octet-stream.

    That said, I do feel a little sorry for browser devs, particularly those that have to support Windows. Found this gem while poking around the Chromium source code:

    // This is a primary mapping (overrides the platform) rather than secondary
    // to work around an issue when Excel is installed on Windows. Excel
    // registers csv as application/vnd.ms-excel instead of text/csv from RFC
    // 4180. See https://crbug.com/139105.
    {"text/csv", "csv"},
    

    Yeah, of course Excel would do that. 🤦‍♂️

  • Spent the last few days building a small site which will convert an OPML file of RSS subscriptions into an HTML list of links to their respective websites. I needed it for a blogroll I’m planning to add, but I figured this might be something others may find useful.

  • Goland Debugger Not Working? Try Upgrading All The Things

    I’ve been having occasional trouble with the debugger in Goland. Every attempt to debug a test would just fail with the following error:

    /usr/local/go/bin/go tool test2json -t /Applications/GoLand.app/…
    API server listening at: 127.0.0.1:60732
    could not launch process: EOF
    
    Debugger finished with the exit code 1
    

    My previous attempts at fixing this — upgrading Go and Goland — did get it working for a while, but recently it’s been happening to me again. And being at the most recent version of Go and Goland, that avenue was not available to me.

    Continue reading →

  • I’m a bit surprised that Jira doesn’t have a notion of drafts. You start writing a task, then you think that it might be best to know whether it’s worth doing. What do you do with this half written task? Do you create it? At the moment I just keep them in an open browser tab, which is… not ideal.

  • Need to find a way to represent a collection of IDs in Go, all representable in different ways, with each one having a different type. Kinda wish Go had algebraic data type like Elm or Haskell, or even just enums with associated data like Java or Swift. Would be so useful for this.

  • Discovered a new artist through a YouTube channel I watch. They make some pretty good chill-out music. I can recommend Synths Working Overtime and Music For Podcasts 6, particularly “Cloudloop” (track 6) and “Systematic” (track 7). 🎵

  • Falling into the trap of not using a particular mug because it’s “special”. I bought the mug to be used, I should actually use it. As the appraisers on Antiques Roadshow are wont to say, it’s a real shame that such a special thing never leaves the cupboard.

  • It’s about time I started seriously using the clipboard support that comes with Keyboard Maestro. I think the first step is making it easier to show the history. I’ve remapped the history picker to ^ which feels easier to invoke, and probably easier to remember. We’ll see how it goes.

    Keyboard Maestro macro with the single action 'Activate Clipboard History Switcher' triggered when Control+Option+Command+Up Arrow is pressed
  • So after logging in this morning, I had to:

    • Enter my 1Password master password,
    • so I can get to my laptop password to log into the VPN,
    • so I can enter my admin passwords in Settings,
    • so that MacOS knows I have admin rights,
    • so I can enter my admin password again to upgrade Slack.

    Yep, we truly live in a golden age. 😒

  • People Are More Interested In What You're Working On Than You Think

    If anyone else is weary about posting about what projects they’re working on, fearing that others would think they’re showing off or something, here’s two bits of evidence that I hope would allay these fears:

    Exhibit 1: I’m a bit of a fan of the GMTK YouTube channel. Lots of good videos there about game development that, despite not being a game developer myself, I find facinating. But the playlist I enjoy the most is the one where Mark Brown, the series creator, actually goes through the process of building a game himself. Now, you’re not going to learn how to use Unity from that series (although he does have a video about that), but it’s fun seeing him making design decisions, showing off prototypes, overcoming challenges — both external and self imposed, and seeing it all come together. I’m aways excited when he drops one of these videos, and when I learnt today that he’s been posting dev logs on his Discord, so interested am I in this topic that I immediately signed up as a Patreon supporter.

    Continue reading →

  • Well, it’s around 4:15 on a Friday and the last code change I pushed didn’t fix the bug I was working on. Looks like that’s something to look at again on Monday.

    Now to clock off and put on my Friday after-work music. Oh, wait! That’s an opportunity for a new Album Whale list.

  • Posted my first “real” list on Album Whale: my list of new and rediscovered albums of 2023. It’s a little on the small side, but that’s because I tend to listen to familiar stuff most of the time. I do have plans to post those as well, but we’ll start with something small.

  • 🔗 Pika

    Seeing this makes me want to try it. I think I have a problem: I want to try all of the blogging CMSes. But I have no need for it now, so I’ll just keep a link to it here for later.

  • Github Actions, Default Token Permissions, And Publishing Binaries

    Looks like Github’s locked down the access rights of the GITHUB_TOKEN recently. This is the token that’s available to all Github actions by default.

    After taking a GoReleaser config file from an old project and using it in a new one, I encountered this error when GoReleaser tried to publish the binaries as part of a Github Release:

    failed to publish artifacts:
    could not release:
    PATCH https://api.github.com/repos/lmika/<project>/releases/139475588:
    403 Resource not accessible by integration []
    

    After a quick search, I found this Github issue which seemed to cover the same problem. It looks like the way to resolve this is to explicitly add the content: write permission to the Github Actions YAML file:

    Continue reading →

  • In lieu of sharing my Vision Pro review, let me share with you my Visual Ear Worms list.

  • So apparently I can’t even look at the album cover of “Tubular Bells 2” without having it play in my head.

  • Defense contractors should lean in to what they do in their recruitment ads. None of this “explore growth opportunities” fluff. Go with something like “Love blowing stuff up? We’ve got the job for you!”

  • It takes me longer to come up with half-baked tools for writing Jira tickets than to just write the Jira tickets. I still think of making them though. Because I just can’t stand writing Jira tickets in Jira.

  • Learnt two things about the Vision Pro buying experience from a colleague today:

    1. You’ll need an iPhone. Guess that rules me out (well, that plus I’m not in the US)
    2. The thing that scans your face is actually an App Clip, which is the only case I’ve heard of one being used in a non-demo way.
  • More YouTube watching this evening. These three videos about scam Chrome plugins were amusing and, I guess, a good argument for human curation of these “marketplaces”. Kinda pains me to say that. I wish it wasn’t so. 📺

  • Thoughts on The Failure of Microsoft Bob

    Watching a YouTube video about Microsoft Bob left me wondering if one of the reasons why Bob failed was that it assumed that users, who may have been intimidated by a GUI when they first encountered one, would be intimidated for ever. That their level of skill will always remain one in which the GUI was scary and unusable, and their only success in using a computer is through applications like Bob.

    Continue reading →

  • Build Indicators

    AKA: Das Blinkenlights

    Date: 2017 — now

    Status: Steady Green

    I sometimes envy those that work in hardware. To be able to build something that one can hold and touch. It’s something you really cannot do with software. And yeah, I dabbled a little with Arduino, setting up sketches that would run on prebuilt shields, but I never went beyond the point of building something that, however trivial or crappy, I could call my own.

    Continue reading →

  • You don’t need to be an iOS developer to get the “build it, and see what happens” experience. Just get a CloudFormation stack with a DynamoDB table and GSI. Oh, you want to add a new attribute to an index, or change an index’s projection? Well, just do it and see what happens (it’ll probably fail).

    My favourite limitation: you cannot deploy a CloudFormation delta that contains more than one GSI change on a single table (I’m pretty sure it’s per table and not per delta). If you need to make two GSI changes, you’ll need to do two CloudFormation deployments. This is super fun when you’re banking changes that will be pushed to prod in one hit, and you’ve forgotten earlier changes you made to GSIs.

  • I removed the paper wasp nest this morning. Surprisingly, doing nothing didn’t solve the problem. The nest was growing and was impeding my ability to hang out my washing. So it had to go. Good thing it was on a leaf, which made it easy to remove it once the wasps themselves were dealt with.

  • Bocce in a nearby park this afternoon. A bit sunny but otherwise a really nice day for it. Also had a spectator for a few minutes:

    A juvenile magpie on a dirt track.
  • Chris Coyer writes about companies always asking about our experience:

    In a way, it’s hard to blame companies because they honestly want to know and, in the best-case scenario, actually use what they get to make things better. But it’s oh-so-overwhelming. Just constantly about every single little thing.

    This annoys me too, particuarily for software I have to use. I’m constantly getting ask how my Slack Huddle went. But to Slack’s credit, theirs are reasonably nonintrusive. Less so is the one from Docker, which throws up a feedback modal just when I’m about to do something in their console.

  • Reading Manton’s post this morning reminds of one the projects I worked on. It was a Java GUI app called CBL that we would deploy to Windows machines of our customers. It would constantly crash and whenever it did, it was impossible to get the stack-trace. I added a class which would show the stack-trace to the user, so they could copy and paste it to support. I could’ve named it anything but I chose the name “CBLMessageOfDeath”.

    It’s not nearly as creative as “vetos” but, much like Manton, it made me smile whenever I had to work with it. And compared to alternative names like “ErrorDialog”, it did a better job of being more interesting and memorable. It’d had to, or I wouldn’t remember it after a decade and a half.

  • Working on one of the admin sections of the project I was alluding to yesterday. Here’s a screencast of how it’s looking so far.

    The styling and layout is not quite final. I’m focusing more on functionality, and getting layout and whitespace looking good always takes time. But compared to how it looked before I started working on it this morning, I think it’s a good start.

  • 🔗 The amazing helicopter on Mars, Ingenuity, will fly no more

    Ingenuity has been an incrediable achievement. The engineers at NASA should be so proud of themselves. It’s sad to see this chopper grounded now, but seeing it fly for as long as it did has been a joy. Bravo!

  • It’s a bit frustrating that iOS treats all apps as if they’re info-scraping, money-grabbing, third-class citizens. How many times do I have to grant clipboard access to NetNewsWire before they realise that yes, I actually trust the app developer?

    This applies to Safari’s treatment of websites as well, with their ridiculous purge of cookies and stored data after 7 days, no exceptions.

  • Why I Use a Mac

    Why do I use a Mac?

    Because I can’t get anything I need to get done on an iPad.

    Because I can’t type to save myself on a phone screen.

    Because music software doesn’t exist on Linux.

    Because the Bash shell doesn’t exist on Windows (well, it didn’t when I stopped using it).

    That’s why I use a Mac.

    Continue reading →

  • I’ve been bouncing around projects recently but last week I’ve settled on one that I’ve been really excited about. This is reboot five of this idea, but I think this time it’ll work because I’m not building it for myself, at least not entirely. Anyway, more to say when I have something to show.

  • Shocking to hear Gruber on Dithering tell that story about the developer’s experience with Apple’s DevRel team. To be told, after choosing to opt out from being on the Vision Pro on day one, that they’re “going to regret it”? Is it Apple’s policy to be offensive to developers now?

  • Broadtail

    Date: 2021 – 2022

    Status: Paused

    First project I’ll talk about is Broadtail. I think I talked about this one before, or at least I posted screenshot of it. I started work on this in 2021. The pandemic was still raging, and much of my downtime was watching YouTube videos. We were coming up to a federal election, and I was getting frustrated with seeing YouTube ads from political parties that offend me. This was before YouTube Premium so there was no real way to avoid these ads. Or was there?

    Continue reading →