Friday, June 17, 2005

The “Baby Name Wizard’s NameVoyager” is a Java-based, web UI for looking at the popularity of baby names over time. When we were deciding on names for our newborn daughter, I would occasionally pull this up to see how common/rare a name was.

On its surface, it’s simply an area chart. For a given name or set of names, you see a names popularity expressed as “usage per million babies” over time (with decades on the X axis). From a visualization perspective, it’s interesting because it’s constantly updating as you type in a name. You can choose to view names for boys, girls, or both, and the area chart updates as you type — type in “Alex” and you’ll see Alex, Alexa, Alexis, Alexander, Alexandra, Alexandria, and so on. I like how, in addition to updating constantly as you type, it also animates the updates leaving the whole interface feeling very smooth.

Not that you’ll need to have the Java runtime on your machine in order for the applet to work.

posted on Friday, June 17, 2005 10:39 AM Mountain Daylight Time  #    Comments [0]

I created a new category for the blog… InfoPorn. It’s a name I got from Wired Magazine, but is a great way to refer to a longtime passion of mine: data visualization. Most of my development experience has been with applications that take high-volume data and aim to bring the interesting bits to the surface. Charts and graphs are great, but the visualization world has exploded lately with lots of online examples, Flash applications, entirely new visualization styles, and discussion groups all cropping up all over.

With the similar explosion in weblogs and RSS, it makes it very easy to find others who are interested in data visualization, as well as pointers to cool examples online. This category will be used to link to examples, mention ideas I’m tossing around, and so on.

posted on Friday, June 17, 2005 10:20 AM Mountain Daylight Time  #    Comments [0]

Whew.

Elizabeth Rosslie Donnici was born on Tuesday, June 14 at 3:27pm. She was born via c-section and came out screaming. She weighed in at 6 lbs 11 oz, and is just over 19” long. She looks a lot like her older sister did as a newborn. All is well with her and Michelle and both are now home and getting lots of rest (in 2–3 hour blocks, that is).

posted on Friday, June 17, 2005 10:07 AM Mountain Daylight Time  #    Comments [0]
 Saturday, June 11, 2005

There’s an interesting discussion going on in the comments of Eric Wise’s blog about interface implementations versus type inheritance. I respectfully disagree with rlewallen’s post that an interface implementation serves as a "has a" relationship -- and most OO literature would disagree with that notion as well. "Has a" implies a composite relationship where a whole is made up of parts -- An Order object "has a" OrderDetails object. An Invoice object "has a" Customer object. That an interface "has" properties and methods" isn't the same thing, as any type "has" members -- class, interface, struct, and so on.

An interface defines an "is a" relationship... SqlConnection "is a" disposable object (e.g. implements IDisposable). A collection "is a" enumerable object (e.g. implements IEnumerable). Your Customer "is a" comparable object if it implements IComparable.

In terms of when to use one or the other, there are a couple of thoughts that come to mind for me.

First… My feeling is that inheritance is widely overused and that it often paints developers into a corner. Deep hierarchies tend to propagate themselves in that specialization rules out wide reuse… so when the developer needs something that’s “close to, but not quite” an existing class, they’re typically going to have to subclass again. This isn’t a .NET specific thing at all, as I saw it a lot in my Java days and in other OO languages (Delphi, VFP, and even PHP where OO isn’t enforced). Note that I’ve worked with C++ as well, but am not a fan of multiple inheritance environments. In general, I think developers are better served with composite (“has a”) relationships over inheritance. Make small building blocks and then “compose” them to get big components.

The key question is “when do I use an interface versus a implement base class?”. Years ago, someone (and I’ve long since forgotten who the author was) explained somewhere that an interface makes sense when a type “is also something else”. That is, a type that implements IComparable might also be a Customer, a string, an Invoice, and so on — but the manner of comparing them is very different. So while I know I want to compare two Customer types or two Invoice types, I really don’t want to assume anything about how they’re compared.

A type that implements IDisposable might be a SQL connection, a file handle, a graphics object, and so on. If all of these things had to inherit from either a “disposable” implementation, you’d have some unwieldy class hierarchies — and ugly code as the implementation for disposing of these things is very different. So if there’s no shared functionality (which would imply using a base class that provides it), then an interface lets you talk to widely different objects using the interface contract. The example I often use is:

A Car, Truck, and Boat might all be subclasses of the MotorizedVehicle base class. You have shared implementations here, dealing with starting an engine, basic navigation, and other functions related to a mototized vehicle. However, the MotorizedVehicle base class might implement the IDriveable interface – providing Steer, Accelerate, Decelerate, etc. While you could avoid the interface and declare those members on the base class, using IDriveable lets you implement behavior for your Bicycle, Scooter, and other non-motorized types that can be driven.

posted on Saturday, June 11, 2005 4:57 AM Mountain Daylight Time  #    Comments [0]

Sheesh, months have gone by since the last post. In the meantime, I’ve got a Firefox bookmarks folder full of things I wanted to post, comment on, ideas to toss out, etc.

It has, however, been a very busy few months.

  • I hadn’t mentioned it on the blog before, but my wife is pregnant. She’s due July 1, but we learned yesterday that the baby is in a breach position (feet down) and shows no signs of turning… so we’re scheduling a c-section this week rather than risk breach delivery. We know we’re having a girl (the ultrasound tech guarantees it) and Allie, our 5–year old, couldn’t be more excited about being a big sister.
  • Got through the spring youth soccer season, coaching two teams — Allie’s U-5 team (“herding” more than “coaching”) and the U-14 boys team I’ve coached for years. They’re now aged out of our local soccer program, but many will be playing in high school.
  • Got a spare bedroom cleared out, painted, decorated, and mostly furnished as a nursery.
  • Busy as can be at work, which is a great thing. I also moved up to a new role (VP, Engineering) to add to my duties as the lead architect.
  • The MLS soccer season is underway, though this is more a source of frustration than anything else these days.
  • Got a couple of side development projects underway (call ‘em personal R&D), stuff around the house, etc.

Anyway, there ya have it… I’m hoping to get through some of those “blog this” bookmarks this weekend before the fun starts next week.

posted on Saturday, June 11, 2005 3:34 AM Mountain Daylight Time  #    Comments [0]
 Sunday, February 27, 2005

For some reason, I find various online "personality" tests interesting, mostly because I'm curious about how the code works under the hood. There are so many subtleties involved, including the test-takers self-perception, their ability to be honest with themselves, and the difficulty of measuring complex traits with "Agree/Disagree" types of questions.

Anyway, there's no shortage of these types of things online and I came across this one via Peter Provost. The results below are probably more accurate than not for me… again, if I’m being honest with myself. :P

Cattell's 16 Factor Test Results
Warmth ||||||||||||||| 50%
Intellect |||||||||||||||||||||||||||| 90%
Emotional Stability ||||||||||||||| 50%
Aggressiveness |||||||||||||||||| 54%
Liveliness ||||||||||||||| 42%
Dutifulness ||||||||||||||||||||| 70%
Social Assertiveness |||||||||||| 38%
Sensitivity ||||||||||||||| 42%
Paranoia ||||||||||||||| 46%
Abstractness |||||||||||| 38%
Introversion |||||||||||||||||||||||| 74%
Anxiety ||||||||||||||| 42%
Openmindedness |||||||||||||||||| 54%
Independence |||||||||||||||||||||||| 78%
Perfectionism |||||||||||||||||||||||||||| 82%
Tension ||||||||||||||||||||| 62%
Take Cattell 16 Factor Test (similar to 16pf)
personality tests by similarminds.com

Factor low score high score
Warmth cold, selfish supportive, comforting
Intellect instinctive, unstable cerebral, analytical
Emotional Stability irritable, moody level headed, calm
Aggressiveness modest, docile controlling, tough
Liveliness somber, restrained wild, fun loving
Dutifulness untraditional, rebellious conforming, traditional
Social Assertiveness shy, withdrawn uninhibited, bold
Sensitivity coarse, tough touchy, soft
Paranoia trusting, easy going wary, suspicious
Abstractness practical, regular strange, imaginative
Introversion open, friendly private, quiet
Anxiety confident, self assured fearful, self-doubting
Openmindedness closeminded, set-in-ways curious, exploratory
Independence outgoing, social loner, craves solitude
Perfectionism disorganized, messy orderly, thorough
Tension relaxed, cool stressed, unsatisfied

posted on Sunday, February 27, 2005 9:55 AM Mountain Standard Time  #    Comments [0]

Don Box is getting the itch to write another book. Some of his previous books are considered must-haves for their subjects. He’s not sure which type of book he wants to write next, but is soliciting opinions on his blog.

My vote would be “B” without the COM pieces. Given that we’re just now learning more about Indigo, and that there’s a lot of “what is it and why do I need it” type of curiosity around it, the timing would seem to be perfect for a definitive Indigo text. And who better to write it?

COM’s not dead, but neither is it on an upward trend.

posted on Sunday, February 27, 2005 9:40 AM Mountain Standard Time  #    Comments [0]
 Tuesday, February 15, 2005

This blog was getting peppered with comment spam a while back and it became too much of a pain to deal with. So I turned off the comments feature and resolved to take care of it “one of these days”.

Today was that day.

I finally checked out a variety of options that are out there for dealing with comment spam on .Text sites. The one that seemed to have the biggest “bang for the buck” (where bang is the solution’s effectiveness and buck is the time spent implementing/managing it) was the Clearscreen HIP-CAPTCHA control from Miguel Jimenez. The part that took the longest was probably FTP’ing the changed files to the server. It doesn’t require a rebuild of the .Text source and seems to be working well in my brief testing.

I still have a bunch of stuff I want to do with my .Text install, starting with building it from source and continuing through a new skin design. But for now, this’ll do.

So now you have to enter some random code before you can post a comment. One thing I’ve noticed is that it sometimes has too much distortion in the display… in those cases, just hit Refresh on your browser and it’ll generate a new code. Shoot me an email if you run into any problems with it.

posted on Tuesday, February 15, 2005 4:34 PM Mountain Standard Time  #    Comments [0]

Claiming the feed…

Technorati Profile

posted on Tuesday, February 15, 2005 3:37 PM Mountain Standard Time  #    Comments [0]
 Wednesday, February 09, 2005

The Google Maps service was unleashed yesterday… holy crap, that rocks. Some notes:

1. Watch how rarely the full page refreshes. I haven’t looked under the hood to see how they do it, but I’m assuming some iframe tags and a lot of Javascript. One thing’s for sure — between this, Google Suggest, and Gmail, Google is pushing the envelope for what can be done in a web UI.

2. When it shows a pushpin on an address, clicking the pushpin opens a little callout box with a detailed map for the surrounding area. They even draw a shadow behind that callout box on the underlying layer. That’s slick.

3. You can search on all sorts of stuff. In the Search box at the top of the window, I had luck with addresses, partial addresses, city names, airport codes, zip codes, company names, and so on.

4. You can get at directions from just about anywhere. The little pushpin callouts, the main search results, and so on. Clicking the directions “From here” link in the callout box changes the box to a sort of “sub-search” that lets you provide the “To” address.

5. The searches are context-aware or location-aware. For example, start from the top (new browser window/tab) and search for “Sacramento”. The result is the city in California. Now search for “Kinkos” and you see pushpins for all of their locations in the Sacramento area. Close the tab/window and start fresh… this time, search for “Denver” first and then “Kinkos”. Now you have Kinkos in that area… so each search is aware of the one before it and/or the boundaries you’re currently looking at.

6. I combined it with SlickRun (which I’m addicted to) for a very fast mapping reference. For those that use SlickRun, just use the /?q= querystring, but provide the SlickRun word-replacement macro ($W$). http://maps.google.com/maps?q=$W$ is the command. Assuming your MagicWord is “map”, you can then enter “map boulder”, “map 123 main street, denver, co”, or “map sfo”. Way cool.

posted on Wednesday, February 09, 2005 4:26 AM Mountain Standard Time  #    Comments [0]