<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0" xml:base="http://robbymacdonell.com">
<channel>
 <title>Robby Macdonell</title>
 <link>http://robbymacdonell.com</link>
 <description />
 <language>en</language>
<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/robbymacdonell" /><feedburner:info uri="robbymacdonell" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
 <title>Uber is pretty rad.</title>
 <link>http://feedproxy.google.com/~r/robbymacdonell/~3/pfcj7ws4d0k/uber-is-pretty-rad</link>
 <description>&lt;p&gt;I find the need to take cabs about once or twice a month. I've had a couple not-so-great experiences, but it's generally ok. Certainly nothing I particularly look forward to, though. Last night I splurged and got a ride from &lt;a href="http://www.uber.com/?invite=tqa8p" target="_blank"&gt;Uber&lt;/a&gt;, a new towncar service that just launched in Seattle. It ended up being about ten bucks more expensive than a cab, but it was a &lt;em&gt;way&lt;/em&gt; better experience. They've done a really nice job of smoothing over a lot of the clunky or awkward aspects of normal car services.&lt;/p&gt;
&lt;p&gt;First, I didn't have to call a dispatch, just a one-click "come get me" button on the Android app. I could then see details about the driver that was coming to pick me up. I could also see a map of how far away he was, so I knew right when he'd arrive. He knew my info too, so from the moment I walked out to the car we were on a first-name basis with each other (that's a tiny detail, but it was a nice feeling). The car was really nice and there was free bottled water waiting for us in the back seat. The driver was really friendly and explained to us that once we got to where we were going, we could review the route he took us on to make sure he wasn't trying to boost the fare by driving us the long way. Here's what it looked like:&lt;/p&gt;
&lt;p&gt;&lt;img src="/sites/default/files/images/Uber%20Trip%20Details-1.jpg" width="550" height="314" alt="Uber Trip Details-1.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;It was pretty great. The quality of the experience was totally worth the extra cost. Would I use it over a taxi every time? Probably not, but it's nice to have another transportation option for those times when I want to fancy it up a little bit.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.uber.com/?invite=tqa8p" target="_blank"&gt;Check it out.&lt;/a&gt;&lt;/p&gt;
</description>
 <category domain="http://robbymacdonell.com/taxonomy/term/7">experiences</category>
 <category domain="http://robbymacdonell.com/taxonomy/term/8">ux thoughts</category>
 <pubDate>Mon, 15 Aug 2011 02:08:02 +0000</pubDate>
 <dc:creator>robby</dc:creator>
 <guid isPermaLink="false">43 at http://robbymacdonell.com</guid>
<feedburner:origLink>http://robbymacdonell.com/blog/uber-is-pretty-rad</feedburner:origLink></item>
<item>
 <title>Smashvillians.com. A little project I've been working on.</title>
 <link>http://feedproxy.google.com/~r/robbymacdonell/~3/19NAj1ZhPAU/42</link>
 <description>&lt;p&gt;Lately there are a few things I haven't gotten to do quite as much as I'd like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Design&lt;/li&gt;
&lt;li&gt;Code with Ruby&lt;/li&gt;
&lt;li&gt;Go to hockey games&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In an attempt to deal with all three at once, I've been messing around with building &lt;a href="http://smashvillians.com"&gt;smashvillians.com&lt;/a&gt;, a fan-content aggregator for my favorite NHL team, The Nashville Predators. It gave me a chance to dig into Rails 3 (which I've learned that I really like). It's also a fun opportunity to play around, UX-wise, with content aggregation and curation. There's a few concepts in that area that I think are really interesting and I'm looking forward to doing some more stuff with. Also, I get to &lt;em&gt;really&lt;/em&gt; nerd out about the Preds, and when I'm done actually have something to show for it.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://smashvillians.com"&gt;&lt;img src="/sites/default/files/images/smashvillians-crop.jpg" width="586" height="255" alt="smashvillians-crop.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
</description>
 <pubDate>Mon, 07 Feb 2011 08:29:47 +0000</pubDate>
 <dc:creator>robby</dc:creator>
 <guid isPermaLink="false">42 at http://robbymacdonell.com</guid>
<feedburner:origLink>http://robbymacdonell.com/node/42</feedburner:origLink></item>
<item>
 <title>Reflecting on recruiting.com</title>
 <link>http://feedproxy.google.com/~r/robbymacdonell/~3/NuF6j4s1gu8/reflecting-on-recruiting.com</link>
 <description>&lt;p&gt;Last Friday was my last day at Recruiting.com. Although I'm extremely excited about the new job I'm moving on to, I find myself looking back on the last four years with a lot of fondness. I figured I'd get all nostalgic and reflect for a bit. It was a fantastic experience that I've grown tremendously from.&lt;/p&gt;
&lt;h2&gt;I met the most awesome people:&lt;/h2&gt;
&lt;p&gt;So many amazing people have cycled through that place during my time there. My mind was constantly being blown by how much talent I was sitting right in the middle of. It was a fantastic learning experience. Whenever I talk to other people in the Seattle tech scene, they all bring up how many smart people that place churned out. Hopefully I don't bring the reputation down too much! &lt;/p&gt;
&lt;p&gt;In addition to being smart and amazingly talented, a lot of them were just plain awesome. I have some amazing friendships with ex-Jobster's. One of them even introduced me to my girlfriend who I just got engaged to, so the whole experience was worth it just for that alone.&lt;/p&gt;
&lt;h2&gt;I learned what a start-up feels like, for better or worse:&lt;/h2&gt;
&lt;p&gt;Three weeks after Jobster hired me (and moved me out to Seattle from Boston) we laid off 70 people. That blew my mind, and made me wonder what I had gotten myself into. I saw scrambling business models, pressure from VCs, more layoffs, bad press, worse press, god-awful press, and a slow steady attrition by the survivors of layoffs. &lt;/p&gt;
&lt;p&gt;I also saw people who believed so much in what they were doing and loved coming to work because of the impact they felt they could make. I saw a culture where it was expected that you'd question everything and challenge your assumptions constantly. It was somehow pulled off in a way where pretty much everyone grew from it. We learned what worked, and what didn't. More importantly, I learned that it was possible to do something about it when things weren't working. I had multiple "holy shit!" moments where we realized we had just stumbled onto something awesome in a way that no one else had thought of, and we could build things, and they'd solve people's problems in a real, meaningful way.&lt;/p&gt;
&lt;h2&gt;I built something I was proud of, and learned how to do it in a WAY I was proud of:&lt;/h2&gt;
&lt;p&gt;Things floundered for a while the first couple years that I was there, but in the last 18 months, we really nailed down a strong opinion about what we were there to do for people. We had a really clear objective and we stuck to it, even when it wasn't easy to do so. We had lots of really passionate arguments about whether this feature or that feature complimented or distracted from the core vision. We watched things that we built and felt really good about completely fail in user-studies, but we learned to do it quickly enough that it ended up becoming a good thing when it happened. I learned how to get deeper into the heads of people that I was trying to help (something that was particularly hard for me since I had never met a recruiter in my life before starting there). The deeper I got into it, the more exciting it became. &lt;/p&gt;
&lt;h2&gt;I learned that I really like doing this shit, after all&lt;/h2&gt;
&lt;p&gt;Building software is fun. I thought it would be at first, but I wasn't so sure about it during the first couple years out here. I thought maybe I had an idealized vision of it that was really far from reality. It sounded good on paper, but I got to thinking that maybe it's all just a lot of hard work that ultimately leaves you spending years on a single product that you weren't all that passionate about to begin with. I'm glad it all came full-circle. It could've EASILY ended up different. &lt;/p&gt;
&lt;p&gt;Anyone who's at all familiar with the Jobster saga knows that a lot of craziness went down over the years. But now that it's all behind me, none of that stuff really matters. It makes for some amusing memories, but what's really important to me is that I got to work with awesome people, build something awesome, and do it in a way that I feel really good about. I even made a few recruiters' lives a teeny bit better in the process. :) I have a much better sense of myself and what I find fulfilling as a result of it, and I can't wait to take the things I've learned to the next level.&lt;/p&gt;
</description>
 <pubDate>Tue, 07 Sep 2010 07:26:16 +0000</pubDate>
 <dc:creator>robby</dc:creator>
 <guid isPermaLink="false">41 at http://robbymacdonell.com</guid>
<feedburner:origLink>http://robbymacdonell.com/blog/reflecting-on-recruiting.com</feedburner:origLink></item>
<item>
 <title>Successful infographic: World Cup matches by Michael Deal</title>
 <link>http://feedproxy.google.com/~r/robbymacdonell/~3/7h0RxYuNN4Q/successful-world-cup-infographic</link>
 <description>&lt;p&gt;I feel like there are WAY too many infographics that fall down because they pack way too much data into the presentation. The ones that succeed tend to pick a single data-point (or a very small set of related data points), and use it to illustrate a single concept. It's so tempting to try to show off everything you learned from the data-set, but it can also get overwhelming, really quick. It's an easy trap to fall into, especially for the infographic designer that probably enjoys getting completely lost in data.&lt;/p&gt;
&lt;p&gt;Over the weekend, I came across &lt;a href="http://blog.umbro.com/2010/06/30/football-as-art-the-vital-stats-as-youve-never-seen-them-before/"&gt;this visualization&lt;/a&gt; by designer &lt;a href="http://www.mikemake.com/"&gt;Michael Deal&lt;/a&gt;, which I think is fantastic. He explores the matches in the World Cup by visualizing passes, shots on goal, and goals scored across an entire game. It's a lot of information, but it's insanely digestible. I'm an utter noob when it comes to soccer, and I'm kind of frustrated that I don't have my head wrapped around the game enough to enjoy watching it. But by spending just a couple minutes with this visualization, I can see a picture of the games that not only makes sense to me, it makes me want to learn more. &lt;/p&gt;
&lt;p&gt;For example: (click the images for the full infographic)&lt;br /&gt;
&lt;a href="http://blog.umbro.com/2010/06/30/football-as-art-the-vital-stats-as-youve-never-seen-them-before/" title="click to see the full infographic"&gt;&lt;img src="/sites/default/files/images/spain-switzerland-1.jpg" width="561" height="95" alt="spain-switzerland-1.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
This must have been a really frustrating game for Spain. They dominated on passes and shots for the entire game, but Switzerland ended up taking the match.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.umbro.com/2010/06/30/football-as-art-the-vital-stats-as-youve-never-seen-them-before/" title="click to see the full infographic"&gt;&lt;img src="/sites/default/files/images/italy-newzealand-1.jpg" width="561" height="83" alt="italy-newzealand-1.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
This shows how Italy was dominant in the game in a way that the 1-1 tie doesn't illustrate.&lt;/p&gt;
&lt;p&gt;Michael has some other awesome infographics on &lt;a href="http://www.mikemake.com/filter/infographics"&gt;his site&lt;/a&gt;.&lt;/p&gt;
</description>
 <pubDate>Tue, 06 Jul 2010 17:31:54 +0000</pubDate>
 <dc:creator>robby</dc:creator>
 <guid isPermaLink="false">40 at http://robbymacdonell.com</guid>
<feedburner:origLink>http://robbymacdonell.com/blog/successful-world-cup-infographic</feedburner:origLink></item>
<item>
 <title>Tony Hsieh from Zappos has SPIES EVERYWHERE!!!</title>
 <link>http://feedproxy.google.com/~r/robbymacdonell/~3/Ay8fhxMnmqE/zappos-book-delivering-happiness-delivered</link>
 <description>&lt;p&gt;Ok, maybe they're not spies, maybe he has an army of fantastic little elves, or ninjas. happiness ninjas. Regardless of how he did it, Tony from &lt;a href="http://twitter.com/zappos"&gt;@zappos&lt;/a&gt; made my day yesterday, in a way that completely fits into his personal narrative of 'Delivering Happiness'. The thing is, there's no way he could have possibly done it on purpose.&lt;/p&gt;
&lt;p&gt;I'll explain:&lt;/p&gt;
&lt;p&gt;I'm currently right in the middle of trying to make some pretty heavy life-decisions. I'm at a bit of a crossroads, both personally and professionally, and I'm trying to figure out what's next.  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Do I move, or stay in Seattle?&lt;/li&gt;
&lt;li&gt;What kind of work situation would I enjoy the most?&lt;/li&gt;
&lt;li&gt;Do I take some time off work, or do I dive right in to something new? (there's a fair bit of opportunity out there for UX designers at the moment)&lt;/li&gt;
&lt;li&gt;What kinds of changes will make me the happiest? How do I start to figure out what that even means?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So many questions! I was a kinda frozen, with no clue where to start, and it was &lt;em&gt;really&lt;/em&gt; starting to stress me out.&lt;/p&gt;
&lt;p&gt;So bad, in fact, that I ended up with a migraine yesterday. The way my migraines work, the headache is annoying, but it's not &lt;em&gt;that&lt;/em&gt; bad. The part that really gets me is that I go &lt;em&gt;FREAKIN' BLIND&lt;/em&gt; for about 30-45 minutes. Then I get my sight back and I have a kinda nasty headache for the rest of the day. (Silver lining, It's a fantastic way of making me take a break from whatever I'm doing that's stressed me out in the first place.)&lt;/p&gt;
&lt;p&gt;Anyways, I bailed out of work early to go sleep it off. I half-blindedly stumbled home, and as I'm walking in the front-door, I &lt;em&gt;literally trip&lt;/em&gt; over a copy of Tony Hsieh's book, &lt;a href="http://deliveringhappinessbook.com" title="Delivering Happiness, by Tony Hsieh"&gt;Delivering Happiness&lt;/a&gt;. I had requested a copy 2 months ago in response to &lt;a href="http://twitter.com/zappos/status/13748154843"&gt;this tweet&lt;/a&gt;, and kinda felt bad about it afterwords, because I figured I probably wasn't going to like it that much. If he's gonna be giving them away to anyone, it should probably be to people that are psyched about it. See, I'm not a big fan of "business-y" books. I find the vast majority of them to be fairly smarmy. But, I had seen Tony Hsieh speak at SXSW a couple years ago, and he was pretty entertaining. Plus, when I saw that tweet, it was a really slow day at work, and what else was I gonna do? &lt;/p&gt;
&lt;p&gt;It ended up being the best possible timing for a book delivery in history.&lt;/p&gt;
&lt;p&gt;It's pretty hilarious that a book about happiness in the professional context shows up on my door at the exact moment that I'm thinking about it so much that it's making my brain hurt. I figured I could use something to take my mind off things, I started flipping through it. I figured it's the least I could do for a guy who sent me a copy of his book that I didn't pay for, and only sorta, half-heartedly, asked for.&lt;/p&gt;
&lt;p&gt;Fast forward 24 hours later, and I've read it cover-to-cover. &lt;/p&gt;
&lt;p&gt;Well, mostly. I ended up skimming a little bit in the middle. (Sorry, Tony. There's only so much of a big company's core-values document that I can take at 1am, given my general aversion to big companies.) But it was pretty good, as far as those type of books go. I feel like way too many business / personal development books are written from a slant of "follow your passion and profit Profit PROFIT!!!", and that just feels sorta gross to me. Delivering Happiness, on the other hand, seems to come from a much more personal place. Tony Hsieh seems like a guy who, while obviously very financially-successful, is more psyched because he learned along the way that there are, in fact, much more meaningful things than money, and he just wants to share. &lt;/p&gt;
&lt;p&gt;Also, I really appreciate that he spends two pages breaking down his loving relationship with Red Bull, and that he thinks pickles make him happy because "they are obviously delicious and I enjoy saying 'Pickles'." &lt;/p&gt;
&lt;p&gt;I'll spare the book report, other than to say I got a lot out of it. You should &lt;a href="http://deliveringhappinessbook.com"&gt;check it out&lt;/a&gt;, if that sort of thing sounds at all interesting to you. The main point of this post is that it was &lt;em&gt;EXACTLY&lt;/em&gt; what I needed at that point in time. I totally got lost in it, and that got my mind off all the hemming and hawing I was doing that wasn't helping anyway. It also gave me some nuggets to think about that help put some stuff in perspective. And, dude is just a pretty good storyteller. You can tell he's stoked to be talking about the stuff that he does (something I noticed when I saw him at the SXSW 09 keynote, too). &lt;/p&gt;
&lt;p&gt;So, Tony, however you did it, be it by pure serendipity (most likely what happened), or some &lt;a href="http://en.wikipedia.org/wiki/Skynet_(Terminator)"&gt;skynet&lt;/a&gt;-esque computer that monitors the entire world's tweets and foursquare checkins (what I'd like to think happened), you nailed the timing on that one. &lt;/p&gt;
&lt;p&gt;Good job, sir.&lt;/p&gt;
</description>
 <pubDate>Fri, 02 Jul 2010 18:20:18 +0000</pubDate>
 <dc:creator>robby</dc:creator>
 <guid isPermaLink="false">39 at http://robbymacdonell.com</guid>
<feedburner:origLink>http://robbymacdonell.com/blog/zappos-book-delivering-happiness-delivered</feedburner:origLink></item>
<item>
 <title>Man vs. Food: A ridiculous visualization for a ridiculous tv show</title>
 <link>http://feedproxy.google.com/~r/robbymacdonell/~3/hPpcpX4dhcE/visualizing-man-vs-food</link>
 <description>&lt;p&gt;Here's another HTML5 exploration. This time, it's the Travel Channel show &lt;a href="http://www.travelchannel.com/TV_Shows/Man_V_Food"&gt;Man vs. Food&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;I shouldn't like this show as much as I do, but I can't help it.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://vis.robbymacdonell.com/man-vs-food"&gt;Here's the data-driven look at the first two seasons&lt;/a&gt;, click the image for the full infographic. (Sorry IE users, this one is Firefox / Chrome / Safari only)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://vis.robbymacdonell.com/man-vs-food"&gt;&lt;img src="/sites/default/files/images/manvsfood.jpg" width="600" height="688" alt="manvsfood.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
</description>
 <pubDate>Sat, 19 Jun 2010 01:32:37 +0000</pubDate>
 <dc:creator>robby</dc:creator>
 <guid isPermaLink="false">38 at http://robbymacdonell.com</guid>
<feedburner:origLink>http://robbymacdonell.com/blog/visualizing-man-vs-food</feedburner:origLink></item>
<item>
 <title>Commands in TextMate are awesome.</title>
 <link>http://feedproxy.google.com/~r/robbymacdonell/~3/T4kHu6hGIi0/textmate-commands-with-ruby-are-awesome</link>
 <description>&lt;p&gt;I've used &lt;a href="http://macromates.com/"&gt;Textmate&lt;/a&gt; to write code for the past year or so. I always thought it was a fantastic editor, but I stumbled on something new (to me) about it the other day that makes me like it 1000 times more. You can write &lt;a href="http://manual.macromates.com/en/commands"&gt;commands&lt;/a&gt; to automate tedious tasks in Textmate, and you can do it in just about ANY language that you already know. For me, that's Ruby. Writing commands with it is super easy.&lt;/p&gt;
&lt;p&gt;Lately, as I've been doing more CSS3 stuff, I've gotten more and more frustrated by having to type all the browser-specific extensions for properties that haven't been quite finalized yet. It's annoying, and I'll inevitably start leaving stuff out because I don't want to mess with it (Sorry, &lt;a href="http://www.opera.com"&gt;Opera&lt;/a&gt;). But once I figured out that I could write commands in Ruby, I was able to whip this up in just a couple minutes:&lt;/p&gt;
&lt;pre&gt;
#!/usr/bin/env ruby
s = STDIN.read

s.gsub!(/([[:blank:]]*)border-radius: (\d+px);/) do 
  "#{$1}border-radius: #{$2};\n#{$1}-moz-border-radius: #{$2};\n#{$1}-webkit-border-radius: #{$2};\n"
end

s.gsub!(/([[:blank:]]*)box-shadow: (\d.+);/) do
  "#{$1}box-shadow: #{$2};\n#{$1}-webkit-box-shadow: #{$2};\n#{$1}-moz-box-shadow: #{$2};\n"
end

s.gsub!(/([[:blank:]]*)transition: (\S.+);/) do
  "#{$1}transition: #{$2};\n#{$1}-webkit-transition: #{$2};\n#{$1}-moz-transition: #{$2};\n#{$1}-o-transition: #{$2};\n"
end

print s
&lt;/pre&gt;&lt;p&gt;Then I saved it as a command (Menu &gt; Bundles &gt; Bundle Editor &gt; Edit Commands), and set the input to "Selected Text" or "Line", so I wouldn't accidentally run the command over and over again on different parts of the document.&lt;/p&gt;
&lt;p&gt;It's nothing crazy, but it makes my day WAY easier. Now I can just type the non-browser-specific CSS declarations, then run the command (from the Bundles menu), and all the CSS declarations I've selected get expanded out to their browser-specific versions. For example:&lt;/p&gt;
&lt;pre&gt;
#foo {
  border-radius: 5px;
  box-shadow: 2px 2px 4px #ccc;
  transition: width 0.3s linear;
}
&lt;/pre&gt;&lt;p&gt;
becomes:&lt;/p&gt;
&lt;pre&gt;
#foo {
  border-radius: 5px;
  -moz-border-radius: 5px;
  -webkit-border-radius: 5px;

  box-shadow: 2px 2px 4px #ccc;
  -webkit-box-shadow: 2px 2px 4px #ccc;
  -moz-box-shadow: 2px 2px 4px #ccc;

  transition: width 0.3s linear;
  -webkit-transition: width 0.3s linear;
  -moz-transition: width 0.3s linear;
  -o-transition: width 0.3s linear;

}
&lt;/pre&gt;&lt;p&gt;
It's pretty rad. I wish I had known about that earlier. I'll probably expand on it as needed, but these three rules are already saving me a lot of time. For example, figuring out an easy way to do CSS gradients would be cool, but seems like it'd be an &lt;em&gt;really&lt;/em&gt; ugly regular expression.&lt;/p&gt;
</description>
 <pubDate>Thu, 17 Jun 2010 20:59:53 +0000</pubDate>
 <dc:creator>robby</dc:creator>
 <guid isPermaLink="false">37 at http://robbymacdonell.com</guid>
<feedburner:origLink>http://robbymacdonell.com/blog/textmate-commands-with-ruby-are-awesome</feedburner:origLink></item>
<item>
 <title>Visualizing Lord Stanley's Cup: an HTML5 experiment.</title>
 <link>http://feedproxy.google.com/~r/robbymacdonell/~3/sOz8NmEfC64/visualizing-the-stanley-cup-finals-with-html5</link>
 <description>&lt;p&gt; &lt;a href="http://vis.robbymacdonell.com/stanley-cup"&gt;&lt;img src="/sites/default/files/images/stanley-cup-experiment2.jpg" width="600" height="246" alt="stanley-cup-experiment2.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
Here's a little something I whipped up over the past week. It's an interactive visualization of the winners and losers of the Stanley Cup finals since 1927. I was trying to accomplish two things: 1. learn how to use some new stuff in HTML5 (canvas, css transistions, etc), and 2. teach myself a little bit about hockey.  I'm pretty psyched at how it turned out.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://vis.robbymacdonell.com/stanley-cup"&gt;Click here to see it.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;By the way, Internet Explorer completely barfs on this, so it's really only worth looking at if you're using Chrome, Safari, or Firefox.&lt;/p&gt;
&lt;h2&gt;How I did it&lt;/h2&gt;
&lt;h3&gt;1. Start with simple HTML markup.&lt;/h3&gt;
&lt;p&gt;It seemed like the right way to start was to put all the data into something simple that would display fine on it's own, in any browser, then transform it into something more interesting with javascript and css. I came up with a simple HTML structure that showed the wins and losses for each team, and allowed for some notes for context. &lt;/p&gt;
&lt;pre&gt;
&amp;lt;section id=&amp;quot;sc-timeline&amp;quot;&amp;gt;
  &amp;lt;ul id=&amp;quot;timeline-data&amp;quot;&amp;gt;
    &amp;lt;li id=&amp;quot;calgary&amp;quot;&amp;gt;
      &amp;lt;h3 class=&amp;quot;team-name&amp;quot;&amp;gt;Calgary Flames&amp;lt;/h3&amp;gt;
      &amp;lt;div class=&amp;quot;timeline&amp;quot;&amp;gt;
        &amp;lt;h4&amp;gt;Stanley Cup Wins:&amp;lt;/h4&amp;gt;
        &amp;lt;span class=&amp;quot;win&amp;quot; title=&amp;quot;1989/05/30&amp;quot;&amp;gt;1989&amp;lt;/span&amp;gt;,
           
        &amp;lt;h4&amp;gt;Stanley Cup Losses:&amp;lt;/h4&amp;gt;
        &amp;lt;span class=&amp;quot;lose&amp;quot; title=&amp;quot;1986/05/30&amp;quot;&amp;gt;1986&amp;lt;/span&amp;gt;,
        &amp;lt;span class=&amp;quot;lose&amp;quot; title=&amp;quot;2004/05/30&amp;quot;&amp;gt;2004&amp;lt;/span&amp;gt;
           
        &amp;lt;h4&amp;gt;Notes:&amp;lt;/h4&amp;gt;
        &amp;lt;span class=&amp;quot;note&amp;quot; title=&amp;quot;1972/10/01&amp;quot;&amp;gt;Founded in 1972&amp;lt;/span&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/li&amp;gt;
  &amp;lt;/ul&amp;gt;
&amp;lt;/section&amp;gt;
&lt;/pre&gt;&lt;p&gt;... then repeat the list-items for each team in the data set.&lt;/p&gt;
&lt;h3&gt;2. Build a timeline with Javascript.&lt;/h3&gt;
&lt;p&gt;Now that the raw data is on the page, I need to add some stuff to it so it will actually be interesting. I stored all the javascript to control the visualization in an class called 'timeline'&lt;/p&gt;
&lt;pre&gt;
var timeline = function() {
  this.init = function(el) { ... setup stuff goes here ... }
  ... more logic goes here ...
}
&lt;/pre&gt;&lt;p&gt;Then I created an instance of the class, and run an initialize function that adds in the extra HTML we need for the visualization.&lt;/p&gt;
&lt;pre&gt;
var sc_timeline = new timeline();
sc_timeline.init($('SECTION#sc-timeline'));
&lt;/pre&gt;&lt;p&gt;
Rather than paste in all the code here, which would be overwhelming, &lt;a href="http://vis.robbymacdonell.com/stanley-cup/javascript/timeline_class.js.txt"&gt;have a look at the source&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In the init function, three bits of extra markup are added to the existing html, so the structure now looks like this:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;section style=&amp;quot;width: 1010px;&amp;quot;&amp;gt;
  &amp;lt;ul id=&amp;quot;timeline-data&amp;quot;&amp;gt;
    &amp;lt;li&amp;gt;...&amp;lt;/li&amp;gt;
  &amp;lt;/ul&amp;gt;

  &amp;lt;!-- this stuff below is added by the timeline.init() function. --&amp;gt;
  &amp;lt;canvas class=&amp;quot;timeline-canvas&amp;quot; height=&amp;quot;270&amp;quot; width=&amp;quot;1010&amp;quot;&amp;gt;
  &amp;lt;ul class=&amp;quot;timeline-bar&amp;quot;&amp;gt;
    &amp;lt;li&amp;gt;1927&amp;lt;/li&amp;gt;
    &amp;lt;li&amp;gt;1928&amp;lt;/li&amp;gt;
    ... etc.
  &amp;lt;/ul&amp;gt;
  &amp;lt;div class=&amp;quot;timeline-titles&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;div class=&amp;quot;timeline-notes&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;section&amp;gt;
&lt;/pre&gt;&lt;p&gt;All of that is super easy with &lt;a href="http://api.jquery.com/append/"&gt;jQuery&lt;/a&gt;. &lt;/p&gt;
&lt;h3&gt;3. Add some CSS&lt;/h3&gt;
&lt;p&gt;Now, all the markup is there, but &lt;a href="/sites/default/files/images/stanley-cup-timeline-unstyled.jpg"&gt;it's pretty ugly&lt;/a&gt;. In a CSS file, I floated all the list items so they displayed horizontally, hid the raw data (wins, losses, notes), positioned the new timeline-title and timeline-notes DIVs on top of the CANVAS element, and added team logos to each LI in the timeline-data list (using the &lt;a href="http://vis.robbymacdonell.com/stanley-cup/images/team_logo_nav1.jpg"&gt;team_logo_nav.jpg sprite&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://vis.robbymacdonell.com/stanley-cup/css/sc-timelines.css" target="_blank"&gt;check out the css file.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It's all really straightforward CSS, but there's one thing I want to point out. When you hover over the team logo, I used a &lt;a href="http://webkit.org/blog/138/css-animation/"&gt;CSS transition&lt;/a&gt; to give some animation to the background position. It's the first time I've ever used that, and I like it a lot.  I can imagine some really cool stuff that can be done with it. (too bad it only works in Safari and Chrome, currently)&lt;/p&gt;
&lt;pre&gt;
-webkit-transition: background-position 0.3s linear;
&lt;/pre&gt;&lt;h3&gt;4. Add interactivity&lt;/h3&gt;
&lt;p&gt;There are two bits of interactivity I want on this thing. First, you should be able to mouse over the team logos and display the years they were in the finals, along with any notes. Second, and inversely, you should be able to mouse over the years in the timeline and see which teams played on any given year.&lt;/p&gt;
&lt;p&gt;In the timeline setup, I attach the actions to the list items:&lt;/p&gt;
&lt;pre&gt;
this.setup_timeline_actions = function() {
  public_instance = this.public_instance; // this is a reference to this instance that we can attach to HTML elements that need to refer back to it.
  this.teams.find('LI').hover(function() {
    public_instance.draw_timeline_links(this);
  });
  this.years.find('LI').hover(function() {
    public_instance.draw_matchup(this);
  });
}
&lt;/pre&gt;&lt;p&gt;
I won't go through the ins and outs of how I did the highlighting of the corresponding list items. It's basically finding the matching years or teams by filtering the list for an ID or title attribute, then adding a 'selected' class to them and writing the team name to the timeline-titles DIV element. &lt;/p&gt;
&lt;p&gt;Oh, and then I got to the fun part...&lt;/p&gt;
&lt;h3&gt;5. Drawing with CANVAS.&lt;/h3&gt;
&lt;p&gt;I think the most interesting part of the visualization is the bars that link the teams to their win or loss years. I did it with the HTML5 CANVAS element, which is basically a scriptable image tag that you draw on programmatically. It's not difficult, but it's way different than basic DOM scripting like I'm used to. &lt;/p&gt;
&lt;p&gt;To make it work the way I wanted, I sized the canvas to be exactly as wide as the list items. Then I could easily to draw links between the two rows, just by finding how far the corresponding elements were from the left edge.&lt;/p&gt;
&lt;pre&gt;
this.draw_connection = function(team,year,color) {
  // this.ctx() is a reference to the context object of the canvas. 
  this.ctx().globalAlpha = 0.2;  
  this.ctx().fillStyle = color;

  // get the coordinates
  var l1 = team.position().left;
  var l2 = year.position().left
  var r1 = l1 + team.width();
  var r2 = year.width() + year.position().left;
  var h = $(this.stage.canvas).height();

  // draw the connection
  this.ctx().beginPath();
  this.ctx().moveTo(l1,0);
  this.ctx().lineTo(r1,0);
  this.ctx().lineTo(r2,h);  
  this.ctx().lineTo(l2,h);
  this.ctx().fill();
}
&lt;/pre&gt;&lt;p&gt;
When I loop through all the teams and draw their connections, with blue bars for wins, and red bars for losses, it creates a pretty neat effect:&lt;br /&gt;
&lt;img src="/sites/default/files/images/stanley-cup-graphic.jpg" width="550" height="348" alt="stanley-cup-graphic.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Drawing notes is pretty simlar, I drew a line on the canvas, then positioned the note text on top of it, left-aligned to the line:&lt;/p&gt;
&lt;pre&gt;
var year_pos = this.stage.years.find('LI#y' + year).position().left;
var h = $(this.stage.canvas).height();
this.ctx().strokeStyle = '#00ff00';
this.ctx().globalAlpha = 1;
this.ctx().beginPath();
this.ctx().moveTo(year_pos, 0);
this.ctx().lineTo(year_pos,h);
this.ctx().stroke();
this.stage.notes.append('&lt;div class="note-item" style="left: ' +  year_pos + 'px;"&gt;'+ note.note + '&lt;/div&gt;');
&lt;/pre&gt;&lt;p&gt;
Creating a note layout that looks like:&lt;br /&gt;
&lt;img src="/sites/default/files/images/stanley-cup-notes.jpg" width="549" height="362" alt="stanley-cup-notes.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;From there, it's just a matter of clearing the canvas whenever a year or team is hovered, then drawing the connections all over again, but just with the selected year.&lt;/p&gt;
&lt;p&gt;Again, &lt;a href="http://vis.robbymacdonell.com/stanley-cup"&gt;here's the finished product&lt;/a&gt;. View the source to see the details of the javascript.&lt;/p&gt;
&lt;p&gt;Learn more about working with the &lt;a href="http://gizmo-jumpjet.appspot.com/developer.mozilla.org/en/Canvas_tutorial"&gt;CANVAS tag&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Learn more about &lt;a href="http://webkit.org/blog/138/css-animation/"&gt;CSS transitions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; The guys at &lt;a href="http://fansnap.com"&gt;FanSnap&lt;/a&gt; had me build &lt;a href="http://www.fansnap.com/blog/2010/06/nba-finals-throughout-history-3/"&gt;a timeline for the NBA finals&lt;/a&gt;. I made some design refinements with this one and made it work in IE. By "made it work in IE", I mean "made myself feel really dirty while making it look only halfway-passable in IE".&lt;/p&gt;
</description>
 <pubDate>Sun, 06 Jun 2010 07:52:23 +0000</pubDate>
 <dc:creator>robby</dc:creator>
 <guid isPermaLink="false">36 at http://robbymacdonell.com</guid>
<feedburner:origLink>http://robbymacdonell.com/blog/visualizing-the-stanley-cup-finals-with-html5</feedburner:origLink></item>
<item>
 <title>Infographic: Epic US Floods in the last 100 years, Damages and Casualties</title>
 <link>http://feedproxy.google.com/~r/robbymacdonell/~3/Jf9VMrB8ZHs/infographic-epic-floods-comparison</link>
 <description>&lt;p&gt;I've been thinking about floods a lot lately. A few weeks ago my hometown, Nashville, TN was hit with the &lt;a href="http://en.wikipedia.org/wiki/Nashville_flood"&gt;worst flooding it's had in at least 80 years&lt;/a&gt;. Seeing all the &lt;a href="http://www.boston.com/bigpicture/2010/05/flooding_in_tennessee.html"&gt;images of the damage&lt;/a&gt; was pretty mind-blowing. I'm still having a hard time wrapping my head around the extent of it all. &lt;/p&gt;
&lt;p&gt;To make at least a little sense of it, I started diving into as much of the raw data as I could find. In the process, I realized a sad truth about floods. It's really easy to underestimate how big of a deal they are, provided they don't happen near to a place you have a particular attachment to. In the past decade, there have been a few floods that were at least as destructive as the Tennessee floods, but I don't really remember them. Or, I do remember them, but didn't think they were that big of a deal. Just a whole lot of rain. Add that to the fact that the Tennessee floods went down on a weekend where there was &lt;a href="http://www.boston.com/bigpicture/2010/05/disaster_unfolds_slowly_in_the.html"&gt;an environmental crisis&lt;/a&gt;, and a failed terrorist attack in NYC, and it's easy to see how the severity of the situation was lost on a lot of people outside of the South.&lt;/p&gt;
&lt;p&gt;Here's an infographic I pulled together exploring the damages and lives lost in several of the largest floods over the past 100 years. Click through for a larger version.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/robby1066/4628122869/sizes/o/" title="Infographic: Epic US Floods throughout history by robby1066, on Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4044/4628122869_2de379449e_b.jpg" width="396" height="1024" alt="Infographic: Epic US Floods throughout history" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And please, if you're feeling at all generous, there's a lot of folks in Nashville that could use a hand. Consider &lt;a href="http://www.donatenashville.org/have/money"&gt;making a donation&lt;/a&gt;, &lt;a href="http://liftupnashville.com/"&gt;buying something&lt;/a&gt;, or if you're in the area, &lt;a href="http://www.hon.org"&gt;take a little time to help out&lt;/a&gt;. Thanks.&lt;/p&gt;
</description>
 <pubDate>Sat, 22 May 2010 07:02:23 +0000</pubDate>
 <dc:creator>robby</dc:creator>
 <guid isPermaLink="false">35 at http://robbymacdonell.com</guid>
<feedburner:origLink>http://robbymacdonell.com/blog/infographic-epic-floods-comparison</feedburner:origLink></item>
<item>
 <title>(sorta) Practical CSS sprites for high-traffic sites:</title>
 <link>http://feedproxy.google.com/~r/robbymacdonell/~3/DTiPzW60kPA/sorta-practical-css-sprites-for-high-traffic-sites</link>
 <description>&lt;p&gt;This past week, I learned about how &lt;a href="http://googlewebmastercentral.blogspot.com/2010/04/using-site-speed-in-web-search-ranking.html"&gt;google is starting to take server speed into account in their search result rankings&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;It reminded me of some work I did a year or so ago when I was a front-end developer for &lt;a href="http://www.jobster.com"&gt;Jobster.com&lt;/a&gt;. We were getting just shy of a million unique visitors / month at the time, and our servers were starting to strain under the load. We solved some pretty big performance problems by reducing 50+ image requests on each page to just 2 using CSS sprites. Here's some of the stuff I learned during that process.&lt;/p&gt;
&lt;div class="explanation"&gt;
Disclaimer: In most situations, bending over backwards to get everything into a single sprite is overkill, and I don't really recommend it unless you're suffering from high-traffic performance problems. If you find yourself in that spot, however, it can make a huge difference.
&lt;/div&gt;
&lt;p&gt;First off, look at these two pages, for a fictitious online candy retailer called BaddassSnacks! They should look identical. The only differences are under the hood. I noted some details about the assets used in each page.&lt;/p&gt;
&lt;table id="comparison-table"&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;h3&gt;&lt;a href="/sites/default/files/sprites-examples/html-sprites/index.html"&gt;Demo #1&lt;/a&gt;&lt;/h3&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;h3&gt;&lt;a href="/sites/default/files/sprites-examples/html-nosprites/index.html"&gt;Demo #2&lt;/a&gt;&lt;/h3&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Total image files:&lt;/strong&gt; 24&lt;/p&gt;
&lt;p&gt;      &lt;img src="/sites/default/files/images/no-sprites-image-files.gif" width="214" height="473" alt="no-sprites-image-files.gif" /&gt;
    &lt;/p&gt;&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Total image files:&lt;/strong&gt; 1&lt;/p&gt;
&lt;p&gt;      &lt;img src="/sites/default/files/images/sprites-image-files.gif" width="176" height="36" alt="sprites-image-files.gif" /&gt;&lt;br /&gt;
      &lt;a href="/sites/default/files/sprites-examples/html-sprites/images/sprite.gif"&gt;click here to see sprite.gif&lt;/a&gt;
    &lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;Getting all of these images to work with a single CSS sprite was a bit of a challenge. Here's a few of the techniques I used to make it all work:&lt;/p&gt;
&lt;h2&gt;1. Replacing a block of text with an image:&lt;/h2&gt;
&lt;p&gt;    This is one of the most straightforward things to do with CSS sprites. Just make sure the text is contained in a block-level element and set the height and width of the element to the same as the image. Of course, you'll need to hide the text too, here's how to do it.&lt;/p&gt;
&lt;pre&gt;
/* page logo, for example */
H1#logo A {
  display: block;
  height: 100px;
  width: 175px;
  text-indent: -9000px;
  outline: none;
  /* set the background to your sprite, then move the sprite into position
     in this case, 25px from the left and 50px from the top */
  background: url(/path/to/your/sprite) -25px -50px no-repeat;
}
&lt;/pre&gt;&lt;p&gt;This can turn into a lot of CSS if you're doing this with a lot of images. You can clean this up a bit by creating a single class that you can apply to any text-containing element that you want to turn into an image. I usually call this class ".img" or something similar.&lt;/p&gt;
&lt;pre&gt;
.img {
  display: block;
  text-indent: -9000px;
  outline: none;
  background: url(/path/to/your/sprite);
  background-repeat: no-repeat;
}

H1#logo A.img {
  height: 100px;
  width: 175px;
  background-position: -25px -50px;
}
&lt;/pre&gt;&lt;p&gt;
here's an example from the demo page:&lt;/p&gt;
&lt;p&gt;&lt;img src="/sites/default/files/images/sprites-replaced-text.jpg" width="561" height="449" alt="sprites-replaced-text.jpg" /&gt;&lt;/p&gt;
&lt;h2&gt;2. long, tiling backgrounds&lt;/h2&gt;
&lt;p&gt;If you need an image to tile horizontally AND vertically, you're out of luck when it comes to sprites.&lt;br /&gt;
But if you can live with only tiling images horizontally, then you just make a REALLY tall sprite with all your horizontally-tiling images, then use background-position to line them up to the right point. &lt;/p&gt;
&lt;p&gt;Again, an example:&lt;/p&gt;
&lt;p&gt;&lt;img src="/sites/default/files/images/sprites-horizontal-tile.jpg" width="553" height="395" alt="sprites-horizontal-tile.jpg" /&gt;&lt;/p&gt;
&lt;h2&gt;3. Backgrounds for elements with a variable width&lt;/h2&gt;
&lt;p&gt;This is really similar to #2&lt;br /&gt;
You can use the &lt;a href="http://www.alistapart.com/articles/slidingdoors/"&gt;sliding doors technique&lt;/a&gt; with CSS sprites, you just need to make sure that your sprite is as wide as your widest variable-width element is likely to be.&lt;/p&gt;
&lt;p&gt;&lt;img src="/sites/default/files/images/sprites-sliding-doors.jpg" width="507" height="342" alt="sprites-sliding-doors.jpg" /&gt;&lt;/p&gt;
&lt;h2&gt;4. Bullet icons&lt;/h2&gt;
&lt;p&gt;This is where things start to get a little bit tricky when you're using sprites, and it's difficult to come up with something that's bulletproof. The problem is, in a nutshell, that you want to make use of individual icons, but because they're on the sprite, the neighbors of the image you want will show through unless you've positioned them just so. In this example, I just made the image really tall and gave everything a lot of padding. I've found that increasing the dimensions of the image doesn't increase the file size proportionally, so you can get away with it and still achieve a smaller total file size.&lt;/p&gt;
&lt;p&gt;&lt;img src="/sites/default/files/images/sprites-icons.jpg" width="525" height="524" alt="sprites-icons.jpg" /&gt;&lt;/p&gt;
&lt;h2&gt;5. Inline images&lt;/h2&gt;
&lt;p&gt;These seem tricky, but are actually quite easy, so long as you're willing to put up with one teeny bit of ugliness in your code. The obvious problem is that inline elements can't reliably get a height and a width in all browsers. You need something that will act like an IMG element. As it turns out, that's what you use. But, we want to keep our images all in the sprite, so how do we do it? There are two ways. First, and easiest, accept the extra server hit and serve your inline images as a 1x1px transparent gif. &lt;/p&gt;
&lt;pre&gt;
&amp;lt;img src=&amp;quot;/images/invisible.gif&amp;quot;  /&amp;gt;
&lt;/pre&gt;&lt;p&gt;Then use css to set the height and width of the image and use your sprite the same way as you would with any block-level element. That's what we did on Jobster.com, and it worked fine. The second way is uglier, but will keep you from using a second image. The SRC attribute of the IMG tag usually takes a url to an image file, but you can also put raw image data in there. This will give you an image that's the equivalent of the 1x1px transparent gif:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;img src=&amp;quot;data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==&amp;quot;  /&amp;gt;
&lt;/pre&gt;&lt;p&gt;Did I mention it's ugly? In either case, you can then use CSS to position the sprite like so:&lt;/p&gt;
&lt;pre&gt;
IMG#whatever_id_you_give_to_the_inline_image {
  height: 15px;
  width: 45px;
  background: url(/path/to/your/css/sprite) no-repeat -50px -65px
}
&lt;/pre&gt;&lt;p&gt;
&lt;img src="/sites/default/files/images/sprites-inline.jpg" width="530" height="256" alt="sprites-inline.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;And that's basically it. For a real-world example of most of these techniques, check out the &lt;a href="http://www.jobster.com/find/US/jobs/in/seattle%2C+wa/for/css"&gt;search results pages&lt;/a&gt; on Jobster.com (although I don't work on that site anymore so no guarantees that things haven't changed in the meantime)&lt;/p&gt;
</description>
 <pubDate>Mon, 10 May 2010 06:57:35 +0000</pubDate>
 <dc:creator>robby</dc:creator>
 <guid isPermaLink="false">34 at http://robbymacdonell.com</guid>
<feedburner:origLink>http://robbymacdonell.com/blog/sorta-practical-css-sprites-for-high-traffic-sites</feedburner:origLink></item>
</channel>
</rss>

