Lessons learned from Film Addict

It’s been a week since I posted Film Addict. It got posted to kottke.org, Slashfilm, USAToday.com, and became a Twitter and Facebook meme on some level. At this point, it has received 100,000 pageviews, and it was filled out 37,000 times (peaking at a rate of over 1000 per hour, but at this point still about once a minute).

Lessons learned:

  • If I use strict and warnings, I should keep an eye on the Apache error log. I generated 10GB of errors in the first 24 hours, filling up /var on my webhost, which resulted in 8 hours of downtime during the Slashfilm surge.
  • Google Adsense now allows "personal" domains. I tried to sign up in 2004, when Weboggle was all the rage, and I was turned down because it lived under plutor.org. I'm not sure when the policy changed, but I applied this week and was approved on Thursday.
  • Google ads don't really make you much money. At this point, the ads on the Film Addict page have made me $2.90, but even if I had had them from day one, I'd only have made about $15.
  • I sleep fine at night, even after creating something clearly intended to be meme-fodder.
  • With enough data, you can get awesome bell curves. Histogram of number of movies seen:

It didn’t end up going much of anywhere on Digg or Reddit or Delicious. I’m not sure why, but I think part of it might have been the individual nature of the form. You could compare your list against your friends', but there was no community interest. Another factor (especially on Delicious) was the unique id in every posted URL; there could never be enough posts of a single URL to get any momentum.

Film Addict

A couple friends of mine posted one of those lame Facebook chain note things today. It was a list of a couple hundred movies, mostly 18-25-year-old targeted franchises from the past decade or so (think Scream, Saw, American Pie, etc) with some others (mostly very popular) thrown in. “Copy this list to your profile and check off the ones you’ve seen”. The list’s arbitrary inclusion criteria angered me, so I decided to make my own, with a better inteface than “copy and paste it yourself”. The list is IMDB’s top 250.

I posted it to MetaFilter Projects. Pretty much immediately, Mathowie Twittered it. At this point, more than 200 people have taken it already. Give it a try, compare your list to mine.

Redirect referer test

A web user is looking at page A. He clicks on a link for page B. That page has a META Refresh to page C. What is the value of HTTP_REFERER for that last request? What if the redirect was a Status 307? Or a location.replace() JavaScript call? What if he’s using Opera? I’ve been doing some redirect referer tests this week and I have results for some the most common browser/OS combinations. I hope to expand them further.

Live photocasting Halloween

Sometime during the planning of our two parallel Halloween parties, Chris and I realized we needed some way to allow the two groups to communicate. Videocasting was our first thought, but we didn’t have the equipment or the knowledge. But when it came to taking photos and putting them on websites, we had all kinds of both. Using something Chris had written a while ago as a guide, I wrote a quick script to pull the photos off the camera, resize them to a reasonable resolution, and upload them to our web server. I then wrote a CGI that would pick a random photo from each location and place them side-by-side. Chris asked me to make the algorithm weight towards newer photos, which was far easier than it would have been if we had been uploading to a service like Flickr or something.

After a rough (and late) start in Boston, things went well. Philly took some naughty shots early, which got people riled up here and for a period of time, things were pretty lewd. Eventually it became family-safe fun time party photos and some gentle photo-jabs were traded between the sister parties. Sometime around midnight, Chris texted me “this is the best thing we’ve ever done.” I agree. That said, we learned things. The script had all kinds of bugs (mostly because I wrote it without having the camera we were going to use or the software). The CGI was too weighted towards new photos. And whereas Chris had done this before and had a neat photobooth setup (a side room, tripod, IR trigger), Boston had a camera that had to be hand-shot and plugged back into the laptop every few minutes.

Will we ever be able to learn from the mistakes we made, and try out a new iteration of the script? I certainly hope so. Maybe we can hook in a third city. California friends, I’m gesturing in your direction.

FeedWordPress Collapse Filter

There’s a serious dearth of FeedWordPress filter plugins out there. I aim to rectify the situation. FeedWordPress Collapse Filter will collapse multiple posts being imported from a single feed into a single post. I use it here on Plutor.org to keep Flickr photos (which I frequently upload by the handfuls) from overwhelming everything else. Each syndicated feed can be separately configured to collapse (or not) with a different time threshold.

Download FeedWordPress Collapse Filter 1.0

Trivia in the Boston Area

We’re trying to find a new location for trivia night that’s a little more central than the current destination in way-north Somerville. So I whipped together my very first Google Maps mashup. It includes all of the Stump trivia locations as well as the T subway lines and stops.

Gometric is expiring

The domain GoMetric.org is expiring on April 24. Should I renew it? Does anyone use it? It averages fewer than 20 hits a day, and it’s unclear how many of those hits are anything besides robots.

Update 5 Apr - Fine, sheesh! I didn't realize people actually still used it. Gometric is now renewed for another two years, and I have some ideas for some updates and whatnot.

Three Words, Five Minutes

I wrote Three words, five minutes this morning after about a year of procrastinating. It was initially going to be big and complicated, but since that was the source of the procrastination, I made it a single frameset with Writeboard as the writing interface. TWFM makes it surprisingly easy to just go and get a little writing exercise, and even if it doesn’t inspire something longer, then it was worth it.

Nomad has been ignoring work with it all day.

Greasemonkey Scripts

I discovered the Firefox extension Greasemonkey in early March 2005. I had probably heard of it before then, but I don't know why it had taken so long for me to really look at it. It's exactly the kind of thing that appeals to me: injecting Javascript (often with DOM actions, possibly with Ajax) into any web page. Every once in a while, I come up with an idea for a one-off script. They're all available from my profile on Greasemonkeyed.com.


Welt (Windows Event Log Tool) collects event logs from an arbtrary number of Windows machines and allows for centralized reporting and monitoring. I’ve built in a SiteScope hook, so we were able to replace 1200 NTEventLog monitors with fewer than fifty Welt monitors, and we now have far greater flexibility with thresholds. The engineering team also uses the Welt web interface to gather information about an outage.


Boggle is arguably one of the best candidates for a simple online multiplayer game. All of the interaction between players is at a single moment, and the scoring can be easily automated. JavaScript with DOM allows you to do a lot of really neat things, so as a test of my skills, I decided to try to make a massively multiplayer online Boggle game. It worked, but my backend code was pretty inefficient. When I brought it down, Evan offered to mirror it. He’s not only done that, but he’s improved the game beyond even my plans. Check out the game.


Around the the end of January, I was doing some reading for work on the Document Object Model (DOM). The DOM (ideally) allows JavaScript to access and modify any element in an HTML document in a heirarchical Object-Oriented fashion (well, as OO as Javascript can ever be). The more I read about what was possible, the more I realized that I could create a totally interactive application written in merely HTML and JavaScript.

Then I remembered what I think is the most useful JavaScript feature in existance: asyncronous HTTP requests using the XMLHTTP object for Internet Explorer or the XMLHttpRequest object in Mozilla-based browsers. Using this object and a little server-side scripting, I could not only keep important logic and large files like dictionaries on the server, but I could also create multiplayer (potentially massively multiplayer) interactive online games that required nothing but a modern browser.

Think about PopCap, Pogo, Yahoo Games, and MSN Games. Every single one of the games on these sites could be done without requiring a single plugin. I thought about it, and I decided to set about demonstrating it. (It was only after this game was mostly completed that I noticed SSCrabble. While it uses similar client-side scripting techniques, it lacks the multiplayer functionality entirely, which is too bad.)


WEBoggle is primarily HTML and JavaScript. There’s fewer than 100 server-side lines of Perl, and a 90,000 word dictionary.

All WEBoggle requires is either Internet Explorer 5 or newer, or a Mozilla-based browser like Mozilla, Firebird or Galeon. (Internet Explorer 4 should work, but I’ve never tried it.). There are a few caveats, and good reasons why other common browsers like Opera do not work, but those are all listed in the Bugs section below. Also, your browser must accept cookies. Sorry.


Cheating in an online game is an inherent problem. I’ve worked as hard as I could in order to keep important scoring logic server-side in WEBoggle. I’m only human, and it’s possible that I’ve missed something and it’s possible to modify the JavaScript source code so that it submits invalid words and they get erroneously scored.

A much easier way to cheat, however, is to write a script to give you all of the words that can be found on the board. I could have made it more difficult to do this, but as long as the letters are legible to the player, you could simply type them into a command line script that would then give you a list of words to type back into the game. There was simply no way to prevent this. (I wrote such a script in about 60 seconds, so if you’re considering it, your effort won’t make you “the first”. I was able to get more than 50 points consistantly.)

I just hope that everyone who plays this game remembers that cheating is no fun, not for you, and not for anyone with whom you’re playing..


Once WEBoggle started generating several thousand player-games per day, it started interfering with the operation of the sites on my webhost. I took it down until I could make it more efficient, and a guy named Evan Simpson came forward with an offer to mirror it for the time being.

As anyone who’s seen my Projects listing will agree, I have a short attention span. Updating WEBoggle kind of fell off my radar, and I told Evan that he was in charge. He’s done far more than I ever planned or expected: “missing words” submissions, two simultaneous games (one of which is Big Boggle), the ability to rotate the board, and a list of “words that nobody found” with each round.



I’d like to thank everyone who helped me test WEBoggle and suggested stupid improvements: BrainiACK, Nomad, Splatta, Kazy, and especially M. Also, all the people who donated money through Paypal and posted links to WEBoggle on their blogs. At its height, more than 6000 person-games were being played every day. And a thousand thanks to Evan Simpson for mirroring and then improving the game.

Science and Industry

Science and Industry is a teamplay based modification for the game Half-Life. I was an active part of the community for a couple years, running a server, working on some applications, helping with testing alpha versions, etc. Eventually, I became a full-fledged member of the development team, helping PapasNewBag out with the coding for the mod. Many of the visual enhancements included in version 1.0 were my contributions.

Working on S&I was a fantastic experience that I will treasure forever. </corny> Honestly, the entire team is friendly and brilliant, and their hard work is evident in the quality of the maps, models, and replayability of Science and Industry.

Here are some of the behind-the-scenes screenshots I took and sent to the other dev team members, showing what I was working on and what problems I was having. These images were all taken between January and April 2002. Also included is my history of S&I — A Mod’s Life — written February 2002.

Crux Linux

I discovered Crux Linux exactly when I needed to. I was getting sick of Redhat’s big-endian-ness. Upgrading was always a challenge, and the complexity of the boot scripts made things really confusing. Based on a BSD-like “ports” system, Crux is a built-from-source Linux in the tradition of Gentoo. But it’s far simpler, and for the first time I really feel like I understand how Linux works, from one end to the other. There’s only very weak dependency support (an advantage, in my mind, over having to run rpm with –nodeps three-quarters of the time), and it’s not for newbies (you need to partition your disk by hand, and compile your own kernel), but I’m in love. I was a ports maintainer for several months.


I contribute to the free online encyclopedia Wikipedia on almost a daily basis. I’ve written articles on Danbury and the Danbury Fair almost from scratch, and rewritten several articles, like Handheld game console. Check out my User page for more contributions.


With Moveable Type, several freely available plugins, and a fair amount of HTML and CSS knowledge, I’ve been able to create a website with three totally independent sections, each behaving differently and managed independently. I’m fairly proud of how this website has turned out.

Password generator

Usage: ./genpasswd.pl [OPTION]...
Generate a set of random passwords that match certain criteria.

  -c, --charset=SET    Use the specified charset
  -l, --length=N       Passwords must be exactly N characters long
      --length=N-M     Passwords must be N to M characters long, inclusive
  -n, --number=NUM     Generate NUM passwords (default is 20)
  -r, --require=TYPES  Require at least one of certain characters in password
  -h, --help           Display this help and exit

SET may be one of the following: typeable, alphanumeric, numeric.

TYPES is a comma-separated list of one or more of the following: upper, lower, number, symbol. Any TYPES specified that are not valid with the charset are ignored. Default is all TYPES.

IT Inventory System

A few months ago, I was asked to make an inventory application for Priceline. I thought it would be simple. But you try making an inventory system for three different IT groups. Make it so that the networking devices and servers are logically “connected” properly, so you can search - for example - for all machines connected to a given core switch. What about tracking depreciation, and controlling who can edit what? Then write scripts that make sure that the information you can get from the Cisco switches matches with what’s in the database.

SiteScope Management

Freshwater Software has a great site monitoring suite called SiteScope. It allows you to watch dozens of different events and resources on any number of servers. Priceline has more than 4000 monitors set up with this software watching things 24 hours a day. Unfortunately, we have these monitors across 6 servers and 3 data centers in 2 continents. We needed a way to bring all of the SiteScope data together in a single place.

  1. Simplified visualization of current warnings and errors, and
  2. Baselining and historical trend analysis.

SSM allows us to do both of these. It is able to handle the more than 10 readings per second. The current database has almost 2 months worth of data, is 5.5 GB, and still is reasonably responsive. It’s written in a combination of Perl, C, SQL, JavaScript (using DOM), and HTML.

Go Manhattan

Using some free GIS data I found online, I made a Manhattan mapping application. Now that Chris has moved to Harlem, I’ve started dusting this code off, trying to get it more functional. I’m hoping to be able to get subway stop data, pre-programmed points of interest, and be able to give point-to-point directions based on some miserliness and willingness-to-walk variables provided by the user.

Go Metric

Go Metric is a web frontend for the GNU application ‘units’. It allows you to convert values between (literally) thousands of different units, both mundane and scientific. It was a quick little ditty to write and I hope to get lots of use out of it.

S&amp;I Text Adventure

The one and only release of my Science and Industry inspired web-based text adventure. Note that there are lots of features missing. It should be considered an alpha-quality product.

S&amp;I Statistics

This is really how I broke into the S&I community. I wrote a statistics script to parse through my server’s logs, and all of a sudden I was everyone’s friend.

The next version (Beta 4) was in planning for a while. I was planning on changing for Perl to C++ (which would hopefully result in speed improvements), and completely rewriting 99% of the parsing code.

The current release (Beta 3.11) became broken with S&I 0.97a, and over the years I’ve decided that individual player stats put too much pressure on the individual to do well, no matter what it does to the team. This wasn’t my desired effect, but it has led me to shutting down this project.

THE FILES BELOW ARE UNSUPPORTED AND NON-FUNCTIONING WITH S&I 0.97a AND NEWER. They are provided only for posterity’s sake.