Shortlog - a log of everyday things

View the past: 2013 2012 2011 2010

Atom Feed

Entries from 2012

2012-01-02 | 1 comment

Wow, it's going to be hard to keep up with the blogging. Also, all of my photos are terrible, but I'm going to post some of them anyway. Also also, I mostly don't have pictures from 28c3 because CCC policy requires that everyone depicted in a photo at the Congress give explicit consent, which is generally not possible in such a crowded space.

I do have this one photo from outside the bcc, showing Fairy Dust (the name of the rocket, which is one of the iconic images of the CCC) and the CCC flags on display. I've taken the time to blur every face, or I wouldn't post it.

View of the bcc with a rocket ship


After having stayed up until something ridiculous like 0800, the fact that I was awoken at 1500 when the hotel called asking when they could come clean my room should come as not terribly surprising. I told them to give me an hour, during which I showered and discovered that all of the clothing I had worn the previous night reeked of smoke. For the record, I have not particularly appreciated that there is cigarette smoke nearly everywhere in Berlin. I picked out fresh clothing and obtained food and attempted to purchase Birkenstocks, but found the store closed (presumably, 31 Dec is a holiday or something). The S-Bahn was much busier than it had been the past four days, and a cursory web search suggested that people were probably heading to the New Year's celebration at the Brandenburg Gate. With the next search, I discovered I was a pretty short walk from the Brandenburg Gate, so I put on my warm clothing and set out on foot.

I arrived quite early; well before most of the crowd of a million.

Silvester In Berlin, soundstage

I laughed as I heard "Take me back to San Francisco" on the speakers. I thought to myself "nope, not for another couple weeks." Turns out the DJ was playing Cascada's remix of "San Francisco." I enjoyed watching the DJ at work. This guy was practically rewriting songs on the fly. He either had split-track sources, or was using equalizers to separate bassline from melody, or something, because he just flat out added the bassline from one song to another, in realtime. It was impressive. (Aside: it's fun knowing a little bit about everything, because then you can properly appreciate the skill of a master.)

I eventually wound up with quite a good view of the stage; about 10m from stage left. Why there, in particular? I managed to find four other CCC-goers in the crowd, and one of them happened to have brought his giant plush Tux (the Linux penguin):

A 28C3 attendee with his giant plush Tux

Tux appears on TV

As the hour grew later, the space grew much more compressed. I wound up packed near these three girls from Brazil who had travelled to Berlin primarily to see Kim Wilde sing "Cambodia" (I knew the song only by the trance remix by Pulsedriver, which I quite like) and "Kids in America." They brought a sign:

Me on TV, briefly
(still taken from 2DF's live TV broadcast of the event)

The music selection was interesting - a wide variety of cultures and languages were represented. The program included:

Right after the clock struck midnight, the Scorpions played "Rock You Like A Hurricane." Willkommen 2012!

Four foreigners

Hugs were exchanged all around, and dancing continued for a while until I decided that I should go to sleep so I could wake up and figure out my plans for tomorrow before all the Munich-bound trains left the city.


I woke up at 9AM. My tasks for the day were as follows:

  1. Find a place to sleep in Munich for the next three nights
  2. Buy a train ticket to Munich
  3. Catch the train from task 2
  4. Arrive at place determined in task 1

with the constraint that after leaving the hotel, there's no phone nor internet available until you arrive at the place you find in task 1, so you'd better have everything you're going to need when you check out. is pretty cool. It's a website designed to let people rent out extra rooms in their house/apartment to travelers that want a more human experience than a hotel stay (often at a much better price). They have a "standby list" feature which allowed me to say "I need a place to sleep from tonight until the 4th in Munich, and I need to finalize my plans in the next two hours. Oh, and if I can find a place with Wifi near the Deutsches Museum, that'd be awesome too." And no joke, within an hour, I'd worked out a place walking distance from the museum for the duration of my stay. So I went to Berlin Hauptbahnhof, bought my train ticket to Munich, slept darn near the entire ride, found the address, and was warmly welcomed. The fact that I could make such a booking at all is a testament to the power of the Internet and innovation, but also to the kindness and flexibility of people in a world that can seem cold and uncaring.

I was invited to join Arne (my host), his Italian girlfriend and their Italian friend for a delicious feast. There was ham, salami, olives, potatoes, pickles, corn and babycorn, beets, and a huge wheel of cheese that was placed under a heating element to melt the top, at which point the melted part was scraped off onto each of our plates. I believe this style of cheese-serving is called Raclette. Oh, and we all drank a Helles that Arne described as the most popular beer in Munich - I'll have to look up the exact name later. Apparently, they do no advertising - their popularity is strictly from word-of-mouth. Anyhow, dinner was fantastic, and a welcome break from the subsistence eating regimen I'd followed during CCC. (It's okay, I gained ~6 pounds over winter break; I can afford to lose them.)


I went to the Deutsches Museum! It was nothing less than amazing. I managed to make it through what I believe are almost all the exhibits, but that only happened because some of them were only in German, so I couldn't read everything. That museum covers pretty much everything you need to bootstrap a civilization:

Seriously, is there anything important missing here? I need to learn more about all of these now.

I came home and crashed, and then ate dinner and started working on this blog entry.

2012-01-22 | 0 comments

My sleep schedule would be normal, if I were still in UTC+1 (Berlin, DE). Help.

On the upside, I'm having pretty interesting dreams:

02:12 < zarvox> I just had this dream
02:12 < zarvox> it started out with Ronald Reagan outside a grocery store identifying himself as Rudolph the red-nosed reindeer
02:13 < zarvox> first space inside was a tennis-and-table-tennis sporting goods room
02:13 < zarvox> where all the people were buying ping-pong balls for beer pong
02:13 < zarvox> for some reason ping pong balls were also being used with some video game console
02:14 < zarvox> pretty sure this was inspired by the PS move tips
02:14 < zarvox> then the rest of the dream took place in the game
02:14 < zarvox> where you ran around as a many-headed dinosaur with a jetpack and other awesome technology
02:14 < zarvox> and had to dodge all sorts of dinosaur-age hazards
02:15 < sharpobject> wow
02:15 < zarvox> and then at the end there was a giant enemy, and apparently the main character, rather than let the enemy take over the planet, summoned an airstrike
02:15 < sharpobject> when are you making the game then
02:15 < zarvox> that turned out to be the meteor that wiped out the dinosaurs
02:16 < zarvox> the game ended with an angelic chorus singing as the cutscene showed everything disintegrating and fading into a giant white explosion
02:16 < zarvox> and then I woke up
02:16 < zarvox> hoooooooly crap
02:16 < zarvox> I dunno
02:16 < zarvox> the game's controls kinda sucked
02:16 < zarvox> who makes L+R jump?  that's like StarFox landmaster bull****
02:17 < sharpobject> o_O
02:18 < zarvox> and like...the "start game" control was toggling LRL on the dpad
02:18 < zarvox> I am not even sure the PS Move has a dpad
02:18 < zarvox> dreams do not worry themselves with continuity problems

Um, yeah.


Also TODO, but lower priority:

2012-01-29 | 0 comments

My muse has not been inspiring me to write much as of late.

Thursday: cooking club returns. Andrew made roast chicken and quinoa; I made a pear/walnut/feta salad. I ran off to campus to meet with the Campus League of Puzzlers to work out content for our upcoming weekly column in the Daily Cal.

Friday: Went to the Qualcomm infosession. That company is building some serious goodwill with the Berkeley CS department. Thanks to their behavior in the wake of the Atheros acquisition, they're building some serious goodwill with the open-source community too. Cool folks, and I will definitely be watching what comes out of that company in the future.

While meeting with Dave Wagner, I came up with a clever idea that I may do a piece of for my master's project. I have a hard time finding ideas that are big enough to be interesting, but still have small enough pieces that I can cut them off and complete them in a reasonable timeframe, so this was good.

That night, I went into SF and met up with Matt Mullins and David Mackey and a bunch of other folks from imo. We ate dinner and discussed all manner of nerdy things at a pub. It was good meeting some new faces and seeing all the old ones.

My graphics card's fan was striking the casing and making terrible noise again, so I took it apart and tightened the screws that fastened the fan to the card. That tiny adjustment appears to have done the trick. My desktop is darn near silent, which is good, because that's what I had in mind when I built it.

Saturday: I spent a decent portion of the day installing Debian on my Wii. This was fun, and eventually I was successful in getting a proper development system set up. I tried building libfreenect for the Wii. Apparently, no one uses libfreenect on big-endian systems, because there were compile errors until I fixed the endian-conversion routines. In the end, it turned out that the Wii is just too weak to reliably handle the traffic. On the upside, the code got cleaned up a decent bit.

Matt came up to Berkeley that night, and we had dinner at Barney's Burgers (which, for the record, is excellent). On the topic of burgers, one of the things that I'm excited for this summer will be living closer to The Counter, which also has fantastic burgers.

Matt showed me his new Ford Focus and all the bells and whistles and automagic parallel parking. I was surprised that Matt wound up buying an American car, but after seeing it and hearing how excellent the salesperson had treated him, I had to admit that Ford's offerings are definitely competitive.

Right before I went to bed, I got nerd-sniped by an email from Dave Wagner, posing a puzzle that amounts to designing a quine with a language that looks like a compression format. I still haven't completed a solution, but I'm definitely going to fill up a piece of graph paper with ideas.

Sunday: puzzled over puzzles. Did part 2 of the aforementioned Kinect-on-Wii attempt. Called my family and talked for a while.

I have an appointment to have maintenance done on my car at early-o-clock tomorrow, so I'll be heading to bed now.

2012-02-08 | 2 comments

Today is Sarah's birthday. I called her on Skype to wish her a fantastic year now that her age is no longer a prime number. She proceeded to spend the next three minutes laughing at my facial hair.

I managed to fall on my right ankle/leg while practicing the Doe Traverse. This hurt. I hope I didn't break that foot again; we'll see how it feels in the morning. In the meantime, my walking velocity is down to about 70% normal. I may avoid going to campus tomorrow.

2012-02-11 | 0 comments

My face feels cold.

In other news, x-rays confirm my foot isn't broken, just sprained. I'm back walking around normally already; the doctor said I'd probably be able to climb again in two weeks.

2012-02-17 | 3 comments

On plaintext markup formats.

I can't say I'm satisfied with any of the current plaintext markup formats. All of them have warts. The most popular on the web at this point is probably Markdown. Github uses it. So do Reddit and StackOverflow. So do a variety of blog engines, including Posterous, Tumblr, and WordPress. And for good reason: it's probably the best one out there.

What do I think about it? I love some things, and I really hate some others. First, the good:

  • The usual text markup features, like paragraph reflowing, horizontal rules, lists, etc.
  • Reasonable escaping behavior for HTML entities
  • A decent compromise on line break behavior
  • Intelligent auto-linking
  • Classy reference-style links probably inspired by proper email use of the same
  • Easy to embed fancier HTML constructs as needed

My dislikes tend to stem from a few things where I think the syntax either looks atrocious or strikes me as poorly designed:

  • Support for two kinds of headers, both of which are ugly. Also, whose idea was it to underline things on a separate line to make them headers? It looks uglier, and it's harder to parse.
  • Somewhat icky list behavior (why does adding an empty line between two items make a new <p> tag inside both?) along with poor indentation policy (just as in publishing, your bullets should not align with the left edge of your text). To be fair, lists in general are hard to make featureful, attractive in plaintext, and still uniquely parseable.
  • Numbered lists requiring digits, but ignoring the digits provided. (Some people consider this a feature; I do not.)
  • Single underscore on either side of a word makes it italic, making for disasters like this if you aren't religious with your escaping, where you meant to have words_with_underscores but got wordswithitalics instead. (If I can tell what tool you use by the defects in your final product, that's a good sign you should either learn to use the tool better, or get a better tool.)
  • Wasting the obvious use of underscores to indicate underlining by making the exact same thing as asterisks.
  • Punting to HTML for tables, which are uniformly awful to try to read in plaintext (the alternatives aren't great either, but they're less bad).
  • I have no idea what's going on with the image embedding syntax; a more general asset embedding syntax might be useful here, with possible auto-detection of, say, video or image formats based on suffix (though I guess it's perfectly reasonable to punt to HTML for most such things)
  • John Gruber apparently has no interest in maintaining the darn thing, to the chagrin of Markdown users

Even with all these complaints, Markdown is the best we have. There are projects that have extended it to improve (among other things) the table situation. The alternatives fairly uniformly suck: reStructuredText suffers from about two-thirds of the same criticisms, lacks nearly any redeeming features, and requires way too many empty lines. AsciiDoc has the same atrocious header behavior, has horribly difficult to read plaintext, also wastes underscores on italics, and has horrid list nesting if you have list items longer than six characters. BBCode is practically HTML replacing < and > with [ and ]. Mediawiki is intended to have a richness of features that goes far beyond what most text-to-HTML engines require, but does some silly things with using nothing but 's for italics and bold, and the lists are ugly. Textile has a somewhat redeeming table structure, but the lists have the same issues as most other markup formats, code blocking and headings are so close to HTML proper as to be not worth using, and they use underscores for italics again.

Now, I happen to like a lot of things about dokuwiki's syntax. I find the list syntax of dokuwiki to be attractive. It's got its own heap of problems - lists can't contain a whole lot of other possibly interesting fields, nested lists behave inconsistently depending on how you indent them, and list items can't span multiple lines. That last criticism I see as a feature; if you're writing such long bullet points that you need to split them into multiple paragraphs, you're using bullet points incorrectly. Alone of the text markup formats I've seen, dokuwiki's lists require the indentation of the standin for the bulletpoint itself at the zeroth level.

Dokuwiki's table format is also terse, yet effective. It doesn't appear to support super-fancy use, but is simple and readable enough that I like it. Using the whitespace inside cells to determine alignment is clever and well-done. Dokuwiki also is rare in that it gets the use of underscores and asterisks correct as well.

Dokuwiki's linking system is subpar - it's clearly meant for a wiki, which makes it slightly harder to repurpose, and it's not clear how embedding of assets works if you're not using them in the context of a wiki. I'm not a fan of using \\ as a line break either.

The biggest problem with Dokuwiki's syntax, though, is that it appears to have exactly one implementation, and that's the (extensible!) codependent lexer and parser that sit in the dokuwiki PHP source. I cannot find any renderers for its markup in any other language. And that is a shame.

I'm in the process of making my own derivative plaintext markup language that takes the behaviors I like from markdown and dokuwiki. I will, when it's ready, use it internally on my blog when I write entries. I hate that it'll be Yet Another Plaintext Markup Format, but at least I'll be happy with it.

And that's just one of the ~six technical things I've been working on this week. If you're curious about the others, drop me a line, and I'll try to write up my progress on each of them a little more.

2012-02-18 | 0 comments

More thoughts relating to my previous entry grumbling about plaintext markup formats.

It turns out that markdown implementations also accept lists with proper indentation, so long as you start them with spaces. So that's one complaint already addressed (though in my defense, the "spec" doesn't mention it). Yay.

What's more, python-markdown2 supports google-code style tables, which, while not my favorite, are certainly better than raw HTML tables.

The ugly-looking headers are probably something I can either tear out of an implementation with relative ease.

Most markdown implementations these days also disable the underscores-within-words-becoming-italics nonsense; I'll probably find some way to hack around one of the implementations to get (in my opinion) more reasonable underline, italic, strong, and monospace behavior. But hey, at least someone realized one of the most glaring defects was problematic.

Apparently markdown output is producible without actually truly parsing the content - it's done nearly entirely as a pipeline with a series of regex replacements (some quite complex). This makes the code fairly simple, in practice.

On the downside, it does mean that there isn't really a grammar for markdown, nor any semantic tree for it. Markdown is never parsed, just rendered. And it is very much tied to HTML as the output format, which has both upsides and downsides - on the one hand, you can easily punt to HTML when you need more precise control of output. On the other hand, you can't (sanely) use markdown to output to, say, a PDF, or a LaTeX document. Tradeoffs.

The fact here is that if you do want to actually parse markdown (or similar constructs), you're left to face a few unhelpful facts:

  1. Markdown (and most of these plaintext markup formats) are context-sensitive.
  2. Context-sensitive parsers cannot have completely separate lexers, since the tokens are ambiguous and depend on context (is that number followed by a period the beginning of an ordered list item, or just some text in a paragraph?)
  3. Parser generators suck at producing parsers for context-sensitive grammars, since we lack a good way to represent them, unlike for regular grammars (regular expressions, of course!) or even context-free grammars (BNF/EBNF).

So if you want to truly parse something like markdown, you're probably left manually coding the appropriate context-sensitive parser with codependent lexer (if you bother lexing at all), or modifying the language itself to be non-context sensitive. It's worth noting that regular expressions with non-greedy or lazy quantifiers are capable of dealing with this particular type of context-sensitive grammar. It's unclear to me whether this generalizes to all context-sensitive grammars or not, but I'd be interested to know.

With all this in mind, I'm now deciding whether to try to modify a decent markdown implementation to add things I like, since several of the things I complained about are no longer issues, or to continue writing a proper parser that can handle all the things I like about both markdown and dokuwiki.

2012-02-20 | 0 comments

My 28c3 talk, discussed around the web:

2012-02-27 | 0 comments


My law professor is a pretty cool guy. He runs Debian GNU/Linux, has a DeCSS t-shirt, and one of his course projects involves writing (or significantly improving) articles on Wikipedia. He mentioned that he wanted a tool that would let him record his lectures, but that he couldn't find one that would record both his desktop, audio, and an external camera. So I hacked up a Python script (warning: still a work in progress, has known bugs, may do unpleasant things to your pet) to choose what devices/monitors to record from and then launch recordmydesktop recording the desktop and audio, and gstreamer recording the external video simultaneously. He thought this was pretty great, and we're going to try to record most lectures for the rest of the semester.


Ren Ng, the founder and CEO of Lytro, gave a talk about how light-field cameras work. It was pretty cool, and we all got to play with one of the Lytro cameras and some of the software after the talk.

I'm interested in what software tools to interact with these new sorts of cameras will be like. We don't have any standard formats for light-field photographs yet - it remains to be seen what optimal encoding, storage, compression, and retrieval formats will look like. I hope that Lytro will recognize that while they can (and should) build a great set of tools around their camera, they will achieve much greater accessibility and a wider market if they document their file formats. Even better would be for them to engage with the community to determine what would improve such a file format.

Keep an eye on this company; I anticipate that this technology and company will have a significant impact on the way photographs and videos are handled in the long run.

I saw Stripe posted a Capture The Flag challenge on their blog. In short: log into a server and find a way to exploit a service to extract the password for the next level. There are six levels. I made it to level04 before it was late-o-clock and I decided I needed to sleep.


Today was BEARS 2012. Good fun chatting with all manner of people about current research.

At 16:30, I dropped in on Reynold in the amplab. He told me he was going to go to a meetup in San Mateo about Spark, and then visit his friend Yuri at AeroFS. He invited me to come along. So I grabbed slices of the Zachry's pizza and followed.

The Spark talks were interesting - apparently Conviva has gotten some excellent speedups from running Spark jobs rather than Hadoop for certain analytics.

We got to Palo Alto, joined Yuri and Mark and Weihan and a professor from U of Toronto who was visiting and walked down to Coupa Cafe. The discussion was pleasant and interesting.


Ankur, Annelise, Josiah, and I participated in the Palantir Superhero Academy puzzlehunt. It was fun, and the first time I've actually hunted alongside that group (everything else up until now has been writing or playtesting!). Our teamwork was excellent, and we got 2nd place overall and 1st among student teams (they also announced the hunt on the DASH and BANG mailinglists). A great way to end a week!

We finished two hours before the wrapup, so we went back to Cory Hall and worked on our own puzzle hunt and website a bit.

Oh, and we have weekly puzzles in the Daily Cal. Check 'em out.

When I got home, I worked on the Stripe CTF some more, finishing level04 and getting some ideas . I learned how to defeat ASLR. Despite the amount of security background I have, I'd never actually written exploits for C code. It was fun.


Spent the morning and most of the afternoon finishing the last two levels of the Stripe Capture the Flag. I'm quite proud of having completed it - it was a fun challenge, and I learned some useful details of some real systems. I can write my own pickle code now. I can defeat ASLR. I can abuse the kernel to win race conditions in userspace. And I'll remember how these tricks work when I create software, and I'll try not to let my code be vulnerable to such things.


Andrew and I went to the local Asian supermarket and bought 45 pounds of rice. Also, pork sung is delicious.

I finished implementing some C to read the Wiegand protocol from my RFID reader. The trick to getting things working reliably was to buffer the entire Wiegand transfer before putting any data on the UART. Now I can read the serial number from MIFARE cards. Fun times.

It's a good thing that I finished this project, though; I really need the desk space back. Quoth Matt:

"Heh, judging from your desk, an earthquake would set you back a week finding all the teeny components and shit you had strewn about."

...which is completely true. I need to clean up my desk pronto.


I realized somewhat recently that when I'm sitting here at my desk, my hands are within one cubic meter of 8 devices running a Linux kernel. Madness.

2012-03-01 | 0 comments

The morning started out depressing - cold and rainy. It got better as the day progressed, though, and by late afternoon was warm enough for short sleeves.

I took the BART to SF for the Stripe CTF meetup. Upon arrival, the outside door was locked, as was the stairwell and the elevator. I and the other four or so people who had arrived at this point joked that this was level07 of the six-level challenge - social engineering our way up to the office. Eventually, someone exited the building through the stairwell, so I caught the door, ran up and notified the Stripe folk that we should probably prop the door open if they want any of the attendees to actually make it upstairs.

The talk was good - Andy explained how they set up and secured the systems (chroot jails, limit mounts, mount -o bind,ro), and showed some snazzy graphs of how many people were logged in simultaneously over the duration of the contest. Turns out they were expecting on the order of a couple hundred participants. They got 10000 unique IPs logging in for level01. Oops. In addition, doing proper limits on anonymous accesses is nontrivial.

I was one of ~250 people who completed all six levels of the CTF. That's pretty close to what I had expected. Of the eighty or so people present at the meetup (rough number), I saw seven hands go up when they asked who got the-flag's password.

Greg and Sidd walked through each of the levels, how they were vulnerable, and demonstrated an exploit for each. Apparently some people did a statistical timing attack to defeat level06. Since the timings would be noisy with everyone else running lots of things on the machine, these folks waited until 3AM to run timing attacks for a few hours. Their persistence impresses me.

After the formal talk and Q/A ended, the pizza arrived (perfect timing!). I wound up chatting with Leah Culver and John Collison for a good while about all sorts of things - long-polling, session management, the craziness that is chat protocols, and the impermanence of the Web and the right to disappear. I shared a bit about my group's research on the current state of permissions and privacy on mobile platforms and the recent iPhone and Android permission fiascos. We also talked a bit about password management solutions and OAuth - it turns out Leah co-authored the OAuth spec, but now thinks that individual username/password setups are actually better for users in most scenarios.

I met a guy named Dan who was wearing several CCC wristbands, and we talked about the CCC, data privacy and retention policies, differences in American and European culture, and a good bit about Noisebridge. Apparently Noisebridge runs a high-bandwidth Tor exit node. Snazzy.

As the crowds started to clear out, I headed over to the beanbag area, where I talked about Bitcoin and virtualization and reliable highly available distributed systems with Greg Brockman and Evan Broder (both of whom I knew from MIT!). We had a great time going on about high-availability datastores and Paxos and the need for a distributed lock manager. I very nearly commenced a group reading of the Amazon Dynamo paper, since Greg had never gotten around to reading it, and it's one of the finest distributed systems papers around. In the end, I opted not to, because he also needs to read the Chord paper to fully appreciate the Dynamo one, and I didn't feel like reading that one too. Broder reported that the AFS servers at MIT are no longer restarted at 3AM on Sundays. Guess the memory leaks have been fixed!

It was loads of fun meeting up with faces old and new, and as I explained that I'd be joining AeroFS in May, a bunch of people thought it sounded really neat. A couple had feature suggestions. A couple others thought their companies might like that product. Exciting times!

More and more people left, and eventually it was 23:20 and I decided I should probably head back to the East Bay. As we parted, Broder joked "Well, if nothing else, I'll see you again in January!" (We both solve puzzles at the MIT Mystery Hunt in January each year with the team Death From Above.) I laughed. Hopefully we'll meet up again before then.

A random girl on the BART heading back to Berkeley told me she liked my hair. I felt pretty.

2012-03-05 | 3 comments

Saturday: Brohaus threw a party; I met lots of folks I hadn't met before. Glowsticks are fun. It was the first time I've been at a party where emergency services were called because someone passed out from drinking too much. Invitations may be given out slightly more judiciously in the future.

Sunday: reverse engineered a big red button with Dustin. That thing abuses HID in quite strange ways - the HID descriptor was effectively useless, and it would only send Interrupt IN transfers if you first sent it a SET_REPORT request on the Control endpoint. Wat. We were successful in finding a command sequence that would answer correctly, but sometimes the device would just hang indefinitely and never give a reply. How bothersome. With a little time and a decent amount of inspiration from libtouchmouse, I made a terribly hacked-together (but working!) library for Windows, OSX, and Linux. From a cursory googling, it appears that I'm not the first to figure out the protocol, but I didn't see any cross-platform libraries, and I think the ones that use libusb on linux will have to unbind the USBHID driver to function. Maybe I'll clean up my implementation and put it on github.

Monday: I woke up this morning rather early. It was loud, and everything was shaking. I need to get better at jumping into doorways out of a cold sleep.

My hair gets super curly when I go to sleep with it still damp.

2012-03-12 | 0 comments

22:16 < Backgammon> Hey #OpenKinect.
22:16 < Backgammon> Popped in to say thanks for all your work.
22:17 < Backgammon> I'm from FIRST Robotics High School Team #639, and we used your library as a component in a range/angle finding program for this year's game.
22:18 < Backgammon> We won what's basically a general quality award, in which the Kinect vision system played a part, and we couldn't have done it without all you guys, so thanks again.

It's things like that make it all worth it.

2012-03-13 | 0 comments

Today I went paintballing in San Jose with AeroFS.

It was my first time playing paintball. The same held true for four of the other players. It was more fun (and less painful) than I had expected. We were all given jumpsuits (to keep the paint mostly off our clothing), protective gear, and a paintball gun. We played a bunch of rounds over the course of a few hours. It's a good thing it was a cool day - paintball is a lot of cardio.

There were 8 of us, so we divided up into two teams of four, identified by our chestguards (there were camouflage ones and plain black ones). I joined Mark, Yuri, and Ellen on the "camo" team. We started out with some team elimination rounds, which our team seemed to do well at. We moved to a bigger field and played a few rounds of Capture the Flag, with a single flag in the middle. Yuri was successful in retrieving the flag twice.

After a couple breaks, we played several rounds of Zombies vs. Humans, in which three players started out as "zombies" which could only be killed with a headshot. If they shot a human, the human would return to the zombie base and join the zombie team. The game ends when one race is eliminated. I did much worse at this game than the previous two.

We tried some more Capture the Flag, and Allen just started sprinting for the flag in the middle. Since we're all newbies at paintball (and terrible shots to boot), none of us managed to stop him, and the rounds ended rather quickly. We convinced the guy refereeing to find a second object to serve as a flag and to modify the game such that there would be two flags, and to score, each team would have to retrieve the flag located in the opposing team's base. Add in respawns, and we had a lengthy and well-fought battle - both sides had lots of trouble approaching the enemy's base. Eventually, I got one opponent from the flank, another head-on, and caught Weihan at the base with his gun pointing up enough that the hopper wasn't loading paintballs into the barrel when he pulled the trigger. As the three returned to their respawn point, I grabbed their flag and sprinted at top speed back to my base, ending the round.

Once we were all worn out (and had shot just about all of our paintballs), we went to Cha Cha Sushi for dinner. They are highly rated on Yelp, and rightly so. All the rolls were excellent, and the green tea ice cream is over-the-top.

We returned to downtown Palo Alto, and I dropped by the imo office, where Erdal and Patrick were still around. I chatted with them for a bit about permissions systems and API designs and dealing with the Android Market and such, then drove back to Berkeley.

The "paint" inside the paintballs is completely washable. I'm doing laundry now, and my hoodie is back to its normal shade of black.

I am going to ache tomorrow. No welts, but a few red spots (the hits on my fingers were the worst) and some tired legs from running. But a good kind of tired, and one that will remind me that I had fun trying something new.

2012-03-14 | 0 comments

My thighs are super sore from all the running around yesterday. Apparently, I can sprint at 17 mph. If I could keep it up for a mile, that'd be a mile in under four minutes. Pity I can't go very far that fast.

Today was Pi Day (March 14th)! For the CS social hour, Jono meant to get pies, but apparently other people in town had similar ideas, so Trader Joes was completely out of pies. We wound up with various other tasty things instead.

This evening, Ankur threw a pi day party. There were pina coladas, pizzas, and lots of pies, both sweet and savory. I probably can't remember them all, but there was a meat pie with ground beef and lamb and onions, a pineapple pizza, a chili pie, an apple pie, a pumpkin pie, a pie containing corn, macaroni and cheese, and mashed potatoes, a latke pie with applesauce, and a chocolate pie. I sampled all of them, and they were tasty.

The chat was lively and properly nerdy. While I'd seen a few of the people in attendence before, the majority of the faces were new to me. Many were former Tetazoans.

As people left, our numbers dropped to six people, and we played a game of Canadian Fish. I'd never heard of the game before, and I kept zoning out and forgetting all the state I'd known the entire game because I was tired, but it seems quite interesting. Apparently Ankur and friends have written AIs for the game as well; I may try my hand at writing my own some time.

2012-03-20 | 1 comment

Yesterday I participated in a user study pertaining to multitouch gesture frameworks. Regexes for multitouch events are pretty cool. Automatically generating them is even better. The hard part in describing touch gestures seems to be stating clearly which details you don't care about. I should toy around with multitouch frameworks at some point.

Today Facebook ran a mini puzzlehunt (7 puzzles) at Berkeley. Ankur, Annelise, Josiah, and I completed it in 45 minutes flat (and backsolved two of the puzzles). After we won (and each received $100 Visa gift cards (!)), we went back and forward-solved the puzzles, then relocated to our usual meeting location in the Swarm Lab and planned our own puzzle hunt a little more.

Then I went back to BiD and sat around talking to Andy and Manas with a microphone to produce test data for David Sun's project.

On the way back home, I stopped by Soda Hall and caught the tail end of the CS Movie Night - they were watching Star Trek II: The Wrath of Khan.

2012-03-23 | 0 comments

I spent 7 hours converting every single one of my blog entries to the markdown variant I described a while back. Now they're all pretty!

At some point, I think I should throw all the entries in my AeroFS folder. Then I could write them locally even if I don't have internet and they'd automagically sync up when I'm connected again.

On the topic of parsing: I found this video from PyCon 2012 interesting. The results were basically what I had concluded when trying to parse dokuwiki - lots of interesting grammars (like wiki markups!) are context-sensitive, for which you need either lots of lookahead assertions (ugly) or PEGs (fairly young, not widely supported, and less performant). I have some more references for building a better dokuwiki parser now, though, if I wanted to make one true to the original syntax.

2012-03-25 | 5 comments

I went skiing at Tahoe this weekend!

Allie and Ryan Janoch, Paul, Judy, Jon, and I drove out Friday evening. We'd actually planned to go last weekend, but it had been raining all week in Berkeley (which means it was probably snowing in Tahoe) and there was a bit of a blizzard. Mountain passes in a blizzard are no fun, so we opted to put the trip off until this weekend.


I rode with Paul and Judy for the ~3 hour trip. It was mostly uneventful - we stopped at a Whole Foods to grab some dinner, and I took a nap. We had minor navigational difficulties in finding the condo we were staying at on account of the GPS failing to know about the street the condo was on and all of us having difficulty locating it on our phones. Eventually, after a bit of turning about in Nevada, we prevailed in our lodging-locating expedition and unpacked.

The place was nice - two-story, three bedrooms, two bathrooms, a snazzy well-furnished kitchen, washer and dryer, a foosball table, a couple couches, and some wooden mats that looked like giant coasters for people to sit cross-legged on.

After we settled in a bit, we took a trip to the local Safeway to get breakfast foods. We wound up with something like $60 of yogurt, fruit, granola, eggs, bread, veggies, and beverages. Paul made Tequila Sunrises, which are surprisingly tasty. Judy sliced some fruit, including a kiwi, which made my mouth tingle in a weird way. Apparently, kiwis contain raphides which enhance the effects of actinidin, which I may be allergic to. Maybe that's why I haven't eaten kiwifruit since I was a small child. We watched the first episode of Firefly, which ended just about the time Jon, Allie, and Ryan arrived. We all went to bed so we could get up at a reasonable hour and hit the slopes in the morning.


I wound up setting the time for the alarm, but failed to switch the alarm to the correct mode, so my 08:30 planned wakeup turned into more of an 09:17 wakeup. I probably needed the sleep anyway.

I ate a fried egg on toast and some yogurt, strawberries, grapes, and banana topped with granola for breakfast. Gotta fuel up for the day!

Allie and Ryan have season passes at Heavenly, so Jon and I got $10 lift ticket discounts for being their guests. Heavenly has fancy RFID cards for their lift tickets that they can scan through your ski jacket. I am totally going to see if my RFID reader can read it later - probably not, but worth finding out. Jon and I rented equipment. I sprung for the performance skis and a helmet. I will never ski without a helmet again, after what happened on my previous ski trip. Ask me about it in person some time, if you haven't heard the story before.

The winds were fierce, and most of the lifts and trails were closed. Those that were open still were somewhat crowded (Saturday is unsurprisingly the busiest day at ski resorts). The snow conditions weren't great - a bit slushy, a bit icy, and in a couple places, winds so strong they'd almost blow you uphill. Most of the runs that were open weren't great, but it was a decent chance to get back into the swing of things, since I think the last time I skied was in 2010. Allie and Ryan decided not to ski - season pass holders can be choosier about when they ski. Ryan also had an ankle injury, so he probably shouldn't have been skiing anyway. Jon and I stuck it out for the rest of the day, though. I wound up a little sunburnt and windburnt on my nose and cheeks.

That night, Allie and Ryan made spaghetti and meatballs and a salad with a vinaigrette dressing and fresh bread (but the yeast was expired and didn't rise very well, and the oven was weird and burnt the bread, so not so much bread) and pineapple. It was delicious.

I played foosball with Ryan. He is a worthy opponent. After our game, we added Judy and Jon to the two sides and played a couple 2v2 matches. The 2v2s were better than the 1v1 - the table was so frictionless that shots could go right through defenders. With a hand on every handle, though, the game felt much more a challenge of skill. It was noisy and the battles were ferocious.

Later, the six of us played Pass The Popcorn, a movie trivia game. Paul knows movies pretty darn well, and won handily.

We watched The Whistleblower which is definitely not a feel-good movie. I made fruit smoothies (the kitchen had a nice blender!) served in a big red wine glass. Classy.

Jon and I discussed how he wants a device with a three-day battery life that we can use for editing text in the wilderness. Nothing really satisfies this need - e-readers have terrible keyboards, and basically nothing else lasts long enough. Pencil and paper come close, but we need our vim, and handwriting everything gets exhausting. Last time I handwrote more than two sentences, my hand started cramping up. I am so much more productive with a good keyboard.


I managed to set the alarm successfully! For future reference, anything short of a puzzlehunt that makes me wake up before 09:00 shall be officially classified as The Enemy.

I made an even bigger breakfast today than on Saturday - a two-egg omelette as the filler for a sandwich on sourdough bread in addition to my fruit-yogurt-granola mix. Mmmm, breakfast.

The skiing was much, much better today. All of the trails were open. Allie, Jon, and I started out on the Nevada side of the mountain, and hit a bunch of glorious trails. Lots of wide trails with good snow. It was a bit colder outside (and we started a bit earlier), so the lifts tended on the cold side in the wind, but I have no complaints! Allie is a speed demon - we let her lead the way (since she knows the trails the best), but she managed to get so far ahead of us that we lost track of where she was and missed switching trails a couple times. I can't blame her - the mountain is great for fast, controlled skiing.

As lunchtime neared, we skied across the border to the lodge on the California side, which was closer to the condo. There was a lot of pole-pushing across flat runs, which was quite exhausting. On the final run, I had a fairly impressive wipeout. I'm not sure if the shaking in my legs that I noticed afterwards was from adrenaline or general fatigue.

We met up with Ryan and Judy and Paul at the lodge for a late lunch. When the weak feeling in my legs didn't go away after eating, I decided that I should probably call it a day before I injure myself, so I returned my rental equipment and got on the road with Paul and Judy. We turned back shortly after leaving when we realized that we hadn't ever refuelled the car (and the gas light illuminated). I'm going to have to remember Paul's excellent technique for turning the car around on a two-lane road when there are a bunch of cars driving fast behind you in your lane of origin, but the lane going the opposite direction is empty and has a shoulder.

I'm home now. I want to watch the rest of Firefly.

2012-03-31 | 1 comment

Today I resealed the cork on my Birkenstocks. Yay.

TL;DR for the rest of the post: PRIVACY RANT PRIVACY thoughts RANT

There's been some himhawing about the Internet lately over an iPhone app called "Girls Around Me" which has become a posterchild for "social media privacy wake-up call". The app itself takes public Foursquare checkins and cross-references them with Facebook accounts. Read this article explaining why that's creepy.

Now, the app has had its Foursquare API key pulled and has been removed from the iTunes store.

Several people have written interesting responses about the incident. Parker Higgins compares Girls Around Me to Firesheep. Charlie Stross makes an eloquent case for how social networks are financially incented to structure their products to mislead their users or at least intentionally avoid educating their users about privacy. It's how they make their advertising money, after all.

To me, I see the problem of privacy as having (at least) two large facets: informed consent and control of context. Informed consent means the user must understand the risks and implications of the action they are going to take (say, sharing their information with a web service). Control of context means that the user is in charge of where that information can be disclosed - I may be fine talking to my colleagues or family about things that I wouldn't want shared with everyone on the street. Surely you can relate.

Here, users are inadequately informed of the implications of sharing their information, so even though they've "given consent" to the system, they don't realize the impact that could have. Second, once they've handed this information to a platform like Facebook or Google+ or really, any social media product, they are letting whoever runs that product be in charge of the context that information is used in. And so many platform owners make APIs that let third parties use the data that there's little control left to the user. The concept of communications defaulting to private the way we'd expect in real life no longer works on these platforms. I'm not trying to ignore Facebook's privacy controls nor Google's circles concept, but far too few people understand what's going on here, and the (profitable!) default is to share everything. Some part of me thinks that people who don't think about these topics get what they deserve, but I digress.

Switching gears (but still within the broader topic of privacy): Al Franken raises concerns over the power of dominant tech firms (pdf for the brave). While I don't appreciate his support of SOPA, I'm inclined to agree with him here on issues of antitrust. A couple lines struck a particular chord:

"The more dominant these companies become over the sectors in which they operate, the less incentive they have to respect your privacy."

"And so when companies become so dominant that they can violate their users' privacy without worrying about market pressure, all that's left is the incentive to get more and more information about you. That's a big problem if you care about privacy, and it's a problem that the antitrust community should be talking about."

To those who would claim to not care about privacy, I need only point to the previous section of this post to explain why such a cavelier attitude in general might be unwise. While obviously Google isn't about to publish all of their users' searches everywhere, and Facebook isn't about to yank all security controls, there's a concerning amount of homogeneity. We're there, and like the US government's budget failures, I suspect that this will become clear to the public only once it has become too late.

There's a place for startups here - ones that will respect the privacy of their users. DuckDuckGo comes to mind. The hard part is making sure that they'll remain that respectful even when they start to succeed, or when the cost of doing so means their economic failure when they have to compete with larger, less-scrupulous competitors.

In the meantime, I'll stick to personally running as many of the things I use as I can, like this website and a number of other services upon which I rely.

I'll probably continue to spend a certain amount of effort to stay in personal control of my image and my communications and be looked upon as a paranoid phobiac with silly concerns who makes it hard for people to interact with him and stay in touch.

2012-04-12 | 0 comments

I'm a bit behind on the ol' blogging again.


Peter Bailis organized a trip to go hiking at Mount Tam, which gathered 8 folks. Dave Moore picked up Greg, Sarah, and me at some unholy hour like 8am and drove over. There were some curvy mountain roads, which were being expertly navigated by the five Ferraris (no joke!) in front of us and the one behind us. Dave was keeping pace in his Subaru, which was a combination of awesome and terrifying. My right arm got a workout gripping the handle on the door.

Dave keeps pace with the Ferraris
Dave keeps pace with the Ferraris

We passed over a tiny wet patch on the road, to which Dave quipped "I was excited right when I went over that wet spot, because even if it was for just a fraction of a second, I had better acceleration than the Ferraris." We all laughed.

We met up with Peter, Claire, Austin, and Philip when they too arrived in the outskirts of Stinson Beach. From there, we set out on the 7 mile trail, which was lovely. There were a bunch of chalk arrows on the trail pointing in the opposite direction of our path - apparently there was some Team in Training event going on on the trail.

After we finished the hike, we drove to the summit (which would have been a 14 mile hike, which some of us were not up for) and ate lunch at a picnic table.

Peter took lots of pictures with his hipster black-and-white film camera, and he taught me some of the science behind photography. I only had my phone with me, so apologies for the below-average image quality.

Claire passes between two giant redwood trees
Claire passes between two giant redwood trees

Peter switches rolls of film in his camera
Peter switches rolls of film in his camera

Austin, Peter, and me on a tall rock at the peak
Austin, Peter, and me on a tall rock at the peak

Peter.  You can see the Bay Bridge and SF in the distance.  While you can't see it in this picture, we could also see the Golden Gate from this vantage point.
Peter. You can see the Bay Bridge and SF in the distance. While you can't see it in this picture, we could also see the Golden Gate from this vantage point.


Worked on the Berkeley Mystery Hunt website. I'm learning Django!


Excellent day. Moxie Marlinspike, perhaps one of the world's greatest experts on attacks on SSL (secure web browsing), came and gave a lecture (much like his BlackHat 2011 talk) on the problems with the CA system used to provide security on the web. He described the missing piece in today's system as "trust agility" - the ability for users to revoke their trust in a CA (or any trusted third party) at any time without loss of functionality.

Moxie has a project called Convergence that provides such a system. It's based on the concept of network perspective - a man-in-the-middle attack typically makes a site look different (from a computational perspective), and so if you can approach the site the from many places, you can see the discrepancy, and know not to trust the fraudulant cert. It's quite cool, and one of my friends is trying to implement it for Chrome.

I find the whole project inspiring. If anyone can fix the CA problem, it will be Moxie and his collaborators - he is asking the right questions.

We had cooking club as well, which meant that I missed having dinner with Moxie and the other security folk, but Jon Long made Beef Wellington, and it was amazing. There was also fresh bread, a spinach salad, quinoa salad, and cheesecakes. I was so full I had to lie down for a spell.


It was raining all day. I paid my car insurance.


The Campus League of Puzzlers met up for a meeting. Our puzzlehunt is coming together! I'm a little afraid that it will barely be done in time, but our plans are becoming more and more complete as the days go on.

Our meeting ended at 20:00. I managed to catch the 20:08 BART to SF, where I met Patrick Bogen, his friend Renee, Matt Mullins, David Mackey, and Joe Cabrera at the Beast and Hare for dinner. I had rabbit stew, lamb bacon (very tasty!), and a slice of carrot cake. We chatted for a while, and then I went home and slept.


I finished hacking up the website for our user study, which included learning how HTTP file uploads work. Yay research.

2012-04-14 | 0 comments

I got up at early-o'-clock (approximately 06:40, or "two full hours before I normally wake up"), picked up Ankur, Annelise, and Josiah, and drove down to Stanford for this year's Microsoft College Puzzle Challenge. The CPC wasn't being held this year at Berkeley, but that won't keep a team of serious puzzlers like ours from getting their puzzle fix.

We wound up packing an extraordinary amount of supplies. There's the obvious things: pencils, scratch paper, computer, and power supply. There's the not-obvious-the-first-time-but-obvious-if-you've-done-it-before: scissors, tape, colored pencils, a ruler, whiteboard markers that work, and a portable whiteboard. There's the we-like-being-nourished-while-thinking-this-hard: bananas, oranges, Clif bars, crackers, trail mix. There's the we're-serious-about-having-everything-we-might-benefit-from-having-on-hand: a projector, a 14-port power strip, an extra pair of laptops. And finally, there's the we-do-this-in-style: t-shirts from past puzzle competitions and a wizard hat. Ankur also had a pillow and a sleeping bag (unrelated - he needed to return them to a friend), but he left those in the car.

We settled into a snazzy conference room, and then another team dropped in saying they had reserved it for the day, so we moved to a different unoccupied one. Fortunately, Stanford's CS building is snazzy and has lots of awesome conference rooms. We wound up in a room with a giant table, in between a men's bathroom and a kitchen. I plopped my power stip in the middle, and we got to work.

I felt our teamwork was very solid overall. We played to our strengths - Annelise is great with word puzzles, Josiah does an amazing job of finding obscure things and can jump in to help on pretty much any puzzle, Ankur excels at figuring out answers with insufficient or mistaken information and notices patterns well, and I tend to be decent at throwing down extraction mechanics, know a pile of encodings, and hack together scripts. To top it off, we're all pretty good at catching each other's mistakes. :)

Puzzles that I had a hand in solving:

  • Ameglian - a puzzle that looks like an HTTP 404 page, except that the actual error is 418 I'm a Teapot. A solo solve.
  • Cows in Space - a constraint satisfaction puzzle. Once I found the two Ms and the A, my teammates suggested various theme-fitting words, and we found the right one after a couple guesses. After solutions were posted, Josiah quipped "Well, the left half of that picture looks familiar."
  • Beverage Menu was one Josiah and I threw down in the first 5 minutes flat with about 50% of the data.
  • I did the "Duck Konundrum", Don't Panic!, on the whiteboard.
  • Hello Ground was a Silverlight puzzle where you had to keep 5 objects suspended in the air with a fan. After failing at the game for a while, I gave up on trying to beat the game the normal way and read the XAML in the executable's implementation. Presumably to defeat people attempting to extract the answer from the binary, the developers painted the answer with lines and shapes, rather than rendering text. No matter, I reverse-engineered how the Data field of <Path> works (I couldn't find a good reference online, and MonoDevelop kept crashing when I tried to let the IDE render it), and painted the Path by hand on scratch paper. I managed to inadvertently invert the Y axis in one of the drawings and wound up making a W into an M; Josiah noticed this and came up with the correct answer.
  • I came up with the final extraction for Eat In or Take Away. I also made a mistake that threw all of us off for a bit longer than I'd like to admit.
  • Carambola, the t-shirt puzzle, was actually one of the last puzzles we solved; we didn't figure it out until after the meta. Eventually, I had a breakthrough when I said "Star. Fruit. Where's APPLE?" out loud slowly. From there, the team made quick work of the rest of the puzzle together.
  • Ankur did most of the work on Three Part Act, but I helped with transcription.
  • I solo'd What Do You Get When You pretty quickly.
  • I'm Hungry was a full-team effort. We made a bunch of transcription mistakes, but we managed to catch each other's errors. This puzzle made me feel really good about our teamwork.
  • We got stuck at the final step of Two for WAY too long.
  • The Honeycomb was this year's metapuzzle. As soon as round 2 unlocked, Ankur and Josiah figured out which hexes were which color. Later, Josiah and I spent some quality time with a transcribed set of bigrams, figuring out what hexes could go where. We finished the metapuzzle - about 10 minutes after a team from University of Michigan won the overall prize.

All told, we got second nationally, and first at Stanford, so we each got a $100 Best Buy gift card. This bodes well for Google Games (upcoming on the 28th). We also earned the distinction of being the only team to complete every puzzle during the competition.

After the brief award ceremony, we hung out on campus with a group of Ankur's friends. Ankur led us to several fruit trees, and picked lots of kumquats from the trees. Apparently Stanford has an online encyclopedia of the flowering plants on campus. After eating kumquats and oranges, we went to The Axe and Palm for dinner. The same building had lots of snazzy meeting rooms, so our team sat down and worked for a bit on our puzzle hunt. Annelise and Ankur focused on finalizing the t-shirt design, and Josiah and I played puzzle-doctor for a particularly broken puzzle. After toying with a decent number of options, we rewrote

And then, all of a sudden, it was 23:00, so I drove us back to Berkeley. I dropped Ankur at his residence, then joined Josiah and Annelise for a cup of tea and another hour of coding for our puzzlehunt website.

It was a good day, and I'm looking forward to hunting with that team again. :)

2012-04-15 | 0 comments

Today, Austin and Colin made crêpes for cooking club. There were savory crêpes and sweet crêpes, and I had two of each. Crêpes and nutella belong together.

I wound up taking a nap in the afternoon. Now I'm working on cyberlaw things.

2012-04-20 | 0 comments

Someone I met at Valkyrie's wedding sent me a link to an article titled The Extroverted Web, which I found intriguing. I can't help but think about the social processes involved in software design (which are apparently Linus' favorite part about Linux) and Clay Shirky's extensive work on internet group dynamics. I'm not sure exactly what I think about this, but I'm starting to think that part of the reason that some people find submitting to the kernel intimidating is because it needs to be that way to ensure the group remains functional at scale.

It's ~21 degrees outside, so clearly that makes it 32 degrees indoors and somewhat miserably hot in the afternoon/evenings. (Sidenote: looking forward to having a first-floor, east-side, air-conditioned room in a house in a month. Not having to have my monitor fight the sun for brightness/contrast will be fantastic too.)

The upshot of this is that I've spent a decent chunk of the past two days in a disgusting puddle of sweat, trying to avoid exertion that will further increase my body temperature. Maybe that's why I'm waking up so early in the morning lately.

On the upside, it's lovely outside of my apartment, so I went on a nice long walk with some friends.

In other news, today I received an Asus Xtion Pro depth camera. A few hundred lines removed and a few lines added, and it works with libfreenect. Right now it's just in quick hack form, but when I get around to the refactor which adds support for the Kinect for Windows, it'll be trivial to add support for the Xtion Pro as well. I may have to seek out an Xtion Pro LIVE at some point, which also has the RGB camera and microphones.

2012-04-22 | 0 comments

I spent 14 16 hours on campus today (apparently I can't subtract at 3am). The Campus League of Puzzlers did a near-complete audit of the puzzlehunt we're running next Sunday. I personally playtested the entirety of the runaround. We also added some snazzy features to the website.

We have 135 players representing 22 teams registered, which is more than we expected and very exciting. We've put in numerous man-days planning this hunt, and it's great to see it all coming together at the end.

I am exhausted, but happy.

2012-04-23 | 0 comments

The .org registry lost my domain today. I am not pleased; this is a situation of "you had one job! ONE JOB!" Also, my study website is hosted...under my domain. Gah.

A few minutes on the phone with my registrar fixed the issue.

2012-04-28 | 1 comment

Today the Google Games (a Google-run puzzlehunt of sorts for university students) were held in Mountain View. Obviously, I participated.

The Google buses arranged to take us to the Mountain View headquarters were lined up in front of Soda Hall. One of the buses was a double-decker bus, which I'm not sure I've seen in the US before. My team - Ankur, Josiah, Annelise, Nima, and myself - arrived wearing silly hats. Ankur wore a tall straw fez, Josiah wore his usual baseball cap, Annelise had a beret, Nima wore a Russian hat with earflaps, and I wore my wizard hat. We were all wearing our Berkeley Mystery Hunt 2012 shirts. I tried updating my old Dell laptop using the in-bus wifi, but decided that it was probably a bad idea to run down the battery that much en route.

The Berkeley buses arrived a few minutes before the Stanford buses, so we found our table. I had forgotten our team name, but knew that it was a really big number. After looking through my email, I was reminded that we had chosen 4 ⇈ 3 for its length, simplicity of explanation, and un-Googleability (I should note that basically every other search engine handles long queries like that just fine). Somewhat impressively, the staff worked out that it was precisely 2512 when they referred to our team name during the competition. They were also kind enough to not require us to write out the entirety of team name (13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096) on all of our submissions.

The contest started off with a round of trivia questions - there were math, science, pop culture, history, and other miscellaneous questions. I have to be a little vague about the actual competition so I don't accidentally spoil the Games for the other sites, but I was proud of a couple of the computer-history-related answers I remembered. Our team thought we did decently but not amazingly well at the trivia round.

The second of the four rounds was a set of puzzlehunt-style puzzles. This was where we hit our stride - the round was scheduled to take 105 minutes. We were done in 40, which set a record for this year's puzzleset across all of the Google Games sites. Ankur managed to extract a long word with knowledge of exactly three known letters, and I managed to get a long theme-related word on a puzzle that was proving very difficult to solve forwards from just the last two letters. Our teamwork was fantastic as usual.

As a result, we had over an hour to burn, so our team high-fived and went outside to enjoy the beautiful day. We rode around on the Google bikes (I hadn't ridden a bike in years!) for a while until one of the security staff very politely informed us that he couldn't let us ride the bikes for liability reasons. Alas. It was fun while it lasted. We returned, and tables were being set up for lunch - Italian from Buca di Beppo. I chatted for a bit with Ilya Sherman, who was on the Texas ARML team with my back in the day and works for Google now.

We grabbed lunch and sat in this garden area with a big outdoor shade umbrella and enjoyed lunch. After we finished eating, we chatted with various other folks. Jaehyun Park (who also interned at imo last summer) came by and we caught up a bit. We went over a couple of the puzzles with Shang Jiang and Kate Harrison and their teammates. Jono Kummerfeld and the rest of the EECS grad student team joined a circle of conversation with us and Hanah Kim, the Google recruiter for Berkeley. We got to hear a little bit about how the Games were developed and playtested internally, which was really interesting, since the majority of my team has been working on our own puzzlehunt for months. The Games developers were very attentive to balance in all of the puzzles - they tried to make them all things that did not require a particularly obscure or domain-specific step. It turns out the Games are a branding event, not strictly a recruiting event, so they're evaluated with slightly different metrics. Hanah asked us how we felt about how we did in the Trivia round, and we again answered something along the lines of "probably top 25% or so."

After lunch, we all went back inside and the organizers announced the standings, where we discovered that we had grossly underestimated our trivia performance - we had, in fact, placed first in that round as well.

The next round involved building something out of Legos, and I'm pretty sure I can't say anything more specific than that without giving away the activity. We wound up getting third in this category, and I came up with what I felt was an innovative design for part of the task.

The final round was a combination of some programming problems and a final puzzlehunt-style puzzle. Nima and Josiah and I worked on the programming problems, and Ankur and Annelise did the puzzle. And when I say "Nima and Josiah and I worked on the programming problems," what I really mean is "Nima started on problem A, I started on problem B, and Josiah started on problem C, and Nima finished implementing all three before Josiah or I managed to get a sufficiently performant solution for either of our problems." We were one of 7 teams to finish all three problems at both difficulty levels.

Some teams came up with clever ways to improve their code's performance - Ben Dong, one of the undergrads I do research with, told us when his team ran their Python implementation on CPython and it was too slow, they tried it again with PyPy and it finished running in time. I thought of doing this, but I didn't have PyPy installed. Everything turned out okay though; Nima's C++ implementations were great, and in the meantime, our puzzlesolvers had finished the extra puzzle (which they described as very elegant).

At the end of the day, we wound up winning by three points out of a possible 247. Jaehyun's team got 2nd place (and would have beat us if they'd finished the 7-point extra puzzle). Berkeley had taken first at the Google Games for the first time in five years. (Stanford still won overall; their teams did better on the average). The next-best Berkeley team turned out to be Jono's team, which placed sixth fifth (thanks for the correction, Jono!). Our team was awarded Samsung Chromebooks as our prize. Since I had brought two laptops (one for me, one for Ankur in case his laptop started acting up again (a fairly regular occurance)), I get to say this line:

I went to Google Games with two laptops and left with three.

Photos were taken, and hopefully Hanah will send us a link to them in the near future. We got back on the bus, and our team worked on the Friday and Saturday New York Times crossword puzzle. At some point on the bus ride, I fell asleep.

We got back to campus, tried to finalize puzzlehunt-related plans and make sure we'd done everything that needed to be done in time for the hunt. I got home around 01:00 and coded until 03:30, when I finally finished getting the team import script right (and idempotent).

2012-04-29 | 1 comment

I woke up at 7 this morning (after three and a half hours of sleep) to shower, get dressed, pick up Annelise and Josiah and lots of assorted things at 8, and set up and run the 2012 Berkeley Mystery Hunt for the rest of the day.

Participants started showing up around 09:30. Annelise checked off which teams arrived and gave them their t-shirts. Special thanks go out to Intel for sponsoring the event, which allowed us to hand out over 150 t-shirts. Steven Herbst was there with one of the teams! He and I debugged Verilog for the Happy Boards for MIT's 6.270 back in January 2010. I hadn't seen him since then, but he works out in the Bay Area.

The kickoff went swimmingly. Some teams had a little trouble logging in to the website; next year I'll want to be able to have teams test their logins in advance without gaining access to the whole hunt.

It was fun to watch the team solves go up on our leaderboard.

I wound up spending most of the day trying to keep the website from catching fire. It was a true test of on-demand bugfixing - the hunt was live, and every time I got emailed an exception, that meant that someone on one of the teams was hitting a bona fide website bug. In the morning, I knew I had a bit over 2 hours after kickoff to implement the hint-earning event pages. There were a bunch of things that we changed in the last week (after our playtest) that didn't get properly QA'd before today. We made 24 commits that day, some of which were features being implemented just before they were needed, some of which were load shedding by adjusting refresh times, and some of which were somewhat serious bugfixes.

Pizza for everyone (~170 players, ~7 organizers) arrived on schedule in two batches at 1pm and 2pm respectively (again, thanks Intel for the sponsorship!). Teams were a bit behind in the hunt at this point, so we nudged them all along so they could get to the more interesting puzzles (and we could get all the people we had out and about back to HQ and fed).

As I noted before, I spent most of my time at HQ - it's very helpful to have someone who's intimately familiar with all the puzzles helping out with the answer queue, so you know when to give comments like "Check your work." and "Keep going." to teams that have either made a small recoverable mistake or are on the right track but need to keep working.

The site remained fairly healthy over the course of the hunt. A couple of teams wound up doing partial bruteforcing on one of the puzzles. When one team started submitting all possible bigrams, we called them on the phone and told them to knock it off. In their defense, we had sorta taught them to bruteforce with an earlier puzzle, and we never exactly mentioned that all the submissions were being graded by hand. In fact, another team submitted a guess of "DOESSOMEONEREADTHISORISITAUTOMATED"

I got to lead an interactive puzzle which was pretty fun. The looks on people's faces when they finally figured the puzzle out was fantastic. Even better were some of the guesses that I got to see after the event ended.

The coin was found by Perspicacity (the team formerly known as PhDestroy (aka my team from last year)) at 19:55. Three more teams completed the endgame before we shut HQ down at 21:45, which was great. Probably three more teams would have started the endgame if they'd had another hour. And we had seen continued submissions from basically all the teams throughout, which suggested that they all remained engaged over the course of the day.

Evaluating a hunt's success or failure is a nuanced task - it really comes down to whether people are having fun or not. Solvers seek a challenge, but not an impossible one. From what the people who hung around all the way until our 22:00 wrapup told us, everyone had a blast.

At some point, I intend to generate some pretty graphs of who solved what puzzles when, and some other pictures that illuminate the overall shape of the hunt. We're also going to send out a survey to get more detailed feedback on the hunt - which puzzles people liked, which ones they didn't, how hard/easy they found puzzles, and any other comments or suggestions they may have. I'll call it a win if no one complains about the website being broken in various ways. It's also still a win if that's the big thing they have to complain about - it means that we did a great job with the rest of the hunt.

We're planning to rerun the hunt for a wider audience some time in late June or July (which is why I've again been pretty vague with puzzle specifics). We're also thinking about ideas for how we can make the rerun work well for both local and remote hunters, as well as hunters of different experience levels.

I have lots of thoughts on how I could design better software for producing the hunt and running the hunt. Which, as I discovered over the course of the past couple months, have very different requirements!

I guess I can mark another item off my bucket list now. :)

2012-05-02 | 1 comment

We sent out the post-puzzlehunt survey. A couple interesting notes from the responses so far (N=25):

  • Most comments were very positive overall. There's probably some amount of selection bias, but this is a good sign.
  • Participants would us to spend our budget on food, shirts, and prizes in that order. Some suggested that a monetary prize would make the hunt too competitive, and that we should stick to nonmonetary prizes. Perspicacity (the team that won) thought the medals that we lasercut were really nice. Looks like we nailed this one.
  • Most of the people who sent us feedback said that they plan to participate again next year. Of those that indicated otherwise, all but one said that they wouldn't participate because they wouldn't be at Berkeley. This is also excellent.
  • About 40% of the respondents had played in last year's hunt; the other 60% had not (which bodes well for hunt growth over time)
  • People thought everything ran very smoothly. Which, for the most part, it did. At least after 2pm. The morning was a bit rough, but I don't think anyone outside HQ would have noticed.
  • Participants rated the overall difficulty of the hunt as follows:
    • 1 respondent felt it was slightly too easy
    • 16 felt it was just right
    • 7 felt it was slightly too hard
    • 1 felt it was much too hard
  • There was much discussion on hints:
    • Several teams commented on how hints seemed much easier (or too easy) to get. This was actually pretty close to what we had in mind from the get-go: teams that needed hints would have plenty and wouldn't get permanently stuck and would still have fun, whereas teams that didn't need them could think a bit more, and feel of themselves for solving the puzzles without aid. Furthermore, it provides a nice dial for HQ to spin if people aren't solving puzzles fast enough to finish the hunt in time, or a way to give an extra nudge to stuck teams without having to spend too much time on the phone (which was a problem with the hints system last year). After our planned timeline slipped by over an hour, we felt justified in nudging everyone along a little - apologies if the hints weren't really needed.
    • One suggestion offered was to have a "hints" division and a "no hints" division. This is a very interesting proposal * as a larger puzzlehunt culture forms at Berkeley, the hunt will have to cater to an even wider range of puzzlesolving skill levels, and I could definitely see this being a helpful way to keep the hunt fun for all parties. Furthermore, it could give stronger teams a stronger social incentive to try to solve puzzles without hints.
    • Another suggestion was to make it possible to buy just the last hint in a set - most teams were successful in figuring out the first steps to a puzzle, and they'd get stuck on the final extraction, but would have to buy all three hints to get there.
  • Lunch was appreciated, but noted as "a bit chaotic." It looks like in hindsight we hadn't ordered quite enough pizza for the second batch or late arrivers. Some grad students wished we'd had something less greasy. The undergrads uniformly appreciated the free food.
  • People were a little frustrated with a couple aspects of certain parts of the hunt (I'm being vague again because of the rerun). Feedback noted; we'll try to avoid doing the same thing next year and at the rerun.
  • The website got multiple comments of approval. AHHH THEY LIKED IT THEY LIKED IT!!
    • "Extremely well done. I was really impressed by the web organization."
    • "Things went pretty well all around. The website worked well, the presentation was fun, and I love my medallion. :)"
    • "The interface was easy to navigate and the length of the hunt was enjoyable"
    • "Interface was great. No complaints at all. Well-organized."

All in all, I think the writers, assistants, and solvers all had a fantastic experience. And that's something to be proud of.

2012-05-04 | 0 comments

I met with Dave Wagner early today so we could go to Adrienne Porter Felt's dissertation talk. It was a great talk - she crystallized a number of the things I've been thinking about for the past few months into an easy-to-grok talk that hit on a ton of important points in a methodical manner. It turns out we'd both determined that run-time permission grants are better than install-time permission grants. She's worked out several more details, and produced some guidelines for platform designers to make their permission systems more usable and effective. The most important take-away was the following:

When building a platform, if you want to give third-party developers access to some privilege, use these interactions in the following priority order:

  1. No interaction. If an action can be safely and easily undone, just do it, and let the user undo it if they don't like what happened. It's nice to give the user some way to find out why something happened though, so if you can, leave some sort of audit trail. (Example: setting a background on your phone - set it, and show what application last set it and when with an undo button when you view the background settings.)
  2. Trusted UI. Users know what they're trying to do already. Give developers widgets that they can put in their app that will allow the user to trigger the desired action. Key bit: make it so that these widgets are the only way by which these permissions are available to apps. (Example: a button that sends an SMS when the user presses it. There can be implementation difficulties here, and this can also restrict what can be done with the platform. I'd like to think about the implications of trusted UI a little more before deciding it's a great solution.)
  3. Runtime permission grants. Users are much better at understanding their decisions in context - you might not know at install time why your bank app needs access to your location, but if it asks right after you hit the "Locate ATMs near me" button, well, that makes sense then. (Example: accessing contacts or your current location. It's possible some of these instances could be factored into trusted UI.) This should be used if the user can be expected to be available to approve the request, but the system is responsible for initiating the flow that requires the permission.
  4. Install-time permission grants. These should be reserved for things where the user can't be expected to be available to approve an action. (Example: app that wipes the phone remotely if it's stolen. It would think that the thief would select the option to allow the app to perform this action.)

Real-world notes: Android's permission system is basically entirely install-time permission grants, which is one of the reasons that permissions on Android are a ****show from a usability perspective. iOS uses runtime permission grants for location tracking and notifications, and has no interaction for most other permissions, but doesn't really allow for as powerful a separation of privilege, since there are basically no other permissions.

After the dissertation talk, I went upstairs to see the CS160 (undergrad HCI class) poster presentations, where students were showing off a bunch of projects relating to applications of the Kinect depth camera. There were a couple neat ones - the use of the Kinect to teach ballroom dance steps and posture was probably my favorite.

I ran into Kate Harrison at the poster presentations, and we wound up sitting in the CS lounge talking for several hours about all manner of things - the design of puzzlehunts, family relations, school, the computer games we played growing up, gender in the sciences, styling and upkeep of long hair, wireless spectrum, rationality, playing devil's advocate. We played Dominion against an app with a rather weak AI, and then switched to an anagramming game. Shang joined us and we all continued anagramming, then headed down the hill so Shang and Kate could catch the bus and I could head home. I am now apparently responsible for hosting a retro computer games night at some unspecified future time, which will feature such classics as The Lost Mind of Dr. Brain and Logical Journey of the Zoombinis.

It was nice to have a comparatively deep, one-on-one conversation. I haven't had many of those since coming to California. Large gatherings can be fun, but they tend to lose the introspective, thoughtful nature that becomes possible when there are only two voices needing to be heard. With a party of two, you have more time and less pressure to quickly synthesize your thoughts into words before the topic organically shifts elsewhere. There's less contention for the channel of communication.

2012-05-06 | 1 comment

Argh. This is two days in a row that I've noticed I pulled out a grey hair at the end of my shower.

2012-05-07 | 0 comments

I coded the entirety of my study dataset today. It took way longer than I had expected and proved exhausting. I am more effective at thinking for a long time and typing a few short (right) things than sitting down for 8 hours and transcribing text. If I knew more computer vision, I'd have done OCR and image matching and only manually dealt with things that the system couldn't handle.

2012-05-10 | 0 comments

I don't think I'm going to accomplish my goal of completing the Doe Traverse in a single run before I graduate. Pity. Clearly, this means I'll have to come back in the future to do it properly.

2012-05-20 | 0 comments

Some pictures from Google Games (previously discussed here), courtesy of Hanah Kim:

Our team at the table
My team! Our team all wore hats. Annelise has the red beret, I have my wizard hat, Nima is in his Russian cap with earflaps, Josiah has his standard baseball cap, and Ankur is in the background, but his fez can be seen on the table. You might have noticed we're all wearing our Berkeley Mystery Hunt 2012 t-shirts - the day before we ran that hunt. Organizing has it's privileges! :D

One of the events involved building as tall and wide a bridge as we could out of whatever LEGOs were in the bag that was dropped on our table. Scoring was (2* minimum distance between ends of the bridge) + (maximum height of the structure). As a result, the optimal strategy was to have a low, narrow bridge with a very tall spire at one end. I came up with a clever way to mount the spire that allowed us to use the length of the pieces to generate height rather than their height, which was fairly unusual among the structures we saw and allowed construction of a much lighter tower. By the time we finished, the spire was so tall and thin it swayed from the air currents in the room. It was slightly unnerving, but survived the measuring process. We had the 3rd highest-scoring bridge, which was better than I had expected.

Deep in thought
This must have been during either the trivia round of the competition or the puzzles round. I'm guessing that you'd see a laptop out if it were the puzzles round, so I bet we're dividing-and-conquering trivia questions here.