Long Form Posts
-
Yes, this is probably just a rationalisation for trying to minimise sunk-costs, but Iāve got nothing else to work on, so why not this? ↩︎
- Detecting A Point In a Convex Polygon: the subject matter is a little dry, but one thing thatās notable about this one was the interactive elements. This took a few weeks to get right and Iām quite happy with how they turned out.
- Goland Debugger Not Working? Try Upgrading All The Things: notable as it seems to be the post that got the most traffic from Google.
- BASIC.HTM: notable as it was the first post of mine that appeared on Hacker News.
- A Tour Of My New Self-Hosted Code Setup: longest post to date, with probably the longest bit of spoken audio Iāve published on this site. Getting my hands dirty with editing the narration was an interesting experience.
- Micro-fiction: Get A Horse: notable in that this was my first post that was a work of fiction.
- Sidebar For Tiny Theme: This came with the additions for recommendations to Micro.blog, and the addition of sidebars listing those recommendations in a couple of the themes. I use Tiny Theme, which didnāt have a way to do this, so what started as a blog-post eventually became a Micro.blog plugin. Itās been good seeing this adopted by other bloggers.
- Cyber Burger: A Pico-8 game, which I hoped wouldāve only taken a few weeks to build. Overall it took 3 months, largely because I spent large stretches of time not working on it. But Iām glad I actually got this finished and released.
- UCL: A tool-command language, similar to TCL, that Iāve built for work. The state of this is smack-bang in the middle of āsort-of-usableā and Iāll need to spend some effort cleaning this up and documenting this if I ever want this to see wide release. Iām not sure that I want that though. at least not yet.
- Blogging Tools: A set of tools that help me post here. What started as something to assist with making photo galleries has grown to a suite of tools dealing with images, audio and video. Really useful for my needs.
- Tape Playback Site: A private site for browsing old cassette tapes that have been digitised. I still have a pile of tapes I need to digitise though (are you getting a sense that I find it hard to finish things? š).
- Nano-Journal: My version of Kev Quirkās web-based journalling app. After adding Git synchronisation and attachment support, Iāve use this now for all my journalling. It doesnāt do everything that Day One does (off-line supportās a big one) but it does enough.
- Photo Bucket: My third attempt at making something to publish image galleries online. I think the need for this has been made somewhat redundant with Blogging Tools.
- I also started two interactive fiction stories in Evergreen that I havenāt finished yet. One is close, and I probably should get it done. The other is about halfway finished and probably wonāt see the light of day.
- House of the Dragon: Season 1
- House of the Dragon: Season 2
- Andor
- Reacher: Season 2
-
I donāt do much on New Years Eve, electing to go to bed early. Yet, I usually get awaken at midnight for various reasons: fireworks, messages from people wising me a Happy New Year. Last night was no exception. ↩︎
-
Well, thatās not entirely true. Becoming an uncle was an example of such an event. But again, such personal news, is currently outside the scope of this post. ↩︎
- Micropub Checkin: A silly little Flutter app I used for adding check-ins to lmika.day. The apps in a bit of a neglected state, but I still use it as I get value from tracking places Iāve been.
- Strata: The noteās app from Micro.blog. This is where I write my short-term notes. I use Google Keep for shopping lists, but everything else goes here.
- Alto: A music app I wrote, and the main music app I listen to.
- Pocket Casts: The podcast player app I use. Apart from the web-browser, this and Alto are two of the most used apps I have on my phone.
- VSReader: Another silly little Flutter app. This is a test build for an RSS reader I was working on a couple of months ago. Itās been a while since Iāve opened this, and I probably should just kill it given that I havenāt made any recent changes to it.
- Google Wallet: Googleās digital wallet (well, at least their current iteration of their digital wallet). I use it mainly for my train ticket but I do have my credit card in there, just in case I walk out without my ārealā wallet.
- Phone: My family and I still use the phone quite frequently so this app has remained in the dock since I set the phone up.
- Messages: This is Androidās messaging app. Much like the phone, I communicate with family mostly via SMS, and now RCS, messages.
- Play Store: I rarely go to the Play Store, so thereās no real need for this icon to be here. But I havenāt got around to removing it yet.
- Vivaldi: My web browser of choice.
- The right most icon changes based on the last used app, which Iām not a huge fan of, as it occasionally changes just as I go to tap it and I launch the wrong app by mistake.
- PTV: The Victorian public transport app. I usually use it to know the arrival time of the tram I take going home. Also useful for trip planning.
- Plex: I generally donāt watch things on my phone, but before I got my Nvidia Shield, I used this Plex app to Chromecast shows to the TV. It was never great at it though, as it sometimes disconnected from the Chromecast session while the video was running, leaving me with no means of stopping it until I unplugged the Chromecast.
- Kindle: Kept here as I occasionally use it to read books if Iāve read through my RSS feeds.
- ChatGPT: I donāt use ChatGPT on my phone that often, but it does occasionally come in useful when a web-search proves fruitless.
- FastMail: My email provider of choice. Given how often I use it, this is arguably one of those apps that should be on the first screen.
- Pager Duty: The twenty-four hours on-call paging software I had to use for work. Iām no longer on the on-call roster so itās probably something I can remove.
- WhatsApp: What I use for messaging friends. I donāt like the fact that I have a Meta app on my phone, but thatās what my friends chose to use so Iām stuck with it (itās also better than Viber, which is what we used before).
- WireGuard: Personal VPN, although Iām currently not using WireGuard for anything right now. I like to keep it mainly because I like the logo.
- Discord: Iām a member of a few Discord servers, but I use the mobile client mainly to check into the Hemispheric Views Discord.
- Notion: Where I store my ālong termā notes, at least for now.
- Tusky: Mastodon client.
- Splitwise: Group expense management and splitting app. This was useful during our European trip last year, where each of us would take in turn to pay for the group.
- SunSmart: Used to track the current and forecasted UV index. Useful around this time of year if Iām planning to be outside for an extended period of time.
- Micro.blog: The Micro.blog app, although I occasionally use the web version too.
- 1Password: My password manager of choice.
- Realestate.com: Used to browse real-estate, out of curiosity more than anything else.
- Spotify: My āsecondaryā music app. I donāt use it for anything that I regularly listen to, but itās occasionally useful for those once-off tracks.
- Google Authenticator: Where I keep my 2FA codes.
- Day One: Before I moved to a web-based journalling app, I used this Day One client for writing journal entries. It wasnāt perfect: there was always syncing delays to/from the Apple platform instances of Day One. But it was fine.
- Slack: Used mainly for work.
- Camera: Iām not sure why I have this here, since I almost always use the double power-button tap to bring up the camera. I guess I moved it here from screen one and never removed it.
- Should I Run, by Kristen Martell, arranged by Lee Rosevere
- Miles Wide, from Synths Working Overtime, by Lee Rosevere
- We’ve Been Here Before and Hide Your Heart, from Stationary Loops, by Lee Rosevere
- Dark Sky Island, by Enya.
- The Truman Show OST, by Burkhard Dallwitz and Philip Glass.
- Before Too Long, by Paul Kelly.
- s3-browse: a TUI tool for browsing S3 buckets. This didn’t go beyond simply listing the files of a directory.
- scorepeer: An attempt to make a collection of online score-cards much like the Finska one I built.
- withenv: Preconfigure the environment for a command with the values of an
.env
file (there must be something out there that does this already). - About 3 aborted attempts to make a wiki-style site using Hugo (one called “Techknow Space” which I though was pretty cleaver).
-
Or possibly a Peertube client. ↩︎
-
It was much easier for the dark theme. ↩︎
- Notes: Obsidian for work. Notion for personal use if the note is long-lived. But I’ve started using Micro.blog notes and Strata for the more short-term notes I make from day to day.
- To-do: To-do’s are still going to where my notes go, which is now Strata. Although I’m still using Google Keep for shopping lists.
- Browser: Safari’s out from all machines. It’s Vivaldi everywhere now. Except iPad, where I don’t have a choice.
- Presentations: Believe it or not, I haven’t had to make a presentation since last year. I am still paying for iA Presenter, and despite some thoughts, I think I’ll continue to use it for future presentations. I should also add that I’m using iA Writer for prose writing, not that I do much of that either.
- Social Clients: Still Tusky for now, but I’m wondering how long it’ll be before I install a BlueSky client too.
- Journalling App: I didn’t include this in last year’s list, but it’s worth mentioning here as I’ve moved away from Day One to a home grown web-app, similar to the one built by Kev Quirk.
- POSSE: Micro.blog, EchoFeed. Also a new category, now I’m doing this a bit more nowadays.
-
I say “it’s almost as easy” as Dokku, but one thing going for Coolify is that I don’t need to SSH into a Linux box to do things. When it comes to creating and operating these apps, doing it from a dashboard is a nicer experience. ↩︎
-
Not that there’s much to see. It’s just the podcast artwork. Not even a rendered scrubber. ↩︎
-
In my experience, the tracks that take some time to grow to like turn out to be the best ones to listen to. ↩︎
-
Actually, I have a fifth blog which is for projects Iām working on that I rather keep private. Oh, and a sixth, which is a travel blog that I really should maintain better. Might be that I have a few too many blogs. ↩︎
- HTTP Routing: For this, I use Fiber. I suppose using Go’s builtin HTTP router is probably the best approach, but I do like the utility Fiber gives for doing a lot of the things that go beyond what the standard library provides, such as session management and template rendering. Speaking ofā¦
- Server Side Templating: Nothing fancy here. I just use Go’s template engine via Fiber’s Render integration. It has pretty much all I need, so I don’t really look at anything else.
- Database: If I need one, then I’ll first take a look at Sqlite. I use the modernc.org Sqlite driver, as it doesn’t require CGo, making deployments easier (more on that later). If I need something a bit larger, I tend to go with PostgreSQL using the pgx driver. I would also like to use StormDB if I could, but it doesn’t play well with how I like to deploy things, so I tend to avoid that nowadays.
- Database ORM: I don’t really use an ORM (too much PTSD from using the various Java ORMs), but I do use sqlc to generate the Go code that interacts with the database. It’s not perfect, and it does require some glue code which is tedious to write. But what it does it does really well, and it’s better than writing all that SQL marshalling code from scratch.
- Database Migration: I’ve tried using golang-migrate before, and we do use it at work for PostgreSQL databases, but it doesn’t work well with the modernc.org Sqlite driver. So I ended up writing my own. But if it makes sense to use golang-migrate, I will.
- JavaScript: I try to keep my JavaScript usage to a minimum, favouring vanilla JavaScript if I only need a few things. For anything else, I usually turn to Stimulus.js, which adds just enough “magic” for the slightly more involved pieces of front-end logic. I’m also looking at HTMX, and have tried it for a few things, but I’ve yet to use it for a complete project. I use esbuild if I need to bundle my JavaScript, but I’m trying to go “builderless” for most things nowadays, relying on import maps and just serving the JavaScript as is.
- CSS: Much like JavaScript, I still prefer to use vanilla CSS served directly for most things. I tend to start new projects by importing SimpleCSS by Kev Quirk. It makes the HTML look good right out of the gate, but it does make each project look a little “samey” but that’s up to me to address.
- Live Reloading: I’ve only recently been a convert to live reloading. I did use it when I was bundling JavaScript, but since moving away from that, plus doing most things server-side anyway, I needed something that would build the entire app. I’ve started using Air for this, and it’sā¦ fine. There are certain things that I don’t like about it ā particularly that it tends to favour configuration over convention ā but it does the job.
- Deployment: Finally, when I’m ready to deploy something, I do so using Dokku running on a Linux server. I bundle the app in a Docker container, mainly using a Go builder image, and a scratch image for the run-time container (this scratch container has nothing else in it, not even libc, which is why I use the modernc.org Sqlite driver). All I need to do is run
git push
, and Dokku does the rest. Dokku also makes it easy to provision PostgreSQL databases with automated backups, and HTTPS certificates using Lets Encrypt. Deploying something new does involve logging into the remote server to run some commands, but having been burned by PaaS providers that are either too pricy, or not pricy enough to stay in business, I’ve found this setup to be the most stable way to host apps.
On Slash Pages Verses Blog Posts
Interesting discussion on ShopTalk about slash pages and whether blog posts may make more sense for some of them. Chris and Dave makes the point that blog posts have the advantage of syndicating updates, something that static pages lack on most CMSs. It’s a good point, and a tension I feel occasionally. Not so much on this site, but there’ve been several attempts where I tried to make a site for technical knowledge, only to wonder whether a blog or a wiki makes more sense. I’d like the pages to be evergreen yet I also like to syndicate updates when I learn new stuff.
I’ve currently settled on the blog format for now, and it’s fine ā tags tend to help here ā but I wonder if something smarter could be useful here. One idea I have is to have a page with “sections” where each one could be seen as a mini blog post. You add and modify sections over time, and when you do, each section would be syndicated individually. Yet the page will be rendered as a whole when viewing it in the browser. It’s almost like the RSS feed contains diffs for the page, albeit something self contained and readable by humans. There might be a CMS that does this already, I haven’t looked. But I get the sense that most RSS feeds of wiki pages actually contain a diff, or a simple message saying “this page has been updated.” There’s nothing to suggest that what’s out there has this sections semantics.
In lieu of that, I like the idea proposed by Chris and Dave where you basically new versions of these slash pages as blog posts and redirect the slash URL to the latest one, kind of like a bookmark. I may start doing these for some of them, starting with /defaults which is, conveniently, already a blog post.
Project Update: DSL Formats For Interactive Fiction
Still bouncing around things to work on at the moment. Most of the little features have been addressed, and I have little need to add anything pressing for the things I’ve been working on recently. As for the large features, well apathy’s taking care of those. But there is one project that is tugging at my attention. And it’s a bit of a strange one, as part of me just wants to kill it. Yet it seems to be resisting.
About 6 months ago, I started working on some interactive fiction using Evergreen. I got most of the story elements squared away but much of the interactive elements were still left to be done. And as good as Evergreen is for crafting the story, I found it a little difficult tracking down all the scripts I needed to write, debug and test.
So in early November, I had a look at porting this story over to a tool of my own, called Pine Needle (yes, the name is a bit of a rip-off). Much like Evergreen, the artefact of this is a choose-your-own-adventure story implemented as a static webpage. Yet the means of building the story couldn’t be more different. Seeing that I’m more comfortable working with code and text files, I eschewed building any UI in favour of a tool that simply ran from the command line.
But this meant that I needed someway to represent the story in text. Early versions simply had the story hard coded in Go, but it wasn’t long before I started looking a using a DSL. My first attempt was a hand-built one based on Markdown with some additional meta-elements. The goal was to keep boilerplate to a minimum, with the meta-elements getting out of the way of the prose. Here’s a sample of what I had working so far:
// Three dashes separate pages, with the page ID following on.
// Also these are comments, as the hash is reserved for titles.
--- tulips-laundry-cupboard
You open the cupboard door and look at the shelf
above the brooms. There are a couple of aerosol cans up there,
including a red one that says "Begone Insecticide".
You bring it out and scan the active ingredients. There are a
bunch of letters and numbers back there, and none of them have
the word "organic."
\choice 'Take Insecticide' to=tulips-take-insecticide
\choice 'Leave Insecticide' to=tulips-leave-insecticide
--- tulips-take-insecticide
You return to the tulips with the insecticide, and start
spraying them. The pungent odour of the spray fills the air,
but you get the sense that it's helping a little.
\choice 'Continue' to=tulips-end
--- tulips-leave-insecticide
You decide against using the can of insecticide. You put the
can back on the shelf and close the cupboard door.
\choice 'Look Under The Trough' to=tulips-laundry-trough
\choice 'Exit Laundry' to=tulips-exit-laundry
The goal was to have the meta-elements look like LaTeX macros ā for example, \option{Label}{target-screen}
ā but I didn’t get far in finishing the parser for this. And I wasn’t convinced it had the flexibility I wanted. LaTeX macros relies pretty much on positional arguments, but I knew I wanted key-value pairs to make it easier to rely on defaults, plus easier to extend later.
I did imagine a fully LaTeX inspired DSL for this, but I quickly dismissed it for how “macro-heavy” it would be. For reference, here’s how I imagined it:
\screen{tulips-laundry-cupboard}{
You open the cupboard door and lo ok at the shelf
above the brooms. There are a couple of aerosol cans up there,
including a red one that says "Begone Insecticide".
You bring it out and scan the active ingredients. There are a
bunch of letters and numbers back there, and none of them have
the word "organic."
\choice{Take Insecticide}{to=tulips-take-insecticide}
\choice{Leave Insecticide}{to=tulips-leave-insecticide}
}
\screen{tulips-take-insecticide}{
You return to the tulips with the insecticide, and start
spraying them. The pungent odour of the spray fills the air,
but you get the sense that it's helping a little.
\choice{Continue}{to=tulips-end}
}
\screen{tulips-leave-insecticide}{
You decide against using the can of insecticide. You put the
can back on the shelf and close the cupboard door.
\choice{Look Under The Trough}{to=tulips-laundry-trough}
\choice{Exit Laundry}{to=tulips-exit-laundry}
}
I wasnāt happy with the direction of the DSL, so I looked for something else. I briefly had a thought about using JSON. I didnāt go so far as to try it, but the way this could work is something like this:
{"screens": {
"id": "tulips-laundry-cupboard",
"body": "
You open the cupboard door and look at the shelf
above the brooms. There are a couple of aerosol cans up
there, including a red one that says \"Begone Insecticide\".
You bring it out and scan the active ingredients. There
are a bunch of letters and numbers back there, and none of
them have the word \"organic.\"
",
"options": [
{
"screen":"tulips-take-insecticide",
"label":"Take Insecticide",
},
{
"screen":"tulips-leave-insecticide",
"label":"Leave Insecticide",
}
]
}, {
"id":"tulips-take-insecticide",
"body":"
You return to the tulips with the insecticide, and start
spraying them. The pungent odour of the spray fills the air,
but you get the sense that it's helping a little.
",
"options": [
{
"screen":"tulips-end",
"label":"Continue"
}
]
}}
I generally like JSON as a transport format, but it didnāt strike me as a format that suited the type of data I wanted to encode. Most of what this format would contain would be prose, which Iād prefer to keep as Markdown. But this would clash with JSONās need for explicit structure. Setting aside the additional boilerplate this structure would require, all the prose would have to be encoded as one big string, which didnāt appeal to me. Also no comments, especially within string literals, which is a major deal breaker.
So, the current idea is to use something based on XML. This has some pretty significant benefits: editors have good support for XML, and Go has an unmarshaller which can read an XML directly into Go structures. JSON has this too, but I think itās also a pretty decent format for at editing documents by hand, so long as you keep your XML elements to a minimum.
I think one aspect that turned people off XML back in the day was format designerās embrace of XMLās ability to represent hierarchical data without leaning into itās use as a language for documents. The clunky XML documents I had to deal with were purely used to encode structure, usually in a way that mapped directly to an domainās class model. You had formats where you need 10 nested elements to encode a single bit of information that were a pain to read or edit by hand. These were usually dismissed by the designers with promises like, āOh, you wonāt be editing this by hand most of the time. Youāll have GUI design tools to help you.ā But these were awful to use too, and thatās if they were available, which they usually were not (did you know building GUIs are hard?)
If you have an XML format that skews closer to HTML rather than something thatās representable in JSON, I think it could be made to work. So yesterday I had a go at seeing whether it this could work for Pine Needle. Hereās what Iāve got so far:
<?xml version="1.0">
<story>
<screen id="tulips-laundry-cupboard">
You open the cupboard door and look at the shelf
above the brooms. There are a couple of aerosol cans up
there, including a red one that says "Begone Insecticide".
You bring it out and scan the active ingredients. There
are a bunch of letters and numbers back there, and none of
them have the word "organic."
<option screen="tulips-take-insecticide">Take Insecticide</option>
<option screen="tulips-leave-insecticide">Leave Insecticide</option>
</screen>
<screen id="tulips-take-insecticide">
You return to the tulips with the insecticide, and start
spraying them. The pungent odour of the spray fills the air,
but you get the sense that it's helping a little.
<option screen="tulips-end">Continue</option>
</screen>
<screen id="tulips-leave-insecticide">
You decide against using the can of insecticide. You put the
can back on the shelf and close the cupboard door.
<option screen="tulips-laundry-trough">Look Under The Trough</option>
<option screen="tulips-exit-laundry">Exit Laundry</option>
</screen>
</story>
The idea is that the prose will still be Markdown, so things like blank lines will still be respected (the parser strips all the leading whitespace, allowing one to easily indent the prose). Attributes satisfy the key/value requirement for the elements, and I get the features that make this easy to modify by hand, such as comments and good editor support.
I think itās going to work. It would require some custom code, as Goās unmarshaller doesnāt quite like the mix of prose and declared <option>
elements, but I think itās got the bones of a decent format for this interactive fiction. Already Iām coming up with ideas of how to add script elements and decompose fragments into sub-files to make it easier to test.
Iāll talk more about this project in the future if Iām still working on it. I donāt know if the story that started all this will see the light of day. Iāve gone through it a few times, and itās not great. But shipping stuff youāre proud of comes from shipping stuff youāre not proud of, and given how far along it is, it probably deserved to be release in one form or another. Thatās probably why itās been saved from the chopping block so far1.
Gallery of Fake Logo For Test Organisations
In lieu of anything else, I thought I’d put together a gallery of the logos I use for test organisations. IĀ occasionally need to create fake organisations for testing at work, and to add a bit of amusement to the mix, I sometimes make fake logo for them. These logos are typically made using ChatGPT, although if I’m particularly bored, I sometimes touched them up by hand (nothing too drastic, usually things like cropping or adding titles). Most of the fake organisation are film and media production studios, as that’s typically the client base of our product.
I do this mainly for fun, but there is some utility to it. A user can be a member of zero or more organisations, and can change the one they’re acting in at any time. Having a unique avatar for each one helps in distinguishing which one I have active. I do get cute with the names, and for that, I make no apologies. š
2024 Year In Review
Itās a few minutes to 12:00 PM on the 1st January 2025 when I published this. Thanks to time-zones, that means itās just about to turn 12:00 AM one hour to the west of Greenwich, meaning that itās still 2024 in much to the west of the prime meridian. So Iām technically still within the window of time where I could say I got a year in review post out for 2024.
Turns out itās not the first time Iāve used this excuse. Looking at other posts I’ve published on the 1st of January, Iāve done this twice before. And I guess this pattern of posting a year in review on the first of the next year makes some sense: itās usually a quiet day, with nothing open, and Iām usually a little tired and listless1.
That means thereās usually a large block of time available to me, and despite what I wrote yesterday, it is a good practice to do some reflecting, however brief it may be.
So Iād figured Iād might as well drag iA Writer out and scribble out a brief review of the year that was.
Online Presence
I made a point of wanting to cut down the number of domains I acquire in my year in review for 2023. This is still an ongoing progress, but year-on-year, Iām down 2 domains on net, which is an improvement. 2024 saw the acquisition of 7 new domains, of which 2 Iām using for something, and 1 I plan to keep around:
Domains | 2024 | 2023 |
---|---|---|
Registered | 23 | 25 |
With auto-renew turned on | 17 | 16 |
Currently used for something | 15 | 13 |
Not currently for something but worth keeping | 2 | 3 |
Want to remove but stuck with it because itās been shared by others | 0 | 1 |
Iām still trying to keep this blog alive by posting regularly here. Iāve mustāve felt more comfortable with doing so as itās been a record breaking year, with 840 posts, beating the previous record by 594 posts. The initial fear of falling out the practice has subsided to one where I find joy in posting here. Thatās probably why the post count is so much higher.
Of course the quality of a blog doesnāt correlate with oneās ability to āpost the mostā, and I do feel like there have been times where I felt a little blasĆ© about what I write here. I do want to be better here, or at least be a little more conscious about it. But not at the expense of turning this into solely a soapbox/marking/punditry site: thereās plenty of those out there already. So youāll probably continue to see the cringey, irrelevant, lame, and potentially disposable posts here. Iāll just try to make sure that itās balanced out with posts that are actually good.
Some notable posts of the year:
One other thing about blogs: I still have that wandering eye for other blogging CMSs. I did start three other blogs, of which two I shut-down and rolled into this one. That just leaves one new blog created this year that Iām planning to keep separate, mainly because I feel the subject matter warrants a dedicated site.
Projects
2024 didnāt feel like a big project year, probably because most of the projects Iāve started I kept to myself. But I did manage to release a couple this year:
The other things Iāve worked on that I built mainly for myself:
Finally, some of the projects that have been abandoned:
Books And Media
Given that I exceeded my reading goal for 2023, I thought I could push myself a bit more for 2024 and go for finishing 10 books. Sadly, I was nowhere near meeting it. I only got to finishing 4 this year:
(not pictured: Twenty Bits I Learned about Making Websites)
I think I probably started more books than Iāve finished. Not that I have to finish every book Iāve started, but I think my problem is one of focus. The books I have started could be interesting, and I have plans to finish some of them. I just need to spend more time reading.
Iām not a movie person but I did manage to watch a few this year. Here are the ones Iāve posted reviews for:
There was a period of time where I felt burnt out by scripted TV shows, favouring YouTube over much else. I eventually got back into watching a few āhigh production valueā shows, some of which I enjoyed:
And some that I enjoyed far less:
Onwards To 2025
I know itās clichĆ© to look back on the last year and feel pretty crappy about it. And yeah, not every day of your life is going to be great. Theyāve been some rotten days in 2024 that I havenāt included in this review (I have written about them so check out the archive if your curious).
So, was 2024 a good year? Well, Iāll start by saying that it hasnāt been wholly a remarkable year. Thereās no one event that I can point to and say āthis is what made 2024 great.ā Maybe this past year was like that to others, but such events didnāt happen to me2. And recency bias has made it difficult for me to say there were more good days then bad (the last few months have been rough).
But I wouldnāt say 2024 was a bad year. Certainly a busy one, with a lot going on. But on balance, Iād say itās been one of the better ones.
So thatās it, year in review for 2024 done. Have a happy new year and onwards to a great 2025.
Home Screen Of 2024
Itās just turned 3:00 in the afternoon, and I was alternating between the couch and the computer desk, racking my brain on what to do. With no ongoing projects ā a few ideas have been bouncing around, yet none has grabbed me so far, and I had nothing else in a state where I could just slip on some music or a podcast and work on ā and seeing a few others make similar posts on their blogs, Iād figured I talk about my home screens.
I realised that I havenāt actually done this before, mainly because my home screens change very slowly (the background hardly ever). Dramatic changes usually come about when Iām setting up a new phone.
And yet, I do want to talk a little about the apps I have at the moment, and I did want to make sure I had a record of how the home screens looked. And seeing that I needed to keep myself occupied doing something, now is as good a time as any.
Screen One
This screen contains two widgets ā the date and weather widget at the top, and the calendar widget on the right ā plus a small collection of apps placed deliberately where they are. The apps I have here are not necessarily the most used (although two of them are) but I like having easy access to them for various reasons.
Aside from the widgets, the apps I have on this screen ā from left to right, top to bottom ā are as follows:
The items in the dock are as follows:
Screen Two
A grab-bag of apps I frequently use. Some of them probably should be on the first screen, but since real-estate is at a bit of a premium I just keep them here, and swipe over when I need them.
From left to right, top to bottom, the apps on this screen is as follows:
Screen Three
This is a screen I hardly ever used, as itās mainly reserved for apps that are useful while travelling. The Booking.com app and Emirates apps I can probably remove: I was using them mainly to track flights and accomodation during my European trip last year.
The only one worth keeping is Airalo, which allows you to buy and setup data SIMs that work overseas. This has been really useful to me during my last couple of trips, and I hope to keep using it for trips in the future. It doesnāt offer a lot of data, but any data is better than zero data, as my friends ā who continued asking to use my data when weāre out of WiFi range ā can attest.
2024 Song of The Year
It’s Christmas Eve once again, which means it’s time for the Song of The Year for 2024. Looking at the new and rediscovered albums for the year, there are quite a few to choose from.
The runners up are pretty much all from Lee Resevere, a new artist I’ve started listening to, and includes:
But there can only be one winner, and this year it’s Oxygene, Pt. 20 by Jean-Michel Jarre. š
Oxygene is actually an album in my regular rotation, but I always stopped listening to it after Part 19. The strange organ at the start of Part 20 put me off. But one day this year, feeling a little down, I decided to work my way through it and give it a listen, and after the 30 or so seconds, it turned into quite a lovely piece. A nice contrast to the rest of the disk, and a suitable conclusion to the album itself. I’ve even grown to like the organ at the start.
Honourable Mentions this year include:
An actually bumper crop this year in terms of music. Let’s hope 2025 is just as good.
That Which Didn't Make The Cut
I did a bit of a clean-up of my projects folder yesterday, clearing out all the ideas that never made it off the ground. I’d figured it’d be good to write a few words about each one before erasing them from my hard drive for good.
I suppose the healthiest thing to do would be to just let them go. But what can I say? Should a time come in the future where I wish to revisit them, it’d be better to have something written down than not. It wouldn’t be the first time I wished this was so.
Anyway, here are the ones that were removed today. I don’t have dates of when these were made or abandoned, but it’s likely somewhere between 2022 and 2024.
Interlaced
This was an idea for a YouTube client1 that would’ve used YouTube’s RSS feeds to track subscriptions. The idea came about during a time when I got frustrated with YouTube’s ads. I think it was an election year and I was seeing some distasteful political ads that really turned me off. This would’ve been a mobile app, most likely built using Flutter, and possibly with a server component to get this working with Chromecast, although I had no idea how that would work.
This never got beyond the UI mock-up stage, mainly because the prospect of working on something this large seemed daunting. Probably just as well, as YouTube solved the ads problem for me, with the release of YouTube Premium.
Red Crest
I thought I could build my own blogging engine and this is probably the closest I got (well, in recent years). This project began as an alternative frontend for Dave Winer’s Drummer, rendering posts that would be saved in OPML. But it eventually grew into something of it’s own with the introduction of authoring features.
I got pretty far on that front, allowing draft posts and possibly even scheduled posts (or at least the mechanics for scheduled posts). One feature I did like was the ability to make private posts. These would be interleaved with the public ones once I logged in, giving me something of a hybrid between a blogging CMS and a private journal. It was also possible to get these posts via a private RSS feed. I haven’t really seen a CMS do something quite like this. I know of some that allow posts to be visible to certain cohorts of readers, but nothing for just the blog author.
In the end, it all got a bit much. I started preparing the screen for uploading and managing media, I decided it wasn’t worth the effort. After all, there were so many other blogging CMS’s already out there that did 90% of what I wanted.
Reno
As in “Renovation”. Not much to say about this one, other than it being an attempt to make a Pipe Dreams clone. I think I was exploring a Go-based game library and I wanted to build something relatively simple. This didn’t really go any further that what you see here.
SLog
Short for “Structured Log”. This was a tool for reading JSON log messages, like the ones produce by zerolog. It’s always difficult to read these in a regular text editor, and to be able to list them in a table made sense to me. This one was built for the terminal but I did make a few other attempts building something for this; one using a web-based GUI tool, and another as a native MacOS app. None of these went very far ā turns out there’s a lot of tedious code involved ā but this version was probably the furthest along before I stopped work.
Despite appearing on this list, I think I’ll keep this one around. The coding might be tedious, but I still have need something like this, and spending the time to build this properly might be worth it one day.
Miscellany
Here are all the others that didn’t even get to the point that warranted a screenshot or a paragraph of text:
I’m sure there’ll be more projects down the line that would receive the same treatment as these, so expect similar posts in the future.
A Summer Theme
Made a slight tweak to my blog’s theme today, to “celebrate” the start of summer.
I wanted a colour scheme that felt suitable for the season, which usually means hot, dry conditions. I went with one that uses yellow and brown as the primary colours. I suppose red would’ve been a more traditional representation of “hot”, but yellow felt like a better choice to invoke the sensation of dry vegetation. I did want to make it subtle though: it’s easy for a really saturated yellow to be quite garish, especially when used as a background.
My original idea was to use yellow as the link colour, but there wasn’t a good shade that worked well with a white background that had a decent contract1. So I pivoted, making the background yellow instead, and throwing in a brown for the link colour. That improved the contrast dramatically, and helped to make the theme a little more interesting.
One thing I did do was make it conditional to the data-theme
attribute in the html
tag, leaving me the option of adding a theme picker in the future. If you’re interested in the CSS, here it is:
:root[data-theme="summer"] {
--background: #FFFEF5;
--link: #895238;
--link_visited: #895238;
}
@media (prefers-color-scheme: dark) {
:root[data-theme="summer"] {
--text: #f8f8f2;
--link: #fce98a;
--link_visited: #fce98a;
--background: #30302a;
}
}
I plan to keep this theme for the next three months, then look at changing it again when summer turns into autumn. It’s probably not a great colour scheme, as I generally don’t have the patience for making minute adjustments to get the style “just right”. I guess it follows on from my feeling of the season: I generally don’t like summer and I just want to get it over with. Perhaps doing something small like this is a way of enjoying it a little more.
Delta of the Defaults 2024
It’s a little over a year since Dual of the Defaults, and I see that Robb and Maique are posting their updates for 2024, so I’d thought I do the same. There’ve only been a few changes since last year, so much like Robb, I’m only posting the delta:
Looking At Coolify
While reading Robb Knight’s post about setting up GoToSocial in Coolify, I got curious as to what this Coolify project actually is. I’m a happy user of Dokku, but being one with magpie tendencies, plus always on the lookout for ways to make the little apps I make for myself easier to deploy, I thought I’d check it out.
So I spun up a Coolify instance on a new Hetzner server this morning and tried deploying a simple Go app, complete with automatic deployments when I push changes to a Forgejo repository. And yeah, I must say it works pretty well. I haven’t done anything super sophisticated, such as setting up a database or anything. But it’s almost as easy as deploying something with Dokku, and I’m please that I was able get it working with my Forgejo setup1.
Anyway, this post is just a few things I want to make a note about for next time I want to setup a Coolify instance. It’s far from a comprehensive set-up guide: there’s plenty of documentation on the project website. But here are a few things I’d like to remember.
Changing the Proxy to Caddy: Soon after setting up your Coolify instance, you probably want to change the proxy to Caddy, just so that you can easily get Lets Encrypt certificates. Do this before you setup a domain as you’ll need direct access to Coolify via the port.
Go to “Servers ā localhost” and in the “Proxy” tab, stop the current proxy. You then have the option of changing it to Caddy.
Setting Up a Domain For Coolify Itself: Once you’ve change the proxy, you’d probably want to setup a domain so as to avoid accessing it via IP address and port number. You can do so by going to “Settings,” and within “Instance Settings” changing “Domain”.
If you prepend your domain with https
, a certificate will be setup for you. I’m guessing it’s using Lets Encrypt for this, which is fine. I’d probably do likewise if I had to set it up manually.
Deploying From a Private Forgejo Repository: To deploy from a private Forgejo repository, follow the Gitea integration instructions on setting up a private key. This is basically creating a new key in “Keys And Tokens”, and adding it as a key in Forgejo.
As far as I’m aware, it’s not possible to change an application source from a public Git repo to a private one. I tried that and I got a few deploy errors, most likely because I didn’t set the key. I had to delete it and start from scratch.
Setting a Domain For a Project: Setting up a domain is pretty simple: just add a new A record pointing to the IP address of the service the application is running on. Much like the Coolify domain, prefacing your domain with https
will provision a TLS certificate for you (docs):
Unlike Dokku, your app doesn’t need to support the PORT
environment variable. You should be able to start listening on a port and simply setup a mapping in the project page. The default seems to be port 3000, just in case you’re not interested in changing it:
Automatic Deployments From Forgejo: Coolio looks to have some nice integrations with Github, but that doesn’t help me and my use of Forgejo. So the setup is a little more manual: adding some web-hook to automatically deploy when pushing commits to Forgejo. In Coolify, you’d want to use the Gittea web-hook:
You’ll need to generate the web-hook secret yourself. Running head -c 64 /dev/urandom | base64
or similar should give you something somewhat secure.
Setting up the web-hook on Forgejo’s side was a little confusing. Clicking “Add Webhook” just brought up a list of integrations, which I’m guessing are geared towards particular form of web-hook payloads. You want to select the “Forgejo” one.
Use the URL that Coolify is showing for the Gittea web-hook, leave the method as “POST” and set the secret you generated. The rest you can configure based on your preferences.
So that it. So far I’m liking it quite a bit, and I look forward to going a bit further than simple Go apps that serve a static message (some of the pre-canned applications look interesting). I’d like to try it for a bit longer before I consider it as a replacement for Dokku, but I suspect that may eventually happen.
Cropping A "Horizontal" PocketCast Clip To An Actual Horizontal Video
Finally fixed the issue I was having with my ffmpeg incantation to crop a PocketCast clip. When I was uploading the clip to Micro.blog, the video wasn’t showing up. The audio was fine, but all I got for the visuals was a blank void1.
For those that are unaware, clips from PocketCast are always generated as vertical videos. You can change how the artwork is presented between vertical, horizontal, or square; but that doesnāt change the dimensions of the video itself. It just centers it in a vertical video geared towards TikTok, or whatever the equivalent clones are.
This, I did not care for. So I wanted to find a way to crop the videos to dimensions I find more reasonable (read: horizontal).
Here’s the ffmpeg command I’m using to do so. This takes a video of the “horizontal” PocketCast clip type and basically does a crop at the centre to produce a video with the 16:9 aspect ratio. This post shows how the cropped video turns out.
ffmpeg -i <in-file> \
-vf "crop=iw:iw*9/16:(iw-ow)/2:(ih-oh)/2, scale=640:360" \
-vcodec libx264 -c:a copy <out-file>
Anyway, back to the issue I was having. I suspect the cause was that the crop was producing a video with an uneven width. When I upload the cropped video to Micro.blog, I’ve saw in the logs that Micro.blog was downscaling video to a height of 360. This was using a version of the command that didnāt have the scale
filter, and the original clip was 1920 x 1080. If you downscale it while maintaining the original 15:9 aspect ratio, the new dimensions should be 640 x 360. But for some reason, the actual width of the cropped video was 639 instead.
Iām not sure if this was the actual problem. I had no trouble playing the odd-width video in QuickTime. The only hint I had that this might be a problem was when I tried downscaling in ffmpeg myself, and ffmpeg threw up an error complaining that the width was not divisible by two. After forcing the video size to 640 x 360, and uploading it to Micro.blog, the video started coming through again. So there might be something there.
Anyway, it’s working now. And with everything involving ffmpeg, once you get something working, you never touch it again. š
WeblogPoMo AMA #3: Best Music Experience
I’m on a roll with these, but I must warn you, this streak may end at any time. Anyway, todays question is from Hiro who asked it to Gabz, and discovered via Robb:
@gabz Whatās the best music-related experience of your life so far?
Despite attending only a hand-full of concerts in my life ā live music is not really my jam ā I’ve had some pretty wonderful music-related experiences in my life, both through listing to it or by performing it. Probably my most memorial experience was playing in the pit orchestra for our Year 10 production of Pippin. This was during the last few weeks before the show opened and we attended a music camp for a weekend to do full day rehearsals with the music director. The director had a reputation of being a bit of a hard man, prone to getting a bit angry, and not afraid to raise his voice. It was intimidating to me at the time, but in hindsight I can appreciate that he was trying to get the best from us. And with us being a group of teenage boys who were prone to loosing focus, I think we were deserving of his wrath.
One evening, we were rehearsing late, and the director was spending a lot of time going through some aspect of the music. I can’t remember what was being discussed but it was one of those times where everyone was tired, yet each knew what they were meant to be doing and was still happy to be working. You feel something special during those moments, when the group was doing their best, not out of coercion but because we were trying to “get the work done”.
Probably a very close second was discovering Mike Oldfield for the first time. This was probably when I was 11 or 12, and I wasn’t a bit music listener back then (I mean, we did have a home stereo but I wasn’t listening to a walkman or anything like that). Dad was working one night and I came up to him. He then started playing track 1 of Tubular Bells II, thinking that I would appreciate it. I was more intrigued at first, as it wasn’t the type of music I was use to at the time: long, instrumental pieces. Yet I found it to be decent, and something I could see myself liking the future1. He then played track 7, and I was absolutely hooked after that.
WeblogPoMo AMA #2: One Thing I Wish I Could Change About Myself
Here’s my answer to another question asked by Annie for WebogPoMoAMA. This was previously answered by Keenan, Estebanxto, Kerri Ann, and Lou Plummer:
If you could instantly change one internal pattern/thing about yourself, what would it be?
My answer is that I wish I found it easier meeting new people. Not only am I quite introverted, I’m also really shy, and I find it extremely hard to introduce myself to new people in social situations. That is, if I ever find myself going to these social situations. I rarely do, and if I do attend, I usually stay quietly to the side, keeping with company that I know. It was at one time bad enough that I’d find excuses to avoid going out to see those I do know.
I’m trying to get better at this. For starters, I’m no longer staying away from friends, and I am trying to make the effort of going to more social events as they come. It’s still not great though, and I do struggle when being around a group of strangers. I guess the secret is just practice, and maybe trying to make a game of it: setting goals like saying hello to at least one new person every hour or so. I don’t think I’ll ever get over my shyness, but I’m hoping I can find away to at least manage it a little better than I have been.
Phaedra, The lmika Track Arrangement
I recently learnt that the version of Phaedra I’ve been listening to for the past 15 years had not only the wrong track order, but also the wrong track names. This is not entirely surprising, given how this version wasā¦ ah, acquired.
But after learning what the order and names should’ve been, I think I still prefer my version. And yes, that’s probably because I’m use to it, but if the official album were to have these names and this order, I think it would actually work really way. I may go so far as to say that if I got a copy of the official album, I’d probably change it to match the version I been listening to.
In case your curious, here’s how the tracks are named in my version:
Official Version | lmika Version |
---|---|
Phaedra | Mysterious Semblance At The Strand Of Nightmares |
Mysterious Semblance At The Strand Of Nightmares | Phaedra |
Movements Of A Visionary | Sequent ‘C’ |
Sequent ‘C’ | Movements Of A Visionary |
I’m actually a little surprised that my version of Sequent ‘C’ is officially called Movements Of A Visionary and visa-versa. The name Movements Of A Visionary gives it a more mysterious feeling, which fits well with the small, soft, reverb-filled piece of music that it is. As for the track with has that name officiallyā¦ well I just assumed the name Sequent ‘C’ made the most logical sense for a piece of music with a sequencer in the key of C. I don’t have an explanation for Phaedra or Semblance other than “long piece == long title,” but Phaedra just feels like a title that fits better for a piece of music that predominantly features a mellotron.
The tracks in the version I listen too are arrange in the following order:
No. | Official Version Name | lmika Version Name |
---|---|---|
1. | Sequent 'C' | Movements Of A Visionary |
2. | Phaedra | Mysterious Semblance At The Strand Of Nightmares |
3. | Mysterious Semblance At The Strand Of Nightmares | Phaedra |
4. | Movements Of A Visionary | Sequent 'C' |
The fact that Phaedra is the first track in the official version make sense, given that on vinyl it would’ve taken up an entire side, but I reckon starting the album with a small, soft piece ā acting almost like a prelude ā whets the appetite for the heavier stuff. This would be track two, which is 17 minutes long, and is quite dynamic in it’s contract across the piece. You then climb down from that into what I thought was the title track which ā given that it appears as the third one in my version ā gives the artists an opportunity to have a something simpler to act as the centrepiece of the album. Then you end with a relatively lively piece with a driving sequencer, that finishes with a decisive C(7) chord, making it clear that the album is now over.
So that’s how I’d name and arrange the tracks in this album. I don’t want to say that Tangerine Dream got it wrong butā¦ they did get it pretty wrong. š
My Favourite Watch
Seeing all the nostalgia for digital watches of the ’90s and early 2000s, following the release of retroest desk clock shaped like a large Casio digital watch, it got me thinking of the watches I owned growing up. I started off as a Casio person but I eventually moved on to Timex watches. I was pretty happy with all the watches I owned, but my favourite was the Timex Datalink USB Sports Edition, which stood head and shoulders about the rest.
Not only was this watch featureful out of the box ā having the usual stopwatch, timers, and alarms ā it was also reprogrammable. There was some Windows software that allowed you to install new modes and arrange them in the mode menu. I remember a few of these, such as a mode allowing you to browse data arranged in a tree; a simple note taking mode; and a horizontal game of Tetris.
There was also an SDK, allowing you to build new modes in assembly. I remember building a score keeping mode, where you could track points for a game between two or four competitors, with an optional auxiliary counter used to keep track of things like fouls. I also remember building a dice rolling mode, allowing you to roll up to 6 dice, with each dice having between 2 to 9 sides, and the total automatically being displayed to you.
I never used these modes for anything ā I’m neither sporty nor much of a gamer to have any real need for tracking scores or rolling multiple dice ā but they were super fun to build, and I got a fair bit of experience learning assembly from it. And the SDK was pretty well built, with predefined entry points for the mode, reacting to events like button presses, and displaying things on the LCD. The fact that the SDK came with a random-number generator, which wasn’t even used with any of the built-in modes, just showed how well Timex thought about what was possible with this watch.
This was the last watch I regularly wore: I’ve moved to using phones to keep track of time. But it was a great watch while it lasted.
Why I Keep Multiple Blogs
Kev Quirk wrote a post yesterday wondering why people have multiple blogs for different topics:
A few people I follow have multiple blogs that they use for various topics, but I don’t really understand why. [ā¦] I personally prefer to have a single place where I can get all your stuff. If you’re posting about something I’m not interested in, I’ll just skip over it in my RSS feed. I don’t have to read everything in my feed reader.
Iāve written about this before, and after taking a quick look at that post, most of those reasons still stand. So if youāve read that post, you can probably stop reading this one at reason number two (unless youāre listening to the audio narration of this, in which case, please listen on as that last post predated that feature š).
Iām currently keeping four separate blogs: this one, one for checkins to places Iāve visited, one for remembering how to do something for work, and one for projects Iām working on1. This arrangement came about after a few years of spinning out and combining topics to and from a single blog, generally following the tension I felt after publishing something, wondering if that was the right place for it. As strange as it is to say it, this multi-blogging arrangement gives me the lowest amount of tension for writing online.
There are a few reasons for this. First is that for certain topics, I like an easy way to reference posts quickly. This is the primary reason why I keep that work-related reference blog, so that when I’m faced with a software-related problem I know I’ve seen in the past, I can quickly lookup how I solved it. Iāve tried keeping those posts here, but it was always difficult finding them again amongst all the frequent, day-to-day stuff.
It mainly comes down to the online reading experience. Categories can only do so much, and thatās if Iām categorising posts rigorously, which is not always the case. Here, the posts are displayed in full, encouraging the reader to browse. But for my reference blog, a list of bare links works better for going directly to the post I need.
The second reason is the writing experience. For me, certain CMSes work better for certain types of posts. Micro.blog works well for micro-posts or mid-sized posts like this one, but for longer ones, I prefer the editors of either Scribbles or Pika. I donāt know why this is. Might be because all the code-blocks I tend to use on those blogs are easier to write using a WYSIWYG editor rather than Markdown.
And finally, itās a good excuse to try out multiple CMSes. I have no rational explanation for this one: itās an arrangement that costs me more money and requires learning new software. Might be that I just like the variety.
So thatās why I keep multiple blogs. I do recognise that it does make it harder for others to find my writing online, not to mention following along using RSS. But thatās a tradeoff Iām willing to make for a writing and reading arrangement that works better for me. Of course, like I said in my previous post, this might change in due course.
On Panic, iA, and Google Drive
I see that Panic is shutting down their Google Drive integration in their Android app, much like iA did a few weeks ago. This doesn’t affect me directly: even though I am a user of both Android and Google Drive, I regret to say that I don’t use apps from either company on my phone (I do use a few things from both on my Apple devices).
But I do wonder why Google is enacting policies that push developers away from using Drive as general purpose user storage. That’s what Drive was meant to be used for, no? Does Google not think that by adding these security conditions, and not getting back to developers trying to satisfy them, is maybe pushing the scale between security and usefulness a bit too far out of balance? Are they thinking through the implication of any of this at all?
If you were to ask me, my guess would probably be that no, they’re not thinking about it. In fact, I get the sense that they’re making these decisions unconsciously, at least at an organisation level. Probably someone said to the Drive devision that they need to “improve security” and that their performance will be measured against them doing so. So they drafted up these conditions and said “job done” without thinking through how it may affect the actual usefulness of Drive.
And it just reveals to me how large Google is, possibly too large to know why they do anything at all. It’s not like they’re being malicious or anything: they’re a victim of their own success, with way too many product lines making zero dollars that distract them from their raison d’ĆŖtre, which is getting that sweet, sweet ad money. After-all, what does Drive matter to Google in terms of increasing advertising revenue? It’s probably a division making a loss more than anything else.
I suppose, given that I do use both Drive and Android, that I should care more about it. And yeah, I care enough to write about it, but that’s barely above the level of mild curiosity I’m feeling as to why Google is letting this happen. Might be that I’ve just gotten numb to Google not caring about their own products themselves.
Passing
Three nights ago, and two months before her 94th birthday, my Nonna, my maternal grandmother, suffered a stroke. She’s now in palliative care and there’s no telling how much longer she has left. Over the last few years she was slowing down, yet was still quite aware and was able to do many things on her own, even travel to the shops by bus. She had a scare over the weekend but was otherwise in reasonably good health. So all of this is incredibly sudden.
I was unsure as to whether or not I wanted to actually write this post. I did have a draft planned yesterday, with the assumption that she wouldn’t make it through the night. Delaying it any further did not seem right. Neither is making this an eulogy or display of public grief ā that’s not how I like to do thing. But to not acknowledge that any of this is happening felt just as wrong, at least for now.
But what seemed right was a public declaration that I love her and I’ll miss her. I consider myself lucky to have said that to her in person, while she was lucid.
So, what now? Timelines at this stage are uncertain. Would it be hours? Days? Who can say. I guess following that would be the funeral and other matters pertaining to the estate, but that won’t happen for a week or so. What about today? Does one simply go about their day as one normally would? Does life go on? Seems wrong that it should be so, yet I’m not sure there’s anything else that I’m capable of doing. Just the daily routine smeared with sadness and loss.
I heard someone say that grief comes from love, that you can’t have one without the other. I can attest to that, but the edges of that double-edge sword are razor sharp. I know that eventually the pain will dull, and all that would remain are the memories. All it takes is time.
Tools And Libraries I Use For Building Web-Apps In Go
I think I’ve settled on a goto set of tools and libraries for building web-apps in Go. It used to be that I would turn to Buffalo for these sorts of projects, which is sort of a “Ruby on Rails but for Go” type of web framework. But I get the sense that Buffalo is no longer being maintained. And although it was easy to get a project up and running, it was a little difficult to go beyond the CRUD-like layouts that it would generate (or it didn’t motivate me enough to do so). Plus, all that JavaScript bundlingā¦ ugh!
Huge pain to upgrade any of that.Since I’ve moved away from Buffalo, I’m now left to do more of the work up-front, but I think it helps me to be a little more deliberate in how I build something. And after getting burned with Buffalo shutting down, I think it’s was time to consider a mix of tools and libraries that would give me the greatest level of code stability while still being relatively quick to get something up and running.
So, here’s my goto list of tools and libraries for building web-apps in Go.
So, that’s my setup. It’s a collection that’s geared towards keeping the code low maintenance, even if it may come at the cost of scalability. I can’t tell you anything about that myself: I’m not running anything that has more than a couple of users anyway, and most things I’m running are only being used by myself. But I think that’s a problem for later, should it ever arise.
Micro-fiction: Get A Horse
Trying something new here. I came up with the concept of this short-story while riding home on the tram yesterday. The rest of it sort-of fell into place when I woke up at 5AM this morning, unable to get back to sleep. Hope you enjoy it.
Josh was riding the scooter on the city footpath, not trying super hard to avoid the other pedestrians. He was going at a speed that was both unsafe and illegal, but it was the only speed he knew that would prevent that horse from showing up. Besides, he had something that he needed to do, and it was only at such reckless speeds that he knew that that thing would work. Well, he didnāt know; but being at his wits' end after trying everything else, he had to try this. He picked his target ahead and sped up towards it. Good thing he was wearing his helmet.
Josh never used these sorts of scooters before the collision two weeks ago. He was walking to work that day, when he saw someone on such a scooter coming towards him, helmet on head. The rider was going a ridiculous speed, and Josh tried to get out of his way as he approached, but the scooter driver turned towards him, not slowing down at all. Josh tried again but was not fast enough. The scooter rider ran straight into him and bowled him over onto the footpath. Before Josh could gather himself, the scooter rider slap his helmet onto Josh’s head and shouted, āGet a horse!ā He got back onto the scooter and sped away.
Josh got up, fighting the various aching muscles from the fall. He dusted himself down, took the helmet from his head and looked at it. It was very uncharacteristic of those worn by scooter riders. Most of them were plastic things, either green or orange, yet this one was grey, made of solid leather that was slightly fuzzy to the touch. Josh looked inside the rim and found some printed writing: Wilkinsons Equestrian Helmet. One side fits all. The one was underlined with some black marker.
Josh put the helmet in his backpack and was about to resume his commute, when he stopped in place. Several metres away, a white horse stood, staring at him. Or at least it looked like a horse. The vision was misty and slightly transparent, giving the sense that it was not real. Yet after blinking and clearing his eyes, it didnāt go away. Josh started to move towards it, and when he was just within arms reach, it disappeared. Josh shook his head, and starting walking. But when he turned the next corner, there it was again: a horse, standing in the middle of the footpath several metres away, staring at him intently.
Since that day that horse has been haunting Josh. On his walk, at his workplace, in his home, even on the tram. Always staring, always outside of reach. Either standing in his path or following close behind him. The vision will go whenever Josh approached it, only to reappear when he turned to look in another direction. Naturally, no one else could see it. When that horse was in a public place, people seemed to instinctively walk around it. Yet when he asked them if they could see it, they had no idea what he was talking about. But Josh couldnāt do anything to stop seeing it. At every waking hour of the day, from when he got out of bed to when he got back in, there it was, always staring. Never looking away.
And he knew it had something to do with that helmet. He tried a few things to dispel the vision, such as leaving the helmet at home or trying to give to random strangers (who always refused it). Yet nothing worked to clear the vision. That is, nothing other than what had worked on him. Now was the time to test that theory out.
His target was ahead, a man in a business suit walking at a leisurely pace. He had his back to Josh, so he couldn’t see Josh turn his scooter towards him and accelerate. The gap between them rapidly closed, and Josh made contact with the man, slowing a little to avoid significant injury, but still fast enough to knock him over. Josh got off the scooter and stood by the man, sprawled on the footpath. Once again the horse appeared, as he knew it would. He looked down to see the man starting to get up. Josh had to go for it now! He took his helmet from his head, slapped it on the man and shouted, āGet a horse!ā
Josh got back on the scooter and sped away for few seconds, then stopped to look behind him. He saw the man back on his feet, helmet in hand, looking at it much like Josh did a fortnight ago. He saw the horse as well, but this time it had its back to Josh, staring intently at the man, yet Josh could see that the man hasn’t noticed yet. He could see the man put the helmet by side of the road and walk away, turning a corner. The horse was fading from Josh’s eyes, yet it was still visible enough for Josh to see it follow the man around the corner, several metres behind.