Wait to Visit Catalina

I'm sure there's a hundred other pitfalls waiting. Anyone "upgrading" to Catalina on their main work Mac before at least a year is a lunatic. Half the software you use hasn't been tested on that, lazy devs will only now even be putting it on a second machine. You're a long way from safe.

Safari 13

So I hit upgrade, and I regret everything.

Obviously, this is the release where they break Safari Extensions, they now have to be apps. uBlock Origin is dead. I've installed Ghostery Lite for the moment but I have no real solution for the future; "uBlock" is an ancient unrelated fork that allows advertising, fuck those criminal scum.

The other thing is tab management is broken: Cmd-T now makes a tab after the current, instead of at the end of the tab list, so now my tabs are all but unmanageable. I'm going to file a Radar, but throwing bits down the black hole isn't going to fix it I think.

Right now it's churning with CPU time being wasted on background tabs, and I'm hoping that's just because I rebooted and reloaded all my tabs, and not something it'll continue doing.

% cat safariCountTabs.applescript
set output to ""
tell application "Safari"
    repeat with i from first window's index to last window's index
        set w to window i
        set output to output & "Window #" & w's id & " = " & (count w's tabs) & " tabs - "
    end repeat
end tell
do shell script "echo " & quoted form of output
% safariCountTabs.applescript
Window #178 = 125 tabs - Window #170 = 2 tabs - Window #172 = 6 tabs - Window #173 = 18 tabs - Window #174 = 24 tabs - Window #175 = 16 tabs - Window #176 = 35 tabs -

(AppleScript problem: If I use & return or "\n" instead of " - ", they get converted to ^M on output. Is there a setting to make AppleScript not think it's on a '90s-era Mac OS?)

Yeah, obviously I could change to another browser. But I hate every other browser. Chrome's created and operated by a criminal, advertising-supported organization. Firefox is just awful to use, because everyone at Mozilla uses Linux and hates users. Opera's not terrible, but it's not good, and just a wrapper over Chromium so probably just as corrupted as Chrome itself.

NetNewsWire is Back!

I've been running it for the last day, and it's stable and fast.

Syncing to my Feedbin account works great; the Feedbin web UI is usable, but especially the last redesign leaves me somewhat annoyed, and it has very limited keybindings. NNW also has local OPML subscriptions, if you don't need to sync and don't mind waiting forever for it to fetch from every blog and deal with everyone's crazy broken RSS. I like Feedbin centralizing that nonsense, just replacing the UI has been a problem.

NNW has everything keyboard-driven, but I'm not enamored of some of its choices (Help, Keyboard Shortcuts). I'd prefer vi keys, and those are a dangerous habit with Brent's keybindings (l is mark all as read, next; k is mark all as read; I almost never want to do that, and want to hide those behind a warning). I'll either get used to them or see if I can rebind them from system settings. The code's on github, so worst case I can just fork it and hack my own keys in.

The reader's pretty nice. Stays in dark mode when I have that selected; I've seen a couple feeds insert their own background image/color which is obnoxious, but if that's what the feed contains, it should probably show it.

I miss in-app browser tabs. For webcomics (which rarely put full-size images in the feed) I often launch a bunch of them into their own tabs and then read them, which in Feedbin's web UI is (while more-comics? (middle-click title) (press 'space "next comic")) and in NNW is (while more-comics? (press 'b "open the current comic in browser") (press 'alt-tab "back") (press 'space "next comic")). Maybe it's possible to open a browser tab in the background?

A million times better than the years-late, rarely-updated Black Pixel release which had their own broken sync server.

Update: One feature I'm loving is drag-and-drop blogroll reorganization. Got a feed somewhere wrong? Drag. Drop. Synced. Fucking done. In Feedbin, you have to have the feed visible (unread or switched to "all" mode), the old way you'd hit Tags (folders) and just change the text in the dialog box, but they changed it to an Edit button which pops up a giant list of all your tags (folders) and you switch them on/off. Utterly awful if you use a lot of tags (folders) like I do. And yes, I'm annoyed perpetually by the "tags" concept, which doesn't exist in OPML, only folders.

Catalina Scripting

In particular:

Quartz Composer
Starting in macOS 10.15, the Quartz Composer framework is deprecated and remains present for compatibility purposes. Transition to frameworks such as Core Image, SceneKit, or Metal. (50911608)

Tragic but unsurprising. None of those are even remotely a replacement, being machine-level programming tools, not a graphical tool for assembling a graphics or sound workflow. But there's probably almost nobody using QC anymore, because Apple neglects it and won't promote any dev tools except horrible goddamned walking abomination Xcode.

Script Editor
Known Issues
Script Editor might quit unexpectedly when saving or executing scripts. (50470730)
Scripting Language Runtimes
Scripting language runtimes such as Python, Ruby, and Perl are included in macOS for compatibility with legacy software. Future versions of macOS won’t include scripting language runtimes by default, and might require you to install additional packages. If your software depends on scripting languages, it’s recommended that you bundle the runtime within the app. (49764202)
Use of Python 2.7 isn’t recommended as this version is included in macOS for compatibility with legacy software. Future versions of macOS won’t include Python 2.7. Instead, it’s recommended that you run python3 from within Terminal. (51097165)

More of the same, increasingly neglected non-Xcode tools.

Killing python2 is great. It's not clear if python3 will be included standard, or if you have to find that somewhere else.

On my old blog, I had a post "Macs Make Programmers", where I talked about all the great scripting languages and tools included in OS X, including Xcode back when it wasn't broken junk. Timmy Cook's Apple is making that very difficult.

So basically the first thing you need to do on a Mac is install MacPorts, sudo port install python3 and so on.

On the bright side:

This is a massive step up in security and usability. I was a long-time ksh user on HP-UX, Atari ST MiNT, and OS/2, switched to bash for Linux back in '95-ish, and went along with bash on OS X, even though the original default was tcsh. I switched to zsh in 2014, after the bash shellshock bug; and it was long overdue. Apple can't follow the current bash versions because they're under poisonous GPLv3, so even with shellshock patched it's still not safe. zsh is reasonably current and MIT-licensed so it can stay current.

You want one reason to switch right now?

F="foo bar"
rm $F

In bash, that removes two files, "foo" and "bar". In zsh, it removes one file, "foo bar" (you can get the Bash-like behavior of expanding args by rm $(echo $F), probably some other ways).

Terminal Condition

I spend half my time, easily, in a command-line terminal running zsh. So a new one, even one on an OS I don't run, is interesting:

There are some modern, nice conveniences in this. It's a little ways behind Mac Terminal.app (based on the NeXTstep Terminal from 1990), and vastly far behind iTerm2, but it's more advanced than the usual Linux terminals like rxvt, urxvt, or cross-platform Alacritty or Hyper.

Between this and WSL2 being a full Linux, it's plausible that the best Linux dev environment now (well, this summer when it's released) is Windows. The Year of the Linux Desktop is 2019, and it is owned by Microsoft®. Can you hear the tiny, distant screams of the FSF cultists?

Comparison based on code, reviews, and reddit thread with MS devs involved:

  • Scrollback: The single most important thing a terminal can do. MS does this, but doesn't have logging.

    Surprisingly, a lot of them only support a few pages. I keep mine at 10,000 lines or so, which is probably wasteful but so handy; I don't bother logging since my .zhistory keeps everything I typed, and I have Terminal.app and iTerm2 set to not close tabs automatically.

    Alacritty only just added scrollback last year.

  • Prompt Marking: Nope.

    This is a feature it's hard to live without once you've had it, no more paging up trying to see prompt lines (I have a red ANSI-colored prompt and it's still hard to see). In Terminal.app, Edit, Marks, Automatically Mark Prompt Lines, and then ⌘↑ and ⌘↓ move between them. iTerm2 has it enabled by default, and ⇑⌘↑ ⇑⌘↓ are the keys, which took me some re-learning.

    Nothing else has this, as far as I've seen.

  • Fonts: MS has programming ligatures and displays emoji, finally. Does not support RTL languages.

    I use Fira Code in all my editors and shells, and it's enormously helpful, more readable, and catches bugs: I look for === as a fat-equals symbol in JS, etc.

    Hyper, urxvt, Alacritty support Unicode fonts. rxvt stopped development almost 20 years ago so it barely shows 8-bit fonts correctly.

  • Tabs: MS has tabs! They're currently invisible until you add a second tab, same shit Terminal.app does, which annoys the hell out of me; I don't like UI that reshapes itself, reminds me of T-1000 Terminators (also makes it hard to tile my windows up correctly when they get resized).

    It's not clear if you can drag Windows Terminal tabs around to different windows.

    In iTerm2, I normally keep: First window with tabs for home shell, ssh into my server (running screen, so that has many open shells). Second window with 2 tabs for REPL, editor/running/compiling tasks, and sometimes a third tab for reading local docs. If I need more shells, I usually open them on the first window. I rarely open a third window for monitoring some long-running task; I just drag a tab out to its own window. All terminal windows are stacked on the left side of my screen, because there's no icons under that side of the Desktop.

    urxvt has tabs, but they're kind of a hack, not fully usable.

    Hyper has tabs, but they replace the title bar. Which is cool but also awful like a lot of things it does.

    rxvt and Alacritty don't do tabs, because they insist you use screen or tmux. Which sucks if you want to move a process from one window to another.

  • Profiles: MS supports multiple profiles, so you can use different ones for each task.

    So does Terminal.app, iTerm2, urxvt (but it's buried in a text file config).

    Alacritty, rxvt, and Hyper have a single profile and no UI for changing anything, hope you like editing text files and reloading.

    As far as I can tell, nothing else does automatic profile switching like iTerm2; when I cd to my ~/Code/CodeScheme folder, iTerm2 switches to my dark red transparent profile, including Scheme-specific triggers and copy/paste filtering.

    You can probably do that in urxvt's Perl(!) scripting, but it's not normal or easy.

  • Copy/Paste Filtering: Nope.

    iTerm2 and urxvt both let you set a bunch of regexp to run over lines to get selections correctly matching boundaries, not just space-delimited.

  • URL Highlighting: Nope.

    iTerm2, Hyper, and urxvt notice URLs and filenames, and let you click on them. In iTerm2, hold down ⌘ and click on any URL or path (like in an ls or find result!) and it does some useful action: Opens the URL in your browser or file path in your editor, by default, but you can configure that in the profile.

  • Custom Keybindings: Sorta? Doesn't seem complete, no idea if there's UI for it, but it does exist in their config.

    Most terminals can do this, but most can only remap a few actions. I like iTerm2's, as usual, which lets you bind any action, menu, or run a program on any keybinding. I mostly just use it to launch different profiles with starting paths & scripts.

    Terminal.app only lets you send specific text for a key.

  • Images: Sorta? Only if they're embedded in fonts.

    This is a neat trick in iTerm2: images. I use imgls all the time to see a thumbnail of every file with details (protip: I changed ls -ld in the script to ls -1Fskd for a more concise listing), and then ⌘-click to open what I want in Acorn; it's better than opening Finder and trying to read a long filename under a thumbnail.

    I'm unaware of anyone else being able to do this.


I'm yet again frustrated by the state of checklist TODO apps. I had a perfect one once, ToDo on the Palm Pilot; aesthetically it was of its time, but for usability on a stylus-based PDA it was perfect. Everything since then has been a compromise.


  1. Run locally on iPhone and Mac.
  2. Sync automagically, preferably with iCloud and/or Dropbox.
  3. Have multiple lists, though does not need nested folders.
  4. Show a list of items I can check on/off.
  5. Be able to show or hide checked items, delete checked items with a command.
  6. Be able to reorder by hand (or sort with a command).
  7. Start up instantly right back where I was.
  8. Be usable while drunk, stoned, tired, or hungry. UI cannot be a giant pile of fiddly little switches.

Nice to Have:

  1. Due dates/expire dates.
  2. Priority tags.
  3. Search screen to show "What's next?", showing date, priority, list, item in that order.
  4. Notifications. But local notifications require a recent app launch, so you might miss stuff; or interacts with calendar which many people find annoying; or uses push notifications, which costs real money past a small number of users.
  5. Emoji & color tags, photos, long notes, etc.

Must Not:

  1. Give my information to Google, Microsoft, Facebook, or other evil mega-corporation who will weaponize my shopping for killer drones or advertising, or both. I'm dubious of Apple & Amazon, but at worst they seem to be venal, not evil.
  2. Be subscription-based.

Don't Care:

  1. Other platforms. Android, Linux, Windows, I don't use these so they're not a pain point for me. If mulle-objc works out, I could think about that.
  2. Pomodoro, GTD, and other fetishistic rituals.

State of the Field

  • Clear was good on iOS, but it's been "dead"/rebooting at Impending for 2 years already, and they won't be making a new Mac version.
  • Apple's Reminders is awful on the Mac (try finding the "show all" button, and keeping your list in order).
  • Things, Trello, OmniFocus, etc. are too slow & heavy for a grocery list.
  • Text files in Editorial or Drafts don't have usable (finger-sized) checkboxes.
  • Wunderlist got bought by Microsoft and destroyed as per usual. They're getting to be as bad a product graveyard as Yahoo! was.
  • RememberTheMilk is not super useful until you pay $40/year, which is not what a dumb todo list should cost.

What Am I Doing?

Thinking about this. I could write the app I want, release it for $5 on each platform, use Marzipan to make it use the same codebase. In theory, this is pretty easy; I can write a database-backed table view thing in a week. Making it nice is a while longer. Marketing is my least favorite thing, who do I use to get it in front of millions of people?

But I'd have to pay Apple to get back into the sharecropping business, and deal with their shitty Xcode tools and the rotting corpse of developer.apple.com which got fucked over by Apple marketing so you can't get to the FUCKING DOCUMENTATION. @invalidname went to work for them and got sucked into the black hole.

Interactive Python IDLE

When using Python from a shell, the REPL is fairly awful and doesn't let you copy-paste or save, except through the shell itself. I especially find that copy-pasting functions in is error-prone. There's a nice interactive environment for Python called IDLE (after Eric ): It's probably an application in your /Applications/Python 3.7 folder, or whatever other OS's do, or can be run with IDLE3 from the shell. Other than using ^N/^P for next/previous history line, it works pretty much exactly as you'd expect a GUI REPL to work, and lets you save your session as a text file, easy to extract some functions from later or use as a doctest.

Trouble is, IDLE doesn't automatically pick up the ~/.pystartup script; I had to remember to call it with IDLE3 -s, and there's no easy way to do that from the desktop, where I'm often lazily clicking. This has been frustrating me very slightly for years.

So: open Automator, new Document, add Utilities/Run Shell Script, and paste in:

IDLE3 -s

Save as an Application, name it IdleStart. The icon's ugly and generic, so I made a half-assed icon, copy it from an image editor or Preview, and paste into the icon in Get Info on the application.


Now I have a nice stupid foot to click on, and get a proper REPL. The running program has a hideous 16x16 or 32x32 icon scaled up, which I don't think I can easily solve; I looked at the idlelib source and while I could patch it, it's not easily configured. Maybe later. There's also no way to specify the window location, which I'd like to have mid-left of my screen, but again, maybe later.

While I'm at it, the themes are garish, and the customizer is unpleasant. So I just edited this in ~/.idlerc/config-highlight.cfg, then picked Mark's Dark theme:

[Mark's Dark]
normal-foreground = 
normal-background = #111111
keyword-foreground = 
keyword-background = #111111
builtin-foreground = 
builtin-background = #111111
comment-foreground = 
comment-background = #111111
string-foreground = 
string-background = #111111
definition-foreground = 
definition-background = #111111
hilite-foreground = 
hilite-background = #808080
break-foreground = 
break-background = #808000
hit-foreground = #002040
hit-background = 
error-foreground = 
error-background = 
cursor-foreground = 
stdout-foreground = 
stdout-background = #111111
stderr-foreground = 
stderr-background = #111111
console-foreground = 
console-background = #111111
context-foreground = 
context-background = #444444

My current ~/.pystartup is short (in python2 it was much longer, since nothing worked right), just some common imports and functions I use enough to miss:

import os, sys
import math
import random as R
import re
import time
import turtle as T

def dice(n, s):
    t = 0
    for i in range(n):
        t += R.randint(1, s)
    return t

def roundup(n):
    return math.floor(n+0.5)

def sign(i):
    if i > 0: return 1
    elif i == 0: return 0
    return -1


Now if I click the foot and see "READY" above >>>, it's all working.

Apple is a Symbol

"If anyone reads this post I'm sure loads of people will tell me that my problems are all my own making and if only I invested in an iPhone all my problems would go away. Well you know what? APPLE IS A SYMBOL OF PRETENTIOUSNESS AND IGNORANCE - YOU DO NOT EVEN KNOW HOW YOUR PHONE WORKS - I DO NOT HAVE TO PAY A TAX TO APPLE TO LISTEN TO MY MUSIC."
Do I really need to get out the soldering-iron again?

Cash, grass, or ass, nobody rides for free.

You can pay the "Apple Tax" for a working system, and as someone who's written low-level audio software: A working system with the lowest-latency, least horrible (not nice, but least horrible) audio APIs in the industry. An iPod touch is still sold with 128GB for $299, which compares favorably to the $500 CD player with 10 seconds of skip protection I had before iPods.

Or, if this is just going to be a home system, how about buying a real stereo system with an amp, and play through that?

Or you can pay with a pile of wiring and an ugly box under a cheap CD player.

Or you can commit to spending the next decade of your life on low-level software and audio hardware trying to make Android audio that doesn't sound like a backfiring Chevy. Nobody else has succeeded, but maybe you'll be the one.

I love these things where someone creates a problem for themselves and then blames THE MAN for it.