• Dev Log - 2023-03-12

    Preamble When I moved Working Set over to Micro.blog, I’d thought I’d be constantly writing micro-posts about what I’m working on, as a form of working in public. I found that didn’t really work for me, for a few reasons. I’ve got a strange relationship with this blog. I wanted a place online to write about the projects I’ve been working on, but every time I publish something here, I always get the feeling that I’m “showing off” in some way: ooh, look what I’ve done, aren’t I cleaver? Continue reading →

  • It took me a while to get use to it but I’ve grown to like The Verge homepage redesign. Having the micro-posts there seems to work well, especially considering that certain microblogging services have effectively cut off API access.

  • I know UI designers like using either Sketch or Figma — and after signing up to Figma this week, I can see why. But I’m going to give a shout-out to Balsamiq Wireframes (nee Balsamiq Mockups). I’ve found it to be a great tool for demonstrating a proposed layout for a UI without worrying too much about the details. It’s so quick to put together and the hand-drawn motif makes it clear that the drawn UI is just a concept.

    I also love how they use text to represent visual content. An example is items in a table-view: instead of using the mouse to draw each row by hand, you configured it by effectively typing out a CSV with some Markdown. Use commas to separate the columns, use [ ] to indicate a column should have checkboxes. Such a great idea.

  • Do sites that just load their articles with (video) ads, pop-overs, requests for emails, etc. see any improvements in their metrics after doing this (more clicks, longer visit times, more ad revenue)? Or are the just in a cycle of diminishing returns and think that adding more crap will help?

  • 🔗 After 6 long months, an Android phone finally cloned the iPhone 14

    The screen-shots of this “mini capsule” are hillarous. The animated waves that appear when the capsule is expanded; the fact that the only thing it can display is the battery level since there’s nothing like Live Actions. The capper is the “90%” on the right side of the capsule, right next to the 90 in the battery indicator. You know, just in case you need reminding that the battery is at 90%. Champions indeed!

    Hilarity aside, it’s a little sad seeing these Android OEMs doing everything they can to rip off Apple’s design. And it’s not just those in the long tail of OEMs either. Seeing Samsung half-arse features months after they debut on the iPhone, just to abandon them months later is really cringeworthy (anyone remember “AR Emoji”, their rip-off of Animoji). It’s past time they developed some taste on their own.

  • Hiding Your Attachment Folder In Obsidian's Outline

    A useful little CSS snippet for anyone using Obsidian that wants to hide their attachment folder from their outline. .nav-folder.mod-root>.nav-folder-children .nav-folder>.nav-folder-title[data-path^="Attachments"], .nav-folder.mod-root>.nav-folder-children .nav-folder>.nav-folder-title[data-path^="Attachments"] + .nav-folder-children { display: none; } To use: Go to the directory $VAULT/.obsidian/snippets where $VAULT is the directory of you vault. If the snippets directory doesn’t exist, create it. Copy the CSS snippet into a new CSS file. Open you vault settings and go to Appearance. Scroll to the bottom to where you see CSS snippets. Continue reading →

  • Working with some GitHub access tokens last night left me wondering why there’s no way to just renew an expired token. Dealing with the secret is not as tedious as dealing with the token permissions. Get that wrong and you’ve wasted several minutes of work.

  • Completed the release of Dynamo-Browse 0.2.0. Most of the work in the last week was updating the manual, especially the scripting API. Some more updates need to be made for the query expressions as well, but I’ll publish what I have now and update that over time.

  • It’s 2023 now, and I still hate code reviews.

  • Seeing Mastodon posts from Jason Snell about his trip to Aotearoa New Zealand prompted me to check when I travelled to Queenstown for a holiday. It was 10 years ago to the day: 7th March 2013. Would love to go back there again some day.

  • Follow-up from my earlier post about ChatGTP this morning, it turns out I probably should’ve RTFM:

    ChatGTP welcome screen, with the limitation 'Limited knowledge of world and events after 2021' circled in red

    Thanks to @andreab@social.lol for the tip.

  • Oh, AWS. Once again your brilliant UX design chops shine through in the products you release. I always wondered why copying an API keys from an SSO login session took just one click. It’s great that it now takes two, plus a whole lot more reading of small text. 😒

  • Remember in Gödel, Escher, Bach when they were saying that a (then) theoretical AI is less like a calculator and more akin to the human mind; and just like the human mind is likely to produce errors in the answers it gives? Well…

    ChatGTP session where MacOS Big Sur was given as the answer to what the latest version of MacOS was

    For reference, macOS Ventura is the current latest release.

    Update: Turn’s out the reason for this is that ChatGTP’s data-set only goes back to Nov 2021. See follow-up post.

  • I wish more app developers built websites for their apps.

    There are many benefits in doing so. It’ll allow others to see what the app does without getting kicked out of the browser and shoved to an app store, or when they’re using a device that can’t even access the app store.

    It’ll also give others a nice URL that can be linked to or bookmarked. I’m sure App Store URLs are stable, but I wouldn’t call them “nice”. Not much meaning in a URL like apps.apple.com/us/app/id413897608.

    I can appreciate that this is asking a fair bit. And I get it: after making websites for a few open-source projects, I know how painful and time consuming they can be to put together.

    But I think there’s still value in having a simple, single page website for an app, especially when it’s gained enough traction that people are writing about it. It doesn’t even need to be a standalone site, a blog post would be just as good. But something more than just a listing on the App Store.

  • Evidence that I didn’t sleep well last night: for a split second I thought this was actually a note I made. I even remarked as to how neat I made it.

    Screenshot of Obsidian showing Release Notes

    The neatness is what eventually tipped me off. None of my notes look as good.

  • A lot of track work going on this weekend. I enjoy seeing these trucks that can go both on roads and rails. You don’t want to be waiting for them to transition, though. It’s usually done at level crossings and they don’t rush it.

    Truck on rail tracks at a station with workers.
  • Here’s a bit of a blast from the past. I managed to get ccedit working again. This was the original level editor for workingset.net/2022/12/2… my Chips Challenge “fan game” I’ve been working on.

    I’ve been designing a few levels for it recently, but since moving to a new Mac, the level editor I was using was going to be difficult to port. It’s QT application and the QT bindings were a pain to setup, and I rather not go through that again. I was using a Mac at the time I started working on it, but I wasn’t yet ready to go all in on MacOS. So to hedge my bets, I decided to go with QT as the UI toolkit.

    This was 5 years ago and I’m unlikely to go back to Linux, so choosing QT was a bit of a bad decision. I think if I had my time again, I’d go with something like AppKit.

    Anyway, the level editor still works but I have to log into a screen share to use it. I’d like to be able to edit levels on the machine I’m using now.

    The code for the original level editor was still around but it hasn’t been touched in ages. It’s basically an SDL application — the same graphics library I’m using for the actual game itself — and the SDL v2 bindings I’m using are still maintained, so updating those were quite easy1.

    One thing I did have to pull out was the Lua VM2. The editor was using old C Lua bindings. Better Lua VMs written in pure Go are now available, so I didn’t want to keep using these old bindings anymore. In fact, I didn’t want to use Lua at all. Lua was originally used for the level scripts, but I replaced this in favour of another language (which is no longer maintained 😒, but I’m not changing it again).

    The original CCLM Editor
    The original CCLM Editor

    So far the editor boots up, but that’s about it. I can move the cursor around but I can’t add new tiles or load existing levels. There seems to be some weird things going on with the image name lookup. I originally thought image name were case insensitive, but after looking at the image name lookup logic in the game itself, I’m not so sure.

    How much time I’d like to spend on this is still a bit of a question. It all depends whether I’d like to release the game itself in some fashion. There are still questions about whether I’m allowed to, given that the graphics are not my own. Still need to think about that.

    But in any case, good to see the old editor again.


    1. The level editor was actually using older SDL v1 bindings, but it was relatively easy to port them over to v2, although some gaps are still present. ↩︎

    2. Lua was actually the second language used by the editor. The first was a Go native TCL interpretor. ↩︎

  • To Wordpress Or Not To Wordpress

    I’m facing a bit of a dilemma. I’ve been asked to setup a new website for someone who wants to stand up a new business. In therory this is something that I can do quite easily. I know HTML and CSS. I’ve made a living building backends for web-apps. I do have an undeveloped eye for design, but I like to think I have an idea of the principal of good website usability; and as long as I’m not too ambitious, and aim for a minimal usable site, I can probably put together a simple static website. Continue reading →

  • Ok, I now understand why everyone is going on about the Wordpress block editor. I’ve installed Wordpress this morning to play around with it in preparation of a new project, and wow is there a lerning curve associated with it. Definitely not your dad’s Wordpress instance.

  • Here’s something I’d never would have imagined: Jaycar does same day delivery. I experienced this once before but I dismissed it as just a fluke. But it happened again today. I bought something from them at 1:14 this afternoon and it arrived at my house at 3:26. Incredible.

  • It sometimes sucks being a listener of Apple tech podcasts when you’ve got an Android phone. I love the shows where an indie dev talks about an app they’ve worked on. But I can never try them out because I don’t have an iPhone.

    I know there are fixes to this. Just not ready to apply them yet.

  • Foldables and rollables are so 2022. Where are the scrunchables? When I’m done with my phone, I want to be able to scrunch it up into a little ball and stuff it in my pocket. Why can’t I do that? Where is the R&D money going?

    (Honestly, the whole foldable phone thing seems kinda ridiculous to me).

  • I was listening to an episode of Sharp Tech the other day. When the conversation moved on to AI and Ben Thompson’s experience with Sydney, an idea for a game came to me.

    It’ll essentially be a text adventure, but the goal is to try to get a GPT AI to play it. The AI would give you a description of what it “sees” on their screen, and you have to tell it how to proceed. You can’t enter the commands yourself. Except, you have to use natural language to guide the AI through the game.

    Maybe in the harder difficulty levels the AI could disagree with you and you’ll need to convince it to do what you say. Or maybe it’ll give you partial information about what it “sees”. It can say that it sees a castle, but doesn’t explain that there’s a gate-house as well, and you have to tease this information out of it in order to move forward.

    This sort of harkens back to the time when you’re playing a game for the first time with someone that’s experienced, and they’re telling you what to do1. Here, you’re that experienced player giving assistance, even though you’ve never played the game yourself.

    Anyway, free idea for anyone who wants it.


    1. Or maybe those times when you’re trying to give tech support over the phone. Those are fun, right? Well, what better way to spend your downtime than playing a simulation of that. 😛 ↩︎

  • For anyone working with YAML Cloud Formation, if you were to see this error message:

    E0001 Error transforming template: 'NoneType' object has no attribute 'get'
    cloudformation.yaml:1:1
    

    it might be because one of your resources is not properly indented. That is, the Type and Properties keyword is at the same indentation level as the resource name:

    Resources:
      # Broken
      DeadLetterQueue:
      Type: AWS::SQS::Queue
      Properties:
        # ...
    
      # Fixed
      DeadLetterQueue:
        Type: AWS::SQS::Queue
        Properties:
          # ...
    

    Another problem is that you’re trying to use !GetAtt with a string parameter:

    Parameters:
      DynamoDBStream:
        Type: String
    
    Resources:
      LambdaDynamoStream:
        Type: AWS::Lambda::EventSourceMapping
        Properties:
          # This is the source of your woes 
          EventSourceArn: !GetAtt DynamoDBStream.StreamArn
    

    Took a while for me to find the cause of these. Had to comment out all the resources and uncomment them back one by one. In retrospect, a quick glance at the entire file would’ve found it as well; although the slow act of going through the file, commenting and uncommenting things, was still a useful act in and of itself.

    Naturally the error message is cryptic, probably because it falls within the gap of a well-formed YAML file but a badly formed object model. Some better error reporting would be preferred though.

    And yeah, there’s going to be commentary about error reporting in these posts. 😛

  • Quotes Around Names In Error Messages

    I saw this error a few minutes ago: failed to process input: RUNTIME ERROR: function has no parameter stack This threw me for a minute as I was trying to work out which parameter stack went missing, what I did to cause it to go missing, and what the heck a parameter stack actually is anyway. But it had nothing to do with any sort of stack. The error message was showing up because a function call was expecting a parameter with name “stack” which was missing from the function definition. Continue reading →