But you don’t need a Mac. You need Xcode on the iPad. That’s all. […]
There’s no particular reason you can’t write and debug code on an iPad, and it’s going to happen. Same for Logic, and Final Cut, and Photoshop, and so on. Oh sure, maybe it won’t be those specific apps (though in a lot of cases, it will be), but tasks themselves are always more interface-agnostic than you think.
I see where he’s coming from, and there’s a part of me that agrees, or at least wants to agree. The architecture of iOS is fundamentally more secure and easier to use than macOS, and I love fantasizing about a future where it’s the only OS I ever need.
But the mistake I think he’s making is equating programming to just another task. For computers, it’s not a task, it’s the task; it’s what makes everything else possible. And you still can’t do it on iOS1. Has any platform ever become a first-class programming platform retroactively? They’re usually designed to be bootstrapped as fast as possible.
I’m increasingly convinced that this process of bootstrapping builds features into the nature of platform, and that these features can’t be retroactively changed or added2. And if that’s true, it means the ship has already sailed on iOS ever being a great programming platform. I really hope Apple proves me wrong on this.
It’s such an obnoxious term, but so perfectly apt I can’t help using it: iOS only allows “toy” programming. ↩︎
I had a personal realization recently: kottke.org isn’t so much a thing I’m making but a process I’m going through. A journey. A journey towards knowledge, discovery, empathy, connection, and a better way of seeing the world. Along the way, I’ve found myself and all of you. I feel so so so lucky to have had this opportunity.
What I’ve always loved about kottke.org is that more than any other site it makes blogging feel, not like a continuation of other forms writing and publishing, but like a medium all its own.
What Bitcoin actually accomplished is the financialization of a few genuinely joyous ideas. Shrug away the exchange rate, and you have a set of technologies that, for one, allows you to create scarcity. At least of a kind, because you can encode data and information into the blockchain in a way that lets you say, “This is the first one of these particular digital things.” It’s been applied to digital art, and you can see applications for patents, stock photos, things like that. With copies all over the place. […]
People feel compelled to make predictions about blockchains. Here’s mine: The current wave of coins will eventually ebb, because it’s a big, inefficient, unholy mess. It’s more ideology than financial instrument, and ideology is rarely a sustainable store of value. Plus, transactions are slow (everyone says they’re fixing that), and you shouldn’t have to use an aluminum smelter’s worth of power to make new currency.
For what it’s worth I don’t understand the Bitcoin backlash we’re currently in. The creation of a decentralized currency out of computer algorithms seems like a pretty amazing achievement. Whether it ends up having a positive impact, it’s far too early to tell. But technology is the canonical genie you can’t put back in the bottle – its influence will be felt either way.
Early one morning in 1957, country singer Ernest Tubb barged into the lobby of the National Life Building in downtown Nashville, withdrew a revolver from his holster, and shot at a person he thought was Jim Denny. Formerly the gatekeeper at the Grand Ol’ Opry and currently a concert promoter and song publisher, Denny was the guy who fired Hank Williams and told Elvis Presley he had no future in the music business. He was also still asleep in bed, which ended up not mattering anyway: Tubb, who had spent the week binge-drinking, hit only walls. Nevertheless, he was arrested and thrown in the drunk tank, which for him meant buying cigarettes for the cops and playing a few songs at the station.
When we play Minecraft together, the direction of his development, and thus our relationship, is reversed: He converts the world into expressions of his own fantasies and dreams. And by letting me enter and explore those dream worlds with him, I come to understand him in a way that the games from my childhood do not.
Touring the worlds that my son has settled over the last couple of years, I find a lot of the imagery one might expect from a kid his age. Throughout are standard fantasies like living in a treehouse or on a boat. The dominant themes vary as I pass through time: trains in his earliest worlds, then robots, a long streak of pyramids. Pirate ships, particularly half-sunken ones with treasure chests, remain a constant.
It’ll be fascinating to see what kids who have been creating worlds their whole lives do when they grow up.
His trajectory up to that point was a blur of a different hue. From teen sideman to Charlie Parker’s bebop revolution to a solo career that’s better compared to Pablo Picasso than other jazz musicians, Miles instigated entire paradigm shifts in music. Or, as he hissed to a matron at a White House dinner in the 1980s: “I’ve changed music five or six times.” Most narratives point to iconic albums like Birth of the Cool, Relaxin’ With the Miles Davis Quintet, Kind of Blue, Sketches of Spain, Miles Smiles and Bitches Brew, but his 1974 album Get Up With It hangs like an ominous storm cloud over them all, the one that fans of his other works might hesitate to name, his last studio album before he fell mute for the rest of the decade. Like Orpheus grieving in the underworld or Marlow going up the river, Miles went to a place that forever altered his DNA. When he finally returned to the studio, he never sounded the same.
This view is generally expressed only by those who are extremely technically nerdy — i.e. the sort of guys who honestly see Mac OS X as Unix with a Mac GUI, rather than as an updated version of the Mac OS with Unix-like underpinnings.
There’s no better way to put it; that’s what I’m going for on this blog, giving a voice to the ones who see it as Unix with a Mac GUI.
One of the concepts I want to emphasize is the advantage of using small “composable” Unix utilities. To this end, I use rg for all kinds of operations that search or list files. One advantage of this approach is that convenient rules setup in rg, e.g., ignoring .git directories and files in .gitignore, then propagate over every file and search operation I perform.
But something that’s always bothered me is since rgdoesn’t support finding directories (understandably), I lose rg semantics when searching for directories, and instead get decades old find semantics, which don’t do smart things like ignoring things that probably should be ignored.
So I was delighted when I followed the ripgrepGitHub issue to the fzf README to fd. A utility that does exactly what I’m looking for, find directories while replicating the smart take on semantics used by rg (and other modern unixutilities).
Here’s an example of my favorite use of this, replacing the built-in fzfzsh widget’s FZF_ALT_C_COMMAND, which enables a key command to fuzzy filter a directory to cd to recursively.
What the heck is the POSIX shell anyway? Well, the POSIX (the Portable Operating System Interface) shell is the standard Unix shell - standard meaning it was formally defined and shipped in a published standard. This makes shell scripts written for it portable, something no other shell can lay claim to. The POSIX shell is basically a formalized version of the venerable Bourne shell, and on your system it lives at /bin/sh, unless you’re one of the unlucky masses for whom this is a symlink to bash.
If you’re on macOS then unfortunately you’re part of those “unwashed messes” that symlink1/bin/sh to bash. This has some interesting implications, in that even if you use the #!/bin/shshebang in your scripts, they won’t be guaranteed to be portable to other (Unix and Linux) systems. I’ve found a practical solution is to just use the bash shebang, #!/usr/bin/env bash, which will make your scripts portable to any other system running bash.
Xray is an experimental Electron-based text editor informed by what we’ve learned in the four years since the launch of Atom. In the short term, this project is a testbed for rapidly iterating on several radical ideas without risking the stability of Atom. The longer term future of the code in this repository will become clearer after a few months of progress. For now, our primary goal is to iterate rapidly and learn as much as possible.
Contrary to popular belief, we’re not using HTML/CSS for slide rendering, but instead we’re using native macOS views to construct each slide. This allows us to leverage built-in system capabilities like exporting to PDF, native video players, great text rendering and many more.
Avoiding web views: A time-honored tradition of fine apps everywhere.
For its complexity level, TextMate is the most well-designed application I’ve ever encountered. Featurewise1, it doesn’t compete with Vim2, Emacs, or Sublime Text—but the features it does implement are better designed than anywhere else.
TextMate’s design elegance is exemplified by its command composability. “Composability” here means commands can be chained together to produce cumulative effects that are logical and useful.
For example, lets say you want to change the name of the startTime variable to startDate in this Swift snippet:
TextMate’s composability can be demonstrated further by performing the same commands with an active text selection. In that case, only instances of startDate within the text selection are edited. This idea of acting on the current selection or, in the absence of a selection, the whole document, is pervasive throughout TextMate4.
Command composability is a defining trait of well-designed software—learning a piece of software is an investment, and one of the best ways an application can make the most of that investment is to amplify what you can accomplish for the same effort through command composability.
Vim deserves special attention in this post because it also excels at command composability. But Vim has far more design flaws than TextMate. I’d be surprised if anyone can read the chapter on regular expressions in Practical Vim and not come to this same conclusion. ↩︎
“Replace All” does have a keyboard shortcut, ⌃⌘G, but it’s hard to remember. And frankly, OS X dialog boxes don’t work very well when you want to choose any button other than the default (or esc to dismiss). And “Replace All” is too dangerous to make the default. ↩︎
This is a Monome2, it’s a 16 x 16 grid of LED buttons that can be mapped to control any aspect of an electronic composition. By far the most common thing they’re mapped to is sequencing notes in time (called “steps”). The 16 buttons across mean four steps per measure in 4/4 time3.
The Monome isn’t the originator of the 16 steps by any means, that goes back decades: The Roland TR-808 is a historic example of this layout. It’s an electronic music tradition that’s been passed down for generations.
The disadvantages of this design are obvious, the rhythmic possibilities of 16 steps were exhausted ages ago, but it’s the advantages that are more interesting. This small palette acts as a scaffolding for more adventurous ideas. It’s a familiar base that can lure listeners far outside of their comfort zone. It’s what allows DJs to blend songs together, the unsung benefit of DJ sets is just how much experimental music gets slipped in and actually enjoyed (by people who’d never otherwise find themselves staring face-to-face with a trout mask).
The grid has been so successful as a compositional tool that it permeates through all kinds of electronic instruments, to the degree that it can be an uphill battle to deviate from it. In many ways this is a good thing. Innovation happens when the common cases are effortless, freeing the musician to focus their effort on invention. The balancing act for new tools is how to facilitate the exploration of new ideas without interfering with existing workflows.
This is where Euclidean rhythm comes in. An Euclidean sequencer is basically polyrhythm generator, it takes two parameters: a number of notes and a number of steps; and it algorithmically positions the notes as equidistant as possible in the number of steps. For example, three notes and seven steps results in the pattern E(3,7) = [x . x . x . .]. It turns out that equidistant distribution is a key to creating rhythms that sound musical, an extraordinary number of traditional rhythms can be generated through this simple process, see the example rhythms section.
Polyrhythms are a great way to make rhythms sound fresh: Multiple repeating rhythms at different rates creates variation over time. And being difficult to work with, they’re under-explored. The grid in particular makes polyrhythms impossible in many situations, when the number steps that don’t match the 16 subdivisions, and difficult at best. The beauty of the Euclidean sequencer is that it simultaneously addresses all of these problems, while also working seamlessly with the benefits of grid.
Now I just have to make a tool to generatively manipulating the Euclidean sequencer’s parameters, and I can sit back and leave the music making to the machines entirely. I like making software more anyway. My Euclidean sequencer is on GitHub.
I love the Monome’s design because it distills the converging trend in electronic instrument design towards flexibility to its essence. Predictably, it’s been tremendously influential, a google image search for grid midi controller reveals seemingly endless Monome-inspired designs. ↩︎