<?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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Nick Dunn's Blog</title>
    <link>http://nick-dunn.co.uk</link>
    <description>Nick Dunn's Blog</description>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/nickdunn" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
      <title>Aligning search design with user behaviour</title>
      <link>http://feedproxy.google.com/~r/nickdunn/~3/uWP-1xmhZFw/</link>
      <description>&lt;p&gt;&lt;img src="http://nick-dunn.co.uk/assets/files/lbd.search.old.jpg" class="figure right white" alt="Figure 1. Lightbulbs Direct search circa 2005"&gt;&lt;/img&gt;&lt;/p&gt;

&lt;p&gt;When it came to rebuilding the &lt;a href="http://lightbulbs-direct.com/"&gt;Lightbulbs Direct Ltd website&lt;/a&gt; in 2008, the primary aims were to get customers to products faster, and through the checkout as easily as possible. In this retrospective I will discuss the improvements we made after analysing user behaviour and grouping user journeys.&lt;/p&gt;

&lt;p&gt;To begin, this is the original search results page from 2005 (right).&lt;/p&gt;

&lt;p&gt;The problems with this page extend beyond its visual design:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;taxonomic classification&lt;/strong&gt; is good for search engines but user journeys comprise several consecutive pages just to narrow product choices&lt;/li&gt;
&lt;li&gt;many users quickly reverted to &lt;strong&gt;complex keyword searches&lt;/strong&gt;, either specific part numbers or ambiguous “red bulb” or “fridge door”&lt;/li&gt;
&lt;li&gt;“Advanced Search” (personal search via a contact form) was used regularly, implying &lt;strong&gt;search results unsatisfactory&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;search results page &lt;strong&gt;looked visually complex&lt;/strong&gt;, could not be easily scan-read and required a lot of scrolling for pagination&lt;/li&gt;
&lt;li&gt;a “Buy” link directly from results page is optimistic and pushy&lt;/li&gt;
&lt;li&gt;search results &lt;strong&gt;cannot be re-filtered&lt;/strong&gt; or easily amended&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Almost importantly of all there was little feedback to the user that their search keywords had been correctly &lt;em&gt;interpreted&lt;/em&gt;. How could they be sure that the website knew their search keywords “gls 60w” actually meant “Find me 60 Watt GLS bulbs”?&lt;/p&gt;

&lt;p&gt;During the design phase, the user journeys through product search were the main focus of my attention, with a view to solving all of the above problems. We decided on three key entry points into product search, which matched three distinct user groups of varying levels of domain knowledge. Each group would have a search journey tailored to their specific needs, aligned closely with their observed behaviour:&lt;/p&gt;

&lt;h2&gt;1. “What [XYZ] do they stock?”&lt;/h2&gt;

&lt;p&gt;These visitors know about product &lt;em&gt;types&lt;/em&gt; (bulb, fluorescent tube, spotlight) and they are looking for a specific item of that type. This lends itself very well to the original (albeit poorly named) “Bulb Finder” concept which is essentially a taxonomic drill-down through product categories. By displaying familiar top-level category names on the home page and in an obvious place on every page, users who are familiar with the terms can use them as their entry point.&lt;/p&gt;

&lt;p&gt;After several levels of ever-narrowing categories choices, a product listing is displayed. The information shown in the table of products was carefully chosen so that a user can decide whether the product is the right item without having to click through to a product page. In the technical world of electronics, specifications speak louder than captions and descriptions. Nevertheless a small photograph is essential for the user’s decision making process.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://nick-dunn.co.uk/assets/files/lbd.search.categories.png" class="figure white" alt="Figure 2. Wireframes and renders of category drill-down"&gt;&lt;/img&gt;&lt;/p&gt;

&lt;h2&gt;2. “My bulb has just blown, I need a replacement &lt;em&gt;now&lt;/em&gt;!”&lt;/h2&gt;

&lt;p&gt;Do you know your 40W from your 60W; your pearl from your white; your Edison from your Bayonet cap? Probably not, and why should you? But imagine that your desk lamp bulb has just blown and you are holding it in your hand. There are no distinguishing marks except for a faded “60W” stamped on the clear glass. This is where the “Bulb Finder” works its magic, allowing a user to provide details up to four pieces of common information easily realised from a busted bulb: Wattage, Voltage, Cap/fitting (push-fit, screw-in) and Colour.&lt;/p&gt;

&lt;p&gt;And instead of making this a trial-and-error process, the Bulb Finder gives live feedback as you enter the bulb details. You don’t have to click “Search” and wait for a results page to tell you how many matches there are. This serves the purpose of &lt;em&gt;giving the user control&lt;/em&gt; as to when they view the matching products. 600 items found? Maybe you want to narrow it down a bit before jumping in at the deep end. &lt;em&gt;Changes a drop down&lt;/em&gt;. No items found? Maybe one of your choices is incorrect, or we simply don’t have what you’re after. &lt;em&gt;Changes a drop down&lt;/em&gt; 12 items found? It’s likely we’ve got what you want, take a look.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://nick-dunn.co.uk/assets/files/lbd.search.bulbfinder.png" class="figure white" alt="Figure 3. Changing states of the Bulb Finder"&gt;&lt;/img&gt;&lt;/p&gt;

&lt;h2&gt;3. “I know exactly what I want”, or “Panic! I don’t know what I want at all!”&lt;/h2&gt;

&lt;p&gt;The keyword search satisfies a group of other broader, yet still distinct, users. Perhaps they’ve headed to the search box immediately because they don’t know what “40W Phillips” scrawled on the side of their tube means; or perhaps they’ve been browsing a little and can’t find that elusive niche item; or perhaps they know a specific manufacturer part number for a quick price comparison. Or perhaps they’re simply looking for information about “energy saving” and simply don’t want to be told to purchase something.&lt;/p&gt;

&lt;p&gt;Everyone has their own mental model (consciously or unconsciously) of how a search works, and they supply their keywords accordingly. This means that building a good keyword search is incredibly difficult. When developing the keyword search we went to great length to ensure that it remained as flexible and useful as possible:&lt;/p&gt;

&lt;h3&gt;Converting keywords into technical parameters&lt;/h3&gt;

&lt;p&gt;&lt;img src="http://nick-dunn.co.uk/assets/files/lbd.search.keywords.png" class="figure right white" alt="Figure 4. Keywords can be complex technical specifications"&gt;&lt;/img&gt;&lt;/p&gt;

&lt;p&gt;Products are stored in an abstract data model similar to the &lt;a href="http://en.wikipedia.org/wiki/Entity-attribute-value_model"&gt;entry-attribute-value pattern&lt;/a&gt;, allowing a product to have a specification defined by any number of attributes. However, all items have a set of default attributes comprising the four used in the Bulb Finder (Wattage, Voltage, Cap/Fitting, Colour).&lt;/p&gt;

&lt;p&gt;The keyword search uses some complex string-parsing algorithms to translate a search phrase such as “60 WATT bc 240volt” into a product search on Wattage: 60, Cap: Bayonet, Voltage: 240. In the UI, known technical attributes are pre-selected in their respective drop downs and can easily be tweaked or removed.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://nick-dunn.co.uk/assets/files/lbd.search.filters.png" class="figure white" alt="Figure 5. Technical attributes are pre-selected using keyword text"&gt;&lt;/img&gt;&lt;/p&gt;

&lt;h3&gt;Modifying search filters&lt;/h3&gt;

&lt;p&gt;If the user can not find what they want, the search needs to be easily repeatable by tweaking parameters. The attribute drop-downs provide technical clarity, but free-text keywords also need be addressed. Standard keywords are displayed in a familiar strip of tags from which the user can remove individual words if they are deemed to be reducing accuracy.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://nick-dunn.co.uk/assets/files/lbd.search.tags.png" class="figure white" alt="Figure 6. Individual words can be removed"&gt;&lt;/img&gt;&lt;/p&gt;

&lt;h3&gt;Scanning and pagination&lt;/h3&gt;

&lt;p&gt;Products are shown in a simple table, up to ten per page. The small thumbnail allows for instant recognition of more recognisable shapes/colours, and the natural-blue hyperlinked product name is an obvious call to action. Subtle zebra-striping aids scanning horizontally, while wide column spacing and consistent alignment makes vertical scanning a cinch. The total number of results is clearly labelled, and pagination is repeated at the head and foot of the table. This layout displays 2–4 more products above the 1024x768 fold compared to the previous design.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://nick-dunn.co.uk/assets/files/lbd.search.table.png" class="figure white" alt="Figure 7. The full search results page and product listing"&gt;&lt;/img&gt;&lt;/p&gt;

&lt;p&gt;This article has shown that with careful observation of your target audience you can design page elements that are more closely aligned with their behaviour. By adopting this user-centred approach, the site is more useful to its users and becomes instantly more easy to use.&lt;/p&gt;</description>
      <pubDate>Sat, 24 Oct 2009 12:53:00 +0000</pubDate>
    <feedburner:origLink>http://nick-dunn.co.uk/article/aligning-search-design-with-user-behaviour/</feedburner:origLink></item>
    <item>
      <title>Bekonscot.co.uk redesigned</title>
      <link>http://feedproxy.google.com/~r/nickdunn/~3/6uKla4UPp1I/</link>
      <description>&lt;p&gt;&lt;a href="http://www.bekonscot.co.uk/"&gt;&lt;img src="http://nick-dunn.co.uk/assets/files/bek.home.jpg" alt="Bekonscot.co.uk home page" title=""&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Tue, 28 Jul 2009 17:37:00 +0000</pubDate>
    <feedburner:origLink>http://nick-dunn.co.uk/article/bekonscotcouk-redesigned/</feedburner:origLink></item>
    <item>
      <title>Cross-browser drop shadows using pure CSS</title>
      <link>http://feedproxy.google.com/~r/nickdunn/~3/5uaY0r9McD4/</link>
      <description>&lt;p&gt;There’s an awful lot of noise at the moment regarding dropping IE6 and forging ahead with CSS3 properties for the finer touches on web layouts. &lt;a href="http://dowebsitesneedtolookexactlythesameineverybrowser.com/"&gt;Do websites need to look exactly the same in every browser?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One such example is adding drop shadows to content blocks. There are countless ways of achieving this, most requiring additional HTML markup and one or more PNG images. Not to mention hacks for IE6 to get render PNGs properly. All of this begins to degrade page performance, when really the drop shadow is merely a secondary design flourish.&lt;/p&gt;

&lt;p&gt;CSS3 provides the &lt;code&gt;box-shadow&lt;/code&gt; property to achieve just that. Thankfully Safari/Webkit has supported this for some time, and Firefox more recently with Firefox 3.5. Internet Explorer provides a &lt;a href="http://msdn.microsoft.com/en-us/library/ms532917%28VS.85%29.aspx"&gt;DropShadow&lt;/a&gt; filter but this provides a hard-edged shadow unlike its CSS3 counterpart. By combining the &lt;a href="http://msdn.microsoft.com/en-us/library/ms532995%28VS.85%29.aspx"&gt;Glow&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/ms533086%28VS.85%29.aspx"&gt;Shadow&lt;/a&gt; filters however, we can achieve something that fairly closely resembles the rendered CSS3 shadow. Hurrah!&lt;/p&gt;

&lt;p&gt;Here’s &lt;a href="http://nick-dunn.co.uk/assets/files/dropshadow/index.html"&gt;an example page&lt;/a&gt; and the result across major browsers:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://nick-dunn.co.uk/assets/files/drop-shadows.png" class="figure" alt="Figure 1. CSS drop shadows rendered in major browsers"&gt;&lt;/img&gt;&lt;/p&gt;

&lt;h2&gt;Disadvantages&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;no support in Opera or Firefox pre-3.5&lt;/li&gt;
&lt;li&gt;filters may clash if you also need to set container opacity (e.g. fading using jQuery)&lt;/li&gt;
&lt;li&gt;the shadows aren’t exactly the same&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Advantages&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;no additional markup, images or IE6 hacking&lt;/li&gt;
&lt;li&gt;faster performance than rendering images (especially IE6 PNG fix)&lt;/li&gt;
&lt;li&gt;shadow changes can be tweaked using CSS&lt;/li&gt;
&lt;li&gt;no restriction on size — shadow grows as the content grows&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Update (19 July 2009, 17:47)&lt;/h2&gt;

&lt;p&gt;&lt;img src="http://nick-dunn.co.uk/assets/files/drop-shadow.ie6.png" class="figure right" alt="Figure 2. A cleaner IE6 version"&gt;&lt;/img&gt;&lt;/p&gt;

&lt;p&gt;As &lt;a href="http://nick-dunn.co.uk/article/cross-browser-drop-shadows-using-pure-css/#comment-214"&gt;ZigPress points out&lt;/a&gt; in the comments the IE representation is still rather ugly.&lt;/p&gt;

&lt;p&gt;By removing the Glow filter and using Shadow filters in its place, and reducing the weight of the shadow, we approach something more forgiving in Internet Explorer using the following CSS:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;div {
    filter: 
        progid:DXImageTransform.Microsoft.Shadow(color=#eeeeee,direction=0,strength=7)
        progid:DXImageTransform.Microsoft.Shadow(color=#dddddd,direction=90,strength=10)
        progid:DXImageTransform.Microsoft.Shadow(color=#dddddd,direction=180,strength=10)
        progid:DXImageTransform.Microsoft.Shadow(color=#eeeeee,direction=270,strength=7);
}
&lt;/code&gt;&lt;/pre&gt;</description>
      <pubDate>Sun, 19 Jul 2009 12:32:00 +0000</pubDate>
    <feedburner:origLink>http://nick-dunn.co.uk/article/cross-browser-drop-shadows-using-pure-css/</feedburner:origLink></item>
    <item>
      <title>Export a CSV report from Sifter issues</title>
      <link>http://feedproxy.google.com/~r/nickdunn/~3/dBAZrHLJFvs/</link>
      <description>&lt;p&gt;The &lt;a href="http://getsatisfaction.com/nextupdate/topics/sifter_api"&gt;Sifter API&lt;/a&gt; has been a long time coming and there’s nothing on the horizon yet. I recently embarked on my own set of scripts to automate the process of creating a report from Sifter. The idea is to parse the issues HTML list into XML and then transform to whatever the user desires using XSLT (a printable HTML page, an XML file, a CSV). But I digress.&lt;/p&gt;

&lt;p&gt;So I found a natty little update to Sifter that provides native export of your issue list as a CSV file!&lt;/p&gt;

&lt;p&gt;Spot &lt;code&gt;/issues?s=...&lt;/code&gt; in the URL and change it to &lt;code&gt;/issues.csv?s=&lt;/code&gt;. Tada!&lt;/p&gt;

&lt;p&gt;I’ll hold out for the API.&lt;/p&gt;</description>
      <pubDate>Tue, 30 Jun 2009 10:51:00 +0000</pubDate>
    <feedburner:origLink>http://nick-dunn.co.uk/article/export-a-csv-report-from-sifter-issues/</feedburner:origLink></item>
    <item>
      <title>Show latest Last.fm plays on your Symphony site</title>
      <link>http://feedproxy.google.com/~r/nickdunn/~3/9dhEOm-Udfc/</link>
      <description>&lt;p&gt;At the top of my blog I have added the name of the last track &lt;a href="http://en.wikipedia.org/wiki/Last.fm"&gt;scrobbled&lt;/a&gt; to &lt;a href="http://www.last.fm/"&gt;Last.fm&lt;/a&gt;. Symphony made this so easy, eating a biscuit with a fresh brew after five minutes. Here’s how:&lt;/p&gt;

&lt;p&gt;First you need a Last.fm user account, and one of the various applications to scrobble your tracks from iTunes (or Windows Media Player, if your life is broken). Then you need to &lt;a href="http://www.last.fm/api/account"&gt;grab an API key&lt;/a&gt;. The key will be a hash that looks something like this (note: this is not my real API key!).&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;3d21e002930b853d2f048e517c577ec7
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can then create a URL using the Last.fm API to return your recent tracks as XML. We will use the &lt;code&gt;user.getRecentTracks&lt;/code&gt; method of the API. Your URL should be in this format:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;http://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&amp;user={your-username}&amp;api_key={your-api-key}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Log in to your Symphony site and create a new Data Source, choosing “Dynamic XML” as its source. Paste your API call URL into the &lt;code&gt;URL&lt;/code&gt; field and update the cache value to something small, between 1 and 10 minutes should do.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://nick-dunn.co.uk/assets/files/lastfm.png" class="figure" alt="Figure 1. Last FM Data Source"&gt;&lt;/img&gt;&lt;/p&gt;

&lt;p&gt;Note that I have also added the XPath expression &lt;code&gt;//track[1]&lt;/code&gt; so that only the first track node is included in my Page to keep things lean.&lt;/p&gt;

&lt;p&gt;Attach this Data Source to your Page and fire up &lt;code&gt;?debug&lt;/code&gt; to check you can see the fresh track node. You can? Great! I’m glad you’ve been keeping up.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://nick-dunn.co.uk/assets/files/lastfm-xml.png" class="figure" alt="Figure 2. Last FM Data Source debug XML"&gt;&lt;/img&gt;&lt;/p&gt;

&lt;p&gt;All you need now is a little XSLT magic to write this content into your page. Where you want the track name to appear, add a template match to the &lt;code&gt;track&lt;/code&gt; node above:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;xsl:apply-templates select="/data/last-fm/track" mode="last-fm"/&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And neatly out of the way you can create a template to handle the rendering of the content. My template looks like this. Notice I’m checking whether the track has a &lt;code&gt;nowplaying&lt;/code&gt; attribute and changing the label accordingly.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;xsl:template match="track" mode="last-fm"&gt;

    &lt;xsl:choose&gt;
        &lt;xsl:when test="@nowplaying='true'"&gt;
            &lt;xsl:text&gt;Currently listening to &lt;/xsl:text&gt;
        &lt;/xsl:when&gt;
        &lt;xsl:otherwise&gt;
            &lt;xsl:text&gt;Recently listened to &lt;/xsl:text&gt;
        &lt;/xsl:otherwise&gt;
    &lt;/xsl:choose&gt;

    &lt;xsl:value-of select="concat(name, ' by ', artist)"/&gt;

&lt;/xsl:template&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;How stupendously easy!&lt;/p&gt;

&lt;p&gt;The kettle’s boiled. Time for a cuppa.&lt;/p&gt;</description>
      <pubDate>Wed, 10 Jun 2009 17:46:00 +0000</pubDate>
    <feedburner:origLink>http://nick-dunn.co.uk/article/show-latest-lastfm-plays-on-your-symphony-site/</feedburner:origLink></item>
  </channel>
</rss>
