Video: Uncle Bob at NDC2009

by garth on July 9, 2009

Uncle Bob Martin was at NDC2009, and Rune Grothaug just posted the videos. You can also watch them as streams from the NDC2009 site.

Downloads from Rune’s server to Australia are pretty slow, so I’ve put Uncle Bob’s videos on S3 as an experiment. Please ONLY download them via BitTorrent:

“Lifting a Dreamer”, by Yiying Lu

After hearing that the Fail Whale article on Wikipedia was scheduled for early deletion, I felt compelled to help edit it to meet the standards of the Wikipedians — at least, the inclusionists.

It was — and still is — quite important to me to clarify the relationship between the picture of the whale, the name the community gave it, the personality projected by the community on it, and the @failwhale account created by @seanosteen.

Luckily, James Governor had written an article “The Designer Who Gave Us Fail Whale and Showing The Whale”:

I had assumed Twitter was using designs it had paid for for its Fail page, but apparently not. Courtesy of John Wilson’s comment on my last blog about Twitter, a couple of hours ago, came news the famous whale is a stock shot from here.

Yiying Lu is the fantastic designer behind the image we all see, and love, so much. Frankly I think Twitter should use more of their work to give us some variety, and also give Yiying a lot more credit. How about a service sleeping owl?

Thanks to James’ detective work and Kapanka’s edit, the Wikipedia article already linked to Yiying, but it lacked a lot of detail.

So, I sent Yiying a tweet and an SMS, and we ended up talking on Skype. I wish I’d recorded it, as she’s great interview talent. All I can do here is report the story:

Yiying was studying at UTS when she drew “Lifting a Dreamer”. To help support her studies, Yiying put it up on iStockPhoto not realising that the site was more for generic images — say, a mobile phone on a white background — than for personal works of art.

Yiying isn’t sure exactly when Twitter downloaded the picture, and so can’t nail down exactly what they paid for the license to use it, but estimates it was around USD$5-10.

Eventually, someone let Yiying know: “your whale is getting bigger! people see it every hour…”, she saw it on Twitter, and @tlimongello contacted Yiying from the USA to get her permission to put the Fail Whale on some T-shirts. @seanosteen had already registered for fan blog. After some discussion, Yiying set up the online store to meet community demand for Fail Whale memorabilia. She also deactivated the image on iStockPhoto to prevent further commercial use of the image.

To this date, nobody at Twitter has yet contacted Yiying. As of the last sightings of the Fail Whale — soon to be rare, about which I’ve got mixed feelings — the image remains unattributed. So, I’m delighted to spread the word about the true origins of the Fail Whale.

Back to that delightful mix of image, name, personality, and tribute persona, though: I think Yiying nailed it during our call when she said:

“This is a social object — it’s not only my thing. It’s my graphic, but how this graphic got famous… it’s the social power, the Twitter power.”

That Twitter power is now engaging with the artist, not just her image.


Nudi of the Day

by garth on May 15, 2008

Thanks to @codinghorror: David Doubilet’s amazing nudibranch pictures in National Geographic magazine.

David Doubilet\'s amazing nudibranch pictures in the National Geographic

(The title is homage to a web site that used to exist. I can’t find it, now.)


I’m glad I stumbled across Patrick Altman’s tweet about a “default bug in Django“. I’d never have guessed you can pass a callable to a field’s default= argument, otherwise. That’s quite a powerful idiom, and I think I’ll use it a lot.

To balance the karma, I’d like to post a quick reminder to everyone else that expressions in default arguments are calculated when the function is defined, not when it’s called. In Patrick’s code, for example, all objects created in the same running session got the same timestamp. Try this in the Python interactive prompt:

>>>import time
>>> def report(when=time.time()): 
...     print when
>>> report()
>>> time.sleep(5)
>>> report()

Until the interpreter quits, you’ll always get the same timestamp. The correct way to go about this is to default to None or some other sentinel, then replace it inside the function:

>>> def report(when=None): 
...     if when is None:
...         when = time.time()
...     print when
>>> report()
>>> time.sleep(5)
>>> report()

Now that you know about that blunder, you should be able to figure out what’s going on with this second classic blunder when using default arguments in Python:

>>> def spam(eggs=[]): 
...     eggs.append("spam")
...     return eggs
>>> spam()
>>> spam()
['spam', 'spam']
>>> spam()
['spam', 'spam', 'spam']
>>> spam()
['spam', 'spam', 'spam', 'spam']


Twitter Emergency Backup

by garth on May 5, 2008

Dave Winer has been thinking about ways to preserve the Twitter community even when Twitter is down. His latest effort is a web service to save Twitter feeds and expose their content via another feed.

I tried it out, but couldn’t parse the response:

Python 2.5.1 (r251:54863, Jan 17 2008, 19:35:17) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import xmlrpclib, urllib2
>>> twittergram = xmlrpclib.Server("")
>>> content = urllib2.urlopen("").read()
>>> twittergram.saveFeed('garthk', '*****', content)
Traceback (most recent call last):
  File "", line 1, in 
  File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/", line 1147, in __call__
    return self.__send(self.__name, args)
  File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/", line 1437, in __request
  File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/", line 1201, in request
    return self._parse_response(h.getfile(), sock)
  File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/", line 1335, in _parse_response
  File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/", line 547, in feed
    self._parser.Parse(data, 0)
xml.parsers.expat.ExpatError: mismatched tag: line 10, column 7

I’ll investigate later.

I’d love to wade into this kind of problem domain, perhaps using Google App Engine for hosting so I didn’t have to worry about usage spikes. Feed backup is a brilliant start. We also need to helping our followers find the feeds, and I’m sure more thought will yield more areas for funimprovement.


Twitter’s Famous Last Words?

by garth on May 2, 2008

Just before Twitter went completely dark, I saw this:

last words

I’m sure it’ll be back up soon, but ’twas nice to have a laugh before hitting the sack.

(Speaking of irony: I have 666 unread items in my feed reader’s Productivity folder…)

Wireless network “appears compromised”

by garth on January 19, 2008

I’m seeing a lot of this disturbing little error message: “The wireless network appears to have been compromised and will be disabled for about a minute.”

The wireless network appears to have been compromised...

A poke around the Internet doesn’t show much other than other people complaining about the same problem. Some find the only way to solve the problem is to disable WPA. I’m not so sure that’s a smart idea. I hope there’s a fix for this in 10.5.2.

[If you’re getting this on what you think is a Django-only feed, it’s because the community feed administrators haven’t yet updated their subscription to point to my Django posts only. Sorry about that.]


Zephyr’s sense of humour, age 2.5

by garth on October 24, 2007

Zephyr, this morning:

Zephyr big boy. Daddy big boy. Mummy big girl. Willow big chicken pox.

{ 1 comment }

QuickPost WordPress Plugin – Version .4 is now available

So far, so good, except for the database error (wp_categories doesn't exist) under WordPress 2.3…


Yep. Quadruple-barrelled.

I always wondered what'd happen if one double-barrelled person married another double-barrelled person. Reg Drax here seems to be Exhibit A. 

Our kids are double-barrelled. To save them from Reg' fate, we carefuly chose their middle names so they could ditch the two surnames entirely if necessary. 

Thanks, Merlin!