!HME, or How Many Episodes, was a simple mIRC script that kept track
of the all too common question, "How many episodes are in ______?
A typical exchange would be:
<nick> !hme Neon Genesis Evangelion
<me> There are 26 episodes in Neon Genesis Evangelion
<nick> !hme NGE
<me> There are 26 episodes in NGE
<nick> !hme Gundam Wing
<me> I don't know how many episodes are in Gundam Wing
<helpful_person> !hme Gundam Wing 49
<me> There are 49 episodes in Gundam Wing
So it turns out I wrote a crowd-source application a long time before
I knew what crowd-sourcing was. I'm pretty sure I didn't even know about
Wikipedia back then either.
Back in my IRC heydays, spambots were a frequent problem. So I wrote
a script to combat the problem. Now that I think about it, I wrote a
pretty impressive script with Google levels of scariness:
- Automatically maintain a white-list/black-list based on the actions of the other operators.
- Look for keywords in the nickname and whois info that spambots commonly used to feign humanity.
- Analyze the frequency of use of letters in nicknames and whois info to determine the likelyhood that information was randomly generated.
- Keep track of every ip and level of activity of every user to gain "trust".
- Check to see what other channels the user is in and come up with a primitive Bayesian-type score. For example, someone in many unrelated channels is probably not human.
- Spawn a clone and periodically bait the channel for spammers.
- Automatically group similar ban entries to keep it clean and perform periodic ban-list pruning.
That data was combined and a score was assigned to every user, and
every user above a threshold was deemed a spammer and kicked out.
I came to be known as that guy who banned a lot. I had pretty good false-positive
rates too. Probably fewer than half a percent.

Doom mooD is a system monitor Konfabulator widget (now called Yahoo! Widgets).
I know it’s been mentioned by Dwight Silverman of the Houston Chronicle twice before, and I still haven’t found anything that’s even close to the combined whimsy and functionality. When you add in the nostalgia factor, I don’t think anything can match up to it.
As your system load changes, the face reacts. Sharp increases in CPU usage and tightening memory causes
our marine to grimace and get bloody. He'll look at your mouse once in a while too.
Lazy Alarm is a widget for quickly setting alarm and timers using natural English. Using special keywords
will create alarms that repeat or make different sounds.

Lazy Launcher was an early QuickSilver clone for Windows built on the Yahoo! Widget Engine.

Network Monster is a compact widget that monitors your upstream, downstream, cpu, and can ping multiple sites.
Battle Royale was a conceptual group of widgets. Sprites could be spawned, and each sprite had its own
independent animations and could be programmed to react to the sprites around it. My favorite
sprite was a very realistic cockroach that ran around the computer screen.
For a client, I wrote an application to streamline their sales process.
Previously, they would keep track of requests in an excel spreadsheet,
use a CRM called Now Contact to get addresses, and then use a Word document to make address labels.
One of my very first php programs was to write an application that
replaced all of that. Now anyone in the office could easily search for a
contact and generate reel requests, and my application would make PDFs
to be printed for labels. As I learned more, I figure out how to get my
PHP program to get addresses directly from the CRM and generate reports.
The next evolution in the application was when we moved from
Now Contact to a web based CRM called Highrise. I added a simple API to
my reel request script and then made a Greasemonkey script so that
employees could direcly interact with the reel request system from inside
Highrise. One sales rep celebrated the introduction of this feature by
immediately submitting 100 reel requests.
I started writing my “Secret Stash” php script as a simple
DirectoryIndex skin for Apache and it evolved to a full-featured entity
of its own. My client needed an aesthetic way of showing their assets
that tied into the design of the rest of their web site. Previously,
they would either send them to an open directory on their web server,
or write a custom HTML page every time they needed something more. Even
though they had their workflow down to a series of copy-pastes, it was a
lot of work every time there was a change... especially compared to the system I gave them.
What I did was write a php script that created a parallel version of
the open directory. The script used the same CSS and design cues from
the main site, scraped the open directory and its subdirectories, and
presented the files in a context-appropriate way. Subdirectories were
grouped together, there was a widget to play audio files, videos were
embedded according to their type, and images were thumbnailed and loaded
in a lightbox. And the best part is that just maintaining the files also
created the corresponding client site.
I added more features beyond that– like simple file maintenance through
the web interface, and the ability to add comments to each file.
The script was flexible enough to be used for different kind of clients,
significantly reduced the maintenance time, and also made it possible
for anyone with an FTP client to create client sites.
Within the past decade, reels have gone from 3/4" tape, to DVD, to
custom one-off DVDs, and now online video. With online video, we now had
the ability to easily create reels on demand, so long as we had the
software to do it.
This application I wrote ended up using a wide variety of tricks:
DHTML, AJAX to update the page with information from a mySQL database,
CSS theming, cross browser compatibilty, and cross quicktime version compatibility.
The biggest challenge was figuring out DOM scripting for different Quicktime
versions and different browsers.
This is a greasemonkey script that integrates with 37signals's CRM,
Highrise, and bridges it with several internal applications. It allows
sending reel requests and form emails from Highrise.
In addition to facilitating sales reps by letting them send reel
requests and emails directly from Highrise, it also helped them by
generating reports that could be imported into Excel. Prior to this script,
they had to do tedious and time-consuming copy-pastes.
I wrote a handy Greasemonkey script to help our company get around
an industry website. The script reskinned the interface to make it easier
to use, I added shortcut buttons that made common tasks on the site faster
to do, and I added automatic parsing to automate tedious research tasks.
This is a massive project that I can't show all the details, but the
basic process of the project goes like:
I scrape data from a website into an SQLite database. I parse the HTML
using a Greasemonkey Script, and I use Google Gears to write to the database.
The sqlite database can then interfaced through a variety of means:
- a custom local interface again using Greasemonkey and Google Gears,
- a simple PHP application,
- and a python bot using the skype API.

For a while, I was drawing simple maps, but the labels kept overlapping
and I kept thinking of ways to remedy this. I knew one method was to model
it as a system of charged particles, and when I had some free time I sat
down and started writing it.
Please visit the Live Demo
to see it in action.

As a component of my SQLite,Gears script, I wrote an interface to the SQLite database using CANVAS.
There is a zoomable map that shows the main information and a minimap to control the main map.
I actually have a much more advanced version of the map but I haven't repacked it for the demo site.

So I've been playing this game called BattleForge, and there are a
handful of websites that exist just to display information about these
cards you can collect in the game (think Magic: The Gathering or Pokemon).
People have also made Adobe AIR applications and Microsoft Access databases.
So, naturally I thought I would pollute the web with another website.
At first, I was going to use xml + xslt to make it. I actually got a
proof of concept working nicely. But once I tried using javascript,
it got weird on me because it was XML instead of HTML. Then I changed it
to plain HTML + an XHR request to get the XML file and got basic realtime
filters working. Then someone pointed out that there was some google docs
with the information I wanted so I switched from XML to JSONP.

LazyAlarm is a simple alarm/timer/countdown site. You just type when
you want an alarm and it does it. You can add messages, make them repeat,
and change the alarm level all through natural English. And bet best part
is you don’t have to endlessly click to make it do what you want, as
opposed to every-alarm/timer-site-I’ve-ever-found-and-tried-to-use.
It was dealing with these frustrating sites that got me to re-make my
old widget for the web.
The layout is fluid to accommodate small window sizes to make it easier
to run as a desktop widget, as I do. This brings this app back to its
widget roots.

There is a lot of debate on what style of CSS to use. Well... maybe
a few people are debating about it. But I like to switch back and forth
between single-line and multi-line CSS declarations. So I made a quick
web app to help me go back and forth between the two formats.

QuoteSentinel.com is a django app that monitors stock prices and sends
alerts to its users when their stocks hit a target price.
I worked on the front-end, and some of the django and sysadmin.
Well yes. I’ve been working on this project, and we use Codebase for
project management. And the whole time, I kept thinking, “Why can’t I
sort these tickets?!”. Apparently, I’m not the only one, because I overheard
some other people say the same thing so I decided to make a Greasemonkey script.
While there is a mechanism to sort, it requires modifying your search
query and a page refresh. My script not only does all that live, but it
also turns the search box into a live-search, which makes finding a particular
ticket fast. To accompany all this, I also de-paginate the results so all
the tickets are in one page. This could potentially cause problems, because
some projects might have thousands of tickets; but that’s a problem for another day.
While I have been on a jQuery spree recently, I made sure not to use
it for this Greasemonkey script. Even though there is a lot of DOM manipulation,
I rely on Xpath and JavaScript 1.6 Arrays. The script is simple enough
where it’s easy enough to convert to jQuery if needed.
I did the art direction here, building a lot of the things you see
and suppling all the cool equipment in the background.
Here's a spec spot we did. I did the offline edit in FCP. On set I
also did a lot of work controlling the mud. I threw away a lot of clothes that day.
One tasks I had was to translate the text on some of our director's spots. Some were fairly easy, and some were very difficult.
This video shows that I managed to create a clean blank on a highly dynamic background.