Me, myself, and my code

How I Won the OpenStack Birthday Contest

| Comments

Last week I stumbled across the “AppFog OpenStack Birthday Contest” via Twitter.

I’d been quietly following AppFog’s progress since I received a PHPFog beta invite a year or two ago. At the time I hadn’t had a reason to give their service a try since I wasn’t a PHP guy. However, spurred by the allure of a coding contest and the large number of platforms AppFog supports, I finally had a reason to poke around!

Anticipating that I’d be up against stiff competition I chose to place some additional requirements on my contest submission. As the AppFog Blog recently showed I wasn’t wrong about the competition. My hope was that the extra work I put into the submission would grant me at least an honorable mention.

What I didn’t expect was that I’d end up winning the competition!

I am honored that my code was chosen as the winning submission. As a small show of thanks, I’ve decided to detail my experiences with the AppFog beta as well as annotate the de-obfuscation of my code step-by-step.

Official Firefox Extension

| Comments

When was launched a little over a week ago, it was accompanied by both a Greasemonkey script and a Chrome extension.

This was made very simple thanks to the fact that the structure of Greasemonkey scripts and Chrome extensions are very similar. However, this left me with a few small problems.

  1. A good number of Firefox users wanting to use my extensions had no idea what Greasemonkey was.
  2. There is no really decent way to handle automatic updating of Greaemonkey scripts… meaning there isn’t a good way to migrate my users forward as the site evolves.

Combined, these two factors create an unacceptable situation for my Firefox users, so I’m happy to announce that there is now a dedicated extension for Firefox!

As a result of this switch, the greasemonkey script should be considered deprecated and unmaintained. No further updates to the Greasemonkey script will be made.

The Firefox extension can be found at: and is the preferred method for enhancing your experience in Firefox.

The Chrome extension, as always, can be found at: Beta Launch

| Comments

The History:

Those of you who know me know that I’ve become a bit obsessed with this game called Starcraft 2. Combining two of my favorite internet pass-times I’ve been spending a lot of my free internet time in Reddit’s /r/starcraft community.

When I first joined the Reddit Starcraft community there was a nifty little feature which would display your Starcraft race next to your username. Unfortunately as the community grew, the CSS required to implement this feature did as well. Eventually the required CSS outgrew some subreddit filesize requirement and the icons were forced to disappear.

A little bit later a site called was launched by the ever helpful redditor and /r/starcraft mod Aceanuu. The site allowed users to list their accounts, their ranks, their Reddit team, and some other useful information in order to relate redditors to their accounts.

An Impetus for Change: was very useful for those of us that used it, but it quickly fell out of favor with me due to a few things I perceived as shortcomings.

  • You had to manually report and update your ranks
  • There was no verification that the users actually had the ranks reported
  • There was no integration with /r/starcraft
  • There was no explicit support for people with multiple SC2 Accounts
  • The site’s functionality was entirely javascript based, causing overly large load times

A new opportunity:

I’m a fairly “competent” software engineer and wanted to improve this situation. When a few quick attempts at offering my services for the improvement of failed I got impatient and decided to just spin up a new site to fix the problems I saw.

And thus was born. The site fills exactly the same needs as but with a few important ( to me at least ) additions.

  • The site allows you to link profiles with redditor accounts.
  • It supports multiple accounts per Redditor.
  • Ranks are synced with actual ranks via
  • And the most fun: rank and race info can be superimposed on Reddit through the use of an Greasemonkey script or Chrome extension!
  • Password recovery is done through Reddit’s messaging system so if someone “steals” your identity, you can always get it back.

The site is officially in open beta, and I’ll be posting a link to the site with a short description on Reddit soon. I hope people enjoy it as much as  my limited test group did.

Get support for the site at the Google group.

You can follow progress on the site by watching the Twitter account @rstarcraftinfo

Earth Hour

| Comments

For one hour on Saturday March 28 at 8:30pm, switch off for our planet earth.

If it’s a clear night, go outside, check out the night sky you’ll be surprised what you can see.

Earth Hour 2009

From their about page:

“What began as a campaign to get Sydneysiders to turn their lights off, has grown to become one of the world’s biggest climate change initiatives. In 2009, at 8. 30pm on March 28, people around the world will turn their lights off for one hour Earth Hour. We’re aiming to reach one billion people, more than 1000 cities, all joining together in a global effort to show that its possible to take action on global warming.

Earth Hour started in 2007 in Sydney, Australia with 2.2 million homes and businesses turning their lights off for one hour. Only a year later and this event had become a global sustainability movement with up to 50 million people across 35 countries participating. Global landmarks such as the Golden Gate Bridge in San Francisco, Rome’s Colosseum and the Coca Cola billboard in Times Square, all stood in darkness, as symbols of hope for a cause that grows more urgent by the hour.”

A Little Turkey Day Coding!

| Comments

So what does any self respecting programmer do when he finds himself awake at 2am after Thanksgiving?

Do some coding of course!

In this case I decided to finish up that holiday shopping budget I had been putting off. Using this simple little javascript application you can tell exactly how much you can afford to spend on each person.

Just choose your overall max budget, enter the names of all those people you will be giving gifts to, and rate them on a scale from 1 to 10!

Easy as pie.

Happy Holidays!

Google Chrome’s Terms of Service: They Want Your Stuff?

| Comments

UPDATE: The Terms of Service have been updated as of September 4th 2008 to state that you retain the rights and copyright on all things displayed with or through “The Service”. The EULA is no longer a problem and I look forward to giving Chrome an in depth try. (See the EULA here: html)

How often have you tried to install an application only to be stopped by a dialog asking you to agree to some terms of service (TOS), or an end user license agreement (EULA)?Now how often do you actually take the time to read through these terms to see what you’re agreeing to?

New Hobby: Hi-Tech Treasure Hunting!

| Comments

What do you do when you have a GPS receiver, the internet, and a penchant for treasure hunting? You go Geocaching! Geocaching is a game where you quite literally use multi-million dollar satellites to hunt for boxes in the woods.

The game works as follows: 1. First you log into the Official Geocaching website ( 2. Enter your zip code to find all of the caches near where you live. 3. Put a few cache locations onto your GPS, and go hunting!

The caches themselves range in size from magnetic key holders to ammo boxes painted and marked with the word “Geocache”. All caches contain a small logbook where finders can sign the date of their find, their nickname, and maybe even a quick description of the fun they had hunting.

Some of the larger caches are variable treasure troves of trinkets. Geocachers follow a policy of trade equal or trade up. This means that if you stumble upon a cache with a nifty goody you’d like to snag, you must trade that item for something of equal or greater value. This ensures the boxes stay stocked with things to keep everybody entertained.

The caches themselves vary in difficulty from easy to find, to incredibly hard. To make matters worse, since some people may frown upon the idea of geocaching, you generally must stay as inconspicuous as possible while caching. After all, the last thing you’d want to do is give away the cache to someone else hunting, or even worse be witnessed re-hiding the cache only to have it stolen.

The number of people enjoying this interesting hobby is often surprising. Chances are if you’re out caching you’ll bump into another person doing the same. Caches are so wide spread that if you’re anywhere any park, or city, chances are you walk right bye more than a few each day.

I began caching with a few friends from work known on as DrDonut and Raegx. Since then our caching adventures have taken us to various beautiful parks around the Rochester area. I’ve even revisited some of my favorite spots from high school only to discover caches present in the area.

The joy of the find and neat swag aside, the real fun of Geocaching comes from the community itself. The game itself is entirely community run. Geocachers make the caches and post them to the site. Geocachers find the caches. Geocachers police the caches and warn people when they need maintenance. But most importantly, geocachers all seem to be cut from the same adventurous cloth.

An overbearing theme for all caches seems to be to get you to look at your world a little differently. Many caches are placed in such a way that they will take you somewhere you might never know existed. Walking the trail, or even a bit off the beaten path, you’re sure to see something cool and have a good deal of fun.

Happy caching!

Road Runner Is at It Again…

| Comments

After writing my first post describing Road Runner’s annoying practice of redirecting all invalid DNS requests to their own advertising laden search page I opted out. I figured that would be the end of it.

I was wrong.

As of this morning Road Runner ha re-enabled the DNS redirecting again.

How stupid are they? At least now I know how much they actually actually care about their user’s settings.

Road Runer, if you’re reading this. Stop turning this feature on. It’s absolute rubbish and I really don’t want it. When I opt-out of a service this does NOT mean you should re-enable it a few months later and hope I won’t notice.

Oracle Core Dump Grapher

| Comments

Anyone who has ever spent any significant amount of time working with an Oracle database has probably seen a ORA-600 or ORA-07445 “exception encountered: core dump” trace file.

Unfortunately, when you come across an Oracle core dump you can’t do much more than send the dump to Oracle and hope the issue is already resolved in a newer version, or that a patch is available for your current version.

This process usually consists of three steps:

  1. Collect the trace files related to the issue.
  2. Open a Service Request on Oracle’s Metalink site.
  3. Wait for a response

If you’re lucky, the first step is an easy one.

If you’re lucky you caught the first occurrence of the core dump and only need to shoot off a single trace file to the guys at Oracle.

On the other hand, if you’re not lucky, you might be handed 50-60 trace files spanning multiple weeks and be asked to sort them by distinct issue for reporting to Oracle.

I’m not lucky.

Sorting the trace files is a long process which involves searching the trace file for the dump, researching the issue on Metalink, finding similar issues on Metalink, and then sorting the trace files by those issues.

Two trace files into the process I knew there had to be a better way. Well, what better way to organize trace files than by the stack trace that generated the dump?

From that idea TraceFileGrapher was born. The TraceFileGrapher takes as input a directory of trace files, and creates a graph representing the call stacks of all of the trace files resulting in core dumps. The graph is then saved as any Graphviz compatible format of your choosing.

The graphs themselves are simple. The starting nodes of the graph are colored green. The ending nodes are colored red. For a stack trace graph, the end nodes are the names of the trace files in which the core dump appeared. For a PL/SQL Call stack graph, the end nodes are the final PL/SQL function or procedure call name.

Example Graphs

In addition to graphing core dump stack traces, TraceFileGrapher can graph PL/SQL Call Stacks as well.

The TraceFileGrapher requires Perl, the Graph::Easy Perl module, and the Graphviz open source graph visualization software.

Get the TraceFileGrapher here.