Option-dragging while defining the bounds of a screenshot

I’ve been taking screenshots on Macs for more than thirty years. I thought I was pretty much a power user. I’ve known forever that you can do not just the whole screen (⇧⌘3) but a specific target area (⇧⌘4), and of course the space trick for capturing a window (including menus!). But what I didn’t know is… Read more

Apple’s timing problem

The M1 was announced in November 2020. The M1 Ultra wasn’t announced for another sixteen months, in March 2022. It was clearly late. Very late. The M2 was presumed right around the corner (and it was, released just four months later). Why would anyone buy an M1 Ultra, using a two year old CPU architecture… Read more

Z9 II wishlist

Note: I originally wrote this in early 2022, after a few months with the Z9, but I forgot to actually publish it! I realised this in November 2023, so I corrected that oversight after a quick update (e.g. I originally had a wishlist item for a “portrait-grip-less Z9 without any other changes”, which is basically… Read more

SwiftData pitfalls

I’ve been exploring SwiftData lately, and I’ve been unpleasantly surprised by how many sharp edges it has. I’m going to try to describe some of them here, so that hopefully others can avoid them (or perhaps be dissuaded from using SwiftData to begin with). I’m using Xcode 15.0.1 (Swift 5.9) on macOS 14.1 (Sonoma). Background… Read more

Collection enumeration performance in Swift

Swift’s Collection and Sequence protocols provide two primary ways to enumerate (filter, map, reduce, etc): functional-style and imperatively. For example: Or: Nominally these are equivalent – they’ll produce the same results for all correctly-implemented Collections and Sequences. So in principle which you use is purely a matter of stylistic preference. But is it? Do they… Read more

Zsh has neat shortcuts for decomposing file names & paths

I only just learned that the venerable basename and dirname are no longer necessary, let-alone the horrible string splitting required for teasing apart names from file extensions. Zsh has some awesomely convenient expansion modifiers which do it all! e.g. given the path “/Users/me/Documents/Work.zip”: $file:t → Work.zip $file:h → /Users/me/Documents $file:r → /Users/me/Documents/Work $file:e → zip… Read more