Clams are the original mimic chests.

02 Nov 2020

Significant whitespace puts the “y tho” in Python.

18 Aug 2020

With only talent you can do sorcery, but to become a wizard you must RTFM.

04 May 2020

IPv4 is the Dewey Decimal System of the internet.

23 Apr 2020

I moved from Objective-C to Swift right about five years ago, so this NSHipster article about method dispatch was a nice nostaglia trip. If you’ve written code but you haven’t spent a lot of time with Objective-C, it’s an excellent illustration of message-passing, which is a dynamic dispatch pattern that differs from the vtables you’d find in C++ or in pure Swift classes.

I’m sorry that I long ago coined the term “objects” for this topic because it gets many people to focus on the lesser idea. The big idea is “messaging”…

—Alan Kay

18 Dec 2019

Yesterday I played Death Stranding, and last night I dreamed about pressing balloons together to make bigger balloons, except on the inside they were huge eggs.

12 Nov 2019

There should be a Pac-Man edition of the Roomba.

27 Oct 2019

Another downhill path covered in yellow fallen leaves

Looking downhill along a narrow sidewalk, with a carved rock wall to the right and the town of Jozankei to the left

A statue of a Kappa at the base of a mountain path

Jozankei is a cute hot spring town. Kappa like this one are everywhere.

04 Oct 2019

Diced coffee jelly, deep brown in color with liquid residue, in a white bowl on a spring green tablecloth

There is such a thing as coffee jelly. It’s good, but hard to eat with chopsticks.

04 Oct 2019

We made a new friend today and probably won’t see him again. I want to remember him here.

Yesterday we traveled for a solid 24 hours. This morning we woke in Narita, flew to Sapporo, and took the train into the city. At every step we’ve had uncertainty, new things to figure out, a language barrier, and stress. Any step that doesn’t succeed could derail the rest.

To reach the hot spring hotel, our first real destination, we had reserved a shuttle bus from Sapporo. We hiked through the city to it, rolling suitcases behind us. But at what we thought was the appointed place and time, there was no such shuttle. So of course we’re on high alert.

We asked two parked strangers if their vehicles happened to be the shuttle bus, and in each case they went out of their way to figure out our problem. The first stranger was driving an unrelated shuttle bus and ceded when the second got involved. The second stranger was taking a break from work, and he believed we needed to be several blocks in the other direction, back at the train station where we started. He took us there in his car. He said he designed structures, waving a broad paper chart. I that took to mean he was an architect or structural engineer.

When he dropped us off, the bus had already gone. We were ready to just figure out another way to get there. But our mystery man showed up again, having parked around the corner. He called the hotel. He called the bus service. He drove us around the block to the main city bus terminal. He quizzed a driver about which bus we needed and where it was parked. A few minutes later we were on the right bus going to the right place.

Sometimes you don’t know you’re among friends until you need one.

03 Oct 2019

Foamy coffee with a royal blue ceramic mug and gold wisk

I ordered a coffee in a little restaurant in the Sapporo TV tower, and I loved the colors they chose for this cup and its wisk.

03 Oct 2019

Yesterday was a relatively grueling 24-hour travel day, ending at an overnight hotel near the Narita airport. It’s one of those hotels that feels like what I imagine the 1970s were like for a traveling businessman, except we scored a non-smoking room.

The crown jewel of the room is this multi-function hardware built into the bed’s headboard.

Electronic bedroom control device reminiscent of classic stereo equipment

It controls the room’s lights and air. Its radio has two preset FM stations and one for BGM – a term for background music which I just learned is used outside of video games. These are the original radio buttons, the kind where if you push one in the others pop back out. The centerpiece is what appears to be an all-analog alarm clock from before the invention of the snooze button.

So mod.

03 Oct 2019

The last post was a test of publishing photos, which means this blog is ready to travel. Watch for Japan photos soon!

29 Sep 2019

My feet, oddly far away This “ultra wide” camera makes me look tall.

29 Sep 2019

I’m going to travel for a few weeks soon. This has been planned for a long time, and I’ve been lightly anxious whenever I’ve thought about it.

I’m always anxious before travel. I think it’s because for every decision you make when planning and packing, you raise the stakes, and then it all has to go off without a hitch. When you finally leave your house, you can’t have forgotten anything, you can’t be late, your plane can’t be late, and so on. What kind of vacation is that? So I only tend to relax once I arrive, when the highest-stakes plans have played out.

This time, I’m starting to get a little excited, and we haven’t even left yet. It might be because I did very little of the planning.

25 Sep 2019

What’s funny about languages with optionals is that seeing ? gives you certainty and seeing ! raises questions.

18 Sep 2019

I don’t know why I was complaining the other day about how Docker is unintuitive. Maybe it is, but I just needed to read 100% of the documentation and try out half the sample code, and now it fits in my head like it ought to.

I’m only half kidding. You don’t get to learn everything top-down. Like when you begin Swift with print("hello world"), you benefit from progressive disclosure in the language and its documentation. After a short tutorial you can do useful things, and then you come back for more information when you need to know the next thing. Stack Overflow not only gets you unstuck, it improves your intuition.

Some things you have to learn bottom-up, like the shell. man cat, man ps, man 3 intro, apropos regex, ad infinitum. Only when you’ve been exposed to all these details do their combinations begin to make sense, and nobody is going to tell you which information you’re missing. You have to just be willing to absorb every tiny thing and then synthesize the intuition yourself. In theory, if you learned it all, you could solve every problem. So in practice, you read everything available and look up anything you don’t recognize. That learning curve can be a lot when you’re just stuck on one thing, but it’s a fact of life.

Everything you can learn is somewhere on this spectrum. If you’re stuck, you may need to back up and adapt your learning style.

16 Sep 2019

iOS 13 beta was nice to use all summer, but next week I’ll need my new phone to restore from a backup. That means I needed to make a backup on the public release version, the GM. This year it’s complicated because the beta channel is currently on 13.1, not 13.0, so it’s a downgrade. And because that’s something you’re never supposed to have to do, I had problems.

After downgrading iOS from 13.1 beta to 13.0 GM, my Mail database seemed to fail to load. The app would freeze for about six seconds after tapping most any mailbox, and then the mailbox list would be empty. It was as if loading from the message cache caused a failure, like a crash and restart in whatever daemon owns the data. The only exception was an inbox I had zeroed before the upgrade, which worked fine.

To fix that I wanted to reset my Mail cache, for which there are no explicit controls. It wasn’t enough to remove my Mail accounts and delete the app and add them back. Thinking a cache wouldn’t be included in backups (and it should be only a cache because these are IMAP accounts), I backed up my phone on 13.0, erased all content and settings, and restored. That did the trick for Mail.

An hour later I found my music library was suffering from a similar problem, and no amount of tricks would solve it. Although I could add and remove files through means like iTunes sync, the library index appeared to be missing a lot of them. The index was immutable, for instance, I couldn’t add a song to a playlist or add from Apple Music. This was also true for Podcasts and TV. I imagine they are still one big database under the hood.

I think the reason having restored from a backup made no difference to the media library is that it is not simply a cache, it’s a source of truth. Syncing through iCloud Music Library is optional, so the backup mechanism probably needs to include the index even though it omits the media files.

I had to preserve some data, do a fresh install, and then set everything up again from scratch. Ultimately the amount of time that took was about the same as the amount of time I spent trying to repair things. It would have been simpler to just reset to a state I could be confident in.

If any of that made your stomach turn, don’t tempt fate by putting a beta on your carry phone.

15 Sep 2019

In the timeline of multiplayer games there was a point where you could play on the internet with strangers, but there wasn’t yet voice chat. Games let you type a line of text and broadcast it to the top of everyone’s screen, and it would mix in with server messages about what else happened, like who killed who by what means, or who joined and left.

Quake 1 exemplified this when its online multiplayer community blew up. Id released the Quakeworld client, which compensated for the lag we all had on dial-up – Under 300 ping was great; under 100 would get you accused of being a low ping bastard / LPB. The community built GameSpy, then called QuakeSpy, the global server browser Windows 95 app, which we all used as a launcher. The DOS-era convention of having a boss key to quit to the shell was still in effect, though.

It was all so new, that year everyone was both a noob and a troll. I for one was in middle school. So we’d bind a key to say “F10 for extra armor” and see who quit. But it was not usually the player ahead of you on the scoreboard.

15 Sep 2019

I think it’s cool the way identity terminology changes. If terms reflect how we identify, they reflect how we identify in the context of other identities. When you state your identity, you alter the landscape of what people can identify with. Now we have so much to say about it that just about anyone who spends the time to read about identity on Wikipedia learns something about themself.

12 Sep 2019

Getting release and CI and debug behavior all working in Docker is rough. It’s a very opaque experience. You can’t see, so you have to do everything in baby steps, lest you have a problem you can’t track down at all. This is worth it, right? It’s satisfying when it works, but I feel like we’re solving the problem of configuration drift or environment mismatch by merely shrinking the part you write once and then don’t touch again.

10 Sep 2019

In your Azure DevOps Pipeline, if your variable group’s values are not showing up where you reference them, check the syntax. There are two ways to satisfy the variables key, and they mean different things.

First, if you supply a dictionary, you are creating literal variable names and values:

  name1: value1
  name2: value2

Second, if you supply an array of dictionaries, each item’s keys determine whether it’s a single variable or a group:

- group: group-name
- name: name1
  value: value1
- name: name2
  value: value2

(YAML can be a little confusing here. Each hyphenated line begins an array item, and since there is at least one of them, the outer value is an array. Each line with a colon is a name-value pair in a dictionary, and since there is at least one of them after each hyphen, each array item is a dictionary.)

If, like me, you saw the first syntax, then learned about variable groups, then glossed over the fact there were two syntaxes, you might end up with this:

  group: group-name
  name1: value1
  name2: value2

That syntax doesn’t reference a variable group, it creates a variable whose name is “group”. That’s a nasty silent failure for a newcomer.

09 Sep 2019

Assuming this doesn’t appear malformed, I was able to write and publish a blog post from a one-line shell command. Maybe when I’ve used it for a while, I’ll put up a tutorial post.

That’s a nice piece of work for a Sunday afternoon. I always feel like I do better work when I’m just fooling around, compared to when I’ve dreamed up a big project.

08 Sep 2019

I thought I’d put together a blog that’s as easy for me to post to as Twitter and Facebook make it, so I will have a place to publish things without resorting to Twitter and Facebook.

The recent release of NetNewsWire 5 got me thinking about this. I’ve also been using doing, whose shell interface takes the drudgery out of tracking what I work on.

I figure what I need is a blog I can post to from the shell. Having moved my site to GitHub Pages recently, I find I have Jekyll available, which handles the Markdown and page generation bits. Scripting up a new post tool should be doable.

08 Sep 2019

I’ll bet Heimdall is really good at Where’s Waldo.

08 Sep 2019