Shout Out from the Stack Overflow Blog

Friday, I got a shout out on the Stack Overflow blog. A small one, that wasn't really merited... Man, I'm way too excited to see my handle on someone else's website.

Maybe, I should actually contribute something to the WMD bug fixing so that I'm a little more deserving next time.

World of Goo

I just finished playing World of Goo and I have to say that I really enjoyed it. I'll gladly be the six millon eight hundred and ninety three thousand four hundred and sixty first person to recommend it.

Seriously, it's like fifteen bucks go out, get a copy and have some fun!

I can't Believe they Just Fired a Flaming Orc from a Catapult!

I just finished watching In the Name of the King: A Dungeon Siege Tale and given that I went into the movie with very low expections (it's got a 3.8 on IMDB at the time of this writing) I actually kind of enjoyed it.

But seriously: How effective would you expect a flaming orc fired from a siege weapon against infantry to be? I mean honestly.

The Yawning Crevasse of Doom

A great talk by Martin Fowler and Dan North on the communication gap between the developers and users of software titled: The Yawning Crevasse of Doom.

Highlights include:

  • Why communication between developers and business people is important.
  • How DSLs and other technologies improve communication between business people and developers.
  • When offshoring/distributed teams work.

What the Date?

Today's Code Snippet of the Day (CSOD) from The Daily WTF shows how not to validate a date. Inspired by boredom and the knowlege that I could do it shorter and better. I set about writing my own date parsing/validation routines as a form of Code Kata.

In Python, Take I

A first crack written in python:

date_pattern = re.compile(r'^(?P<day>\d\d)/(?P<month>\d\d)/(?P<year>\d\d\d\d)$')

def parse_date(input):
    if not date_pattern.match(input):
        raise ValueError("'%s' is not in DD/MM/YYYY format" % input)

    day, month, year = map(int, input.split('/'))
    d = datetime.date(year, month, day)
    if d > datetime.date.today():
        raise ValueError("'%s' is in the future" % input)

    return d
  1. We validate the date against a regex so that we know what we're dealing with.
  2. We split up the input string and construct the date.
  3. We test that the date is not in the future, and return the result.

This implementation is better than the CSOD in a number of ways:

  1. It uses a regex to validate the format of the input string with is so much more faster/expressive/productive that writing our own validation code.
  2. We use the platform's built in Date object rather than storing and manipulating the year/month/day ourselves which helps to avoid all kinds of silly bugs.

Unfortunately, we still parse and construct the date ourselves, duplicating functionality present in the standard library.

In Python, Take II

A second attempt, this time we're going to rely on strptime rather than parsing the string ourselves:

def parse_date(input):
    d = datetime.datetime.strptime(input, "%d/%m/%Y").date()
    if d > datetime.date.today():
        raise ValueError("'%s' is in the future" % input)
    return d

This implementation is even better as it relyies on strptime to handle the parsing/validating and the only real code that we write is testing if the date is in the future which is our logic.

In JavaScript

An implementation in JavaScript because the CSOD was submitted in JS. This is essentially a transcription of the first Python implementation as none of the JS date parsing utilities seem to take a formate string:

date_pattern = new RegExp('^\\d\\d/\\d\\d/\\d\\d\\d\\d$');

function parse_date(input){
    if(!date_pattern.test(input)){
        alert("'" + input + "' does not conform to the dd/mm/yyyy format");
    }

    ordinals = input.split('/');
    d = new Date(ordinals[2], ordinals[1] - 1, ordinals[0]);
    if(d > new Date()){
        alert("'" + input + "' is in the future");
    }

    return d;
}

It would be preferable to try and achieve the simplicity of the second Python implementation but that would require writing (or including third party code) comparable to strptime.

Aside

It is very, very, strange that months are 0 indexed while day and year are not in the Date constructor:

js> new Date('12/02/2008')
Tue Dec 02 2008 00:00:00 GMT-0500 (EST)
js> new Date(2008, 12, 02)
Fri Jan 02 2009 00:00:00 GMT-0500 (EST)
js> new Date(2008, 11, 02)
Tue Dec 02 2008 00:00:00 GMT-0500 (EST)

Seriously, what's up with that?