• 🔗 Not an April Fool: Dyson announces apocalyptic filter-headphone combo

    Yes, the product is weird, but what prompted this link-post is the remark about this being a “perfect addition to your Mega Man cosplay project.” I believe in the games, you could always see Mega Man’s mouth.

  • Even after 18 years of use, I still get blown away at how amazingly useful the command line can be for doing anything slightly non-trivial with text and files. Maybe that’s why it’s still going strong for 50 years and counting.

  • An amusing thought came to me after reading Gruber’s post on Facebook and TikTok. Here’s Facebook hiring a strategy firm that is considering mediums other than Facebook to try and sway people’s opinions of TikTok. Maybe they should try getting their message on to TikTok. 😄

  • Scene: work.

    Team: here’s the tasks we need to do, here’s how long they will take, and we’ll probably get it done on 24 April.

    Managers: OK, I’ve taken that list, pulled out half the tasks and cut the estimates by 50%. Can you get it done in two weeks?

    😠

  • I’ve been racking my brain trying to best work out how to organise the code for awstools. My goals are to make it possible to have view models composable, have state centralised but also localised, and keep controllers from having too much responsibility. I started another tool, which browses SSM parameters, to try and work this all out.

    I think I’ve settled on the following architecture:

    • Providers and Services will remain stateless
    • State will be managed by controllers
    • Operations in controllers are only available through tea.Cmd implementations.
    • Updates from controllers will only be available through tea.Msg implementations.
    • View models (i.e. tea.Model) will only know enough state to be able to render themselves.
    • There will be one master model which will coordinate the communication between controllers and view models. This model will react to messages from the controllers and update the views. It will also react to messages from the views and launch operations on the controllers.

    We’ll see how this goes and whether it will scale as additional features are added.

  • Credit to Apple for the work they did to get x86 working seamlessly on the M1. It’s only just now, after 6 hours of use, that I realised I downloaded the x86 version of Go when I should have downloaded the ARM version. I finally cottoned on when I tried to spin up the debugger.

  • My theorem regarding email: the chance of me reading an email from a sender is inversely proportional to the number of messages received from that sender per day.

    Supporting evidence: seeing 300 unread messages for GitLab that will be immediately marked as read. 🗑

  • 🔗 Stay on the bus

    The subject here is photography but I think it can be applied to any other creative endeavour out there. Resonated for me as well.

    Ah, I think the book and post are quoting the same person: Finish American Arno Minkkinen. Maybe that’s how Rohan (the author of the linked post) tracked down the original passage.

  • Meetings really take it out of me. I had 4 hours worth of meetings today and now I’m really drained. And it’s not just because they were virtual. I would have been drained if I had them in person as well.

  • More work on the AWS tools, mainly rebuilding the UI framework. Need to rip out all the Operation type stuff, as BubbleTea already does this using messages and commands (see tutorial 2). Also taking some time building some UI models that I can reuse across the various commands, including a few that deal with layout changes.

    Also tracked down what was causing that delay when trying to create a new list. It turns out during the call to list.New(), a bunch of adaptive styles are created, which includes a test to see if the terminal is in light or dark mode. This calls some terminal IO methods which were blocking for a significant amount of time, we’re talking in the order of 10’s of seconds.

    The good thing is that this check is only made once, so what I did was move the check into the main function. Some preliminary tests indicating that this may work: the lists are consistently being created very quickly again. We’ll see if this lasts.

  • Doing a lot of terminal UI app development recently. It’s not easy but I’ve forgotten how much fun it is. Requires a fair bit of thought, not only to make usable UIs using only characters and colour, but also to keep the code from descending into a giant ball of mud.

  • More work on Broadtail this morning. Managed to get the new favourite stuff finished. Favourites are now a dedicated entity, instead of being tied to a feed item. This means that any video can now be favourited, including ones not from a feed. The favourite list is now a top-level menu item as well.

    Also found a useful CLI tool for browsing BoltDB files.

  • An idea for that micro-bulk-image tool: instead of prioritising uploads, maybe prioritise processing of already uploaded images. Things like cropping, optimising, etc. after the upload, and then re-uploading it.

  • New AWS Tools Commands

    For a while now, I’ve been wanting some tools which would help manage AWS resources that would also run in the terminal. I know in most circumstances the AWS console would work, but I know for myself, there’s a lot of benefit from doing this sort of administration from the command line.

    I use the terminal a lot when I’m developing or investigating something. Much of the time while I’m in the weeds I’ve got a bunch of tabs with tools running and producing output, and I’m switching between them as I try to get something working across a bunch of systems.

    Continue reading →

  • Woke up expecting today to be long and annoying, but it turned out not to be as annoying as I anticipated (or as long). I guess the lesson here is not to presume how good or bad a day will be until you’ve lived through it first.

  • Got my copy of Bloch’s Effective Java out today for the first time in years, in order to prepare for an interview. As far as books about programming languages go, this is probably my favourite. Very informative and easy to read.

  • No day trip to Warburton this year: too much to do at work unfortunately. I’ve got a day in leau owed to me so we’ll see if I could make it in April.

  • Wondering if there’s a way where I could quit my job and spend my waking hours building text-based UI applications. Not sure there’s a lot of money in such things unfortunately.

  • Doing some tool smithing at work to make my current task a little easier. Using Bubble Tea to build a TUI-based SQS message browser. Early days so far but already showing promise. Anything which will save me clicks around the AWS console is always a plus.

  • Even more work on Feed Journaler. Still trying to tune the title removal logic. Will probably require a lot of testing.

  • The “Explore Repositories” sidebar on GitHub’s home page (if you’re logged in) is a bit strange. Why am I getting recommendations for projects that I either don’t need, or haven’t sought out? Am I expected to just pull in any bit of code people are publishing? Really weird.

  • Hmm, I’m wondering if Broadtail needs a mode for downloading the audio of a video only, and uploading it to a podcasting service like Pocketcasts. I did this twice before, and now wish I can do it again. Third time is when a pattern is emerging.

    Also, a bit of a deviation to finish the current work outstanding for Feed Journaler. Much of it is trying to get the Markdown translator working with Write.as post, mainly to deal with posts without titles, and to strip any hashtags that appear in the first and last paragraph. The code is a real mess. I should probably spend some time cleaning it all up.

  • Showing Only Changed Files in Git Log

    This technique shows only the changed files in a git log call without having to show the entire patch:

    git log --name-only ...
    
    Continue reading →

  • If there’s anyone else out there using Buffalo to build web-apps, I just discovered that it doesn’t clean up old versions of bundled JavaScript files. This means that the public/asset directory can grow to gigabytes in size, eventually reaching the point where Go will simply refuse to embed that much data.

    The tell-tail sign is this error message when you try to run the application:

    too much data in section SDWARFSECT (over 2e+09 bytes)
    

    If you see that, deleting public/assets should solve your problem.

  • Showing A File At a Specific Git Revision

    To display the contents of a file at a given revision in Git, run the following command:

    $ git show <revision>:<filename>
    

    For example, to view the version of “README.md” on the dev branch:

    $ git show dev:README.md
    

    There is an alternative form of this command that will show the changes applied to that file as part of the commit:

    $ git show <revision> -- <filename>
    

    This can be used alongside the log command to work out what happened to a file that was deleted.

    Continue reading →

  • 🔗 A big bet to kill the password for good

    Lot of talk about getting the user experience/OS compatability right, which is good. But I see no real indication on how they’re going to get the millions of app/website developers to switch to this. Hope they’ve considered that.

  • I may need to shake up my podcast listening habits a little.

    I subscribe to several tech-based podcasts which I regularly listen to. But because I am a creature of habit, I only listen to each one during certain times of the week. Plus I’m finding that I can only take so much tech talk these days, and I need some other topic to listen to.

    I also subscribe to some long form, analysis based podcasts which cover a broad range of subjects, but they don’t come out on a regular schedule. So in order to “fill in the gaps”, I usually turn to some specific news based podcasts. They do come out regularly, but the news of late has been a bit anxiety inducing, and I may need take a little break from them.

    So I think my regular podcast listening rotation needs something new. Might be time to start throwing in some microcasts from fellow Micro-blogers into the mix.

  • A snapshot of the indie-web style project mentioned yesterday:

    This is just static HTML and JavaScript at the moment. The idea is that each of these “cards” can be rearranged by direct manipulation. So I spent most of this morning trying to get drag and drop working in JavaScript.

    After hooking up dragenter and dragleave event listeners to the Stimulus controllers bound to each of the cards, I found that the controllers were getting enter and leave events continuously as the dragged element was moved over them. These enter and leave events occurred almost immediately, making it difficult to indicate a drop-zone just by reacting to the events themselves. Setting a class on enter and then removing that class immediately on leave meant that the class was never shown.

    Turns out this is because the events were being sent for all the subelements of the card. Moving the dragged element from the card padding to the text field resulted in an enter event for text field, followed immediately by a leave event on the card element.

    This means that in order to do any form of indication, some element tracking is required. I’m currently using a counter to do that, which will increment by one when a dragenter event is received and decrement by 1 on dragleave. It sort of works — I’ve got to fix it when the drop event occurs — but I get super concerned about the counter getting out of sync and the indicator being stuck “on” when the dragged element is completely outside it.

    One other thing I could try is having some form of set tracking each of the entered and exited elements and using the set length to determine whether to show the indicator. I trust that the browser will guarantee that a dragleave will always follow a dragenter event sent to the element. 🤔

  • We were hoping for a game of bocce in Argyle Square, which has a bocce pitch. But alas!

    Beaten there by some Grand Prix event. 🙁

  • Code Review Software Sucks. Here's How I Would Improve It

    This post is about code reviews, and the software that facilitates them.

    I’ll be honest: I’m not a huge fan of code reviews, so a lot of what I speak of below can probably be dismissed as that from someone who blames their tools. Be that as it may, I do think there is room for improvements in the tooling used to review code, and this post touches on a few additional features which would help.

    Continue reading →

  • Revising the micro-bulk-uploader project. I’ve been reading a lot about IndieAuth and Micropub formats and I got really excited about it. I figured this would be a good project to try them.

    In short, this is a bulk image uploader. It’s primarily tailored for Micro.blog, but since these formats are standards in a way, there’s no real reason why it couldn’t work for other services.

    Basically, the idea is this:

    • User authenticates with their website.
    • They are presented with a set of file uploads, which they can used to prep their images. They can reorder their images (ideally using drag-and-drop) and write some alt text.
    • Once they’re happy with the images, they click “Upload”.
    • The server will upload the images and then generate the HTML to produce a gallery (or just a list of images if they so prefer).

    I have a few goals for this project:

    1. To ship a hosted service for others to use. The goal is to get into the practice of shipping software for other people. This is the principal goal: it must be usable by others. Otherwise, there’s no point doing this.
    2. To get a working version out the door in two weeks for others to start trying. Two weeks is April 1st, which should be achievable.
    3. To learn about the Indypub formats, specifically IndieAuth and Micropub.
  • I forgot that yesterday was St. Patricks Day. But I did wear a green polo, listened to some Celtic inspired music, and watched a few episodes of Derry Girls last night. Does that mean I accidentally celebrated St. Patricks Day? ☘️

  • Sometimes I wish I had the patients (and the hardware) to play some of the video games indies have been releasing. After reading about them, or watching a speed-run, I see that there some that are actually quite incredible. There are some really talented game designers out there.

  • Reading the chapter on Microformats in Indie Microblogging brought me back to uni where we were taught about the Semantic Web. I tell you, I feel exhausted just thinking about it now.

    All these standards: RDF, OWLS, tautologies, and like seven other acronyms I’ve sinced forgotten. Each one building on top of the other like a gigantic wedding cake. And oh yeah, all of them using XML1 and requiring seven different namespaces and five different forms of URI’s to express even the most basic relationship.

    It was the only part of the subject that didn’t seem fun. HTML? CSS? Great, sign me up! Keeping seven different XML files up to date when a relationship changes? No, thank you.

    If there was ever an instance of technologists overengineering a solution without considering how it would be used to solve the problem, the Semantic Web is a great example.


    1. RDF did have a non-XML representation but I do remember being told that using it was discourage in favour of the XML standard. ↩︎

  • An important tenet of software development that I don’t think is appreciated that much: make your software easy to test. This includes building tests, test setup, running tests, configuration for testing, etc. If you don’t do this, your software will not be tested.

  • 🔗 Go 1.18 Release Notes

    Happy “generics finally in Go” day.

    (I wouldn’t call myself someone who was itching for the Go devs to add generics; but now that they are in the language, I’ll probably use them).

  • Broadtail 0.0.7

    Released Broadtail 0.0.7 about a week ago. This included some restyling of the job list on the home page, which now includes a progress bar updated using web-sockets (no need for page refreshes anymore).

    For the frontend, the Websocket APIs that come from the browser are used. There’s not much to it — it’s managed by a Stimulus controller which sets up the websocket and listen for updates. The updates are then pushed as custom events to the main window, which the Stimulus controllers used to update the progress bar are listening out for. This allows for a single Stimulus controller to manage the websocket connection and make use of the window as a message bus.

    Continue reading →

  • Learning Through Video

    Mike Crittenden wrote a post this morning about how he hates learning through videos. I know for myself that I occasionally do prefer videos for learning new things, but not always.

    Usually if I need to learn something, it would be some new technology that I have to know for my job. In those cases, I find that if I have absolutely no experience in the subject matter, a good video which provides a decent overview of the major concepts helps me a great deal. Trying to learn the same thing from reading a lengthy blog post, especially when jargon is used, is less effective for me. I find myself getting tired and loosing my place. Now, this could just be because of the writing — dry blocks of text are the worst, but I tend to do better if the posts are shorter and formulated more like a tutorial.

    Continue reading →

  • 🔗 Kubernetes 101

    A pretty good introduction about the fundamentals of Kubernetes, and also the post in question here.

  • I was ask today by someone at work1 if I knew of a good post describing the fundamentals of Kubernetes. I remember reading one several months ago which explained the fundamentals quite well to me, and thought it would be helpful for this person as well. But I forgot to bookmark the link.

    I probably should have realised at the time that it would have been a good post to bookmark. I guess I was hoping to rely on the browser’s history, but as far as I can tell, the history in Vivaldi only goes back three or four months. I felt the post was useful enought to spend some time finding it again.

    As you can imagine, doing a straight search for anything on Kubernetes in either Google or DuckDuckGo would result in nothing helpful, since there are roughly a bajillion posts on Kubernetes out there on the internet. But I did remember that the author actually released a simple, for-pay image sharing application, and announced it on Hacker News.

    So I did a DuckDuckGo search for “site:ycombinator.com image hosting single person.” Amazingly the Hacker News post was the top hit. This eventually led me to the app in question, which eventually led me to this person’s blog, and after one more DuckDuckGo search, eventually to the post itself.

    It took a good 20 minutes find this post once more, and I was honestly unsure whether I would have been about to find it at all. I’m bookmarking it now so that it may never2 be lost again.


    1. Yes, I’m working during a public holiday today. ↩︎

    2. Or at least until this blog is shutdown. ↩︎