Going from web pages to web apps with Python (aka, Django for Designers)

Last week at PyCon 2013, with the assistance of Asheesh Laroia and several other helpful TAs, I delivered an introductory Django tutorial wherein one builds a simple bookmarking application. Instead of the official Django tutorial, I used a different curriculum based on the tutorial I wrote for my IOLab students in fall 2011 (itself based on the PyStar Django tutorial).

mtv-diagram

The idea was to write a web development tutorial targeted at a group of students who were familiar with HTML, CSS, and perhaps Javascript and had had some introduction to Python, but had little to no experience with databases or server-side code. Thus, the tutorial skips over some of the traditional tutorial’s topics (e.g. the built-in admin) and emphasizes other areas: static files, CRUD, Django forms, using asynchronous Javascript with Django, and the Django templating language. It also incorporates non-core-Django topics such as git-based version control, database migrations using South, and sharing your work with others both locally and using Heroku.

The version control aspect was especially key, as it allowed me to set up “checkpoints” where everyone would be working from the same copy of the code, even if they hadn’t managed to get part of the code working in their personal branch. Given that PyCon tutorials have a single lecturer/large room structure, rather than small pods or groups, that sort of thing is kind of necessary–you have to keep a pace, even when a few students might not have gotten a step in your tutorial working yet.

I also had a goal of making it so that literally everything you had to type into the command line or your text editor to get the tutorial app to work was available for copy and paste on the tutorial wiki. (It’s not quite true–I think there are some steps in the laptop setup guide that don’t qualify for this, and most of the commits aren’t spelled out–but it’s pretty close. The cheatsheet also helped to fill in any gaps.) This was important not just for speed — to get through all the material, typing all the HTML, etc. out by hand would have been prohibitive — but also so that if a student had trouble in one of the sections, or if the class didn’t make it through all the material (we didn’t, and that was expected, and there are a bunch of “reader exercises” at the end of the tutorial that weren’t meant to be taught in class at all), she would still have everything she needed to revisit it later.

With every runthrough of the tutorial I find more things to fix and tweak, and there’s definitely cleanup and improvements I want to make post-PyCon. Still, I’m pretty proud of the tutorial Asheesh and I (and playtesters Shauna and paultag!) put together, available on the web for free via the OpenHatch wiki and licensed under a permission CC license. I hope other people make use of the tutorial curriculum and (shudder) video too, either to teach or to learn!

Latest reading

Over the last couple weeks, I’ve been reading a startup essay series on the train to and from work. It’s Blake Masters’ notes from a startup class Peter Thiel taught at Stanford last year converted to essay form.

It’s been interesting–not quite the mythmaking or buzzword dump that most talk about startups devolves into. It’s not even all about startups or even technology–there are forays into the nature of capitalism, the contemporary social and political zeitgeist, themes about heroism and independent thinking I’d previously only seen in Harry Potter and the Methods of Rationality, and the basic narratives of Western civilization. I didn’t agree with all of it, but it was worthwhile reading.

The first essay starts off like basically every frickin’ class at the School of Information seems obligated to do, with lip service to the history of technology and globalisation and whatnot. If you didn’t go to the ISchool, though, you might not find it tiresome. And even I didn’t, once I forced myself to not skim it–there’s a few new ideas in there.

My favorite essays:

  • Class 9: Distribution (Why selling things is hard and matters and goddammit you need it)
  • Class 11: Secrets (Relies on some concepts introduced in class 5)
  • Class 13: You Are Not A Lottery Ticket (Something completely different than what I expected from the title, but still good: the role of luck in startups and other crazy endeavours and how different time periods and societies think about the future)
  • Class 18: Founder as Victim, Founder as God (The role of startup founders–and iconoclastic hero-villains of all sorts–in society. Aka “What do Oedipus, Zulu kings, Britney Spears, and Sergey Brin have in common?”)

10 bits of advice for running a Mystery Hunt art team

[Note: This post will be completely boring and irrelevant if you don't care about running Mystery Hunts, but Atlas Shrugged asked and Asheesh insisted I post it somewhere publicly. :P]

1.) On our team, hardly any of the art volunteers had web design experience. Many didn’t do digital art; quite a few didn’t even have steady access to a scanner. It’s a bit of a mismatch between skills and tasks given that the biggest, most visible responsibility for the art team is the hunt website. Thus, one of the biggest responsibilities for the art team lead is to divvy up and delegate any artistic elements of the site design that can be done independent of the HTML/CSS/etc, so that your web designers and web devs’ bandwidth can be saved for the stuff only they know how to do. For instance, I started working on the Ocean’s round design months ago with placeholders for Diana’s casino paintings. When the paintings were finished, everything else on the round was basically ready I could just plop them in. Same with the Indiana Jones map.

It’s easy for the art and tech teams to be composed of very different sets of people who don’t talk enough to each other. We were lucky this year that I knew most of the tech team and am a programmer myself for my day job, and thus could bridge that gap. I hope you have at least one person on your team who can take on that role as well! It might even be worth reorganizing so that there is an explicit ‘Web Team’ consisting of both designers and developers (and, later, post-production volunteers helping prepare puzzles for publication).

2.) Also along these lines, making it easy for non-programmers to get your hunt website up and running locally is key if you want people to contribute to your hunt site design–otherwise, they can’t see what they’re doing! For the Agent 99 round, DD designed it in some static HTML files, and I converted it to use Jinja2 blocks and play nice with the rest of the site myself. This worked okay, but meant that I was a bottleneck for any and all design changes; no one else on the art team had a working copy of the hunt web software and thus could work on this stuff. Which is not a great state of affairs.

What may be wise (and kind of what we ended up doing) is to spin off the front-end as a separate app with URLs and views, placeholder templates, and a json or Markdown file full of fake hunt data (a team, puzzles, rounds, whether things are solved or not). Asheesh also packaged all the dependencies he could into this app’s git repository, to minimize the amount of installation hassle people would have to go through. (Though there was still some hassle; yay gevent!) Having a quality README for getting things up and running, and someone to patiently mentor your designers in using source control, are key too.

The goal is to have a piece of software with easy cross-platform install instructions where designers can muck around in the templates and static files folders, modify the fake hunt state to simulate different parts of the hunt, and see the results immediately, without requiring them to know Python or Django or Flask or whatever and making any necessary use of the command line as painless as humanly possible. (For more on this, ask Asheesh. He is the helping-newcomers-be-useful-in-software-projects expert.)

3.) Less (a dialect of CSS) is awesome. You don’t have to install anything to use it, you can just include a JS file to interpret it, it makes your stylesheets so much cleaner, and since it’s a superset of CSS if there’s anybody on the project who insists on using vanilla CSS their code will still work fine.

4.) Google Web Fonts is also pretty sweet. However, regardless of the fonts you use elsewhere on the site, the div where you put puzzle bodies should use one of the standard boring web fonts (Verdana, Helvetica, Times New Roman, etc.) because some puzzles use crazy arcane special characters. Most of the fonts on GWF don’t have those, so they’ll either show blanks or just look weird.

5.) Browser compatibility was not a priority for us. Our rule was that we’d get things working in Chrome, Safari, and Firefox, and if it worked in IE too, so much the better. We also assumed browser widths of at least 950px, which I’d argue is pretty standard these days. Got a fair number of complaints about that, though–both puzzle authors complaining that the design was too narrow for their puzzle, and other team members complaining that the design was too wide for netbooks. Responsive design, and/or having a separate stylesheet for tiny screens, would have been ideal, but we didn’t manage it in all the rounds and there were lots of more important things to spend our time on. YMMV.

I don’t think any hunt to date has built a mobile version of their site. Probably because it’d be a giant pain and you’ve got a million other things to do. Not unthinkable, though, if your site design is already on the minimalist side. And imagine what you could do with it for the runaround!

6.) Something I completely forgot about until a few days before hunt was printability. Pretty sure some of our rounds fared lousy by that metric. For next year, it might be worthwhile to have a “printable version” link on each puzzle page that links to a unstyled HTML page version of whatever is in your {% puzzle_body %} block (or equivalent template architecture). Then you don’t have to sacrifice the round design for this consideration.

7.) Originally, many of the round designs included slots for correct answers on round or puzzle pages. I was convinced by my teammates that this was a bad idea because if the unlock code glitched or HQ accidentally marked a wrong answer as correct, whole puzzles or even rounds could be instantly spoiled for teams. Bad news. What we decided was a best practice (and eventually implemented, though it wasn’t finished until after Hunt started) was to have a call-in page for each puzzle which shows the list of answers that that team has called in. Since this page never asks the database what the real answer is–it only looks at call-ins–even if HQ were to screw up, it can never show spoilers, while still making it possible for teams to look up solved puzzles’ answers.

8.) The company that 3D printed this year’s coin (and last year’s coin) is http://milcoins.com/. If you want a metallic coin-shaped coin for next year, I recommend them.

9.) Video is hard to pull off. Really, really hard. Unless it’s something you can shoot with a cell phone, nobody owns a video camera. And even if someone does own a video camera, they probably don’t own Final Cut (or equivalent software). And even if you have people who fill these requirements, getting them in the same place as your puzzle writers and actors for a whole day (even for a short video) is hard. And then when your editor or testsolvers demand changes to your video puzzle, instead of just editing a text file like a normal puzzle author, you have to haul all those writers and actors and camerapeople into the same room *again*, and make sure not to have any red herrings due to continuity errors. Rinse and repeat for the next testsolve. Video puzzles are the opposite of agile. And fact-checking or test-solving a script is simply not good enough.

Video is ridiculously resource-intensive. Only do it if you’ve got a really, really good reason and all the people involved are living in the same place. (Opening ceremony is probably a good reason, though–especially since that doesn’t typically need testsolving.)

10.) Watch out for spoilers in your CSS files (and other static files). We missed this this year. Based on some of the id names in the CSS file that appeared on the enigmavalley.com login page (which was findable based on the Hunt invitation), at least one team was able to guess coinheist.com and found its login page–the only thing between them and a view of the Hunt website in a fully-solved state–a few days before Hunt started. Whoops. (They never managed to log in there, thank goodness, but it sent the tech team into a panic as we quickly changed our passwords to be much more secure and swept our CSS files for spoilers.)

Similarly, ideally, you should only be able to access a round’s static files when that round itself has been unlocked–otherwise, the URL should 404. This was something that this year’s hunt site architecture handled quite well. I wouldn’t worry about this until close to Hunt, though–juggling lots of different stylesheets and JS files across multiple folders is a pain when you’re just trying to get started on a design.

Oh, hm. One more bit of advice occurs to me, though who knows if this falls under the purview of the art team or the tech team:

11.) Set a deadline, after which the canonical version for all the puzzles gets moved from Puzzletron to your hunt website git repo and if authors want changes after that date, they have to make them (or request that they be made) in the site code. (Textual edits can be made via Github’s visual editor, so even non-techies can fix typical errata after this date if you show them how.) We failed to do this, which resulted in sleep madness Thursday night due to not knowing which puzzle files we could declare done and move over and which ones people were still tweaking.

Three puzzles

I spun this out into a separate post because the previous post was already just too absurdly long. Anyway, I wanted to post copies of the three puzzles I worked the most on for Hunt, both to save them for posterity and to give readers some idea of what Mystery Hunt puzzles are like.

The first puzzle is named “Evolution”, and contains a bunch of screenshots of email clients.

The second puzzle is named “Will Ruin Your Life [I'm Feeling Lucky]” and has a bunch of images from various pop culture media items.

The third puzzle, “Noise Pop”, is a bonus music-based puzzle me and Asheesh put together. It did not actually appear in this year’s hunt (it was a backup in case we needed to swap out a puzzle at the last minute). So if any readers of this blog were at the Hunt, and aren’t sick of solving, well, here’s a new (short, I promise!) puzzle! :)

I’ve also posted the puzzles’ solutions, though (obviously) don’t spoil yourself if you don’t want to be spoiled!

1. Evolution

top

1

2

3

4

5

6

7

8

9

10

11

12

13

14



2. Will Ruin Your Life [I'm Feeling Lucky]

A maze of twisty open tabs, all alike. Or so it seems.

Only a singular path will take you from the beginning to the end.

image


Solution


…and here’s the new puzzle!

3. Noise Pop

MP3

_____◯___________
_____◯
◯____◯___
◯◯______
___◯
◯___◯_
__◯____◯______
____◯
__◯_____


Solution

Mystery Hunt Post-Mortem: The Hunt We Wanted and the Hunt We Had

tl;dr: I spent the last week helping organize the 2013 MIT Mystery Hunt; this year’s Hunt broke the record for the longest hunt ever, lasting 73 hours instead of the expected 48; congrats to the team whose name is the entire text of Atlas Shrugged (who we referred to as John Galt) for winning, condolences to them as well for having to do this next year; learning to appreciate bits of joy and hilarity in a sea of crushing fail. Also, check out this post for some sample Hunt puzzles and an as-yet-unseen puzzle written but not used for Hunt.

(warning: effin’ gigantic post)

(other warning: all of the below is my half-baked opinion based on incomplete information)

The Hunt We Wanted

If you aren’t familiar with the MIT Mystery Hunt, it’s a weekend-long puzzle-solving competition that’s been held at MIT for over thirty years. Each year the Hunt has a different theme or plot of some kind; last year’s Hunt was Broadway musical themed (particularly The Producers), and the year before that was video game themed, where you were Mario trying to rescue Princess Peach. Every year, to win the Hunt you must find the coin: a usually (but not always) coin-shaped object hidden on MIT’s campus that requires solving tons of puzzles and engaging in a scavenger hunt-esque “runaround” in order to find.

I’d heard of the Mystery Hunt years ago, as I had several East Coast friends and acquaintances who participated. Last year was my first time attending the Hunt, though, with a team called the Manic Sages. Since we won last year, we had the dubious privilege of organizing and writing this year’s Hunt. I volunteered in a few different capacities–writing and testsolving a few puzzles, hammering out the hunt theme, serving as the Art Director, and working closely with the tech team on this year’s Hunt website.

coinheist

This year’s Hunt was heist themed. The premise:

The Mystery Hunt has run into some financial trouble. The Manic Sages took a loan from Enigma Valley Investment and Loan, and through some dodgy paperwork, the bank ended up owning the Mystery Hunt outright. Enigma Valley decided that the coin was a valuable financial instrument, so through various Coin Default Swaps they leveraged a trillion dollars on the bet that nobody would find the coin. To be sure of it, they locked the coin in a high-security vault in an undisclosed location, with security systems designed by some of the world’s finest minds.

MIT legend Alyssa P. Hacker is not happy about this state of affairs. She wants to save the Mystery Hunt, by legal means or no. Thus, she hacks into Enigma Valley’s servers to try and find information on the bank’s security systems. She also enlists IHTFP, a heist consultancy firm, to help us organize and pull off a heist to steal the coin, bring down Enigma Valley, and save the Hunt.

The Hunt was structured with the opening round on enigmavalley.com, which identified the security systems used by the bank and the experts who designed them: Danny Ocean, Richard Feynman, Maxwell Smart (later replaced by Agent 99), Indiana Jones, Marty Bishop, and Erno Rubik.

team

Then there were six normal rounds on coinheist.com, in which teams recruit the six experts to their heist team by finding reasons for them to turn against Enigma Valley.

DSC_3401

When a team solved the round and recruited a new member, they would get to work through a practice obstacle, constructed by IHTFP, associated with that person. The six security system obstacles in the bank were guards, a safe, a laser maze, a puzzle box, an impenetrable door (so teams had to use ventilation shafts to get around it), and a keypad.

After solving the final round, Alyssa P. Hacker would congratulate teams, but before allowing the heist to go forward, insist they come up with a reason why they are motivated to steal the coin from the bank, so she can trust them. At the same time, teams would get an phone call with an automated recording from Enigma Valley, telling them about “some puzzling activity” on their account. The phone call would give teams the link to a final puzzle, styled like a list of security questions–sixty security questions! Ultimately, the form would never allow you to unlock your account, but you could extract the answer: ENIGMA VALLEY GIVES YOU THE RUNAROUND.

The runaround then consists of solving each of the six real obstacles, each of which is slightly harder than they were in the practice versions, due to the bank beefing up security. A corporate newsletter smuggled out by a sympathetic member of the bank gives teams information to figure out what has changed about each obstacle and how to get around the changes. Finally, teams get into the vault–and are faced with an unexpected seventh obstacle, where the coin is hidden in a bunch of “counterfeit” coins, and teams have to use a scale to determine which is the real coin before the guards come back to the safe.

The Hunt We Had

14

Exhaustion–physical, mental, emotional.

Not just that this year set a record for the longest hunt (73 hours long), even with us handing out free answers like candy and cutting a metapuzzle towards the end. Heck, technically we even cut the runaround, since we declared a winner before the winning team completed it (less than an hour before the wrap-up ceremony). But for me (and most Sages), Hunt started long before Friday. Hunt had been distracting me from work for months. The week before the Hunt, all I did was sleep, eat, and work on the Mystery Hunt. I barely saw the sun.

Honestly, the predominant emotion I feel right now about this year’s hunt is despair. The Hunt starting an hour behind schedule, cutting so much of the hunt material in desperate bids to end the Hunt on time, having the Hunt go until Monday afternoon–I felt like we had failed. We abused teams’ time and sanity, letting the Hunt go into Monday. There was so much cool stuff that people worked their asses off for that no one–or only John Galt (the winning team) and Palindrome (the only other team to get to the runaround)–ever got to see: the security questions puzzle, the runaround traps, the coin design, even the finished hunt home page, all effectively for naught! On Monday I laid on the floor crying in the tech room for a while, not really able to productively handle it. I skipped all of the post-hunt events except wrap-up, mainly because I couldn’t deal with being around hunt people anymore. It was all just a reminder of how badly we–I–had fucked up.

Objectively speaking, I was the art director, and art and front-end development actually went basically fine, despite miscommunications and last minute feature requests. My puzzles worked well and I got some positive feedback on them. I was a new Sage, and didn’t have authority either in terms of seniority or in terms of being a puzzle expert, so it’s not like I had grounds to have opinions about the length and structure of the Hunt. But I didn’t–don’t–feel responsible for just my little circles of contribution. I was emotionally invested in the entire Hunt, and have had difficulty recalibrating that.

When my warnings from months ago to our tech lead that writing our own brand new hunt website software was a mistake he was too intelligent to make came to fruition, I wasn’t at all happy to be right. I stayed up until 4 AM Thursday night hoping that I could somehow help fix the backend tech, and feeling completely fucking helpless that I couldn’t usefully contribute. The two main website tech volunteers hacked something like 40 hours straight, and even with that herculean effort we still had to delay the start of Hunt an hour.

sages-fail

After the rush up to hunt, and the tech embarrassment, I had been hopeful that the rest of Hunt would be relatively relaxing. Maybe I’d be called upon to fix minor front-end tweaks, but fundamentally once the Hunt site design is done, it’s done, and it’s unlikely to explode in sudden unexpected ways. But then we noticed that the teams were progressing much more slowly than we (and our automated projections) ever expected. Round after round unlocked based on the time-based side of our puzzle release mechanism, but nobody was completing the rounds. We’d intended the opening round to be so easy that every active team would solve it, yet even by Saturday many teams hadn’t gotten it.

By the time we realized just how badly things were going, there was little we could do about it. From Saturday afternoon through Sunday, HQ was full of the thousand-yard stares of sleep-deprived, overworked people, all wondering what on earth we could possibly do to save the Hunt.

We couldn’t cut a full round for many reasons–one, the plot already had indicated you needed to recruit six people, and two, the last round’s leader (and the people whose puzzles were in that round) would kill us if we didn’t include it. We would’ve needed to cut it before the Hunt even started, if such a decision were politically feasible even then. If we’d had better projections of how long our hunt would take to solve, and had known late Friday/early Saturday that the damn thing would go into Tuesday without intervention, there was only one thing we could have done at that point: hand out a utterly absurd number of options (free answers). Explicitly restructure the Hunt so teams could choose their favorite 90 or so puzzles out of the hunt, solve them, and use options for the rest. As it happens, that’s what we ended up doing, but we didn’t realize we were doing it at the time, and we hesitated too long for it to make a radical difference.

(The other change we could have made at that point would be to make it obvious in the as-yet-unlocked rounds which answers contributed to which metapuzzles, which would help teams be more strategic. But that would have made much less significant a difference than the above.)

It seems fairly clear why we failed.

  • First, last year’s hunt was around 100 puzzles long, and it ended early. We heard lots of whining about the early end. So we thought that this hunt needed more puzzles in order to last until Sunday noon. In the early Hunt structure conversations, some individuals vociferously argued that the Hunt needed to be around 180-200 puzzles long, or else it wouldn’t be long enough. Arguably, this shifted the Sages HQ Overton Window in terms of what we thought the Hunt required–people retorted that 135 was enough, not that we needed to *lower* the number back to 100.
  • Second, the team was too self-deprecating. We thought that the average Manic Sage was a below-average Mystery Hunt participant, and that the only reason we won last year was because of sheer manpower. So if a typical testsolving group only barely managed to make it through a puzzle, after a few attempts, it went in, with the thought that it would be easier for a “real” team. If a group of ordinary humans couldn’t solve the puzzle, but one of our best solvers could, it went in, hamstrung also by the belief that since most of our best solvers were spoiled on many puzzles due to being writers and editors, the sampling wasn’t realistic. If a meta was solvable by our best puzzler with only half the answers, or no answers at all, we dialed up the difficulty. For the most part, we didn’t ship broken puzzles–certainly not more than other Hunts. Every puzzle we used was solved in testsolving. We just thought they were easy puzzles when they really, really weren’t. We now know that the average Manic Sage is a slightly-above-average puzzler, and our best puzzle-solvers are as good as anyone else’s. Had we believed this before, it would have improved our estimates quite a bit.
  • Third, as stated earlier, the tech team succumbed to Not-Invented-Here syndrome. The new system was designed to handle lots of connections without a lot of load, and it did succeed at that. Where last year’s load average was around 900 at the start of Hunt, ours was 0.1. We could have run the Hunt on a Raspberry Pi if we’d wanted. That part went great. But the brilliant new architecture was arcane, so when bugs appeared hardly anyone could do anything about it.

    This was a far less impactful failure, in the end, though; it “only” cost us an hour in starting Hunt, various broken links that got fixed over time, some other useful but not crucial site features for showing teams their previous answer submissions and other status information, and the tech team’s health and sanity. On Friday I remember team members worrying that we looked unprofessional, that this hunt would be remembered as sloppy. If we’d only known how right we were…

finish

It is difficult for me to focus on the positive. It feels like everybody hated this Hunt, and I seem to be thoroughly enveloped in post-Hunt depression. But there were some successes and beautiful, hilarious moments.

protest

Codex’s mock, Occupy-style protest at the opening ceremony filled me with glee. The only thing Codex knew (like every other team) was that there was a bank involved with this year’s hunt theme. Yet their protest turned out to be super thematic! It was actually a little *too* realistic–I had to run interference between the security guard at the opening ceremony and Codex to assure the former that it was just a prank, not a real protest, and plead with the latter to avoid alarming any cops when they left! Even with that, afterward Lobby 7 had a heavy police presence.

1.5

4

Scribbling on the opening ceremony bank slides as Alyssa P. Hacker: lots of fun. :D

IMG_3820

Half the hunt website frontend–including the entirety of the Rubik round–got designed and built during the week before hunt. And it looked fucking awesome, if I say so myself–Diana’s crazy-detailed casino art, Alice’s world map calligraphy, Rob’s revisions to the Sneakers round design, DD’s shoephones and the rest of the Get Smart design, and Sean’s manipulable, browser-compatible 3D Rubik’s cube… Plus the recruit cartoons on the hunt home page and the evil bank’s logo and brand identity. Even if we had to take away a few features due to the techpocalypse, I am seriously proud of this hunt’s art and front-end design and glad I had the chance to take the lead on it.

DSC_3852

The bank security system obstacles were a ton of work to construct, but totally fucking cool. I only wish everyone had gotten to see both versions! I was especially giddy about the “twist” in the Feynman bank obstacle, which was a sentence Blake came up with months and months ago: “DIP IT IN ICE WATER”. So we constructed a safe puzzle where the demo safe’s combo was HOT LAVA, and the real, runaround safe’s combination was OBSIDIAN.

IMG_3867

Also, we had not one, but TWO real, working laser mazes. The second maze’s solution? CLAP OFF. Yeah.

No apologies necessary for the obstacles portion of the Hunt; they were pure fucking awesome. Darby, Sparky, and all the Sages who helped tape cardboard: you guys rule.

coin

The coin. Good God the coin was sexy this year, even if we forgot to show it to teams at the closing ceremony. DD drew the beaver and suitcase; the rest of the design was mine. Our production lead Sparky, and the company that 3D printed the coins, did a fantastic job–the company even added fur texture to the beaver!

heisttestkitchen

heisttestkitchen2

One bright spot midway through the hunt was Heist Test Kitchen, a puzzle wherein teams had to cook a dish containing certain ingredients (the ingredients varying depending on their team composition) and bring it to HQ. Most teams’ dishes were quite delicious–even the one that used rice cakes and Doritos as ingredients, shockingly–and between the various items it meant that we didn’t have to cook much of a separate team dinner for Saturday night! A+ puzzle, would include again. :)

casino

Events: The decorations for Casino Lobdell looked amazing, and the pictures for the Thomas Crowne event also came out fantastic. And, as in that one psychology test, at Thomas Crowne we had a guy in a gorilla suit that only half the participants there even noticed (their focus was on watching the bag handoffs)! Even the non-hunting journalist videotaping the event thought we were joking or lying about the gorilla–”Really! Play back your video!”

We got quite a few amusing submissions to the hunt’s answer queue:

  • Here is a list of people you don’t want on a heist (aka wrong answers we got for the opening round):
    • MARTY MCFLY / SEAMUS MCFLY / CALVIN KLEIN (lot of guesses along these lines for Marty *Bishop*’s puzzle)
    • FANTASTIC MR. FOX
    • RUBE GOLDBERG
    • FELIX BAUMGARTNER
    • ZEFRAM COCHRANE
    • KING OF FRANCE
    • FRANKENSTEIN
    • GLORY HOLE (what?)
  • For Sages Style, Providence Transplantations submitted HOMEOMORPHICALLY IRREDUCIBLE TREES (the real answer was GRAPHS)
  • For Ex Post Facto, Luck submitted HALF SOLVED (which is an instruction you get partway through the puzzle). After we told them that was incorrect, they tried SOL. *facepalm*
  • Multiple teams submitted WONDERPIG for a puzzle whose correct answer is WONDERING. I get you don’t have all the letters, but why would you guess that *first*?
  • Strange New Universe tried BLESSED IS THE DETERMINANT for the Feynman metapuzzle. Would have been a great answer!
  • For my email puzzle, Random Thymes tried QUIT AND RENAME THE DIR. Nope.
  • For Tuva or Bust, Super Team Awesome tried BUST. They also tried RUSSIA, RUSSIAN FEDERATION, and about half the dictionary in a fit of frustration. The real (unfortunate) answer, that they had all along? RENAMES.
  • Luck submitted “best liquor for puzzle solving”. They immediately followed up with “Sorry, thought this was Google”. Neither of these was an answer to any puzzles in this year’s Hunt.
  • There was a puzzle called “Time Conundrum”, as part of which we had to call teams and tell them that their answer to the puzzle, RED HERRING, was incorrect two minutes *before* they unlocked the puzzle. (Most teams found this merely confusing; one actually tried to argue with the caller that they hadn’t called any such thing in!) After the puzzle was unlocked, a few teams called in RED HERRING. We responded, “Don’t call in repeat answers.” They were insistent, though: “We know it’s wrong; we just wanted to prevent paradoxes.”
  • John Galt tried EWE for the puzzle I Can’t Spell You.
  • John Galt also called in THEREARETWOPEOPLEIN26-100HAVINGSEXRIGHTNOW. This turned out to be correct, but not for the Highlight Reel puzzle. Folks, this is not what the answer queue is for…

There were also a variety of amusing HQ moments not related to answers…

  • One of the oldest teams in the Hunt, Setec Astronomy, used to win rather frequently. As a result of being forced to write so many hunts, the team now deliberately does their best to not win, usually by applying liberal amounts of alcohol if signs indicate that they are near the top of the pack. Early in the hunt–I think late Friday–Setec Astronomy solved the opening round meta. This put them in the lead for a while, both by total puzzles and total rounds solved. Upon yelling “SETEC is in the lead!” in HQ, we resolved to never ever inform them of this. :)
  • When Catherine overheard the tech team talking about how the automatic time unlock feature wasn’t working (but we could still manually trigger it), she exclaimed, “What do you mean we have to hit a button every two hours or the hunt explodes? That has to get fixed. This isn’t Lost!”
  • HQ ran out of plastic forks on Sunday, which worried the kitchen crew:

    Veronica: This is the last fork. Soon we’ll run out of food and we’ll have to start eating each other.
    Tom: Worse, we’ll have to eat each other with our hands!

  • At one point in the Hunt, Random Thymes had only gotten one of the three wheels to their Enigma machine for the Sneakers metapuzzle, but thought that they could crack it anyway. One of their members had access to a supercomputer in Ohio, so they plugged the puzzle into it. As they told us, “If the British can do it with a Turing machine, we can do it with 8000 cores.” Sadly (?) the team completed the other parts of the round and had all three wheels by the time they solved the puzzle, so we will never know if this meta could have been brute-forced!
  • The second place team, Palindrome, was unhappy that their number of options was uneven (they had 32 options, which at that point in the Hunt would never amount to anything, since free answers cost multiples of 100). So, they contacted HQ and offered to do something entertainingly humiliating for 68 options. This resulted. We gave ‘em the points. :)
  • Late at night on Sunday, a notice popped up in the contact HQ queue from the team Immoral, Illegal, and Fattening. Its text? “um, we set our metapuzzle on fire…”.

    While basically all of HQ was incapacitated with laughter for several minutes, the team also sent an unrelated request along with “(also we are sorry about the flaming metapuzzle still)”. We finally managed to call them back, and they answered the phone: “Hello, this is Immoral, Illegal, and Flammable!”

    As the team explained, they thought the piece of paper the Get Smart metapuzzle was on was treated with the kind of invisible ink that appears if you apply heat to the paper (rather than the kind that appears if you apply vinegar, which was in fact the case). To test this hypothesis, instead of using an iron set to low, like a sane person, or a candle flame, like a less sane but more understandable person, they decided to put the paper inside a toaster.

    This was pretty much the “As God is my witness, I thought turkeys could fly” moment of the Hunt.

    Fortunately, we had plenty of duplicates — we had made 100 copies of the metapuzzle, but ended up using only four of them, including the burnt one.

A number of hunt participants tweeted great things using the hashtag #mysteryhunt. I especially enjoyed the retweets from the (fictional) @manicsages account. Most of them are compiled in the Tech’s Storify. I’m glad I didn’t see these during Hunt, though, as a couple of them are rather disheartening, but I can appreciate them now. I liked Eric Berlin’s hunt wrap-up post, as well. There are other blog posts reviewing our hunt in much more disgruntled terms… but, right, this is the positive section.

Perhaps most of all…

I don’t know yet if I’ll be back for Hunt next year. I was never a very good puzzler, and maybe we’re now the Depressed Sages? Got a whole year to recover, I suppose.

I am eagerly looking forward to once again having a life outside of the Hunt, in any case.

PyCon 2013 talks I would like

To further the meme:

  • Python and JavaScript: Best Buddies Forever (best practices for building AJAXy web apps on a Python base, why end-to-end JS is–I hope!–not the answer)
  • Raspberry Pi — cool things people are doing with it, ideas for teaching with it, etc.
  • You’ve been tossed into the deep end: now what? (strategies for quickly getting up to speed on a new language, framework, whatever for a new job or what have you)
  • Stop using print statements–proper logging isn’t that painful, really
  • Automated teaching tools for Python and other languages (trypython/tryruby/codeacademy/codingbat/jsforcats/OpenHatch missions/test-driven tutorials/etc — technical and pedagogical strategies for writing interactive, plot-driven bots that teach people)
  • Let’s Build Your First IRC Bot Using Python!, or another hands-on tutorial for event-driven programming (what I wish last year’s Twisted tutorial had been)
  • Rolling your own Python web framework: why and why not

And two from pydanny:

  • Python 3 from scratch
  • Python in Space!

Into my personal sociotechnical gap

In October 2009, I was let go from a startup I was doing awesome work for because I wasn’t a coder. Even I thought they couldn’t justify keeping me on post-October–cash was running out. I saw myself as expendable. I believed–and it was certainly true in that case–that I needed to become a programmer in order to justify my existence.

(Blake, possibly benefiting from hindsight and/or an outside perspective, disagrees. Apparently the startup was really sad and lacking in energy without me. But anyway.)

I had a serious inferiority complex–that because I couldn’t code, no one would ever hire me. That I’d never be able to find full-time work that would pay the bills doing something I loved. That I’d forever be yet another liberal arts major crushed by student loan debt living with her parents (or a cardboard box under an overpass, which honestly having done the former I might prefer if it ever came down to that again). Unemployment doesn’t suit me; while I am good at finding interesting side projects and hobbies to fill my time, the panic attacks about money aren’t worth it.

My friends from Scripps (which still has no CS department) were almost all working menial jobs or in grad school or doing internships that paid peanuts. All but one of my friends from Harvey Mudd across the road–especially the computer science majors–had high-paying jobs in interesting-sounding places. It wasn’t hard to draw conclusions.

So I set myself a goal of becoming a full-time, paid web dev somewhere I liked.

A bit less than three years later, I’ve achieved that goal. (My official title is “Product Software Engineer.”)

I can’t help but feel, “What now?”

Has coding lost a bit of its luster, now that I get paid to do it every day? Maybe a little bit. Though, I now stand in a position of enormous privilege: the comfortably-student-loan-repaying salary, career security (as long as the bubble lasts, at least), tribal fit, and other perks I have now are all things I couldn’t find as a Media Studies major two years out of school, and probably would still have a hard time finding without my technical skills. I can’t forget that. Can’t let myself forget. But, if I’m honest with myself… It is true that I’ve always loved tech. I love what I can build with code. I like being “in the zone” programming. I could tweak CSS all day. But honestly, I’m not head-over-heels for code in and of itself the way I know some people are. Maybe that’s okay.

Before, it was unthinkable that I would try to change careers again. I thought of grad school as my last shot at being able to have a successful adult life–if this didn’t work out, if I still couldn’t get a job I liked afterward, I was just completely screwed professionally and personally. While I enjoy what I’m doing and definitely want to do this for the next several years, don’t get me wrong… it’s *thinkable* now that I might transition to something else later on in my life. Maybe design more of the time, maybe writing, maybe some sort of product management…

So I wonder, what’s my next goal?

Where do I want my career to go from here?

And what should I focus my limited time and energy outside of work on?

There are so many projects and priorities competing for attention. Dieting? Rock climbing? Weights training? OpenHatch? My webcomic? Cooking regularly? Biking more? Art classes? Maintaining a nice, clean apartment? Various coding side projects I’ve started or thought about starting? Networking / trying to make a name for myself? Reading more books? Blues dancing? Pickup soccer? Traveling? Dating? Doing fun things with friends? Thus far, I’ve done some of all of these, but none of them well. I need to focus, but choosing is hard.

Well, I’ll give it some time. It’s true I am only a month or so into my new job, new apartment, and new life. I probably *should* be experimenting. And given how unsettled things have been, maybe I can afford to cut myself some slack.

It’s just that slight tickling unease in the back of my head, wondering what I should be working on next. I’ve never been much for sitting around in the present.

Life update.

You know how it gets. You go so long without updating your blog, that you feel like your next post will have to cover acres and acres of territory just to get up to date, and that feels so insurmountable that you put it off, until the snowball of busyness and apathy and guilt just keeps rolling and getting bigger and bigger…

Heck, I get in that cycle with my *diary* sometimes, and then there isn’t even an audience.

So here’s a post. It won’t cover everything that happened in the last seven months. It *can’t*. But that’s okay. ‘

Cliff’s notes:

I participated in the 2012 MIT Mystery Hunt, finally. Manic Sages, the team I was on, won. I’m now helping write next year’s hunt in some small capacity.

I spoke at PyCon. Went reasonably well; still haven’t answered all my post-con email, though.

I somehow managed to not flunk any of my classes in the last semester of my program. Given how much I felt like I was half-assing things, this is kind of shocking. Towards the end I really didn’t like how taking multiple classes at once made me unable to focus. This is arguably one perk of non-student life: less multithreading.

Graduated with a MS in Information Management and Systems. Final project got an honorable mention for the Chen Awards. Apparently me and Rowyn’s final presentation managed to make legal research funny and entertaining. Thank you, high school forensics.

Got a job at Disqus. Started job at Disqus. Am still figuring out what the hell I’m doing, but I’ve gotten a couple patches pushed so far, so I don’t quite feel useless. Am the First Female Technical Hire (unless someone quit before me, I suppose). Most of the the time that fact isn’t all Consciously Capitalized in my Head. Yay.

Moved to Oakland, over by the cute neighborhood on Piedmont Ave. Injured myself the day before moving, so thank goodness I have sufficiently hunky friends. Spent an utterly ridiculous amount of money at IKEA. Finally have my own apartment, which I’m calling Downtime Abbey. My apartment is the best apartment, or at least it will be after I get a dang couch.

Took a day trip down to Half Moon Bay with Asheesh and Blake. Hiking in redwoods + delicious drunken picnic + beach with seals + driving Zipcar down CA-1.

Attended Open Source Bridge for the first time.

And now the clock is reset, and maybe I’ll post more.

2011 rundown / 2012 resolutions and plans

Since others I know have been writing similar posts: a look back, and a look forward.

What I did in 2011:

  • Helped my parents pack up for the move from Minnesota to Portland, OR.
  • Finally figured out how to write a Django app from scratch.
  • Attended PyCon for the first time; presented a poster and met all sorts of cool people.
  • Got down to 171 lbs. Immediately gained most of it back, thanks to surgery + laziness + depression. Managed to re-lose about 7 lbs before the end of the year.
  • Had surgery to remove a benign (but weird) ovarian cyst. That was a drag.
  • Did the badassest 213 (UI design) project ever with Marco, Galen and Alex.
  • Wrote a 203 paper that got linked by lots of people. Led to a column in Full Circle Magazine and a talk at Wikimedia.
  • Vacationed in Sea Ranch / saw the northern California coast.
  • Got my first smartphone. So that’s what this whole mobile nonsense is all about.
  • Had an internship at Code for America through Google Summer of Code. Became friends with all sorts of awesome staff, fellows, and interns there. Switched projects partway through. Met Karl Fogel and Carl Malamud.
  • “Learned” Ruby on Rails. Decided that it and my brain do not get along, and to stick to Python for now, no matter how much that means not being able to work on lots of cool apps :/
  • Did my first 24-hour hackathon.
  • Visited Boston and actually enjoyed it for the first time.
  • Started weight-lifting more seriously.
  • Felt my first earthquake. And my second and third.
  • Dyed my hair red with henna for Halloween. Didn’t realize how permanent it was.
  • OpenHatch made the legal move towards becoming a non-profit, and I got a seat on its board of directors.
  • Houseguest had their stuff stolen, possibly by housemates or their friends. Found a new place to live.
  • Turned 25. Had a lovely birthday party. Can now rent cars without paying extra.

Things I will do in 2012:

  • Move to my new house in Elmwood.
  • Blog more — let’s say at least one (short) post every week. I’d get in on the #acetarium Iron Blogger thing, but I’m on the wrong coast to buy the other participants drinks when I don’t make the deadline…
  • Give a talk at PyCon. Heckle people at TiP. Take at least one tutorial, preferably more. Participate in the sprints. Hopefully not make an ass of myself.
  • Try out Debian.
  • Actually learn bash and various other UNIX sysadminny stuff.
  • Work on and finish my final project, and present something impressive in the end.
  • Graduate from my master’s program.
  • Find a job that I love and that involves at least some coding.
  • Read more (non-class-related) books.
  • Re-do my personal website and portfolio.
  • Be more social / make more, closer friends.
  • Go sightseeing/traveling in California — Tahoe, Big Sur, wine country…
  • Get back into rock climbing, at least enough that I can do V2s again.
  • Keep weightlifting, and figure out all those scary barbell-using lifts. If I lose weight, great; if I just get more badass, awesome.
  • Be more deliberate/picky about the projects I tackle. Focus is valuable, and work, school, and volunteering already divide it a lot. I hate half-assing things, so I should be better prepared to say no.
  • At the same time, though, preserving time for my own vanity projects is also a goal.
  • Tackle more computationally-interesting programming problems, instead of just pure CRUD web apps.
  • Do more with JavaScript; learn more JS libraries and frameworks. I might not like JS, but it’s not going away and at least it does cool things.
  • Use SASS or Less for at least one project.
  • Learn about lambdas, map/reduce, and the other parts of Python I never use. Be less of a n00b.
  • Stay as sane and happy as can be managed.