Remember when this was the most minimalist, uncluttered homepage on the web?



Design anti-pattern: "Results per page"

Can we please leave this behind:
Designers, you drew up the results page, you know how many results it scales to while remaining usable. So just pick that and be done with it.

A lesser sin (also pictured) is choosing the sort order at query time. Just pick for me, and give me visual indicators that I can re-sort right on the results.


Learning with Bridgehead

Earlier this week, I had the immense pleasure of attending Bridgehead's course on coffee / espresso. The crowd was awesome - all coffee lovers looking to take their espresso-making skills up a notch. Held at The Urban Element, which I've been dying to visit for some time, the course covered two main topics:

The first part (by Mr. Ian Clark), on identifying flavour components of coffee, tasting demonstrations, etc., was interesting but of limited everyday use for me. I (and I suspect I'm far from alone in this) tend to find one or two varieties of beans I like and always go back to those. Still, lots of fun.

The second half (by Laura Perry), gave me much to think about as I prepare my customary morning latte. When pulling an espresso shot, I've often been focused simply on trying to coax my equipment into getting the extraction time right, with little attention given to tamping technique and temperature control.

Biggest discovery of the class? The amount of coffee Laura packs into a portafilter. I've probably been under-dosing my shots for years now!



Sensible Defaults

As developers, we hear over and over again about the importance of sensible defaults..
I can't say I find the iTunes 9 welcome screen terribly useful, but this is probably the first time I've ever seen software with the correct default setting for "Show this window when $APP starts". (The correct answer, btw, is NO.)

Maybe they finally learned something from all the backlash around Quicktime auto-starting on Windows?


Design I like: Ottawa recycling collection calendar

No complaining today - I'm so happy when I stumble across an element of visual design that's so well done I can't help but stop, smile, and consciously notice how pleasant it is. I'm doubly surprised and delighted if it's from the government, because, you know, bureaucratic design-by-committee isn't exactly renowned for its tasteful results.

Good Design: September Recycling Calendar
  • I love how the grid itself doesn't contain a single written word.
  • I enjoy the simplicity of the blue/black lines indicating which type of recyclable materials are being collected this week. (Although this requires explanation if you're not from Ottawa - blue boxes are used for glass & plastic, black boxes for paper and cardboard.) I applaud the designer for targeting his work to his audience (Ottawa residents), for whom the blue/black bars are self-evident.
  • I have a soft spot for the cute leaf icon (indicating pickup of garden clippings, again, obvious if you live in Ottawa, so it's the know-your-audience principle again).
  • But most of all, the stroke of genius is the arrows indicating that the statutory holiday on September 7th offsets regular pickup dates by 24 hours. An incompetent designer would've required a paragraph of text to explain that. This author does it with a big orange X and five arrows. (Note how the arrows and the X are painted in the same orange to tie them together, and that orange isn't used anywhere else in the grid.)
I find this calendar extremely inspiring. Hat tip to you, anonymous designer. I've had Edward Tufte's The Visual Display of Quantitative Information on my Amazon wishlist for a while, but I think noticing this tonight is the push I needed to finally go ahead and order.


Conversations with strangers

[JP walks into the sauna, two guys are just sitting.]

Stranger 1: hey
JP: hey [sits]
Stranger 2: we're shooting a movie.
JP: mm-hmm
Stranger 2: it's called "Sweaty Fuckers 2"
JP: hah
Stranger 2: it's a porno
JP: yeah, I wonder if a video camera would survive in this hot, humid environment
Stranger 2: THAT'S his comment? You've got nothing against the gay porno, but you want to know if the humidity would damage the camera?
JP: pretty much; this is Kanata, dude

This is so typical of conversations I have.


Eclipse: Find the Breakpoint!

Today's user experience callout is Eclipse JDT. Let's play find the breakpoint:
Find the breakpoints

Here's a hint:
Find the breakpoints

Maybe it's more obvious if you compare with a search hit that doesn't have a breakpoint on the same line:
Find the breakpoints
(The breakpoint is on the top result)


The ideal solution would still draw both icons in the same amount of space. After playing around a bit with transparency on the search arrow (verdict: looked terrible), I've come up with two possibilities:
  1. Draw everything as above, but when the mouse hovers near the search result arrow, fade it out to 20% opacity. Fade it back in to full opacity when the mouse leaves the area. (Lots of work.)
  2. A much simpler option would be to move the search arrow about 5px to the left, and chop off its leftmost 3-4 pixels, as in this mockup, to allow seeing both a search result and a breakpoint:
    Breakpoints (mockup)
    Neat, right? What do you think?


flickr uploadr

Ah yes, on the subject of usability:


Does anyone else think the options should be "Stay here" and "Go to Flickr & Exit" ? I always end up hitting one of the two buttons, then ⌘+Q to quit uploadr.

Drive me crazy, will you?

I'm a dock-on-the-left guy.
I might adore using OSX, but for some crazy reason, whenever I launch gvim, this happens:
I have no idea why this is the only app on my system that doesn't respect the dock's position when placing its window on startup. If anyone knows how to fix it... please post!

And yes, I know this is a small thing to complain about. I have Windows XP at work, and OSX with a copy of gvim that randomly bounces around the screen every 60 seconds would still be more pleasant to use.


Overheard in Ottawa

"No, we were waiting for you at the *other* 'Pho Bo Ga La with a blue sign on Somerset'..."


This Week in Food

Ice Cream at The Piggy Market

A few coworkers recommended I check out Pascale Berthiaume's (who provides the ice cream for the Wellington Gastropub) ice cream, now being sold in Westboro at The Piggy Market. They're located in the rear half of the old, now defunct, Westboro Market.

The Piggy Market

I gave them a first visit this week to check them out, and so far I've a very positive impression of the place. I stopped in on my way home from work on Thursday, around 20:45. They had been closed for an hour and forty-five minutes, but they still let me in to buy ice cream as long as I paid cash (the charge machines and register were closed for the day); they get 6 out of 5 stars for service. Again, on a coworker's recommendation, I picked the Peanut Butter Salted Caramel flavour.

Terrific Ice Cream

Outstanding! And check out the ingredients: yolks, cream, sugar, peanut butter, caramel, salt, vanilla. That's it! Goes for 10$ a tub.

Ron Eade on Butter Prices

Omnivore's Ottawa weekly supermarket specials roundup includes these few words from Mr. Eade:

Anyway, my gold star of the week goes to three chain stores, Price Chopper, Food Basics and Superstore Loblaw for selling various brands of butter, salted or unsalted and sometimes both, at $2.97 to $2.99 a pound. Really, I can't understand how stores get away with charging $4 or more for a pound of churned animal fat. (I'll bet it has something to do with the government-sanctioned cartel marketing board that controls milk prices. Reach for the sky, buddy, this is a stick-up.)

Now a complaint like this about the price isn't too punchy in a vacuum - we need to put it in context to see if there's really anything to gripe about when it comes to butter prices! How does this compare to the rest of your grocery basket?

Agriculture and Agri-Food Canada provides a bit of historical data for retail prices of various dairy products.

They also provide an overview of the butter sector, but this report is quite misleading; it significantly understates (by 50%!) the price of butter as they got the units wrong, claiming an average price of 3.84$/Kg in 2005. In Table 2, they present the AC Neilsen retail price survey data in $/Kg, adjusted to what I assume are 2006 dollars, but the Neilsen price survey measures the price per pound of butter (454g). I wonder how many people noticed the error.

It's best to ignore the above report then, and go back to the original data, in nominal dollars per pound of butter. As we can see from the series representing the price of a pound of butter, retail has crept up towards the 4$ mark for the last few years, but the nominal price, from 2006-2008, has hardly increased.

I've plotted this data against milk prices and the Core Consumer Price Index (which includes dairy products, btw), using 2004 as a baseline:

So it seems that although the price of butter has shot up a bit faster than core CPI around 2004-2005, it's been relatively flat even in nominal dollars over the last three years, meaning it's actually gotten cheaper in real terms.

Hardly cause for panic! Happy cooking.


Caprica Pilot: They had Linux, DocBook and Windows on Caprica! (The Cylons probably rebelled after trying DocBook)

So now that BSG is gone, we can turn to the new Caprica series for our murderous Cylon fix.

I saw the first episode tonight and although the first fifteen minutes scared me a little (Oh no! It's The OC in space!) it got a little better after that and I think it's promising; the musical score by Bear McCreary was top notch as always. I love how they finally flipped the bird at Star Trek TNG 15 years after it ended: Screw you Gene Roddenberry - if we had holodecks, sex, drugs and indulging murderous fantasies are EXACTLY what we'd use them for. Recreating Sherlock Holmes stories or a spa with mud baths staffed with creepy clowns? Not so much.

Oh and I noticed this (large version linked): they apparently had DocBook, Linux and some old version of Windows on Caprica:
They had Linux, Windows and DocBook on Caprica!


CampfireJ: a Java API for posting to 37signals' Campfire

My team at work has been considering trialing the Campfire app for intra-team communication. I've played with it a bit and so far I like it (a lot), but as with anything, adoption by the team is going to be the make-or-break factor.

I found myself wishing, though, that I had a way to post messages and notifications to Campfire chatrooms from the command-line or from Ant build scripts, used by our continuous integration system. There's a Ruby Campfire API already, but that doesn't really help me. So I wrote a simple Java API this weekend that posts messages over HTTP, with the self-imposed requirement it should have ZERO external dependencies outside the JRE. It's up here on Github and called CampfireJ; license is WTFPL.

Programmatic usage should be pretty easy to figure out, and the javadocs will be generated by the build, but what I want to call attention to here are the command-line interface and the Ant task.


Once you have campfirej.jar, you can use it directly as a command-line app like this:

$ java -jar campfirej.jar -u user -s subdomain -p password -r "Room 1" -m "Hello world" [--paste]

This will send the message "Hello world" to the room "Room 1" on your Campfire subdomain. I'm using this from a script for Out-of-Office notifications, you can easily find other uses. I think a useful addition to the program would be to allow omitting the -m argument and reading stdin for messages, that shouldn't be too hard to add.

Ant script

The real reason for hacking this together was so I could send Campfire notifications from a CruiseControl build/CI system, so I had to support sending from Ant.

Here's a sample invocation from a build script:

<project name="campfirej-ant-test">
<target name="test">
room="Room 1"
message="Hello from ant" />

Cheers, and contact me with desired improvements, the library is just a few hours old so obviously it's not fully-featured yet.


Booking a table

This impressed me a lot, it's very slick:

GMail managed to look into this restaurant confirmation email and see that it referenced an event at a specific time, so it created a link to add to my Google Calendar!

Following the link to their website reveals, however, that reservations are done through some third-party widget that's not OpenTable.

It's a shame that restaurants in Ottawa are fracturing their reservation systems across several providers like this, just like online classifieds for the city are fractured across Kijiji, Craigslist and UsedOttawa, reducing their utility for everyone. Restaurant reservations are the sort of service where these third-party hosted reservation service providers can hugely benefit from network effects. Once one service reaches a tipping point (like it seems OpenTable is achieving in some US cities), it will enable the creation of location-aware mobile apps and a whole bunch of other useful services for finding restaurants around you.

It seems to me that as a restaurateur, you'd have see huge benefits from going with a large provider that's essentially advertising your restaurant for you by publicly listing availability of tables. You'd want to go for the dominant service that could offer this, which hasn't (yet?) happened with OpenTable in Ottawa...


That didn't take long


Wow, the Kanata Costco sells Manchego cheese now. In three years it went from unobtainable to completely mainstream.

Three years ago, you could buy some 6-month and 12-month manchego at La Bottega. If, you know, you got lucky. Very lucky. And wanted to pay about 60 bucks a kilo.

Now it's at Costco for 35$ a kilo.


Resource Acquisition over Broadcast Channels (Geek Factor: 9/10)

I've converted most of my workplace to my RABC protocol when requesting favours / equipment. Here it is:



This document provides a message-exchange pattern (MEP) for
requesting and attributing resources over a shared broadcast
channel (RABC), such as an electronic mailing list (see
RFC822, RFC2919).


This section describes the status of this document at the time
of its publication.

This document is the second public Working Draft of this spec-


The following nomenclature is defined:
Alice Requester
Bob Responder to Alice's request
Charlie Responder to Alice's request
Dave Responder to Alice's request
L Broadcast destination [email list or message board]
R Resource being requested

Note that R need not be a physical resource, it may also be a
service. Examples of common resource requests include a ride
to a place of business, a piece of networking equipment, a
driver to pick up a food order, etc.


A common anti-pattern this protocol addresses is the lack of
notification provided to non-selected responders informing
them of which offer was selected:

(1) Alice -> L Request(R)
(2) Bob -> Alice Offer(R)
(3) Charlie -> Alice Offer(R)
(4) Dave -> Alice Offer(R)
(5) Alice -> L "Thanks!"

In the above example, before MESSAGE 5, Alice may or may not
have sent the private message:

(6) Alice -> Bob "Thanks, I'm using yours"

Charlie and Dave are now left wondering if the thanks was di-
rected to them, and if not, which offer was accepted. From
their point of view, MESSAGE 5 was ambiguous.


The only change required to the above pathological scenario is
for MESSAGE 5 to include an extra identifier. Requesters using
RABC to request a resource MUST include the identifier of the
party whose offer was accepted in their broadcast thanks mes-
sage. Any thanks expressed in this message is implicitly di-
rected at ALL offering responders, even if they are not named.

Sample exchange:

(1) Alice -> L Request(R)
(2) Bob -> Alice Offer(R)
(3) Charlie -> Alice Offer(R)
(4) Dave -> Alice Offer(R)
(5) Alice -> L "Thanks BOB, received R"


In some situations, a responder may wish to offer a resource,
but not have that fact rebroadcast in the thanks message. A
typical case for this would be if the responder is concerned
that him offering a resource he's holding, albeit temporarily
(such as a piece of equipment), might publicly imply he didn't
really need that resource in the first place.

This is solved by including a unique anonymous key in the Of-
fer message. There are no format restrictions on this key, it
can be any string the responder reasonably believes will be
unique given the size of L:

(1) Alice -> L Request(R)
(2) Bob -> Alice Offer(R, ANON_12345)
(3) Charlie -> Alice Offer(R)
(4) Dave -> Alice Offer(R)
(5) Alice -> L "Thanks ANON_12345, received R"


It is allowable for a requester with an outstanding request to
repeat this request after a personally-defined timeout. When
repeating an unsatisfied request, a requester MUST reply to
his original request keeping intact its subject field. This
allows members of the broadcast channel L to use message
threading features in their mail clients to easily collapse
request retransmissions into the original request's thread.

The retransmitted request thus replaces the original. Members
of L consider MESSAGE 1, MESSAGE 2 and MESSAGE 3 a single re-

(1) Alice -> L Request(R)
(2) Alice -> L RE: Request(R)
(3) Alice -> L RE: Request(R)
(4) Dave -> Alice Offer(R)
(5) Alice -> L "Thanks DAVE, received R"


v0.1 jpdaigle 2008-05-20
Initial revision

v0.2 jpdaigle 2008-06-05
Added STATUS section, implicit thanks to IMPLEMENTATION

v0.3 jpdaigle 2009-03-10
Added anonymous thanks

Can I get some quiet?

It was too loud in my cube so I moved to the lunchroom to finish some doc reviews (no coding today). Of course, since the universe tends toward maximum irony, a bunch of coworkers decided the lunchroom would be the perfect place to start chatting away. Nice, thanks a lot.


Spotlight Effectiveness

What happens when you hit ⌘+space, then type "digi"?
Spotlight Effectiveness by you.

And how effective is this "Top Hit"?

You'd think there would be some sort of frequency counter kicking in after the first hundred times I manually arrowed-down to the right result, to train whatever rule determines the Top Hit.