Also available is the same map in PDF so that you can pinch to zoom. Over on the right (known to cartographers as "East") you can see Pac Tom Level 1, totally all done. I've been hard at work on the stuff South of the Monongahela since I finished Level 1 almost two years ago. It's hard because it's far from my house (see rules and regulations) and crazy hilly. You can see that I've made a lot of progress either just by the superbrite color lines all over everything (btw that image above is about 136 square miles, about 140 feet per pixel) which is where I went, or by comparing to last time, or by me being more specific:
Neighborhoods totally done (level 2): Banksville, Beltzhoover, Bon Air, Brookline, Carrick, Chartiers City, East Carnegie, Esplen, Fairywood, Hays, Knoxville, Lincoln Place, Oakwood, Overbrook, Ridgemont, St. Clair, Westwood, Windgap.
Total running events (this includes Pac Tom, training, races, and 3D World Runner): 734 Total time recorded: 25 days, 23:15:38 Total distance: 4230.118 miles
But actually what I really wanted to show you was a newer map, which has been on the Pac Tom site for a while but I have never explained. It's the shortest paths map:
Well, at this view it just looks like the regular map vomited a rainbow all over itself. What's going on is that this is a graph of all of the places I've been (each individual GPS waypoint), connected by heuristics (like they were consecutive in a trip, so I actually ran between them, or they appear to be near enough to imply that I could run between them) and then I compute the shortest path from each point back to my home. Here's a zoom up:
Bonus points if you recognize the neighborhood! See all those fingersnakes reaching up to meet one another? Those aren't dead ends, they're the farthest away from my house I can get on those roads (the leaves in the minimal spanning tree rooted at my house). On one side, the shortest path is to go South, but just a few feet away, the shortest way is to go North. (My house is Southeast from here.) I spent a lot of (fun) time writing this code partly in the hopes that it would teach me about better ways to get out to distant neighborhoods, but it turns out that on city streets (especially grids), the shortest path on foot is usually pretty obvious. Even when it's not, the difference rarely exceeds 100 feet. The most interesting places are probably choke points, like bridges:
Pretty much everything nearby points up this bridge. The colors by the way are not gratuitous; they indicate the physical heading that I should be running on that segment to decrease my distance to home. Green means East, red means North, violet means West, cyan means South. This is meant to emphasize the break-even points described above. Here you can see from the thickness of the lines (which just comes from having lots of runs through there, with GPS noise) that I don't usually take the Birmingham Bridge, even though it would save me about a South Side block's width (that's the pink stuff: Turn around!) I usually prefer the Hot Metal Bridge to the East because it's got better pedestrian access and also my brain autopilot is accustomed to the area, having run it like a hundred times. Unfortunately it's hard to get route preferences (and other stuff like elevation change) incorporated into the formulas. So, rainbow brite indeed but not actually that useful. The maps are updated automatically after every run onto the graphics page. You can check out the source code which of course is mostly calls out to general-purpose libraries for loading GPS data and computing fine-grained distances on the earth pear's surface and undirected graphs and snapping the neighborhood boundaries to be exactly perfect, and outputting the SVG, all of which I of course wrote myself even though it probably or certainly already exists because have you MET Tom?
Pittsburgh Marathon 2010: Project SHARKWEEK
(02 May 2010 at 17:57)
YES. You guys know I like to run races in costume, or carrying something, or otherwise making it conspicuously difficult. Well, when I signed up for this year's Pittsburgh Marathon they allowed us to pick a 9-character personalized vanity bib, and since the first thing that came to me was SHARKWEEK, I did today's marathon in a shark costume. At first, it was just a dream, with this as the prospectus:
Erika, a costume whiz, helped me get started planning it out and correcting my grievous anatomical mistakes, but then I slacked off for ages not working on it, until I bought a sewing machine and then put together the costume starting Friday night on my own. It's highly overengineered, with an adhesiveless design, inner wireframe made of coat hangers, and tailored felt with reinforced stitching. I discovered that pretty much every part of a shark's body is shaped like a coat hanger:
It was a good long day of remembering how to sew and which unfortunately lasted longer than I wanted it to. I decided to punt on the gills, which were unanatomically located anyway, but otherwise it pretty much came out as I had hoped. Here's shark-face:
I was worried about this race, though. Weather reports predicted temperatures up at 80°F at some point, plus thunderstorms. That'd be bad for just running regularly, but one of this costume's main difficulties is how it seals in the flavors and spices. I wanted it to be hard but not heat-stroke hard. And then I had unwisely stayed up until 12:30am finishing the costume, and also I couldn't fall asleep until 2 or 3am because of Pitt's graduation party noise, heat, allergies, and excess energy from tapering. Despite the 3 hours of sleep, and not being able to find my bicycle pump, I biked downtown with the costume on and with a flat tire (the biking is where I first discovered how obstructive wearing a tail can be, particularly when it gets caught in the wheels), tried to find my friends running (couldn't) and then started towards the back of the pack. Part of the idea of this costume was the mental image (hopefully communicated to some) of a shark (me) attacking a swimming (running) throng of people (people) at the beach (marathon course) trying to get to shore (finish line), eating all the ones who weren't fast enough.
It turned out that despite all the looming potential disasters, it really went quite well. Temperature was mercifully in the 60s. The costume was hot, for sure, towards the end of the race forcing me to walk off problems that I knew weren't just exhaustion (e.g., headache) but it was way better than it could have been and I managed to run the first 18ish miles only stopping for water, and only some modest walking in the last 8. The costume was heavy and soaked up water when it rained on us for most of the race, but honestly the water there wasn't as bad as it was in my shoes. Although the head would stay on pretty well if I was just walking or biking, when running it would bounce too much (bad design). I therefore had to spend the whole race holding it on, usually with an internal handle under my chin. The coathanger shoulder-"rests" dug into my shoulders the whole time and left some pretty grody bruises, but given all the other sharp pieces and metal burrs it's a miracle I didn't come away with some real serious abrasions or stabbed as the thing collapsed around me (it held up almost perfectly). The tail was an unexpected difficulty: As soon as I actually started running I realized that I was kicking it and probably would be for the whole race. So I used a shorter than usual stride, but still it was pretty tripoverable and I was hitting it or worse with every step. That's fine, think about what a shark with feet must feel like! My official time was a garbage 4h29m49s, which is about a 10 minute mile, more than an hour slower than my non-costume first marathon.
The costume itself went over extremely well. The Tribune-Review says,
Marathons usually bring out their share of off-the-wall running apparel, from tuxedos and wedding gowns to Elvis impersonators, but there were relatively few that engaged in the offbeat this year. One of the few was someone who donned a shark's head and dorsal fin for the occasion.
Still Pittsburgh runners have not picked up on the fun of costume-running. Other than all the trouble, it's the best: The whole race other runners are running up to say hi or you overhear them saying to a friend, "I just got passed by a shark!" The crowd who is sitting there in the rain waiting for their one family member or because they can't go anywhere because the roads are shut down, they completely love it, so you get people from all backgrounds laughing and clapping and shouting, GO SHARK MAN!!!, and the water station volunteers who are doing labor in the rain for nuthin' in return always perk up, and little kids trying to figure out what is going on with that dude but with that little kid smile where they know something's funny but don't totally get it. Two people recognized me as the guy from birthday cake running. At some point a woman comes up to me who had been running at a mutual pace for a while and says, "You have made so many people smile today."
(BTW Thanks to Gabe and Someone on Twitter for the pics. I can't photograph myself while running yet.)
One of my favorite groups to make smile is the live bands or musical cheering organizations like the dance music cheerleaders. In this race I slowed down in front of every such group (probably about 15 of them) and did an interpretive dance to their music. This was so fun. I got several of the singers to mess up their singing from laughing, and some bands made musical or lyrical reference to the shark (like the cover band that lamented having just played "Fins" right before I got there), and the cheerleaders were flipping out, chanting, "go shark! go shark!" and pumping their fists. The best was when a school band saw me coming and quickly arranged a full marching-band version of the Jaws theme—not kidding, this was completely amazing—and I did the hunched over swimming lurch by them.
Most people only see the shark for a few seconds, so it's interesting to get a catalogue of thousands of people's first reaction. I was surprised that Land Shark was the most common thing shouted, since that skit is pretty old now. It's not like every shark costume is depicting land shark just because it's on land. If I were dressed as the International Space Station, would they say "Land-ISS!"? No. Also popular: Sharky (don't know if this is some specific cartoon character but it was too common to not be), Shark Man, Shark Boy (at least one referring to the Rodriguez film), Sharkweek (reading the bib), and in single digits: dolphin (?), whale (?), alligator (??). I get the benefit of hearing the quips so many times over the four hours that I can develop and refine comebacks. Like at the water stations, if someone takes the last cup of water right ahead of me, "Save some for the fishes!" or when biking back home against the runners who hadn't finished yet, and someone goes "26.2 miles is not enough, now you're going biking?", I say, "Yeah, it's a triathlon. The swimming part is easy."
Tom 7 Entertainment System Hero (show and demo reel)
(16 Apr 2009 at 20:14)
Hey, okay. Finally I have the videos ready to reveal secret project 7H, which is called Tom 7 Entertainment System Hero.
This is part video game and part performance art piece. The video game is essentially an implementation of Guitar Hero, where the songs are Tom 7 Entertainment System tunes. Some of these are ridiculously intricate and most have weird time signatures, which makes for advanced play. It supports keyboard on Mac, Windows, and linux or real USB guitar controllers (like the XBox 360 ones) on Mac and Windows. That includes accelerometers and whammy bar. The best introduction is to watch the demo reel:
This video has a bunch of clips in it, mostly from the Show at Belvedere's. You'll see a bunch of things. One is that I actually mess up a lot when playing. I'm better than this but two things contributed to my mistakes: (1) I was kinda drunk since the show started like 3.5 hours late and I got free beer for being a "musician" and (2) in the last week before the show I was sprinting to get all the software and hardware working, so I actually didn't practice hardly any of these songs more than the one time it took me to decide to put them in the setlist. Once it's available publicly I will challenge you to high-score battle to prove it. Hardware you ask? I didn't build the guitar or drums of course, but I did build the Laser Suspension Womb, which to be more pithy I sometimes call my "USB laser hat." It's a hardhat with a bunch of very bright LEDs and actual laser diodes embedded in it, powered by 1.5A, worn on the head, and connected to the computer via USB implemented on a custom circuit board with a PIC microcontroller. The in-game music and events ("drums were kidnapped!") trigger the lights and lasers to play along. I have a clever hack so that it doesn't need special drivers on any platform, though that's not helping penetration much because there's only one of them. This was my first real hardware project in my adult life, but now that I know how to do it I hope to do more (especially input devices, i.e., "instruments"). It's much better in 2009 than I recall from sticking paperclips and resistors in the parallel port in 1993.
Rock Band drums are supported too. Unlike the guitar, which has a goal pattern for you to match, these are totally freeform. Commodore 64 samples are played in response to drumhits. I wish the controller supported some kind of velocity sensitivity, because that is kind of important for drum expressiveness, but too bad so sad.
Techno details: The implementation is almost all in Standard ML using SDL, except for the low-level sound synthesis thread and the interface to the USB laser hat. That stuff's in C. It's easy to mix them. The code has some shortcuts in it for sure and deserves to be cleaned up (lots of them introduced in that last week sprint) but it also has some really nice parts, like the algorithm that matches your input to the score. The matching is ambiguous, so there's an on-line dynamic programming algorithm to be maximally generous to your playing. (I don't think Guitar Hero II had this maximally generous algorithm, which was one of the reasons I started working it out like a year and a half ago, but I do think that GH III and on do it right.) The finger patterns you're supposed to match with the guitar, which I call the "score", is generated automatically from MIDI files. To turn a T7ES MIDI file into a T7ES Hero game file, I have to assign instruments to each of the tracks, and then pick which tracks or track parts are supposed to be played on the guitar. The rest is automatic, save some tuning parameters. "genscore" has a model for how closely a candidate score matches the original MIDI (for example, if consecutive MIDI notes are rising in pitch, then it's better for the fingers to also be rising on the fretboard) and then it solves for the optimal assignment, measure-by-measure. I thought that I would need to modify the score after this to get good quality, but it actually works amazingly well. Some of the stuff it comes up with is super fun, like I would assume was created by a human with a good sense of fun. No. Only cyber-brain.
Here's the last two songs of the regular set in full. In this you see that you can actually play drums and guitar at the same time if you're good enough (I am not). 2 player mode? Maybe soon:
I don't know if I'll ever get the opportunity to perform this again (befriend T7ES Band Page on Facebook for guaranteed notification), but maybe. Either way, I'm looking forward to sharing the software with you guys, which I will do as soon as I finish the auto-update and high score table, so that we can compete with each other and I can release song packs.
SIGBOVIK 2009 has come and gone, and was a great success. This is a real simulated conference that we've been holding at CMU for the past few years. It's hard to really describe the vibe, but it's a bunch of academics getting together to make fun of the academic conference and publication system by putting loads of work into making very sophisticated and polished papers and presentations about nonsense ideas, or to put together disturbingly real implementations of things that pretty much should not exist, just for fun. This year was great, I think better than last year's. My contributions were as follows:
(2) The "LFMan" game and associated ephemera. If you have never seen the old TV Show "Square One" then you should watch this video of Mathman to understand the referent. It is a paper and talk and sort of an actual game: LFMan. (Use the arrow keys and '1' or '2' to select between SERVER OK and ABORT). The talk and demo went well even though I think there were a lot of people that are too young to have seen Square One.
The award is itself an unplayable Arkanoid clone. This was playing on the screen during the awards presentation, and had just one dot left (you'll see it takes like 10 minutes for it to get that last one) for a long time, with people continuously going "awwwww" when the ball just barely missed the last dot. For the "people's choice award" we used the Clap-O-Meter to determine the favorite paper from a short list, but while we were using applause to determine that, the final dot was struck in the Arkanoid award, which was met with the clearly most enthusiastic cheering of the Clap-O-Meter phase. So the People's Choice award ended up being given for my own Award drawing, which I think we are pretty happy about the way that turned out.
If you like this kind of thing, do check out the full proceedings. There's lots of good stuff in there. Long live SIGBOVIK!
Spoiler alert! This emacs mode contains spoilers for the TV show Lost (Season 2). (I always wanted to say that, heh heh.) It will also make no sense to anyone who hasn't seen the show or used emacs.
Now that Lost Season 4 is over, I know you need something to tide you over for 9 months or whatever until it comes back. Therefore please enjoy this emacs mode simulating the Swan station computer from Lost. The modeline countdown timer will follow you in every buffer, ticking down the seconds.
When reaching the 4 minute mark, you can use the Swan computer and do what you gotta do:
If you don't do what you gotta do, then you might get some System Failure:
System Failure used to kill emacs without saving your buffers, but I decided this was a bit too cruel. Now you can live with System Failure indefinitely, meaning that you can safely run lost-mode as part of your regular day-to-day emacs use. If you have emacs I recommend trying it yourself so you can see the animations (particularly the timer reset animation). Put
Well, the faux/real SIGBOVIK conference on April 1 was a staggering success. Basically, Harry Q. Bovik is a fake graduate student that the Computer Science Department uses for various purposes and in-jokes. His 64th birthday was this Sunday so we had a conference filled with joke papers and presentations in his honor.
The website has a full draft proceedings, and I think soon you'll be able to get a bound printed copy to enhance your office's gravitas or to place with randomly generated call numbers into your university's engineering and science library.
If you hate reading you can watch the totally pre-recorded version of "Generalized Super Mario Bros. is NP-Complete" (make sure your sound is on, and wait for the whole thing to load before starting it) (warning: this is very immature) or look at the talk for Wikiplia (but this mostly consists of words). Both need the newest Flash player. Since I really implemented the latter (I think the only SIGBOVIK paper that comes even close to being real) you could also just use it, at least until I eventually shut it down for taking up too much of my office machine's resources.
Suddenly, impulse strikes in the computer science lounge -- people want to make games in SML! Here's a totally ridiculous screenshot of a short project to make Sokoban using xlib. We've got some nicer stuff coming, I promise... ;)
NEW: Classic Video Game Characters Wuss Scale
(30 Dec 2001 at 18:29)
I have been working on snoot.org a lot this break. Today I have created a new wuss scale (where various contestants do battle to rank them based on their fighting prowess, sort of like a text-based Quake 3 Arena), for Classic Video Game Characters. Who would win in a fight, the Fat Guy from Ice Hockey or the L-shape from Tetris?
I finally put up the code I wrote a very long time to generate random text from a grammar description. This is used for the news flashes on UNTITLEDGIF.ORG and used to make haikus on snoot. You can download this sloppy, undocumented C++ program (and example data) here. (Forgive me, I was young!)