View from the Strachan bridge towards CN Tower

This post comes a day late due to a valuable lesson: editing a reusable WordPress block after inserting it into a post will cause it to be completely reset and lose everything upon page reload, autosave be damned! 🙃


It’s a strange kind of season. As if on cue, the leaves started to turn yellow-red on Sept 1, yet it’s still bloody hot during the day (for me). The cooler mornings and nights are very welcome, though. I forgot how oppressive the summer heat can be. It’s kinda taken me by surprise this year. The lack of shade around our new neighbourhood has kept me indoors through most of July and August. I’m starting to prepare myself for next year, where I intend to spend more time outdoors despite the uncomfortable heat.


🏠 Remote work

My workplace is pretty chill about “working hours”, so I’ve decided to take advantage of it and make a slight change to start and end an hour early. I’ve become more of an early riser over the years, so I’m hoping it’ll help me get some focused work done in the morning. More crucially, I’m hoping that ending at 4pm will give me a bit more time to run any personal errands before the mad rush hits at 5. It’s a struggle to stop work, though. The momentum is strong, and I’ve always found it hard to transition from the certainty of work-related tasks to the big mess that is the rest of my life. My strategy right now is to add a reminder first thing in the morning for a simple personal task to complete exactly at 4pm, like “do dishes” or “take out organics”. Anything that can be done quickly and won’t be so overwhelming that I’m tempted to keep working. It’s been helpful for the few days I’ve been doing it!

📚 Readwise Reader

I got an invite to the beta of Readwise Reader, and I love it. It’ll definitely replace Pocket for me. Maybe if feed management gets better, and if it gains the ability to pull in full articles from excerpted RSS feeds, I may ditch Inoreader too. The workflow Reader aims for is perfect for me. Intake everything quickly (via their extension or mobile apps), then either process immediately, highlighting for future spaced recall as needed, or send to “later” or “archive”. There’re keyboard shortcuts for everything important. Cross-device sync, including reading position, just works. It’s great! One tiny feature that I didn’t know I needed is the ability to navigate an article paragraph by paragraph using up/down keys. Maybe it’s just the novelty of it, but it feels good to progress through a long article.

🌊🛹 Surfskating the Bentway

Got out with C+A on Sunday to surfskate The Bentway. I can’t believe I’ve never been there despite living a walking distance away for years. It’s a lovely little public skating spot for beginners. No rails or bowls here. Just a flat, evenly paved figure eight of a track, with plenty of seating, and an indoor bathroom (important!). It wasn’t nearly as crowded as I expected, and the vibe was chill. Will definitely be coming back in the future.

The Bentway skating park

💠 Misc

  • Totally stealing the idea from Winnie Lim, I started keeping a changelog for the site itself. Will probably link to it from the footer next.
  • Reading
  • Watched
    • Rings of Power / House of Dragon. These are feel-good / feel-bad, respectively. I’m not particularly invested in either, but they’re good entertainment to share with my partner.
  • Played
    • Still enjoying Death Stranding. Haven’t been able to play it very much lately, but whenever I do I always have a great time. I kinda want to savour it!
    • On the other hand, I’m probably going to play Horizon: Forbidden West on Story difficulty. I want to fast-forward through the frequent and repetitive combat, which I find kind of cruel, possibly due to my tendency to anthropomorphize the mechanical creatures. Like, really, you want me to shoot off the wings and talons off this majestic bird before looting its short-circuiting, glitching, smoking corpse? 🤮
    • Surprisingly, I found a Zelda game that I like: Link’s Awakening! 🛡️ The tilt-shift camera and glossy, rounded character models make it appropriately cute for the story and setting.
    • Also enjoying Luigi’s Mansion 3. I’ve only played an hour, but all I want to do is hoover up all the things!

I learned about difftastic today, which aims to show differences between files while being aware of the underlying programming language used in said files (if any).

Structured diff output with difftastic on a change in Mailhog
Structured diff output with difftastic on a change in Mailhog

It’s basically magic when it works!

I generally like the built-in diff in the JetBrains suite of IDEs. The one I use these days is GoLand, but I believe they all support adding an external diff tool. Since difftastic is a console app, here’s what I had to do on my Mac:

  1. brew install difftastic # install the tool
  2. Install ttab using their brew instructions. This allows GoLand to launch a new tab in iTerm and run the difft command there. Otherwise, using the External Diff Tool in Goland would appear to do absolutely nothing, as the output of the tool isn’t displayed natively.
  3. Configure the external diff tool using the instructions for GoLand.
    1. Program path: ttab
    2. Tool name: Difftastic (but can be anything you like)
    3. Argument pattern: -a iTerm2 difft %1 %2 %3
      1. The “-a iTerm2” is to ensure that iTerm is used instead of the default Terminal app.

Now you can click this little button in the standard GoLand diff view to open up the structural diff if needed:

Screenshot of GoLand's diff viewer with a highlight around the external diff tool button

Ideally the diff would be integrated into GoLand, but I don’t mind it being an extra click away, since difftastic doesn’t work reliably in many situations (particularly large additions or refactorings).

Landscape from Death Stranding

🌐 General

A somewhat slow week on personal projects and learning as more of my time has been dedicated to my full-time job, which is a frequent-enough occurrence that I probably won’t mention it here again.

📦 Death Stranding

Maybe it’s the cool overcast couple of days we’ve had here, which mirrors the game’s mood, but I’ve been really enjoying playing Death Stranding this week. I was initially repulsed by its nonsensical premise, convoluted plot, and terrible on-the-nose naming for everything and everyone. I’m really glad I gave it a shot after all, because this game’s got soul.

Walking across its lonely, grey landscapes gives me that same “wistful explorer” feeling that I got from the original Mass Effect UNC missions. It’s just you and the environment for extended periods of time—a meditative experience. It’s balanced really well with its tightly integrated multiplayer component, which brings other players’ creations into my world. It’s easy and free to provide positive acknowledgement of their contributions and to help each other complete missions or build structures. All this supports the theme of connection and cooperation, which despite the dystopian backdrop puts this game squarely into “optimistic scifi” category for me. It feels good to play it.

The game also has a lot of what I consider respect for the player:

  • Apart from the Save function being a bit buried, menus are quick to load and navigate. Everything you need to use quickly has shortcuts. Surprisingly many games get this wrong. I remember being annoyed with Witcher 3’s menu system, which was slow to load but had to be opened frequently even during combat.
  • Avoiding repetitive encounters. Since the main game loop is ferrying packages back and forth between points on the map, it could be frustrating to constantly be running into the same enemy encounters, but Death Stranding avoids this trap. Passing through a field of BTs seems to happen only on the initial approach to a mission waypoint. I remember completing a mission like that, then getting another mission to navigate back through the same area and bracing for the inevitable repeat of the same encounter, but feeling pleasantly surprised at its absence.
  • Inventory management can be fun for some, but there’s a button to just “do it for me”, which I appreciate.
  • Same with balancing while moving on foot. It’s a neat mechanic that could be rewarding to master, but sometimes I just don’t want to worry about it, and the game provides an easy way to do that (hold L2+R2).
  • Saving defaults for deliveries and photo mode settings.

… and many others. All these little touches make what could be a boring walking simulator an experience that stays interesting and rewarding. I’ve had a hard time putting this game down!

Death Stranding screenshot of a woodsy area.
Approaching Wind Farm in Death Stranding

✨ Server-Driven UIs

Did a little bit of reading about these, trying to understand why as an industry we’re seemingly reinventing HTML+CSS+JavaScript. Some resources I found useful:

There’re many SDUI frameworks out there already:

I suspect the big tech companies that built their in-house SDUIs will open source them eventually, or another open source framework will be released separately, and there will be a convergence of sorts. It seems like a generic-enough problem.

Overall, I feel that Apple and Google are at least partially responsible for the thin->thick->thin client swings. They had an opportunity early on to take existing Web formats and make them work for their mobile OSs, but they chose to build custom platforms instead. The trifurcation of UIs was unnecessary. My hope is that someone figures out how to take HTML+CSS+JS and convert that into native components on mobile, so we could converge again on technologies that aren’t owned by big corps.

💠 Misc

  • 🏃🏻‍♂️ Ran 17k this week. It’s my longest distance yet. Proud of myself for slowly working up to this number while staying injury-free (*knocks on wood*).
  • 📸 Found another use case for Syncthing: using the PS App on my phone to synchronize screenshots with my laptop for easy uploading into posts like this one.
  • ✉️ Messing around with WordPress plugins for sending these posts as emails. I haven’t really shared this site or these posts too broadly yet, but I suspect any family/friends interested in reading them won’t be familiar with RSS/Atom.

Library hallway with several stacks on each side

Let’s try this.

I want to set a clear intention. I’ll write these for myself, expecting no one else to read them, knowing full well that someone might. What I want to get out of these:

  • Slow down time. I tend to fall into these routines, especially around middle of summer and winter when the outdoors feels downright hostile. Other times it’s when work is particularly stressful. Either way I get caught up in it and time seems to fly by. I don’t like that feeling.
  • Leave a trace for myself. I don’t have a great memory, and unless an event has been documented either visually (e.g. through photos) or in writing, it fades quickly.
  • Clarify. I definitely write to think. Even if I end up deleting or not posting, I’m hoping this practice will help sort things out in my head.
  • Practice writing. I don’t intend for these posts to be even remotely polished, but I do want to write clearly, in general. This here can serve as a scratchpad to try things.
  • Connect with others. Maybe. I don’t know how I feel about this yet, but perhaps these can fit a space between social media, which I quit, and conversations.

I’ve learned that putting pressure on myself never works, so I’m treating these as an experiment. I’m gonna let myself miss weeks or write very little, change the format, write in short form or poorly, and just generally do a terrible job. I also may decide to take these posts down or quit altogether. This is for me, not the reader.

I was inspired by Jamie Tanna’s week notes. I like how he keeps it simple, which I’m sure helps to make it a habit. Let’s see how it goes for me.


🌐 General

A bit of a transition period both professionally and personally. Letting go of my past self is both scary and liberating. The fear is always that I’ll slip back into old roles and habits.

🔃 Syncthing

This one’s more from the week prior, but I spent a bit of time setting up Syncthing between my laptop, phone, and NAS. I’ve discovered it some years back, but couldn’t really find a use case for it at the time. Now I have two:

  1. Some personal docs that I’d like to be able to access on the go, but also keep available on my laptop, while holding the source of truth on the NAS. These are things like insurance docs, vaccination records, etc.
  2. Screenshots that I take either on the laptop or phone. On the former, the Desktop folder is shared, which makes every screenshot automatically sync to the phone. This is convenient when needing to grab some info in a rush out the door. I’ve got Google Photos automatically syncing photos from the phone, so the reverse sync case is already covered.

One thing I’m missing is a way to notify me when there’re syncing issues, especially on the NAS. I changed some permissions there while doing something else and only realized that this broke syncing hours later when I opened Syncthing’s UI. I only did that because I had just installed it, so was curious how it’s running, but this isn’t something I’d want to remember to do regularly.

🏃🏻‍♂️ Fitness

I’ve accepted that if I want to retain—never mind improve—my running level I’m going to have to go early in the morning. It sounds pretty obvious when I write it out, but just in the past couple of months alone I’ve missed many opportunities to run outdoors because I woke up too late or simply wanted to get my workday started as early as possible, thinking “oh, I’ll just go later”. After 8am the temperatures rise really quickly and stay high late into the night, so practically the optimal window for a run is between 6-8am. It’s too dark before 6 and too hot after 8. I need some time after waking up to settle my stomach, which shrinks the window further.

Now, while I still aim for that sweet spot I will be going when it’s “too hot” and compensate by not pushing as hard or doing shorter distances. I did my longest run yet today (16.5k), starting at 10am. It was slow, and I stopped a few times in a shady spot, but it felt better than just not going altogether. Thankfully, fall is coming, which will allow for more flexibility.

🎮 Video games at the library

Who woulda thunk? I was pleased to discover that my local library allows borrowing (recent!) games for the Switch and PS5 for a week at a time. This is perfect! I’ve been wanting to try out several games that I’m not certain I’ll like, so paying any amount for them, even if used, feels like too much. Current list:

  • Monster Hunter: Rise. ❎ Only one I played so far. Too much like Breath of the Wild, which I didn’t enjoy.
  • Spirit of the North
  • Super Mario 3D World
  • The Legend of Zelda: Skyward Sword
  • Death Stranding

Other than that I bought and played through Signs of the Sojourner. For a game where all you do is talk it stressed me way out. It does a good job driving home the message that people grow apart, and that you can’t expect to see eye to eye if you lose touch for a long time. I explored way too far way too early and tried to talk to everyone, which meant that half way through the game I couldn’t match any cards with anyone anywhere! That in turn resulted in (probably) the worst possible outcome at the end. While it was frustrating I’ll probably give it another shot when I feel in a less rejection-sensitive space.

💠 Misc

  • Learning
    • Reading up on Server-Driven UIs. The tech pendulum swings back and forth, but every time the situation is not quite the same as the last. Conditions change gradually until a shift occurs. I’m curious how we got here.
  • Reading
    • The galaxy, and the ground within. I would read anything Becky Chambers writes. It’s the kind of sci-fi I wish we had in abundance. The starting point is respectful mutuality rather than psychopathic individualism. It shows that you can have an interesting story without domination, ambition, and abuse moving it forward.
  • Watched
    • First two episodes of The Sandman. Digging it so far.

Prometheus has this line in its docs for recording rules:

Recording and alerting rules exist in a rule group. Rules within a group are run sequentially at a regular interval, with the same evaluation time.

Recording Rules

I read that a while ago, but at the time it wasn’t clear why it mattered. It seemed that groups were mostly intended to give a collection of recording rules a name. It became clear recently when I tried to set up a recording rule in one group that was using a metric produced by a recording rule in another group.

The expression for the first recording rule was something like this:

(
  sum(rate(http:requests[5m]))
  -
  sum(rate(http:low_latency[5m]))
)
/
(
  sum(rate(http:requests[5m]))
)

The result:

Using a recording rule from another group

It’s showing a ratio of “slow” requests as a value from 0 to 1. Compare that graph to one that’s based on the raw metric, and not the pre-calculated one:

Using the raw metric

The expression is:

(
  sum(rate(http_requests_seconds_count{somelabel="filter"}[5m]))
  -
  sum(rate(http_requests_seconds_bucket{somelabel="filter", le="1"}[5m]))
)
/
(
  sum(rate(http_requests_seconds_count{somelabel="filter"}[5m]))
)

The metrics used here correspond to the pre-calculated ones above. That is, http:requests is http_requests_seconds_count{somelabel="filter"}, and http:low_latency is http_requests_seconds_bucket{somelabel="filter", le="1"}. The graphs are similar, but the one using raw metrics doesn’t have the strange sharp spikes and drops.

I’m not sure what’s going on here exactly, but based on the explanation from the docs it’s probably a race between the evaluation of the two groups resulting in inconsistent number of samples used for http:requests and http:low_latency. Maybe one has one less sample than the other at the time they’re evaluated for the first group’s expression, which I think could show up as spikes.

Whatever the cause the solution is simple: if one recording rule uses metrics produced by another make sure they’re in the same group.