Isaac Cambron



Kickstarter is for suckers

Mar 26, 2014

There was a recent article in the Wall Street Journal about how all of the people who gave Occulus money feel a bit screwed by the acquisition. I think the article has some flaws, but it reminded me of a point I’ve been making recently. I posted a short writeup of that point on Hacker News, and I like how it turned out enough to post it here (with some minor edits):

I’ll just say it: Kickstarter is for suckers. When you give money to a project, you’re doing one of two things:

  1. Making a donation to a company.

  2. Preordering something that hasn’t been built yet.

Doing 1 is silly, since you don’t really get anything in return. “But it makes it more likely that this thing I want will happen!” In some tiny marginal way, sure, but mostly it’s going to happen because other people donate (or fails to happen because they don’t). Don’t be the fool who tries to personally take on the collective action problem. And stop trying to make other people rich out of the goodness of your heart.

Of course, as the WSJ fails to make clear, most of Oculus’s Kickstarter money wasn’t straight-up donations; it was preorders of the Rift. That’s obviously not a donation, but it’s not a good idea either. As the buyer, you bear the risk that it never ships at all. “But I’m compensated with a discount!” Essentially, you’re making an investment in which your returns come in the form of future discounts on a product. Forget that you like the Oculus Rift for a second; is this a wise investment structure? If someone set up a VC company that did that instead of buying parts of companies, would you think that was smart? Did you do any kind of analysis that suggests this is actually works out to be a good investment? Do the potential returns even justify that analysis? Do you think of other consumer products this way, or only shiny electronic things?

Will you even get a discount? Why would you?

Or to think about it a different way: imagine if someone set up a store that worked like this: you take your item to the counter, where they don’t actually let you buy the item. Instead what you can do is pay the price minus n% and then they roll this big roulette wheel to decide whether you get the product (m% success rate). If you win you get to keep the product and if you lose it goes back on the shelf and they keep your money. To spice things up, they don’t tell you what n and m are either, just the price to play and whether you get the item. Now, it’s possible—though unknown—that m and n work out that you’re EV positive here. But would you really shop at that store? Especially when there’s another store next door that just sells you the same stuff at a known price (i.e. just buy the Rift when it comes out).

The fact of the matter is that you’re aren’t pre-buying the Rift on a rational basis. You’ve been convinced by clever marketing to shoulder risk for a company because it seems cool and feels good. Total sucker move. That probably explains why it tastes bitter when the company whose capital requirements you fronted rolls that into a $2 billion dollar acquisition.

The original is here if you want to see the responses.


Introducing FbFriends

Dec 25, 2012

FbFriends is a new jQuery plugin for picking Facebook friends from a dialog using the Facebook JS SDK. It’s written in CoffeeScript and Less; you can find the docs and demos here and the code here.

For the lazy, here’s a screenshot (and apologies to my friends who showed up here):


Go check it out; I think it’s pretty cool.

Not a ton to say, but here are a few interesting notes about it:

  1. I went with the idea that the caller has to provide the dialog component. It just seemed dumb to bake in my own and likely you’ll want to make it look consistent with the dialogs/modals/whatever in the rest of your app. So you provide callbacks to open and close whatever dialog you want. FbFriends just provides the content.

  2. I really didn’t want to build this. In fact, the Facebook SDK used to have this ability, and they dropped support for it. I wish they hadn’t.

  3. A lot of Quarrels Harris Port was consumed during the making of this library.

Oh, and Merry Christmas!


Introducing Timestack

Aug 27, 2012

This probably won’t render correctly in your RSS reader. If not, click through.


This is Timestack:

It’s a jQuery plugin I wrote that turns unordered lists into nifty timelines. Docs here. Code here. Check it out.

Why did I build it?

Timestack is a small library and didn’t take long to write, but I had a few thoughts about the process that I wanted to share.

When you build software for a living, you make a lot of compromises. You start with a vision of what you want to build, you get to work, and you run into obstacles. Maybe the technology you wanted to use doesn’t exist. Maybe it does exist but doesn’t work the way you wanted it to. Sometimes the right thing to do is to fix that technology or just build your own before moving on to the actual work. But usually that’s not the right move. Usually, you compromise your vision, make do with the pieces you have, make some quirky work-arounds, and move on. If you don’t, you’ll end up rewriting your entire stack from scratch to make every little part just right and you’ll never actually get anything done. You’ll have a bunch of (maybe) cool infrastructure for something that hasn’t been built yet. Knowing when and how to make this kind of tradeoff is part of being a good engineer.

One of the nice things about a personal side project is that it allows you to absolutely, totally ignore that whole last paragraph. You can compromise as much or as little as you want. And if you’re like me, personal projects are an awesome opportunity to solve problems totally tangential to your goal, getting distracted by problems you encounter solving those tangential problems, and so on into fractal oblivion. That’s just fun. That’s what a personal project is. If I had to actually deliver it, even to myself, it would be a job. Jobs are fine, but they’re not the best context for depth-first exploration.

Anyway, here I was trying to make a nice interactive resume for a simple “Hi, I’m Isaac. I build things.” website. I wanted a timeline that showed when I worked where, because I think that’s more interesting than a boring bulleted list. I looked around and there are a few components out there that do this:

After trying out Timeline (it is pretty), I decided it was too big and heavyweight— it’s a timeline, not an application framework. It doesn’t need themes or its own script loader. Importantly, it also didn’t really do what I wanted, partially because it imposes some constraints I don’t like, and partially because it just isn’t meant for my use case. Simile is similar, but unmaintained and worse looking. I wanted something really simple:

  1. It should turn some list items into timeline bars. No-JS fallback FTW.
  2. It should create an interval key (the times at the bottom).
  3. It should be able to do stuff when the user clicks on the timeline items. Note that I don’t want it to show me stuff; I just want a callback. Component does less = more flexibility for the user.
  4. It should be small, simple, and hackable. Libraries for handling simple things should be simple, and tweaking them should be trivial.
  5. It’s not important that it work in old browsers.

So I put aside the website and jumped down the rabbit hole.

Notes on building it

Since I’m terrible at UI design, I looked around and quickly found Matt Bango’s Pure CSS Timeline. It looks pretty good and the CSS is simple. It’s hand-cranked, though; the widths of the bars are just hardcoded for the particular times he needed. So all I had to do was write some code to generate those widths. I also added colors, because why not?

Some things I think I know now:

  1. The look and feel of web UI widgets should be customized by the user through CSS. CSS already gives you inheritance, overrides, and all that jazz. Just keep it simple and tell your users to override the CSS you ship. Easy.
  2. Give widgets a width of 100%. The user can decide how big to make the container box.
  3. Go for cheap extensibility over configuration. Instead of adding a whole bunch of flags into the options list, I just put the functions I wanted to make customizable into the options defaults and let the users override them.
  4. When dealing with tricky spacing problems in HTML, use box-sizing: border-box. It’s takes away that problem where you need to set the div width to realWidth - border - padding, which would have been really painful here. In fact, I’m increasingly convinced that border-box should just be the default browser behavior.
  5. If you need to work with dates and times in JS, you should use Moment. It’s just more pleasant than dealing with native dates and times.

If you want to know more about Timestack itself, definitely go here.


What I want from Sublime

Jul 21, 2012

I’ve been using Sublime Text 2 for 7 months now, and it well past time for me to take a step back and evaluate things. In general, it’s a great editor, but there are now one too many things about that bug me. I wanted to write them up. Maybe someone will tell me how to fix them. Maybe they’ll actually get fixed by the author. Maybe I’ll just feel better having gotten it off my chest.

If any of this sounds nitpicky, I should point out that I spent like 10 hours per day in this program, so what might seem like minor nuisances add up very quickly. Programming is really just a particular kind of text editing, and we ought to have really well-oiled text editor programs. That’s partially for efficiency, and that’s partly for our happiness. If you were to respond to that by pointing out that if I feel that way, I should really invest more time customizing my editor, I wouldn’t disagree. I should probably dig in, learn my way around the API super well, and make it do what I want it to do. But since it’s easier to complain about it on the internet, I’m going to do that. Then I’ll look into fixing it.

It may also be that there are configuration options I don’t about that could fix this stuff. If so, I’d love to hear them.

Here’s my laundry list.

I want set_mark, yank, and so on to work a bit differently

One thing I think is profoundly annoying are the disjunctions between cut and delete-to-mark and between paste and yank.

For the uninitiated, in Emacs-speak, you set a mark (usually with ctrl+space), which is a sort of bookmark in the document. Then you move your caret around to wherever you want and then you “kill the region” (which really just means “cut”) between your caret and the mark you set before. Later you can “yank” (basically paste) that text back in. So the big difference here is that the region you keep is modal instead of being an explicit selection (the other big difference is that Emacs keeps a full history of your kills so you can do fancier stuff, but that’s not important here).

Sublime has support for this: you can set a mark, you can kill the region, you can yank the region, and you convert the region into a selection. So far so good, but here’s the issue: kill/yank and the more standard copy/paste use completely separate buckets to hold stuff. That might sound useful, but in practice it means I have to keep track of (and map) four commands instead of two. Want to paste in something from another program? Use paste. Want to paste in something I killed? Yank. Want to cut something I have selected with the mouse? Use cut then paste, not kill then yank. And we haven’t event talked about copy. So that’s annoying.

I could get around this by by setting a mark, going where I want to go, using the select_region command, and then cutting. Then I could always use paste. That would work, but it’s an extra command (and keybinding) just to kill some text. It’s also a deeper problem than just kill/cut: more complicated manifestation is that I can’t use to create a region and then hit Tab to add a tab to each line, because that command works on the selection, not this weird other region thing. The issue is that regions and selections are different things.

Slight aside: I’ve been using EmacsKillRing plugin that partially fixes at least the cut/paste part of this and adds some other Emacsy goodness, but it doesn’t really solve the issue that the region isn’t a first-class selection, and it has plenty of other issues too.

Anyway, what I want—I think, anyway—is just a select lock command. Instead of set_mark, I just want to say:

Look, I want my selection to start here. Wherever I go with caret, have the selection follow me, like how it does if I hit shift+up. Then treat my actions like you normally would. Cut cuts, Copy copies, etc.

That would add a total of one command and (for my purposes), get rid of all the kill/yank/region stuff. I’m a total noob when it comes to customizing ST2, but it seems kinda hard to implement as a plugin: would each command that moves the caret need to be aware of it? Do the actions that get rid of the selection have to be aware of it? It seems like I’d have to create my own versions of a lot of editing features to make it work. Or is there something simple I could be doing here?

The spellcheck face needs to be customizable

This is really only a problem for me when I’m writing blog posts, but since that’s what I’m doing right now, I’m going to complain about it. Spell-as-you-type uses a red squiggly underline, which is very painful to look at with a dark background:

My eyes!

I was unable to find a way to change that, and I did find some posts to the effect of “yeah, you can’t change that”. Bummer.

Opening an already-open file should move it to the right group

Sublime has groups, which allow you to split the screen. Files can be moved from group to group so that you can manage your workspace. And you can switch between them easily with the keyboard:


Another nice feature of ST is the “find a file dialog”, which allows you to open any file in your project via an autocompleting search. The cool thing is that if you already have the file open, it just pulls open that tab. The trouble is that these two features don’t play well together. If I want to edit an already-open file to the front of my selected group but the file is in some other group, Sublime will open another view on that file.

While it can occasionally be useful to see different parts of a file side by side, that’s the exception. One consequence is that you end up with a lot of clutter. If you have three groups and you’re working with five files, after enough switching you’ll have fifteen tabs open instead of just five. Another is that Sublime is a little quirky with more than one instance of a file open. For example, closing a tab triggers the “Don’t you want to save this?” dialog even if there are other instances open. There are other quirks like that. And that EmacsKillRing plugin we talked about earlier is totally broken in this scenario.

What Sublime should really do is move the file to the current group if it’s open already.

Deleting a file should close the file

This is the issue that probably causes me the most anguish on a day-to-day basis. You can delete files by right-clicking them off the side bar and clicking delete. Except that it’s not. If you have the file open, it’ll stay open. “Fine”, you say, and close it. But ST will think “Hmm, that file is different on disk, in that it doesn’t exist there. I’d better confirm Isaac really doesn’t want to save this!” and gives me a dialog about whether I want to save the file I JUST DELETED. Like, my intention is literally the opposite of what you’re asking about. In fact, it’ll do this even if I don’t have the file open, because when I right-click on the side bar item, ST opens it in a sort of preview mode, which is normally superuseful, but annoying here because when I close the preview I have to deal with this goddamn dialog.

If I delete a file, ST should close it.

Fewer dialogs

Sublime mostly gets out of your way, in that most of the dialogy things are expand out of the top or bottom of your screen and steal focus, as opposed to being a big rude modal dialog. That’s a great thing. But Sublime does have big rude dialogs, like “There’s a new version of Sublime. Would you like to upgrade?” or “This file has been edited. Would you like to save it?”, etc (neither of those are verbatim.) Not only are they jarring, but they’re also not very keyboard friendly, and reaching for my mouse to answer a question that could be Y/N makes me sad. Some sort of notification toaster would be better.

Some keyboard holes

I really hate using my mouse. Looking up, that’s actually what most of this is about. In general, Sublime does a good job here, but there are some holes. One in particular is search results. You can search your hole project, and results are displayed in a buffer. It’s really nice and Emacsy and well done:

Next, find things

But it doesn’t have good keyboard support. You have to actually click on those yellow boxes with your mouse; there’s no shortcut for that. You can actually iterate through all the results by hitting F4 as many times as you like, which is also nice, but not the same as being able to simply go to the right occurrence in the results and jump to it is frustrating.

I also haven’t figured out how to pull up the right-click menu with the keyboard, which would be really nice for selecting spelling alternatives.


Some of this I can probably fix with some Python hacking and some patience. Some of it will actually have to be changes in the product. In the meantime, it puts me in this annoying state of almost having a really great editor, but not quite.


Just fucking say it

May 4, 2012

Haha, she hates dashes!

I hate the term “pet peeve”, but that doesn’t stop me from having them in spades. Most of them are just geeky annoyances: if you use various programming phrases imprecisely, I will lecture you. At length. Obnoxiously, even, and probably only for the benefit of my own ego. If you act obliviously to the concept of sunk cost, I will put you into the Stupid Until Proven Otherwise bucket. I’m a judgmental prick like that. Maybe you’re pathologically incapable of being honest when I ask you a direct question. I will roll my eyes and talk about something else, forever incurious about your future opinions. So a lot of things bug me. But this post isn’t about the stuff that just bugs me; this post is about the one thing that boils my blood, that sends me into hysterical fits of primordial rage, the ice pick in my brain that keeps me up at night. Especially when I’m drunk, which, right now, I am. I will try to remain calm while writing this.

If you want to curse, curse. If you don’t, don’t.

An example

This might require an example. So here you are, on Facebook, writing a post about your awesome job. Or Twitter or Tumbler or Gmail (this anger of mine is medium-independent). You want to say something strongly worded, something to express on no uncertain terms how great your day at work was. So far, so good. I love my job too; no shame in sharing on the internet. But then, in your excitement, you type out, “My job is the sh*t!”. You hit enter. Everyone can see it now: your job is the sh*it.

If there were such a thing as baby angels, you would have just killed six-hundred and twenty of them.

“Shit” has an “i” in it. I’m pretty sure. Now, I’m not a great speller either, and one of the weapons not regularly stocked in my arsenal of petty neuroses is anger about spelling. But you knew that “shit” doesn’t have any asterisks in it, didn’t you? And you wrote it anyway. On purpose. Why did you do that? WHY DID YOU DO THAT?

I honestly, seriously, in all earnestness, do not understand. You misspelled a word with four letters in it.

Need to start rationing exclamation marks

You said the curse word. You wrote it to express the word and you successfully communicated that word to your audience, along with any associated meaning and connotation. So why the game of replace-the-letter?

It’s everywhere

Once something like this bugs you, you see it everywhere. It’s in articles. It’s in web comics (Jesus, you self-censor your own web comic? Why do you even have one?). Book titles. Album covers. Magazines (Newsweek used to kill me with this, but it has apparently stopped). It’s in emails from your coworkers.

Since there doesn’t seem to be an appropriately specific word for this, I’ve decided to call it cursfuscation. It’s a subspecies of bowdlerization. And it’s one of the most irritating things on Earth.

It bothers me because it’s utterly pointless; it detracts from the readability without changing the content. Sure, you can read it, but you can also read th*s and it’s still annoying. And no one has a cogent explanation for why they do it. Part of some shared fiction about properness? Just a thoughtless habit? An honest fear of the literal letters in curse words?

If “LOL” is the nervous tick of the internet, then cursfuscation is its stutter.

Don’t pretend you’re not cursing

Maybe you don’t like cursing. You think it’s crass or just wrong. We differ in this respect, but fine, you think there are certain combinations of consonants and vowels which are off-limits to polite human communication. I sort of get where you’re coming from, actually, and there are a few words I don’t make a habit of saying. But you know what? I respond to my qualms about those words by not saying them. For example, I don’t use the word “nigger” because I think it’s shitty word that expresses a bunch of stuff I don’t want to express. But, by trivial extension, I also don’t write “n*gger” or “n—-r” or say “nignog” and pretend I’m in the clear, because it’s the same word. If the word is so bad, then why are you saying it? Do you really think that the morally reprehensible part of the word is the little vertical line with a dot above it? How has your s/i/\* avoided whatever culpability you feel for having used the word, in all of its actually-spelled-correctly glory? What’s offensive about “shit” that isn’t offensive about “sh*t”?

My dad doesn’t curse, ever, out of a strong ethical commitment of some kind. I don’t understand it, but I give him props for not actually cursing. He doesn’t say “freakin” or “effin” or “f&#!ing” or—pretending for a moment that he watches TV other than Law and Order—“fraking”. He doesn’t pretend that the letters F-U-C-K form some kind of hyper-specific satanic incantation, the apocalyptic consequences of which can only be avoided by not saying the exact right combination of sounds involved, but which it’s perfectly reasonable to express the substance of whenever you feel like. He just doesn’t say “fuck” because he thinks it’s wrong to say “fuck”. Not complicated.

Who are you fooling?

Or maybe you’re OK with cursing, but only in certain contexts, like hanging out with your friends. Maybe you’re writing an email to a coworker and you want to be professional and serious. Professional, serious people, you think, speak only in the set of English words minus this particular seven. Maybe innocent children or prudish grandmas will read your writing, and they will be corrupted or offended by the raw power of your words. Fine, I get there are boundaries, sensibilities you don’t want to offend. Mores.

But who are you fooling? You think those bosses, children, and octogenarians will have no idea what you mean by “b*tch” and couldn’t possibly figure it out? They’ll think it says “botch”, right? Right?

You’ve only succeeded in insulting their intelligences. It’s not even censorship, really; it’s just minor obfuscation.

But in fact, it’s even worse than that: the asterisk doesn’t even work if the reader doesn’t know what it means. The whole point of saying something is to communicate that something to the listener, and the only thing distorting your words can accomplish is to sabotage that goal. That’s why you made sure it was easy for everyone to understand by using a known cursifiscation convention. You wanted to make sure that everyone knew the word was “bitch” without, you seem to think, the word actually being “bitch”. You wanted to obfuscate your communication in name only, a sort of half-hearted nod and wink in the form of awkward reading. Who benefits?

You said “bitch”; come to terms with that or stop saying it altogether. The middle road is wholly imagined.

Some kind of disconnect

Much better

Much better, right?

As I understand it, cursfuscation started as a tacky way to circumvent obscenity laws, just like beeping on TV. In other words, the convention came about to make cursing in newspapers easier. Those newspapers that used “f——” could have just not cursed. They used dashes so that they could curse; they wanted to say “fucking” without getting in trouble. It stands to reason that if they prefer to curse, they would simply have done so plainly, had they been allowed. How the convention turned into a knee-jerky way of pretending not to curse is beyond me. Those laws are either no longer on the books or don’t apply to you anyway, and you’re allowed to curse to your heart’s content. And you’re making cursing harder for yourself and everyone who reads your writing. Why would you do that?

So stop. Please. No more cursfuscation. Your intentionally transparent word manglings do no one any good. It’s insulting to our intelligences and cringe-inducing to read. You will offend no one who won’t be offended regardless. Spare us your dashes, your asterisks, your beeps, your twisted versions of the words you’re trying, awkwardly, to communicate to us and just fucking say it.

Or don’t say it.


Next page