The Pig Truck

At dawn came the pig truck, driving itself in from over the hills. By the time it reached the jail, the prisoners were lined up, resigned, watched by the armed guards in their towers. Cleaned and shaved, naked and divested of names, they were human no longer. Dust rose and fell as the long blank truck pulled up, the back springing open by itself, the ramp dropping to the ground. Read more…

The Dream Of Climbing

She was a worker, that’s all. A courier. Pick it up here, carry it a long way, drop it off there. It was a dull job, but it meant she didn’t have to think much, which suited her. And everyone she knew worked the same job, so it was easy to share in-jokes and gossip and complain about the conditions. Her people had no vehicles, no roads, no pack animals. But they knew all the trails throughout the valley and the forest, kept them clear and well-marked. Read more…

Reinventing Journaling

Journaling is a style of blogging that’s gone out of style lately, for some reason, but it’s dear to my heart, and to many of my friends’. Journaling is exemplified by LiveJournal, which has a long proud history as the first social network and possibly the first turnkey blogging system (begun in 1999, it slightly predates Blogger.) LiveJournal still exists, but it’s a shadow of its former self. The UI and functionality are stuck in an early-2000s timewarp, and worse, most of the users are gone, having decamped to Twitter and Facebook. Read more…

Fears

I’m afraid of a lot of things. Or, I’m often afraid of things. I have some issues with anxiety. The anxieties aren’t constantly in my way; they’re more like electric fences that keep me in line. I can go through my everyday life without thinking of them, but when I venture outside what I’m comfortable with I start to get crackles of sparks down my spine and in the pit of my stomach, and then usually I back away. Read more…

Baaaa

They were easy enough to mistake for sheep at a distance — white, fluffy, contentedly grazing — especially in the pre-storm dimness. It was when he got closer to them and saw their body shapes and the way they were eating that Laurence began to regret coming to the farm. As he watched, the nearest animal sheared off a half-dozen dandelions with its mandibles, squirted some sort of digestive ichor on them, and began rhythmic movements of its mouthparts. Read more…

Another new blog...

Well, it’s the same blog, I’ve just replaced Jekyll with Hugo. If I’ve succeeded, you won’t be able to tell anything’s changed. Every couple of years I go through this ritual of porting to a different blogging engine. This blog started out as handwritten HTML, then it went through Movable Type, Drupal, WordPress, Jekyll, and now Hugo. Each iteration is usually an improvement, but to be honest, the main reason is to have a chance to mess with Web Stuff for a while. Read more…

App Dream

I’m at a computer lab [probably the one from college] and have written an entire email client app in a day. I’m excitedly showing it off to everyone. It’s kind of glitchy but I can pull up my real emails, including spam. The app is also, simultaneously, made out of a 2-liter soda bottle. It starts out crushed, and expands and fills with water as it launches. Unfortunately there are some cracks that water squirts out of. Read more…

Notes Toward A Social-Network Schema

Modeling a social networking system like LiveJournal or Facebook in a JSON-document-oriented database like Couchbase [Lite] or CouchDB isn’t hard. Here’s a basic schema that I’ve been playing with for a while.

Read more…

"Forest Wire" Mix

Here’s my most recent music mix, “Forest Wire”, all music from 2013. This mix is dedicated to my brother-in-law who builds guitars but nonetheless appreciates electronic music. It starts and ends ambient, but builds up into dub and K-pop and jungle and other styles.

Read more…

What I'm Up To In 2014

Couchbase Lite (Née TouchDB, née Couchbase Mobile) Mobile syncable NoSQL database for iOS. My work project in one way or another since I started at Couchbase in mid-2011. I’m still having fun working on it. Couchbase Sync Gateway The companion piece – the glue that lets Couchbase Lite sync with Couchbase Server. It’s been challenging and educational and boundary-stretching, and part of me is sick of working on it because the secret is I’m not a big-data guy. Read more…

New app in testing: Jackdaw

I’m looking for some more beta testers for a font preview/management utility I’m working on. I’ve been frustrated by not having a good visual way to browse my font library, so I wrote my own. It’s called Jackdaw. If you have a sizable font collection, choose (or just ogle) fonts on a regular basis, are willing and able to send bug reports/crash logs/suggestions, and are running OS X 10.8 or 10. Read more…

New Blog For 2014

This blog kind of ground to a halt in 2011. I think the final straw was having my WordPress hacked and many of the posts defaced with spam links. After that I swore a mighty oath not to have any further trafficking with the wickedness of PHP. But I still miss blogging (proper blogging not tumblr). Sometimes I have things to say! And apparently back in the day a few people even used to read things I wrote here, which is nice to think about. Read more…

Announcing TouchDB

[I just posted this to the Couchbase Mobile community mailing list.]

TouchDB is a project I’ve been feverishly working on for a few weeks. It’s an investigation into the feasibility of a CouchDB-compatible database rewritten from the ground up for mobile apps. The comparison I like to make is that “if CouchDB is MySQL, then TouchDB is SQLite”. In fact, it uses SQLite as its underlying storage engine. You can read a longer justification for it on its wiki, as well as an FAQ and design document.

— It speaks CouchDB’s replication protocol. I’m pretty serious about that; I’m even documenting the protocol.
— It also understands a large subset of the REST API, enough so that it works with CouchCocoa. I’ve got a clone of Grocery Sync working as one of the demo apps in the project.
— The current implementation is for iOS. If the investigation pans out we’ll port it to Android, and possibly other platforms.

TouchDB is certainly not ready for prime-time yet, but here are some current statistics to whet your appetite:

Read more…

My presentation from Keeping It Realtime

I gave another talk about Couchbase/CouchDB at the Keeping It Realtime conference this week in Portland. This one is titled “_ch_ch_changes: CouchDB/Couchbase Notifications And Replications”, and the slides are now up on slideshare. I had a great time. The conference itself was pretty exciting, even if some of the content was over my head (I’m not primarily a web developer, server-side isn’t how I roll, and I’ve only just started learning about node. Read more…

Couchbase news (and my preso)

My new employer is doing well: MOUNTAIN VIEW, Calif. – August 10, 2011 – Couchbase, the leading NoSQL database company, today announced it has secured \$14 million in a Series C round of financing led by venture capital firm Ignition Partners with participation from the company’s existing investors Accel Partners, Mayfield Fund, and North Bridge Venture Partners. The company has also reserved an additional \$1 million for investment from strategic customers and partners. Read more…

At The Ice Bar

August in Los Angeles was bone-dry and dusty, but he left it behind in the parking lot as he made his way through the series of three doors, heavy and white, and into the frozen refuge of the ice bar. He was known, there, and the hostess greeted him with a sealskin robe, slipped over his shoulders before he had time to start shivering. The tip of her elegant nose felt icy against his own.

There was room for one more at the bar, and at a nod from the chef he took the seat gratefully. One often had to wait, stamping feet to ward off the cold. The chef slid the amuse-bouche before him as he unfolded his napkin, and it was exquisite in appearance: a translucent carpaccio of walrus blubber sprinkled with snowflakes. The snowflakes were not unique, in fact they came in precisely two shapes, one sprinkled on the left side of the dish, the other on the right. They made not-quite-imperceptibly different crunches as he ate them. It was touches like this that had made the chef’s name when he was but a young man just arrived from Nunavut.

Read more…

Fudge

I’ve just released a new open-source project, a small one — Fudge-Cpp, a fast C++ library for reading and writing Fudge messages. I hadn’t heard of Fudge either, till a few weeks ago, but it’s a type of thing that’s always interested me: a generic structured binary data format. A quick elevator pitch would be “it’s sorta like JSON, except more compact and faster to parse”. (It’s also sorta like Mac property-lists, YAML, etc. Read more…

Glitch City

No again, I will not show you what’s under the bandage on my arm. I won’t even look myself, anymore; it’s gotten too disturbing. I mean, the wound hasn’t changed, but every time I look at it it bothers me more, takes me longer to stop shivering. I keep wanting to touch it. Listen: Did you ever play Shock City? I’m not trying to change the subject; hear me out. I played the hell out of that game when I was twelve, and I always wondered what was inside all those buildings you couldn’t get into. Read more…

py2rb: A Python-to-Ruby Porting Assistant

I’ve never figured out whether I prefer Python or Ruby, so I’ve written things in both languages. Sometimes I start in one, then change my mind and decide I’d rather use the other. Unfortunately, changing over is painful, even though both have fairly similar syntax. For instance, converting to Ruby means inserting zillions of “end” statements! Having a need to do this recently, I lazily looked around for a script that would do the grunt-work of Python-to-Ruby translation. Read more…

Re: Idea for alternative RSS syncing system

Brent “NetNewsWire” Simmons raises the idea of an open protocol for syncing RSS/Atom subscriptions, that is, a way of keeping multiple local newsreader apps (like on a Mac and an iPhone) in sync with each other, so that they share the same set of subscribed feeds, and remember which articles have already been read. You can think of it as “IMAP for RSS”. NetNewsWire already does this using Google Reader as an intermediary, and Apple’s PubSub framework (which is what Safari and Mail use) shares the read/unread state using MobileMe. Read more…

The Music I Liked Of 2009

Every year the Albums Of The Year lists seem more and more removed from my experience. (Most of the time I haven’t heard a single album on the list.) Worse, we’re now getting into the Of The Decade lists, making me realize how long this has been going on*. If you ask me the top albums of the ’80s or ’90s, I don’t have too much trouble rattling off a bunch of names. Read more…

The Dungeon Master

Call the roller of big dice, The long-haired one, and bid him whip On kitchen tables consecutive 18’s. Let the fighters dawdle in such armor As they are used to wear, and let the mages swap Delicious spells from last month’s Dragon. Let a fumble be finale of its caster: The only emperor is the dungeon master. Take from the manual of monsters Painted with three crude beasts, that sheet Read more…

The Lost Lesson Of Instant Typing

Farhad Manjoo writing in Slate about Google Wave: The trouble is, everything you type into Wave is transmitted live, in real time — every keystroke was getting sent to Zach just as I hit it. This made me too self-conscious to get my thoughts across. … Maybe I should just delete what I’d written and say, “Twitter works because it’s simple.” But I couldn’t do that, because Zach was watching me. Read more…

The Top 131 Elephant Jokes

So far, this blog’s main claim to fame has been as the #2-ranked Google hit for [apricot jam recipe]. But that’s no longer enough to sustain my extravagant lifestyle, so I’m following the next most obvious business opportunity: Elephant jokes! These were huge (the jokes) when I was a kid, but they seem to have been largely forgotten, which is a shame. I tested them out on my kids today, and they still work fine. Read more…

I Has A Hash Table

I know, three weeks ago I said I was building me a B-Tree. I did build it, even the parts I listed under “What’s next?” in that post, and it works. But it became apparent there was a more urgent need for a hash table, for work-related reasons, so I switched gears to build one of those on the same principles. The biggest principle is Append-Only Storage, as described in the prior post. Read more…

Gossip For Lakitu

Last year I wrote a series of blog posts about a peer-to-peer system called Cloudy that I was developing. I was going up the stack, from messaging to identity, but didn’t finish documenting all the layers I’d built. I mostly stopped working on Cloudy after I went back to gainful employment, but I keep thinking about this stuff. “Lakitu”? I’ve since heard about another unrelated project nicknamed Cloudy; and the whole term “cloud” has gotten so debased in the past year that it now stands for outsourcing to giant hidden server farms, which is the antithesis of what I stand for. Read more…

I’m Building Me A B-Tree

The other day I took it into my head to implement a B+tree. Why? Because they sound neat, and I’ve done hardly any serious programming with trees in my career. (Someone, I think Buzz Andersen, once noted that there are two kinds of programmers: those who do think in terms of trees, and those who do everything with hash tables. I’m in the latter camp.) And also because I’m a big fan of CouchDB, and really admire its elegant storage model. Read more…

Security: Not Quite Getting It

I got an iPhone 3GS yesterday (yes, it totally rules.) While setting up online account access for billing, AT&T had me enter a password. There was one of those colored password-strength meters next to the text field, and it said the password I entered was “weak”. Alright, I changed it to add some commas and dashes. Then I hit Submit, and was told that passwords can only contain letters and digits. Read more…

320, 160, 192, GO!

New happy fun summer mix!

The Subtle Dangers Of Distributed Objects

Introduction: I wrote this as part of a reply on Apple’s bonjour-dev mailing list, then decided it might be worth publishing more visibly. I’ve found that Cocoa’s Distributed Objects technology is immediately attractive to many developers, while those who’ve used it end up finding that it’s much more complex than it looks. But I haven’t seen much written about the caveats of using it. I am not saying “don’t use DO” or “DO is broken”! Read more…

Career Update, Part ++n

I’ve been working at Google since last August. The Big G’s hiring process is rather weird — when you interview, it’s not for any specific team. It’s only after you get an offer that you decide which team to join, of the ones with open positions. I decided on Google Sites, which I knew and liked from its days as JotSpot, a hosted wiki with some powerful features. It ended up not being the right place for me, for a couple of reasons: Read more…

Is There Any Point To Using The Keychain API On iPhone?

I’ve always liked the Keychain technology in Mac OS X. Sure, the API is notoriously confusing and awkward, but the end-user benefits are compelling: Secure, encrypted storage for all passwords and keys. Items can be shared between applications — so in principle you don’t have to enter a given password more than once, since other apps will find the existing item in the keychain. Items have access control lists, so they can be restricted to certain apps. Read more…

A Bonjour / Chat Tutorial For iPhone Developers

MobileOrchard just published a tutorial article by Peter Bakhyryev, describing a sample iPhone app called “Chatty” that acts as a simple peer-to-peer chat-room. “In this tutorial, we are going to explore a simple chat application for the iPhone. It allows you to host your own chat room and advertise it on your local Wi-Fi network (in which case your app acts as a chat “server”) or find and join chat rooms hosted by other people on your network (acting as a chat “client”). Read more…

The Assassination of J.G. Ballard Considered As A Metafictional Homage

“Some people have suggested that mental illness is a kind of adaptation to the sort of circumstances that will arise in the future. As we move towards a more and more psychotic landscape, the psychotic traits are signs of a kind of Darwinian adaptation.” —1998 Abstract. Numerous studies have been conducted upon patients in terminal paresis (GPI), placing the author J.G. Ballard in a series of simulated auto crashes, e. Read more…

Music, Alone

The feelings created by music are so strong, for me, but so ineffable. The problem of perception is usually described using color — how can we know if the visual sensation I call “red” is anything like the one you call “red”? — but only gets worse as you ascend to higher order perceptions, where even names become harder to apply. What do you call the feeling incited by “Guernica”, and even if you find the same words I would, is it the same feeling? Read more…

What will Web 3.0 be?

So, Web 2.0’s heyday is over, and somewhere out there, Web 3.0 is slouching toward us waiting to be born. What will it be? There’s really no such single thing as “Web *x*”, of course. And all predictions are really just wishes. That being said, my wish is that Web 3.0 will be about distributed systems. To oversimplify: Web 1.0 built up big brand-name websites with their own content — things written by them, or repurposed from the media companies that owned them, or stuff to buy. Read more…

sneJ’s Law of Toolbars

The Pessimistic Form The set of commands available in a toolbar (even via customization) is restricted to those that are either: (a) painfully obvious (New, Save, etc.), or (b) useless to you (Save As EBCDIC, Post To CompuServe, Bilinear Zeta-Regression, etc.) The Optimistic Form Combine this with the well-known principle that, while everyone uses only a subset of an application’s features, everyone uses a different subset. Conclusion: To be useful, a toolbar’s customization UI should allow every single command in the application. Read more…

Couch

I really don’t know how long I’ve been lying on the couch, watching the men on the TV. I don’t remember things so well anymore, since the accident. I don’t remember the accident either, but my friends tell me it was pretty bad. I have healed about as well as I’m going to, and though I don’t get around well, I can still think. In small doses.

The men on the TV gesticulate about some crisis or other; I can’t tell what, because the sound is off. They look angry — at me, at all of us, at themselves. Small text crawls across the screen above and below them. The TV men look very tired, too, as tired as I feel, and perhaps lost and afraid. I feel such sympathy; I would like to turn up the volume and learn more of their situation. Maybe I could ask one of my friends to.

Read more…

“Interview With An Adware Developer”

Matt Knox, a Ruby developer and repentant former coder for an adware company, explains how adware works. Really fascinating stuff, and quite scary from a security point of view. “At the same time, we also made a virtual process executable. I’ve never heard of anybody else doing this before. Windows has this thing called Create Remote Thread. Basically, the semantics of Create Remote Thread are: You’re a process, I’m a different process. Read more…

Career update

FYI, I ended up taking the position at Google. I started two weeks ago, and it’s been quite exciting, despite (or because of) the “drinking from a fire-hose” aspect of learning my way around the big G. I’m on the Google Sites team. I’ve been interested in wikis for years, and now I get to actually work on one. (Although Sites, née JotSpot, is not a typical wiki.) I could write a lot about my experience of Google so far. Read more…

That New-Cards Smell

My Decktet is a thing of beauty. I even printed & assembled the box (an activity that took me back to my happy childhood days of making paper polyhedra models.) The only problem is that the cards still have a faint sickly-sweet stink of toluene and acetone (from the plastic coating) even after I left them spread out on the floor for a few days. It’s quite unpleasant, not like the nice smell of new books, cars or boardgames. Read more…

I Made A Decktet

Sometimes it’s nice to make physical objects. It’s usually messier and more time-consuming than doing it on the computer, but in the end you have something you can actually touch. Ever since I saw P. D. Magnus’s Decktet — a whimsical yet mysterious deck of cards for games or divination — I wanted one of my own. However, the Decktet is currently only available as a PDF, so any physical manifestation has to be of a DIY nature. Read more…

BLIP news (Python! Detailed spec!)

I’ve now implemented BLIP in Python. That officially makes it cross-platform! If we get a third implementation, can we call it an “industry standard”? There’s some detailed protocol documentation, too. Also, on Steven Frank’s recommendation, I set up the Redmine project tracker on my website. It’s pretty slick! Kind of “Trac On Rails”.

BLIP-Protocol mailing list

I’ve created a BLIP-Protocol mailing list on Google Groups: Subscribe to BLIP Protocol Email: Visit this group Please join up if you’re interested in learning, using, re-implementing, improving, extending…

BLIP: Come ‘n’ get it!

I’ve released the source code to my “BLIP” protocol implementation, as part of a project I call “MYNetwork”, for “Mooseyard Networking Libraries”. API documentation is available online, and you can check out or browse the source code from its Mercurial repository. For the really curious, there’s even a sketchy overview of the protocol’s wire format. It’s working quite well for me in Cloudy; it’s been a while since I’ve found any outright bugs, although I know there’s more work to do on performance and features. Read more…

BLIP update

I’ve got my new BLIP protocol all implemented now. After my previous post on Monday: On Tuesday I implemented message metadata. On Wednesday I got SSL working (configuring the “server” side to verify the “client’s” cert was difficult.) On Thursday I put Cloudy up on blocks, pried out Vortex and my Obj-C wrapper library, and replaced them with BLIP. And on Friday (today) I debugged. Cloudy’s back up and running, and all its features work. Read more…

The Fine Line Between Clever And Stupid

…and which side of that line am I on? Not in general; just in respect to my latest decision in Cloudy. It’s the old “make vs. buy” trade-off, or “write vs. reuse” in this case: do you go with an existing library, even if it’s problematic, or do you write your own implementation from scratch? What am I talking about? The networking code in Cloudy. From the very beginning I wanted to use BEEP, a generic and flexible protocol for sending request/response messages over a socket. Read more…

Stickies makes its music-video debut!

Stickies and I hadn’t spoken in a while, but it called me this morning to announce it’s made its acting debut in a music video! That was unexpected, to say the least, but it’s an exciting career move, and I had to congratulate it; it does a great job: Stickies makes its entrance at 0:53, if you want to skip directly to it, but really the entire video (and song) are excellent. Read more…

Cloudy Verification

Continuing from the previous Cloudy post … The first time you connect to someone, how do you establish that digital identifier you’re communicating with is the human being you think it is? This is surprisingly difficult to do, because it’s prone to what cryptographers call the “man-in-the-middle attack”. (Those of you already wearing tinfoil hats can skip past the general explanation, down to “What Cloudy Does”.) A Quick Overview Of Verification Attacks. Read more…

Cloudy Networking

Next I need to talk about networking; having an identity and minting certificates isn’t very interesting until you can connect to someone else. Point-to-Point Communications. When one Cloudy peer wants to communicate with another one, it opens a TCP socket to its IP address — [Hang on, there are two issues I suddenly glossed over in that last phrase. First, how did this peer find out the others’ IP address? Read more…

Cloudy Identity

Continuing from the previous Cloudy post … At the root of Cloudy is the means for creating and establishing identity. A lot of peer-to-peer systems treat the peers mostly as interchangeable anonymous nodes, often deliberately so, but Cloudy is a social system. Quick Crypto Recap. The identity and security layers of Cloudy are tightly intertwined, because identity without security is useless. And security is accomplished entirely through cryptography, because the centralized alternatives like locking all of your servers up in a closet don’t apply. Read more…

Cloudy As Buzzwords

Continuing from Unstealthing, Incrementally. I have many ideas for applications, but most of them seem to rely on similar kinds of infrastructure, in particular a distributed, secure application-level messaging system. Unfortunately, this doesn’t really exist yet, at least not in any form that meets my needs. What am I talking about here? More colloquially, it’s a mechanism for letting applications all over the network send messages to each other, without requiring a central server, and without allowing messages to be eavesdropped upon or faked. Read more…

Unstealthing, Incrementally

I got about 14 minutes of fame back in January with a blog post, wherein I grumbled about (among other things) how I disliked Apple’s culture of secrecy, and announced that I’d left Apple to work on my own, unspecified, project. In the intervening three months, I haven’t said anything about what that project is, almost as though it were … secret. The irony of this is not lost on me. Read more…

Japanese Advertisers Discover Zooko’s Triangle

Cabel Sasser, of indie developer Panic, reports from Japan: “Within minutes of riding on the first trains in Japan, I notice a significant change in advertising, from train to television. The trend? No more printed URLs. The replacement? Search boxes! With recommended search termshttp://www.cabel.name/images-post/2008/03/search-2.jpg! He goes on to note how common it is for people to type URLs or domain names into their browser’s search box instead of the address field. Read more…

My Debt To Arthur C. Clarke

Arthur C. Clarke’s death hit me harder than other recent obituaries, even though it’s been decades since I read much by him. His were some of the first science fiction stories I read, at the age of ten or eleven; and for several years after that he was my favorite author. I remember, during one of our long summer trips visiting the extended family in Germany, finding one of his story collections in the small English-language section of a public library. Read more…

The Origin Of The iChat UI

I had lost this historical document for a long time, but finally found it the other day on an old backup CD. It’s the original 1997 sketch I made of a chat user interface based on speech balloons.

Read more…

The Beauty Of 99¢ iPhone Apps

After digesting yesterday’s iPhone announcements [with fava beans and a nice Chianti] I started thinking about the pricing models made possible by the “Application Store”. In particular,

How cheap can an iPhone app be?

I think the answer’s clear. The Application Store will obviously be based on the iTunes store, whose bread-and-butter is a product, the AAC audio file, that sells for … 99¢. Apple’s clearly able to make a profit at that price point, despite credit-card processing fees, bandwidth costs, and comparable payments [Updated. Thanks, Dru!] to the record labels. So I see no reason they wouldn’t allow a developer to price an application that low.

But why would a developer want to sell an application for a net 70¢?

Micropayments

Because at such a low price, with a one-click store a couple of taps away, it becomes an impulse purchase. It’s a form of micropayment, an idea that’s been talked about for years but hasn’t widely taken off due to the practical difficulties of collecting very small payments. The few areas where micropayments (albeit larger than the canonical 1/10¢ originally proposed) have worked include the iTunes store, and the downloadable-game stores for the Xbox and Wii.

And let’s not forget the most amazing example of what people will pay for if you make it convenient enough: ringtones. The practice of charging suckers \$2 for a 30-second snippet of a song they already have, is a multi-billion-dollar industry.

Read more…

Systems

The last paragraph of the poem “Systems” by Kristy Bowen: “… I try to write a poem I wouldn’t want to sleep with. Would kick to the curb, wrap my thumbs around her slender neck and snap. This one’s still babied, blinking, wondering if it wants to be a skirt or a tire iron. Licking the perimeter of opened envelopes for a tiny bit of sweet. My nouns go awry every time I stop paying attention. Read more…

hash musings

I’ve been thinking about writing an essay about the beauty & weirdness of cryptographic hash functions. The way any digitized data, however huge, can be named by a short fixed-size binary string. The way there are in theory an infinite number of hash collisions, but in practice zero. I was talking to myself about it, this morning, and two quotes appeared, which I write down here to remember: “Hashing is my favorite computer-science concept. Read more…

Black Button, Black Box

I just ran across Invisible Games, a website of short and enigmatic fictions. One of them, The Loneliness Engine, reminds me of my own short-n-enigmatic We [Had Black Boxes]. No spooky synchronicity or anything, but they seem to belong together somehow … which itself fits in with the themes of both stories. Neat.

Network Barbie Says “Asynchrony Is Hard!”

You can’t avoid asynchrony when writing network code, since operations can take an arbitrary amount of time, and often do. To keep the app responsive it has to be able to get other things done while a slow operation is in progress. My first exposure to network programming was in Java, whose approach to asynchrony is to use threads. Lots of ’em. The API calls are [almost] all blocking, so you run them on background threads. Read more…

3 Weeks

I’ve been on my own for three weeks now, and I’m definitely enjoying it. I know that one of the general issues with self-employment is whether one can stay motivated without the external structure imposed by The Man. Fortunately I seem to have no problem with this — I’ve been coding at top speed. Mostly I work in the detached office, which is now clean and cozy, but sometimes I hang out on the couch in the living room. Read more…

FakeSteved!

I used to think it was the Big Time if I got a link from Daring Fireball, but now someone just pointed out to me that the Fake Steve Jobs has taken note of my post. So … what does it mean for my post to be criticized by a fictional construct that embodies a parody of the CEO of the very same ex-employer my post criticizes? Especially when, more specifically, that fictional construct’s humor is largely based on an exaggerated inversion of Apple’s carefully-groomed non-blogging public image, and he calls out a quote of mine that decries exactly the situation that his (fictional) presence repudiates? Read more…

Gone Indie

Here’s a career update, for those of you who care: I’ve left Apple, and I’m now working on my own, from home, as an indie software developer. I have plans for at least two kick-ass Mac apps, I’ll probably contribute to a few open source projects, and I may dabble in some web stuff.

(At least, that’s the plan for now! Everything is subject to change without prior notice. This document contains forward-looking statements. These statements involve risks and uncertainties, and actual results may differ.)

This is kind of a big change for me. I’ve been continuously employed for 19 years, 16 of those at Apple. I clearly like being part of a team, part of a company, and specifically part of Apple. But there comes a time when a man’s gotta do what a man’s gotta do.

Read more…

GeekGameBoard

Santa has an early Xmas present for all you good Leopard programmers: GeekGameBoard, a new piece of sample code by the anonymous engineer elves at Apple. [Update: GeekGameBoard is now an open-source project hosted at bitbucket.org GeekGameBoard is an example of using Core Animation to present the user interface of a board or card game. It implements a small framework for implementing such games, with domain-specific classes like “Grid” and “Piece”, and examples of several game definitions built on top of the framework. Read more…

The Gnostic argument for agnosticism

In some online forums I list as interests both gnosticism and agnosticism, which is a bit of a joke since the two words are literally contradictory, but is true in that both are interesting and important to me. Agnosticism as my attitude toward religion: that the existence of a God or gods is fundamentally unknowable, undecidable, unprovable. Gnosticism as a mystic tradition, a suppressed early fork of Christianity, whose beliefs have more recently had a large impact on the literature of the fantastic and on postmodern philosophy (notably Philip K. Read more…

AppleScript team photo, 1993

Warren just emailed me this photo, commemorating the release of the first Apple product I worked on. That’s me on the second row, second from the right, with the dopey expression (but no gray hairs.)

Read more…

Facebook and Decentralized Identifiers

I finally made myself a Facebook account, mostly to see what it’s like. Overall, I’m pretty impressed: the UI is nicer than most such sites, particularly the still-antiquated LiveJournal and the disaster that is MySpace. The biggest issue there seems to be that the main profile page absolutely doesn’t scale up to handle the exploding number of apps/widgets people are stuffing into it, so you end up with mile-long profiles containing box after box of junk. Read more…

Holding a Program in One’s Head

Paul Graham [who is obnoxiously elitist, but frequently insightful] has a new essay, “Holding a Program in One’s Head”, that is making me feel sad this morning.

“A good programmer working intensively on his own code can hold it in his mind the way a mathematician holds a problem he’s working on. Mathematicians don’t answer questions by working them out on paper the way schoolchildren are taught to. They do more in their heads: they try to understand a problem space well enough that they can walk around it the way you can walk around the memory of the house you grew up in. At its best programming is the same. You hold the whole program in your head, and you can manipulate it at will.”

Read more…

The Hero Passes

We love to play the Hero — exploring dungeons, grabbing treasure, saving the world from evil. But I started wondering about the reasons behind some of the actions in such games, and especially about what my Heroic deeds looked like to the ordinary people of the lands I passed through. (As my wife once put it: “Why isn’t there a Hug button?”) The result is this story.
I don’t normally write this sort of antiquated prose, but the genre does require it. It was actually a fun exercise, and I’ve tried to affect more of a James Branch Cabell or Lord Dunsany voice, rather than the tiresome faux-Tolkien of most current heroic fantasy.

Read more…

Hang on, I gotta take a call from the Archdemon Azazael

37signals gripes about those annoying Bluetooth cellphone headsets with even-more-annoying blinky LEDs on them. I once had the idea of a charity that would collect discarded headsets from yuppies and distribute them to mentally ill homeless people. Just by wearing the headsets, they would eliminate the social stigma attached to talking to themselves on the street; this would help re-integrate them into society.

How not to fix buffer overflows

This tale of woe is making me rethink whether I want to be running any PHP-based software on my website. Yes, integer overflows happen to the best of us (even those of us who write popular algorithm textbooks), but I would hope that once one is pointed out, the people maintaining the code would have a clue about how to fix it. Stuff like “if (size>INT_MAX)…” is funny, but I find it even scarier that someone would think the solution to integer overflow is to store potentially-huge byte counts in variables of type “float”. Read more…

Apricot Jam Recipe

Here’s my family recipe for apricot jam, handed down through generations. One generation, really — my mom got it from a pamphlet put out by some local womens’ group, after we moved to an old ramshackle house in the middle of a huge but disused apricot orchard. The trees were old, but a lot of them still produced fruit, and it was no trouble to walk around and collect bucketsful. So we needed some way to make use of all that fruit…

This recipe is different from the usual one you find packed in a box of pectin, because, well, it doesn’t use pectin. Instead, you thicken the jam by cooking it a lot longer. This means it tastes less like fresh fruit; but it has a wonderful taste of its own, a bit like dried apricots, and a nice gloopy texture. As a bonus, putting an apricot kernel1 in every jar gradually adds an almond-y aroma2.

Read more…

“Cut The Lights”

This is a mix of post-punk (old and new). I made it about a month and a half ago, but hadn’t put together a cover until today. Now it’s ready… [web page] [MP3] [more mixes]

Uncle Jens’s Coding Tips

Ever since Brent “NetNewsWire” Simmons posted his Thoughts On Large Cocoa Projects the other week, I’ve wanted to add some of my own tips. I’ve worked on some big projects (iChat, Apple’s Java runtime, OpenDoc) and have sometimes had to find my way around in others (Safari, Mail), so I know what Brent means when he says:

There’s no way I can remember, with any level of detail, how every part of [my app] works. I call it the Research Barrier, when an app is big enough that the developer sometimes has to do research to figure things out…

It’s been said many times that “the main person you’re writing comments for is yourself, six months in the future.” It’s always a good idea to keep that shadowy figure in mind while you code. Here are some other techniques I’ve found invaluable:

Read more…

Computer Science’s Image Problem

NYT: Computer Science Takes Steps to Bring Women to the Fold I find this article baffling and the comments on it aggravating. “The nerd factor is huge,” Dr. Cuny said. … This image discourages members of both sexes, but the problem seems to be more prevalent among women. ‘They think of it as programming,’ Dr. Cuny said. ‘They don’t think of it as revolutionizing the way we are going to do medicine or create synthetic molecules or study our impact on the climate of the earth. Read more…

Masculine And Feminine In Operating Systems

My friend Tanya is a gateway to the strange and exotic worlds of fan- and slash-fiction. Today she pointed out a whole LiveJournal community, mac_hearts_pc, devoted to mostly-smutty extrapolations of Apple’s anthropomorphized Mac-vs-PC ads. Wow. In her post about this, she says “I tend to think of Macs as so feminine as to be, well, female” which is really making me think… How do we map computer behaviors onto ‘male’ and ‘female’? Read more…

Haiku Archives

2001 Figs cover the ground The children step over them Or sometimes they don’t A hug and a kiss A heart outlined with fingers And a wave goodbye To the very end of the quivering green branch clings a black squirrel So much depends on a red Mario beanie left out on the lawn. Yellow leaves dancing in the air, two stories up against green windows. I cannot get up. Read more…

Music (Prologue)

The problem with writing about something I dislike is that, after the momentary pleasure of getting it off your chest, there’s not a lot of motivation to read people’s responses (especially the argumentative ones.) Better to pick as a topic something that I do like very much … such as music.

I can’t claim to be an expert on music: I can only barely play an instrument, my dj skills are wack, the theory hurts my brain, and my knowledge is encyclopedic only in a few micro-genres. But I’m rabidly enthusiastic about it; and fortunately, music nowadays is tightly entangled with computer technology, which (like any engineer) I can easily sound like an expert on.

Read more…

Computer Psychosis

“I have verified that I can create a sound file that can wake Vista speech recognition, open Windows Explorer, delete the documents folder, and then empty the trash.” — George Ou, ZDNet Sounds like computer psychosis to me. “I’m sorry, Dave, but I can’t open that. The voices told me to delete all of your files.”

So Many Fonts, So Little Print

I went on a free-font-downloading bender last weekend. I still love typography, and I’m glad to see the arcane art of type design isn’t dying out. Back in the old days of Desktop Publishing, you had a choice between high-quality but expensive fonts from reputable foundries, or a bunch of cheap but crappy knockoffs done in Fontographer. But now, thanks to mass amateurization, there are people who actually know what they’re doing, who design new typefaces for the fun of it and give them away. Read more…

In Which I Think About Java Again, But Only For A Moment

It’s amusing how Steve Jobs’ remarks disparaging the idea of Java on the iPhone have ignited controversy. His point was, obviously, that the iPhone’s browser won’t support Java applets; which is a no-brainer because applets were killed dead-dead-dead by Flash and Ajax. But this seems to have riled up everyone who still cares about non-server-based Java, leading to the weird situation of seeing “Java” and “Mac” in the same sentence again*. Read more…

Ozone

I’ve always picked at my nails, bitten them, the cuticles too. A sign of nervousness, I know, and unsightly and unsanitary. Can’t help it, though. The nails, fingertips, are always growing, always in different configurations, and some of those configurations are just wrong, asymmetrical, with sharp bits sticking out. And I can’t leave those alone: I always think in the moment that I can peel off the wrong part and leave the nail smooth and right. Read more…

Only Known Instance Of Zork Slash

My friend Tanya asked her friends to write her a short bit of Slash fiction as a birthday present. Which is not something I’m accustomed to, but here goes… >N The Troll Room This is a small room with passages to the east and south and a forbidding hole leading west. Bloodstains and deep scratches (perhaps made by an axe) mar the walls. A nasty-looking troll, brandishing a bloody axe, blocks all passages out of the room. Read more…

your sword is glowing with a faint blue glow

I dabbled in Interactive Fiction, aka Text Adventures, long ago —- I played Adventure on my Apple ][ and Dungeon/Zork on a VAX; I wrote a primitive game in BASIC and later in college partially implemented a language for building games in yacc; and then after graduating, my first serious Mac program was a souped-up and nearly finished version of that language. After that I was too busy with “real” jobs, but others kept the flame alive even after Infocom tanked, building their own adventure-design languages like TADS and Inform and spawning a cult scene of increasing complexity and literary merit. Read more…

Multisensory CPU meter

It just occurred to me that my newish MacBook gives me no less than four sensory modalities for detecting high CPU usage: The scrolling bar-graphs [one per CPU] of the Activity Monitor icon in the Dock The unobtrusive little purring fan that comes on every few seconds after the CPU’s been busy for a while The extra warmth of the computer against my palms and lap (I won’t say it gets “hot”; maybe “toasty”. Read more…

The Ballad Of badtz-maru

I had a tiny Linux box
Its name was badtz-maru ;
It sat out in the office
Serving tunes for me and you.

One day the Squeezebox just went black!
I didn’t know what to do!
Safari, ssh and ping
Lost touch with badtz-maru.
The living room was silent
(Between games of Pikachu).

Read more…

Just Like The Cool Kids

Like most geeks, as a kid I not only despised the Cool Kids, but also wanted to be one of them too. My own school-age development trajectory took me from a state of total ignorance of what that required1, to brave attempts to fit in2, to a realization that different was cool3.

Anyway: these days being a Cool Kid is within every geek’s reach. Perhaps that’s because the shared culture has exploded into an uncountable number of fragments, each of which is a tribe with its own parallel hierarchies of coolness. Amen to that.

Read more…

Jens’s Tangled Job History

I write code for a living. After all these years I still find it really exciting — I was instantly and permanently addicted at age 11, it’s just that the programs have gone from 20-line BASIC powers-of-two table printers, to enormous Java and Objective-C juggernauts — and moreover I’ve found it’s the one thing that I can work on consistently enough over a long period of time to finish a project of any size. My childhood was littered with unfinished stories, unfinished plans for undersea cities, unfinished D&D maps. But the programs got finished. (Most of the time.)

Herewith, entirely too much detail about the different programs people have paid me to write. Read on if you want, but you’re in the driver’s seat so feel free to hit that Back button if your eyes glaze over…

Read more…

Lesser-known scripting languages

Just when it seemed, a decade ago, that the programming world had settled on C++ as the lingua franca, the One Language To Rule Them All, instead we got an explosion of new high-level languages that have risen to popularity. Why did this happen? Chiefly because the World-Wide Web has conditioned users to expect five-second delays before any responses to their actions, which provides an environment ideally suited for interpreted, garbage-collected scripting languages. This movement has been encouraged by server vendors like Sun and IBM who are eager to show Web developers the productivity increases they can get by using such languages, especially after they then install massively powerful servers.

Read more…

Lua and unique strings

Lua is an interesting scripting language. I can’t say I have much familiarity with it; I’ve only read the book, and a couple of papers, and downloaded and built the interpreter (which takes less than a minute). But what I’ve seen of it gives me a warm feeling, like reading a concise little poem, a haiku. It’s a small language, but what’s there is well-considered, and it appears that you can build bigger things (like object models, whether class- or prototype-based) out of its building blocks pretty easily. Read more…

Little Boxes Of Words

Much of what I’m consumed with (at work) boils down to a question of: what is the right shape for the small but plentiful bits of writing that we are all creating daily? Here shape means largely visual representation but also sequencing and topology.

It’s a problem of hypertext, primarily. The World Wide Web established one shape for hypertext: individual pages with one-way links in the text, replacing one another in a back-forwards chain. It’s proven to be a pretty good shape, but it’s not the only one, and earlier thinkers like Engelbart and Nelson had lots of other ideas.

Read more…

For Alba

Not pink yet, she: bloody red. Not one to be held back, she, even by the host’s noose, even by constraints of brute geometry. Her universe distended, tore and bled for her. Thus the advent of the smallest unstoppable force: wee Alba hurled through the plate glass into life, now fixes us with a blue gaze, her raised arms encompassing it all, and says “I am an old soul. I’m back now. Read more…

Anagrams

Way back in 1989 my friend M@ and I used to work at a font company called Kingsley/ATF Type Corporation. One evening after work — actually we were still at work, physically speaking — we began to consider the subject of anagrams of the company name. After running off the necessary letters (in 100pt ITC Galliard all caps from an Adobe Type 1 font, using Microsoft Word 4.0 on a Mac SE, printing to a 300dpi Apple LaserWriter NTX) and cutting them out (I forget the brand name of the scissors) we set to with gusto. Read more…

Cocteau Twins interview (November 1985)

This is one of my favorite interviews ever, and it reminds me of a long-gone era when the Cocteau Twins mattered, mattered really deeply, and were making music I could barely believe possible. Music I was not the only one to find wholly impossible to describe…

Read more…

“Whose round soft dog fidgeting.”

This was appended to one of the rare spams to make it through Mail’s filter. Perhaps the filter knew I would enjoy some strange mechanical poetry? Whose round soft dog fidgeting. Whose noisy laptop is on fire. Our round mp3 player falls. Whose stupid shining hairy bluish expensive white noisy mp3 player arrives. Any given odd shaped forg arrives as soon as his slopy pensil is angry at the place that his brothers stupid magazine stinks. Read more…

My Geek History

Time to bore you young whippersnappers with my early history in computers. (I saw a couple of other people do it and thought hey! I can do that too![]() First we have to set the Wayback Machine for the darkest depths of the ‘70s, a decade that’s oh-so-much funner as retro than it was to live through…

Read more…

SMTP

The Simple Mail Transfer Protocol is by no means perfect — its lack of authentication is a prime reason why spam is such a problem — but I think it got one thing right: it has the right topology for building a person-to-person communications system.

Read more…

Super Leaf Blower 64™ Official Players’ Guide

Yesterday I got acquainted with our leaf-blower. It’s electric, thank Cthulhu, but not what you’d call “whisper quiet”. We got it as a gift several years ago, and I tried it once back then and it just blew the leaves into a huge swirling cloud that settled down exactly where it began. So I disappointedly put it in the shed and forgot about it. This time, though, I treated it as if it were some new and powerful item from a game. Read more…

We (had black boxes)

…each of us had a little box. We didn’t know each other, not at first; we weren’t even aware of each other. “We” was a grouping defined solely by the fact of our having these little boxes. Each box was black lacquer and about two inches on a side. A network of fine black raised lines covered it. The lid could be opened, revealing nothing much inside. To be honest, it was hard to remember what was inside after you shut the lid. Read more…

We (decided that staying awake)

…we decided that staying awake as late as possible was the way to write new and creative things. This to be accomplished without the aid of stimulants since the goal was to be as sleepy as possible. In ideal circumstances we would actually fall asleep while typing without stopping, finding ourselves squatting in a gray hypnogogic landscape still tapping on the keyboard finishing up priceless new thoughts. The dream-laptop could then be carried along throughout the night as a powerful and modern spirit guide, helping us to keep appointments with buried archetypes and instantly add new dream symbols to our address books, in addition to the obvious utility of taking dictation during the dream, before the veil is torn on waking and the dream story scattered. Read more…

Apricots Are Falling

The apricots are falling, bit by bit helped along by interfering squirrels. Though not yet ripe, they roll upon the bricks, all with tooth-marks, some with chewed-up pits. This fruit debacle fills us with dismay, as we had hoped the ripe fruit to preserve and so retain the sweetness of the day In far December when light’s gone away.

Silver “S”s

Arranged on a torn out page, silver “S”s of old wire pulled from broken clocks. A razor shadow scratched by halogen behind each, tracing its shape in intersections with blue ink lines, a curve modeling stresses and crystal faults. Exhausted by years of funneling pulses from a quartz chip, the wires relax now bit by bit, slow motion snakes, emitting sub-audible scritchings against the paper fibers. As it unwinds, each proudly imagines itself a mainspring. Read more…

A Koan For Video Gamers

The Zen master Yoshi was playing a video game. Seated in the lotus position, he expertly maneuvered the controller with his gnarled hands. Nevertheless, on the screen Mario failed to leap from one block to the next and plummeted screaming into the void. Again, Yoshi began the same level. Again, the moving platforms eluded the sprite onscreen. Seventeen more times, master Yoshi caused the hapless plumber to fall into nothingness and lose another life. Read more…

We are all snakes

We are all snakes. We have a tail and onetwothree mouths. The middle mouth bites the tail to hold fast to form, to keep the extra blessings from dropping off one end and becoming lost in the untidy æther. Leftright mouths are perhaps free to latch onto other snakes should the local geometry and snake density so permit. When our fangs sink into each other we exchange blessings. It must be so. Read more…

Fulfillment

Eli finally entered the Fulfillment Center at dusk, through the wide metal doors opening into the chilly space within. He had been waiting in line since dawn, shuffling slowly back and forth through the cracked remnants of the old parking lot under the eyes of the security guards. The Center was an old, damaged warehouse – this had been an industrial area before the war – and was lit within by banks of fluorescent tubes suspended from the high ceiling. Read more…

DXM, Big Fun, And My Favorite Hypertext

By way of introducing my favorite hypertext, I have to digress a bit. Last March [2001] I had a particularly nasty flu for about three weeks, which ended up as a wretched dry cough. I couldn’t go one minute without coughing, and I had a horrible sharp pain in my ribs caused by a sprained chest muscle. One night I was lying on the couch (so I wouldn’t keep Diana up all night) trying in vain to sleep, and decided to look up exciting Drug Facts about various medications I was taking. Read more…

Splendor

We stepped out our back door into splendor: – the rain-choked hills casting off their muddy carapace of topsoil – uprooted trees shedding their last dead leaves like ticker-tape – all of up heading for down. All the wet rot of the rotating Earth converged on our yard but was held back by cinderblock walls with a splash. Our house lay alone at the foot of a brown slope devoid of landmarks: Read more…

Polar Star

The horizon folded down its blackness. Overhead curled exalted green clouds of Sun-born particles spiraling in. Now upward in an arc, tied to the long invisible armature of the Pole, flew my humble cardboard tube of Earthly minerals, in one moment transmuted into circlets and spheres of sparks — dark materials achieving by dint of effort glory surpassing the Sun’s electrons, if only for a second. Hood thrown back I howled a warning to low-flying angels. Read more…

They Made Me An Offer I Couldn’t Refuse

System Software were looking for a Post-It Notes™ type of program for System 7.5. They were already buying several other utilities — including Find File, Scrapbook, SuperClock — from third parties, and offered Antler Software (me) the same lump sum deal for the “Antler Notes” utility I was working on. It was a nice piece of change. I was happy. This came to the attention of certain people in upper management, whose conclusion was (I’m paraphrasing here) “Why are we going to pay for this? Read more…

Jens The Consumer

The problem of leisure What to do for pleasure Ideal love a new purchase A market of the senses —Gang Of Four, “Natural’s Not In It” “He realizes everything he does is second-hand, a waking dream, a dream someone else has dreamed for him — when he walks into a pub and greets friends with a line he’s half-consciously lifted from last night’s sit-com, he’s an advertisement. He hears himself and he feels tricked, humiliated, so he smashes into his friends … as if he’s never seen them before but knows they mean him no good. Read more…

Piling Up Sheets / the face in the soup bowl

I decided I would only work on this page after ten PM, when I think differently. When I’m tired but alert, and everyone around me is asleep, and it’s dark and quiet.

The cognitive scientist and AI researcher David Gelernter has a model of consciousness that has focus as its parameter: varying focus produces mental states from rigorous logical thought (when focus is at its highest) all the way down to dreaming (when focus is at its lowest.) In high focus states the mind seizes precisely on individual concepts and ideas. In low focus states, multiple ideas, concepts and memories overlay each other such that they can’t be distinguished; they’re superimposed and common features line up, connections between disparate thoughts. In this mode the mind jumps from one memory to another, linked by a chain of connections formed by lining up fragmentary images of those memories. Like a dream.

Read more…

Glass Lizard

The beach that fall was overrun by glass lizards; I had never seen them before. I knew there had been none at the beach when we had visited during the summers (I could remember four summers, and my parents said there had been more.)

Read more…

The Cow Telescope

WHEN I stick my head out of the skylight and look to the left I can see the Cow Telescope atop its hill, red light at the tip blinking to ward off low-flying aircraft. You can see it from Interstate 280; from the back of my parents’ Volvo I used to watch it as we drove past, a big metal parabolic dish pointed at something in the sky, on a grassy hill alone except for the odd ruminating cow. Read more…