Unicode via Alfred

Something I miss a lot on macOS is a fast way to enter Unicode characters. macOS does a pretty good job of handling combining keys so that you can type é and ö, and it's got a fancy emoji picker, but if you want to enter ∫ or ⚠, you're stuck using the terrible character picker window1:

screenshot of the character picker

Well, no longer. If you, like me, use Alfred 4 on your Mac, you can download the following Alfred Workflow to get a new "unicode" Alfred command. This uses a fast index2 to look up unicode characters by name. The first time you run it, it builds the index on your system (which might take 10 or 20 seconds; be patient); every subsequent run will be super-fast. Just hit Return on your desired entry to copy the character to the clipboard; hold ⌘ while pressing Return to copy the metadata3 instead.

screenshot of fast-unicode

Note that this requires an up-to-date Python3 to be somewhere in your $PATH.

download fast-unicode.alfredworkflow

Enjoy!

1

You can bring this up by enabling "Show keyboard and emoji viewers in menu bar" and then clicking "Show Emoji & Symbols" in the new menu item that appears. This window is strange; it floats on top of most other windows, but not all. I usually end up getting it stuck on another virtual desktop and spending 30 seconds searching for it when I need it.

2

Technically, it uses a sqlite database where I store tokenized emoji names, as well as bigrams and trigrams. sqlite is great.

3

For example, for ⌘, you get U+2318 PLACE OF INTEREST SIGN

On the Decline of Zipcar

zipcar

I haven't owned a car in twelve years. Since I moved to San Francisco, I've exclusively relied on public transit, taxis/Uber, and the occasional rental car to get me where I'm going when I need to go somewhere. In general, this has worked well for me — I can get where I need to go, and most of the time I'm not emitting 300g of CO2 per person-mile the way an individual car does. On the rare occasions that I need to drive somewhere by myself (often to the vet, since rabbits really aren't good at public transit), my go-to choice has been Zipcar, an hourly car-rental startup1. This post is a rant about how terrible Zipcar has gotten over the last 9 years, backed up by the raw data of my actual 141 Zipcar trips2.

trips per year

Price

Over the last year or so, Zipcar has been aggressively increasing prices. Individual vehicles that were once $8/hour are now $14/hour, and new cars being added are almost exclusively larger, more expensive cars (for example, the location near me now exclusively has a Honda HR-V). The overall data is noisy, but I never took a trip above $15/hour before 2013 (when the Budget acquisition of Zipcar was completed), and I have barely taken any trips under $15/hour in 2019.

Quality

As far as I can tell, Zipcar no longer maintains their cars with nearly the frequency or attention to detail that they used to. The Honda HR-V ("Hobart") that I've taken a few times from the location near me has the Check Engine light on, and has had it on for more than 500 odometer miles. I report this to Zipcar every time I drive, to no avail. The car that was there previously (a Subaru Crosstrek named "Liberty") had a malfunction in the cruise control that made it blare an annoying noise and pop up a big red modal dialog saying "adaptive cruise control unavailable" every time you powered on the car for the entire months of June and July.

Every time I get into a Zipcar, the gas tank is nearly empty. This despite the fact that the nearby Zipcars live at a gas station.

Even the paint jobs suffer — once upon a time, if I saw any scuff or scratch on a Zipcar, I would report it at pick-up time and it would be fixed by the next time I took a ride. Now, I find it hard to get motivated to report anything because the cars constantly look beat-up.

Convenience

Living in San Francisco, every year was an exercise in guessing which location Zipcar would stop providing cars at. I lived in "lower Nob Hill" (the Tendernob), which is the densest part of San Francisco (the six block census tract containing our apartment building has 2,839 residents3), and frequently there were zero Zipcars available in a one-mile radius. Sutter-Stockton garage went from six cars, to four, to two.

Now that I live in Berkeley, the situation is much the same. There's one Zipcar location within a mile (at a nearby Chevron), and it's dropped from three cars to one. I anticipate that the location will close soon and then my closest option will be to hike to the other side of Ashby BART, to an absolutely charming location in the middle of a homeless encampment.

Alternatives?

Getaround is the biggest alternative to Zipcar. It's a sketchy "disruptive" startup where individuals rent out their private cars (and are responsible for all the maintenance themselves). It's much less convenient (since the cars are in peoples' driveways in residential neighborhoods, usually in poor repair), and the insurance coverage is... questionable. CityCarShare is gone, absorbed by Getaround. Traditional rental companies (Budget/Avis, Hertz/Dollar/Thrifty, etc) don't offer hourly rentals around here and nobody wants to kill that many trees every time they drive somewhere.

Maybe we'll have to buy a car.

1

Well, it was a startup. Now it's owned by Budget.

2

Zipcar has an API, but it's behind an annoying signup process, so I just scraped the website. Aside from the 6 (six!) different kinds of authentication cookies you need to provide, it's not too hard, although it's kind of janky; for example, it returns no trips for 2011, despite the fact that I have email receipts for such trips.

Crime Happened

Today we got a nasty surprise in the form of an email from my next-door neighbor informing me that somebody had attempted to break into our home1! An hour later (while I was on my way home from work), we got another email indicating that the suspect had been arrested.

Apparently, someone was messing around with the lock on the gate to our backyard and my next-door neighbor yelled at them. They hopped the fence, so he called the police and yelled at them some more. They fled. The police came2 , patrolled the neighborhood, and caught the guy breaking into a house a couple of blocks away.

Nothing was stolen or damaged (except some flowers the police stepped on while poking around the backyard to look for clues), but an unsettling event for sure!

1

for more details about said home, see this article

2

about five minutes later — super-quick response for a prowler who ran away when yelled at

Fall; or, Dodge in Hell

Over my recent vacation, I read Neal Stephenson's latest book Fall; or, Dodge in Hell, which is a rough sequel to 2011's REAMDE. I thought I'd write up some brief thoughts I had on it and maybe some questions for a hypothetical future reader. Like all of Stephenson's work from the last couple of decades, this book is a meandering combination of science fiction, philosophy, political commentary, and mythical fantasy. The Kindle edition I read is 880 pages long, and went pretty quickly over four three-hour flights.

In general, I'd give it ★★★☆☆. It's got lots of interesting ideas, but it's shot through with too much ridiculous libertarian ideology, and it tries to tell too way too many stories in parallel. If you liked Cryptonomicon, you'll probably like this book, but I would be surprised if anyone likes it enough to plod through it twice.

WARNING: This post will contain significant spoliers for both Fall and REAMDE; don't keep reading untless you've either read both or are highly confident you aren't going to read either.

read more

Dark Mode

Small update: this website now supports "Dark Mode" on macOS 10.14+ iOS 13+, and the forthcoming Android Q, all using the prefers-color-scheme CSS media selector. Let me know if you see anything that looks janky!

Ode to a Pager

pager

I've been on-call for most of the last 11 years. I was on-call for the CS Department at Mudd1. I was on-call at Yelp, in a rotation that at times contained as few as three people. I was on-call at Uber in rotations ranging from one to twenty people. And I've been on-call at EasyPost — initially in a rotation with one other person2, and currently with two other people. I have responded to tens of thousands of pages. I have been woken up in the middle of the night hundreds3 of times. For the last seven or so years, I've worked at firms where on-call was a BYOD kind of a deal — you bring your own cell phone, register it in PagerDuty, and that's how you handle being on-call. This is my ode to the unfairly-hated pager, to the practices of yore.

Let's look at the phone you have in your pocket right now4:

  • It runs iOS or Android5
  • It gets at most two days of battery life
  • It receives phone calls, of which at least 90% are robots saying things like Hey buddy, this call is from the Department of Social Security
  • When it's not getting phone calls, it's constantly begging for your attention with notifications, most of which are some degree of spam

Is this the device you want to have to have on and audible 24 hours a day, 365 days a year? Do you love the idea of Apple's Do Not Disturb feature? Well, screw you because PagerDuty might need to reach you at any instant6. Do you miss going out into the woods for a hike? Too bad, Apple had to shave 0.7mm off the latest iPhone so now the antenna only works if it has direct line of sight to the AT&T worldwide headquarters in Dallas, TX. Want to quickly see what you're getting paged about? I hope you like watching this brief animation as all your icons swoosh in from whatever armpit of the universe they spend the off-time drinking in before you can actually do anything. Oh, you're using the native PagerDuty app? Well, then, you've got to give it 10 seconds to load (despite the fact that the Apple A12 CPU in your phone is faster than any computer CPU that existed anywhere on the planet 10 years ago) so that it can render some emojis and prompt you to take an "On-Call Selfie"7.

My ideal on-call device would look something like the following:

  • Small and lightweight
  • Extremely long battery life (imagine... weeks without recharging)
  • Only capable of receiving emergency notifications from PagerDuty so I can leave it on, unmuted at all times
  • On a network with great distance and building penetration8
  • Maybe a one or two line black-and-white display just long enough to print out messages like CRITICAL: web1sf - 4 packets transmitted, 0 received, 100% packet loss
  • Maybe two buttons so you could acknowledge or escalate incidents — but maybe not; I'm probably going to grab a laptop or bigger device to actually do the investigation9

Do you know what I've just described, you bunch of ingrates? You damned dirty apes? A bona fide two-way pager. We had the technology! We had built the perfect system! And we destroyed it! In our frivolous pursuit of only carrying one device, in our employers' endless pursuit of simpler procurement, we got rid of a system where your employer provides a simple-to-use single-function device to you, the employee, and replaced it with a system where you bring your own massively over-complicated device, pay your own connectivity bills, and then miss pages at 3 in the morning because you got too many goddamn Farmville notifications and your battery died.

You blew it up! You maniacs!
1

If I recall correctly, we had a physical pager and it went off exactly twice in the two years I was on the rotation.

2

Every on-call since Mudd has followed the best practice of having two people on-call at all times (Primary and Secondary) to minimize missed pages, so a two-person rotation means you are literally on-call 24 hours a day, 7 days a week, 366 days a year on leap years.

3

Hundreds might be conservative; I've never kept track but I'd say no less than once a month and no more than 20 times a month for the last 10 years, which gives us between 120 and 2000 wake-ups.

4

I don't really want to get into this side of things, but the other big issue is that this thing in your pocket is your device and it absolutely blows that the company who's already making you wake up at 3 in the morning is also making you use your personal property to do it. And if you've made the personal choice not to have a cell phone? Good luck getting a job in this industry, buddy.

5

From a security perspective, I dearly hope it either runs iOS or stock Android on a Pixel. Friends don't let friends use OEM-crapified Android.

6

Yes, I know, you can bypass Do Not Disturb for voice phone calls from specific numbers on iOS, and you can bypass it for more kinds of alerts on Android. I have never found the bypasses to be reliable.

7

Seriously: the on-call selfie thing was the most tone deaf crap I've ever seen from PagerDuty. When I get woken up at 3 in the morning because some other team broke something, I most definitely do not want to take my picture and tweet it.

8

How many industry outages do you think 5G/mmWave will cause from people losing their cell service because it got foggy?

9

That's right, I already have to have a second device with me all the time anyway because there are very few issues severe enough to page me but simple enough to fix from a 5" cell phone screen.

Ditching Gmail After 15 Years

Gmail Logo

Everyone who even casually follows the tech industry knows, intellectually, that Google builds an enormous dystopian profile of everything you do in order to sell ads1. But I think there's a difference between knowing that Google Analytics is a shameless back door to do cross-site tracking and actually coming face-to-face with your own profile. Yesterday, CNBC featured a story about a new Google UI which shows you a list of every purchase that you've made in the last few years: https://myaccount.google.com/purchases. For me, wide variety of commercial activity — every purchase I've ever made at a store that uses Square, every Amazon purchase, every Apple purchase, every movie ticket. I see gifts for my wife, work purchases, and even food for my rabbits. And on almost every item is a note: This purchase was found in your Gmail.

It's been clear for a long time that Google as a company no longer considers their users to be much more than piñatas full of delicious data; for me, seeing that list of the last 7+ years of every purchase I've made electronically is the last straw. As of today, I'm taking my personal domain (roguelazer.com) off of the grandfathered free-tier Gsuite2 mail hosting that it's had for the last 10+ years and moving it to a host that seems less inclined to aggressively mine it for data, and moving as many accounts as possible to no longer depend on my gmail.com account. I opened my Gmail account 15 years ago3, so I guess it's time to move on.

I went through the current crop of mail hosts, and evaluated them against the following conditions:

  • I don't want to self-host; I have no interest in actually maintaining (and monitoring and backing up) an SMTP and IMAP server. I get enough of my day job at my day job.
  • I prefer to use regular IMAP and SMTP protocols and mail clients (e.g., mutt); anything that requires that you use the provider's custom application is right out.
  • I'd like a hosting provider who's been around for a few years and seems unlikely to vanish off the face of the Earth tomorrow
  • Decent performance from the US

After doing some research, I decided that Fastmail was the least-worst option4. So I've migrated all my mail out of Gsuite onto Fastmail, re-pointed my MX records, and configured Gsuite to route any mails that still trickle into it over to Fastmail. Some time tomorrow when all the TTLs have expired, I will be shutting down my Gsuite account5.

If you want to have a chance in hell that our grandkids won't live in a surveillance dystopia, search with DuckDuckGo, close your Gmail account, switch to Firefox, and remind your elected officials that the world would be a better place without Big Data.

2

"Google Apps for Your Domain" when I signed up for it in 2007...

3

August 12, 2004. What a different time.

4

Yes, I've already had Protonmail recommended to me by a half-dozen people. I've tried it, but it misses half my criteria and at this point I think anyone pushing a commercial VPN as a product for any reason is probably a snake-oil salesman.

5

Don't worry, I used the helpful Google Takeout tool to dump out an .mbox of my mail for historical purposes.

GPG Key Transition

GnuPG Logo

My current PGP/GnuPG key is expiring, so I've rolled a new one. The ID of the new key is 0x3C7775DD37811E62 (full fingerprint: 1ED5 E5A3 01C3 D109 9040 2289 3C77 75DD 3781 1E62) and it should be in your favorite keyservers, cross-signed by my old key. You can also find it at https://files.roguelazer.com/roguelazer.gpg. It has also been attached to my keybase.io account and my Github profile. My previous key (0xAEE8F2454A41B87D) has not been revoked and has not been compromised, but you should still stop using it if possible. The new key is a 4096-bit RSA key with SHA-2 digest signatures — I'm not quite bold enough to switch to ECC for a long-lived key yet.

My signed transition document is below, and can also be found at 2019-04-27-key-transition-statement.txt.asc if you prefer to download it directly.

Additionally, I have generated a separately-signed key with ID 0x233E5EAF0EC3ABA9 (full fingerprint: 14E8 9660 188D BC9B 2C17 67AA 233E 5EAF 0EC3 ABA9). This key should not be used for communication, but will only be used to sign VCS commits/tags/&c (in Git and perhaps in Pijul). It's going to be on my [managed] work computer, so treat it with a grain of salt.

read more

Wildflowers

I went up yesterday with my wife's family to hike around on some Sonoma Land Trust property up in the North Bay and brought my camera. It's amazing to see the hills green and growing after so many years of drought! You can see a smattering of photos in this flickr album, but here are some of my favorites:

If you're in Northern California and are physically-able, you should try to get out and enjoy this; it's gorgeous!

Vim Setup: 2019

Neovim logo Vim logo

It's been a little while since I posted about my editor configuration, and I thought I might post what I'm using now. I guess the most notable change is that (after much prodding from my coworker Drew Ditthardt) I've switched from Vim to Neovim. Neovim is a vim-compatible editor written in C and Lua (as opposed to Vim, which is written in C, Vimscript, and prayers). I upgraded to Vim 8 last year and have had a few too many segmentation faults in the editor, so I decided to switch to something where more functionality was implemented in a memory-safe language. So far, Neovim has been pretty good to me, although the new process model means that it's pretty hard to write functions which invoke an external process which takes interactive input from a user.

As is probably expected for this sort of thing, here's a couple of screenshots; the first is of VimR, and the second is from NeoVim in Terminal.app, both editing files from rust-mysql-binlog:

read more