<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tommy Lacroix &#187; Usability</title>
	<atom:link href="http://www.tommylacroix.com/category/web-development/usability/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.tommylacroix.com</link>
	<description>Professional Blog</description>
	<lastBuildDate>Wed, 16 Feb 2011 16:35:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.5</generator>
		<item>
		<title>Yet another IE6 rant, and catching up</title>
		<link>http://www.tommylacroix.com/2011/02/16/ie6-rant-and-catching-up/</link>
		<comments>http://www.tommylacroix.com/2011/02/16/ie6-rant-and-catching-up/#comments</comments>
		<pubDate>Wed, 16 Feb 2011 06:04:38 +0000</pubDate>
		<dc:creator>tlacroix</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[Web development]]></category>
		<category><![CDATA[ie6]]></category>
		<category><![CDATA[ie7]]></category>
		<category><![CDATA[internet explorer]]></category>
		<category><![CDATA[internet explorer 6]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[wga]]></category>
		<category><![CDATA[windows genuine advantage]]></category>
<category>html</category><category>ie6</category><category>ie7</category><category>internet explorer</category><category>internet explorer 6</category><category>microsoft</category><category>wga</category><category>windows genuine advantage</category>
		<guid isPermaLink="false">http://www.tommylacroix.com/?p=154</guid>
		<description><![CDATA[It's been a while since I've posted on this blog. Mostly because I've been busy on zillion projects. I'll soon write an update to my cascades queuing post. For a recent project of mine, <a href="http://www.flexivo.tv">flexivo.tv</a>, I've been researching an efficient way to get rid of Amazon's SQS service for once big reason, I needed simultaneous queueing capabilities. One message being in multiple queues at once, that is. My experiments with file system and MySQL queues, even when cascaded with memcached wheren't performant enough. I found my answer in NoSQL. Enough for the intro, now the rant ;-)]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been a while since I&#8217;ve posted on this blog. Mostly because I&#8217;ve been busy on zillion projects. I&#8217;ll soon write an update to my <a href="/2009/12/08/cascaded-queueing/">cascades queuing post</a>. For a recent project of mine, <a href="http://www.flexivo.tv">flexivo.tv</a>, I&#8217;ve been researching an efficient way to get rid of <a href="http://aws.amazon.com/sqs/">Amazon&#8217;s Simple Queue Service (SQS)</a> service for one main reason, I needed simultaneous queueing capabilities. One message being in multiple queues at once, that is. My experiments with file system and MySQL queues, even when cascaded with memcached wheren&#8217;t performant enough. I found my answer in NoSQL. But now, enough for the intro, now the rant <img src='http://www.tommylacroix.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>I&#8217;m writing this while watching <a target="_blank" href="http://www.youtube.com/watch?v=Lv1wEUq2vyA">Stephen Graham making a statement as Al Capone in Boardwalk Empire</a>. So I shall make one too. Now about that fellah&#8217;, the INFAMOUS Internet Explorer 6. A friend of mine recently showed me a site of his making where he directs the IE6 users to a deadend page where he encourages them to upgrade. Sweet. I totally agree. Then he tells me that IE6 is a plague. It sure is, still agreeing. Then that it&#8217;s been alive that long because of all the conciliatory developers like him and me that worked, harder an harder as new standards like transparent PNGs came along, to ensure IE6 compatibility. And that&#8217;s where I disagree.</p>
<p><span id="more-154"></span></p>
<p>He sure is right if you don&#8217;t look at the big picture. IE6 couldn&#8217;t have stayed alive for that long without us, hard working developers. But if you go a bit deeper, you&#8217;ll agree that us, hard working developers, are taking &#8220;orders&#8221; from project managers, who take them from account managers, who take them from clients. And for a client, as well as for an account manager, when still 30% of the population uses IE6, you&#8217;re faced with the <a href="http://en.wikipedia.org/wiki/Prisoner's_dilemma">prisoner&#8217;s dilemma</a>: will you refuse to support it knowing that you competitor might? Probably not.</p>
<p>But the rabbit hole goes deeper than that. Why was 30% of the population stuck with IE6 not so long ago? To me, it&#8217;s a combination of two major factors: the Windows Genuine Advantage, and Windows Vista failure. </p>
<p>According to <a href="http://en.wikipedia.org/wiki/Windows_Genuine_Advantage" target="_blank">Wikipedia</a>, &#8220;the Windows Genuine Advantage  is an anti-piracy system created by Microsoft that enforces online validation of the licensing of several recent Microsoft Windows operating systems&#8221;, starting with Windows 2000 Pro, and including Windows XP and Windows Vista. While I can&#8217;t be against their motives &#8212; they&#8217;re a proprietary software business, they&#8217;re in for the money, and that&#8217;s alright, we need them as much as we need open source if you ask me, but that&#8217;s another debate &#8212; I&#8217;m against the fact that they denied browser upgrades to pirate Windows installation. Sure, these users are pirates, outlaws. They don&#8217;t deserve upgrade. But we do! That decision contributed to two things: keeping the net unsafe and slowing standards adoption by preventing a majority of dummy users (read: not smart enough to get they should install FireFox or Chrome, and that&#8217;s still fine, it&#8217;s not their fault, the internet success resides in its mass adoption, not it&#8217;s adoption by the early adopters, but again, that&#8217;s another debate) to seamlessly upgrade to a safer and more modern browser.</p>
<p>The <a href="http://en.wikipedia.org/wiki/Windows_vista#Criticism" target="_blank">Windows Vista failure</a> was just an aggravating factor. Until <a href="http://en.wikipedia.org/wiki/Windows_7" target="_blank">Windows 7</a> started shipping late 2009 (and even after that, until people realized it was a lot better than Vista), people where still ordering computers with Windows XP. Unfortunately for us, web developers, that included &#8220;cheap&#8221; people who wanted to save a few (hundred) bucks on a (not so cheap) operating system. Internet Explorer 6.0 was released on August 27th, 2001. Almost 10 years ago. But people were still having fresh Windows XP installs no more than 2 years back because Vista known to be crap.</p>
<p>So yes, in the end, we web developers are responsible for not refusing to build web sites compatible with an obsolete and insecure browser. But to me, the whole IE6 mess we&#8217;ve all got to cope with is Microsoft fault. Not because they tried to enforced their right to be paid for copy of their operating system that&#8217;s being installed, but because they did so regardless of internet safety and standards adoption. The net would be so much farther without that decision. But we&#8217;re where we&#8217;re at, and IE6 doesn&#8217;t have enough market shares to rule the world anymore. <a href="http://googleenterprise.blogspot.com/2010/01/modern-browsers-for-modern-applications.html" target="_blank">Google opened the march</a> not long ago. Please, let IE6 rest in peace, so we can get rid of IE7 while hoping that IE9 will be a bliss. Hate it? Drop it, for the sake of us all.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tommylacroix.com/2011/02/16/ie6-rant-and-catching-up/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTTP caching basics</title>
		<link>http://www.tommylacroix.com/2008/07/17/http-caching-basics/</link>
		<comments>http://www.tommylacroix.com/2008/07/17/http-caching-basics/#comments</comments>
		<pubDate>Thu, 17 Jul 2008 18:56:56 +0000</pubDate>
		<dc:creator>tlacroix</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[caching]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[http caching]]></category>
		<category><![CDATA[http headers]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[proxy]]></category>
<category>browser</category><category>caching</category><category>http</category><category>http headers</category><category>performance</category><category>php</category><category>proxy</category>
		<guid isPermaLink="false">http://www.tommylacroix.com/?p=70</guid>
		<description><![CDATA[The HTTP protocol is quite simple. But many of us under-use it, programmatically speaking. There are many very simple performance mechanisms that are often forgotten. Many developers go for disabling HTTP caching completely, as they often don&#8217;t understand how to use it, and because it can cause weird bugs when used incorrectly. But so much [...]]]></description>
			<content:encoded><![CDATA[<p>The <a title="Hyper-Text Transfer Protocol, at Wikipedia" href="http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol" target="_blank">HTTP protocol</a> is quite simple. But many of us under-use it, programmatically speaking. There are many very simple performance mechanisms that are often forgotten. Many developers go for disabling HTTP caching completely, as they often don&#8217;t understand how to use it, and because it can cause weird bugs when used incorrectly.</p>
<p>But so much things are cacheable: pages, images, CSS, JavaScript, even many REST web services! Yes, even in this social web era where content changes faster than you can write, there&#8217;s still plenty of slow changing information, such as home pages, or lists of countries, regions and cities.</p>
<p>Efficiently using caching translates into:</p>
<ul>
<li>Better response and loading time</li>
<li>Decreased load on the server</li>
<li>Better user experience</li>
</ul>
<p>This article aims to present a simple explanation of the HTTP protocol and proper use of HTTP caching.</p>
<p><span id="more-70"></span></p>
<h3>The HTTP Protocol basics</h3>
<p>The HTTP protocol is a communication scheme between two or three actors: the server, the browser, and the often forgotten proxy.</p>
<p>First, to see the implicated headers, let&#8217;s have a look to the typical request &#8230;</p>
<pre class="code">GET / HTTP/1.1
Host: www.tommylacroix.com
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
<strong>If-Modified-Since: Thu, 17 Jul 2008 16:11:24 GMT
If-None-Match: "a9432-fc1b28423-cb122da"</strong>
<strong>User-Agent: Mozilla/5.0 (...) Gecko/2008052906 Firefox/3.0</strong></pre>
<p>&#8230; and response &#8230;</p>
<pre class="code">HTTP/1.1 200 OK
Date: Thu, 17 Jul 2008 16:11:24 GMT
<strong>Expires: Wed, 11 Jan 1984 05:00:00 GMT
Etag: "a9432-fc1b28423-cb122da"
Last-Modified: Thu, 17 Jul 2008 16:11:24 GMT
Cache-Control: private, must-revalidate, max-age=0
Vary: User-Agent
</strong>Content-Type: text/html; charset=UTF-8

&lt;html&gt;...&lt;/html&gt;</pre>
<h3>Basic Caching</h3>
<p>The response headers returned by the server give the browser and the proxy information to make caching decisions.</p>
<p>First, the <a title="The Cache-Control header, in HTTP specifications, at W3.org" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9" target="_blank"><code>Cache-Control</code> header</a> tells if the content is cacheable or not. If they&#8217;re not sent, it&#8217;s cacheable by default. Consider the following headers:</p>
<pre class="code">Cache-Control: public, max-age=86400</pre>
<p>It basically says that the page is cacheable in a <code>public</code> scope, and that the content shouldn&#8217;t be kept in the cache without revalidation for more than 1 day (86400 seconds). The scope can be:</p>
<ul>
<li><code>public</code>: Cacheable by browsers and proxies, even if authenticated</li>
<li><code>Private</code>: Cacheable by browsers only (and proxies, but only for requests from the same clients)</li>
<li><code>no-cache</code>: Cacheable, but revalidation is required every time.</li>
<li><code>no-store</code>: Not cacheable at all.</li>
</ul>
<p>In addition, there are a few other keywords that you can add to your <code>Cache-Control</code> header. Keep in mind that you must separate multiple keywords by commas.</p>
<ul>
<li><code>must-revalidate</code>: Some proxies can be configured to ignore the <code>Expires</code> and <code>maxage</code>. This keyword forces them to always act like the resource was expired.</li>
<li><code>proxy-revalidate</code>: Same as <code>must-revalidate</code>, but only for proxies.</li>
<li><code>s-maxage</code>: Same as <code>maxage</code>, but only for proxies.</li>
</ul>
<p>Finally, for HTTP/1.0 compatibility, you should send a <code>Pragma</code> header when using the <code>Cache-Control no-cache</code> directive.</p>
<pre class="code">Pragma: no-cache</pre>
<p><strong>Browsers and proxies cache resources based on their URL</strong>. You can take advantage of this in many ways at the design stage of your web site or web application. For example, you should put non private REST web service parameters (such as language, or country) in the URL:</p>
<pre class="code">http://www.somesite.com/webservice/regionslist/country/usa/language/en</pre>
<p>Browsers and proxies also store three important information about the page: the <code>Expires</code>, <code>Last-Modified</code> and <code>Etag</code> headers.</p>
<ul>
<li>The <a title="The Expires header, in HTTP specifications, at W3.org" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21" target="_blank"><code>Expires</code> header</a> tells the browser and proxy, along with the <code>max-age</code> component of the <code>Cache-Control</code> header, until when this version of the content should be valid.</li>
<li>The <a title="The Last-Modified header, in HTTP specifications, at W3.org" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.29" target="_blank"><code>Last-Modified</code> header</a> tells the browser and proxy the date and time of the last modification to this page. It isn&#8217;t always provided.</li>
<li>The <a title="The Etag header, in HTTP specifications, at W3.org" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.19" target="_blank"><code>Etag</code> header</a>, which stands for Entity Tag, gives the browser and proxy a unique identifier that describes the content it returned. If a page&#8217;s content changes, its <code>Etag</code> changes as well.</li>
</ul>
<p>When you requested this page, your browser (and the proxy in the middle if there was one) did check if the page is cacheable, and since it was, stored a copy of the page associated with the URL, and the three metrics above. For subsequent requests, the server might use this cached copy.</p>
<p>Might? Yes, because the cached page won&#8217;t be good until the end of times. At some point, the browser (or the proxy) will check with the server if the page it has in cache is still valid. This is called revalidation, and the <code>Expires</code> HTTP response header along with the <code>max-age</code> component of the <code>Cache-Control</code> header control it.<a href="http://www.tommylacroix.com/wp-content/uploads/2008/07/http-cache-browser.gif"><img class="aligncenter size-full wp-image-71" title="HTTP caching, with the browser\'s perspective" src="http://www.tommylacroix.com/wp-content/uploads/2008/07/http-cache-browser.gif" alt="" width="476" height="267" /></a></p>
<p>When the browser or proxy revalidates a page, it sends information about its version: the <code>Etag</code>, and the <code>Last-Modified</code> the server sent when he cached the page. These are sent as <a title="The If-Modified-Since header, in HTTP specifications, at W3.org" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.25" target="_blank"><code>If-Modified-Since</code></a>, and <a title="The If-None-Match header, in HTTP specifications, at W3.org" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.26" target="_blank"><code>If-None-Match</code></a>, respectively:</p>
<pre class="code">GET /some-cachable-page HTTP/1.1
Host: www.tommylacroix.com
<strong>If-Modified-Since: Thu, 17 Jul 2008 16:11:24 GMT
If-None-Match: "a9432-fc1b28423-cb122da"
</strong>User-Agent: Mozilla/5.0 (...) Gecko/2008052906 Firefox/3.0</pre>
<p>The server then compares this information with the <code>Etag</code> and the <code>Last-Modified</code> of the up-to-date page. If the browser&#8217;s cached copy appears to be valid, the server replies with the <code>Expires</code> and <code>Etag</code> (if available), headers, and no content:</p>
<pre class="code">HTTP/1.1 304 Not modified
Date: Thu, 17 Jul 2008 16:11:24 GMT
Expires: Wed, 11 Jan 2009 05:00:00 GMT
Etag: "a9432-fc1b28423-cb122da"</pre>
<p>If the browser&#8217;s cached copy appears to be out-dated, the server replies with the whole page, as usual.</p>
<p><a href="http://www.tommylacroix.com/wp-content/uploads/2008/07/http-cache-server.gif"><img class="aligncenter size-full wp-image-72" title="HTTP caching, with the server\'s perspective" src="http://www.tommylacroix.com/wp-content/uploads/2008/07/http-cache-server.gif" alt="" width="417" height="308" /></a></p>
<h3>Specific Cases</h3>
<p>Now, here comes the tricky cases. For the sake of clarity, I&#8217;ll use the following plot for the scenarios below:</p>
<blockquote><p>« Bob, Alice and Gregg work in the same office. Their office is equiped with a caching web proxy. Bob and Gregg share the same computer with the same user (ok, not credible, so lets say it&#8217;s a under-financed non-profit organization), and Alice has her own (she&#8217;s the boss).  »</p></blockquote>
<h4>Scenario 1: Secure sessions</h4>
<blockquote><p>« Bob goes on his SuperSocial profile page, at http://www.supersocial.com/profile/. His browser and the office proxy will check if the page is cacheable, and it is. They both store a copy of the page associated with the URL.</p>
<p>But what happens when Gregg or Alice log in his/her SuperSocial&#8217;s profile page right after? The browser will give him/her Bob&#8217;s page! »</p></blockquote>
<p><strong>The <code>Cache-Control</code>, <code>Expires</code>, and the <code>Etag</code> headers. </strong>Setting the <code>Expires</code> header in the past and the <code>max-age</code> to zero will cause the browser to revalidate the content each time. If the cached content is valid, only a header with no content will be sent. This is slightly slower than full blown caching, but no as much as no caching at all.</p>
<p>We could also set the <code>Cache-Control</code> scope to private, as each copy of the page will obviously only be valid one user.</p>
<p>We should also use <code>Etag</code>, as the content returned for the same URL isn&#8217;t the same for Bob and for Gregg, so the <code>Etag</code> will change, and the browser will reload the page for Gregg.</p>
<h4>Scenario 2: Content optimization</h4>
<blockquote><p>« The three unproductive workers browse a news site that has a wicked design. So wicked that the guys behind it had to make browser specific optimizations. Therefore, when you&#8217;re with Internet Explorer, the page is IE optimized, when you&#8217;re with Safari, some in-line CSS styles are different, and when you&#8217;re with Firefox, you get the regular page because this beauty is standard-compliant. Standard-what? Lets not digress&#8230;</p>
<p>When Bob and Gregg browse the site with IE from the same computer, it&#8217;s fine. But when Alice accesses it a short while after with Safari, she gets an ugly page as it&#8217;s IE optimized. The reason is, the server sent the IE version to Bob, and the proxy cached it. When Alice requests it, the proxy sends the IE page, thinking that it&#8217;s all fine. »</p></blockquote>
<p><strong>The <code>Vary</code> header.</strong> When the content of a page changes based on miscellaneous headers contained in the request, the server must tell the browser and the proxy using the <a title="The Vary header, in HTTP specifications, at W3.org" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.44" target="_blank"><code>Vary</code> header</a>. The <code>Vary</code> header basically says: If you cache this content, beware that if this header changes, the content might change as well, so use the URL with these fields to make sure you serve a valid version later.</p>
<p>Here&#8217;s an example. The request&#8230;</p>
<pre class="code">GET / HTTP/1.1
Host: www.tommylacroix.com
User-Agent: Mozilla/5.0 (...) Gecko/2008052906 Firefox/3.0</pre>
<p>&#8230; and response &#8230;</p>
<pre class="code">HTTP/1.1 200 OK
Date: Thu, 17 Jul 2008 16:11:24 GMT
Expires: Wed, 11 Jan 2009 05:00:00 GMT
Last-Modified: Thu, 17 Jul 2008 16:11:24 GMT
Cache-Control: public, max-age=86400
Vary: User-Agent
Content-Type: text/html; charset=UTF-8</pre>
<h3>Code Snippet</h3>
<p>Here&#8217;s a code snippet I wrote quite some time ago. It&#8217;s not pretty, but it works so I think it&#8217;s a good basic practical example.</p>
<pre class="code">/**
* setCacheHTTPHeaders
*
* @author	Tommy Lacroix
* @param	string	$privacy		Scope: public, private or no-cache
* @param	int	$lastModified		Unix timestamp of last page modification (optional)
* @param	int	$maxage			Maximum caching time before revalidation (optional)
* @param	string	$etag			Entity tag, page-content specific (optional)
* @return	bool				TRUE if content need to be sent, FALSE if no content need to be sent
*/
function setCachePolicy($privacy = 'public', $lastModified = false, $maxage = false, $etag = false) {
	// Sanitize privacy
	switch ($privacy) {
		case 'privacy':
		case 'public':
		case 'no-cache':
			break;
		default:
			$privacy = "public";
			break;
	}

	// Calculate expiry and max-age
	if (is_string($maxage)) { // Expiry is a string, interpret
		unset($m);
		if (preg_match('/^([0-9]+)([smhdwy])$/', $maxage, $m)) {
			$maxage = $m[1];
			switch ($m[2]) {
				case 's':	break;
				case 'm':	$maxage *= 60; 		break;
				case 'h':	$maxage *= 3600; 	break;
				case 'd':	$maxage *= 86400; 	break;
				case 'w':	$maxage *= 604800; 	break;
				case 'y':	$maxage *= 31536000; 	break;
			}
		}
	}
	if ($privacy != 'no-cache') {
		header('Expires: '.gmdate("r", time()+$maxage));
	} else {
		header('Expires: '.gmdate("r", time()-31536000));
		$maxage = 0;
	}

	// Send ETag headers
	if ($etag !== false) {
		header('ETag: "'.$etag.'"');
	}

	// Determine wheter we need to send content or not
	$outputContent = true;

	// Check ETag
	if ((isset($_SERVER['HTTP_IF_NONE_MATCH'])) &amp;&amp; ($etag !== false)) {
		if ($_SERVER['HTTP_IF_NONE_MATCH'] == '"'.$etag.'"') {
			header($_SERVER['SERVER_PROTOCOL'].' 304 Not Modified');
			$outputContent = false;
		}
	}

	if ((isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) &amp;&amp; ($lastModified !== false)) {
		$ifModifiedSince = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']);
		if ($ifModifiedSince &gt;= $lastModified) {
			header($_SERVER['SERVER_PROTOCOL'].' 304 Not Modified');
			$outputContent = false;
		}
	}

	// Remove content if output has been disabled
	if (!$outputContent) {
		// Return false: You don't need to send content
		return false;
	} else {
		// Send other headers
		header('Cache-Control: '.$privacy.', must-revalidate, post-check=0, pre-check=0, max-age='.$maxage);
		if ($privacy == 'no-cache') header('Pragma: no-cache');
		if ($lastModified !== false) header('Last-Modified: '.gmdate('r',$lastModified));

		// Return true: you need to send content
		return true;
	}
}</pre>
<h3>Conclusion</h3>
<p>The caching HTTP headers are simple to implement, and provide a huge performance bonus. If done properly, this convert into a better user experience, as there&#8217;s less waiting, and more browsing.</p>
<p>Shall you like me to add other scenarios, feel free to drop me a line and I&#8217;ll see what I can do.</p>
<h3>Further Reading</h3>
<ul>
<li><a title="Caching in HTTP, at W3" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html" target="_blank">Caching in HTTP, at W3</a></li>
<li><a title="HTTP Caching in Mozilla, at Mozilla" href="http://www.mozilla.org/projects/netlib/http/http-caching-faq.html" target="_blank">HTTP Caching in Mozilla, at Mozilla</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.tommylacroix.com/2008/07/17/http-caching-basics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usability review of the week (April 4th, 08)</title>
		<link>http://www.tommylacroix.com/2008/04/04/usability-review-week-14/</link>
		<comments>http://www.tommylacroix.com/2008/04/04/usability-review-week-14/#comments</comments>
		<pubDate>Sat, 05 Apr 2008 01:53:41 +0000</pubDate>
		<dc:creator>tlacroix</dc:creator>
				<category><![CDATA[Usability]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[html emails]]></category>
		<category><![CDATA[text emails]]></category>
		<category><![CDATA[web design]]></category>
<category>amazon</category><category>usability</category><category>web design</category>
		<guid isPermaLink="false">http://www.tommylacroix.com/2008/04/04/usability-review-week-14/</guid>
		<description><![CDATA[Getting back to good habits, here&#8217;s another issue of the usability review of the week. I should actually be called usability review of the day, as all the good stuff I came across was published on April 3rd. Big impact, small changes on Amazon (04/03/2008) Effective text only emails (04/03/2008) A Refreshing Take on Usability [...]]]></description>
			<content:encoded><![CDATA[<p>Getting back to good habits, here&#8217;s another issue of the usability review of the week. I should actually be called usability review of the day, as all the good stuff I came across was published on April 3rd.</p>
<ul>
<li>Big impact, small changes on Amazon (04/03/2008)</li>
<li>Effective text only emails (04/03/2008)</li>
<li>A Refreshing Take on Usability (04/03/2008)</li>
</ul>
<p>Shall you stumble on great usability pages, feel free to leave me a comment and I&#8217;ll give it a look.<br />
<span id="more-60"></span><br />
</p>
<h2>Big impact, small changes on Amazon (April 3rd, 2008)</h2>
<p>You probably didn&#8217;t notice unless you&#8217;re a savvy Amazon shopper (whether you shop for books or for usability practices) , but Amazon recently made subtle but great changes to the design. They improved readability of key information elements, and redesigned the up-selling space. Check the link below for a great before/after comparison (that I didn&#8217;t feel comfortable to rip even if I was going to credit the author).</p>
<p>Via: <a href="http://www.grokdotcom.com/2008/04/03/amazon-usability-testing/" title="Small changes, big impact on Amazon, from Future Now's blog" target="_blank">Future Now&#8217;s blog</a></p>
<h2>Effective text only emails  (April 3rd, 2008)</h2>
<p>Text emails don&#8217;t have to be bad and boring. Okay, they&#8217;ve got to be boring. But still, when HTML emails aren&#8217;t an option, or even just to provide a text alternative for all these new non-HTML cell phone email readers out there, there are ways to make text emails look better:</p>
<ul>
<li>Put links on new lines</li>
<li>Uses lists with asterisks as bullets</li>
<li>Try to keep it short</li>
<li>If you can&#8217;t keep it short, divide in sections</li>
<li>Call to action</li>
</ul>
<p>Via: <a href="http://shapeshed.com/journal/effective_text_only_emails/" title="Effective text only emails, on Shape Shed" target="_blank">Shape Shed</a></p>
<h2>A Refreshing Take on Usability (April 3rd, 2008)</h2>
<p>This is more a funny heads up than a news, but it shows how well one can use available information to improve user experience.</p>
<p>Via:  <a href="http://flux88.com/ARefreshingTakeOnUsability.aspx" title="A Refreshing Take on Usability, on B#" target="_blank">B#</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tommylacroix.com/2008/04/04/usability-review-week-14/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usability review of the week (March 14th, 08)</title>
		<link>http://www.tommylacroix.com/2008/03/14/usability-review-week-11/</link>
		<comments>http://www.tommylacroix.com/2008/03/14/usability-review-week-11/#comments</comments>
		<pubDate>Fri, 14 Mar 2008 19:06:06 +0000</pubDate>
		<dc:creator>tlacroix</dc:creator>
				<category><![CDATA[Usability]]></category>
		<category><![CDATA[ecommerce]]></category>
		<category><![CDATA[report]]></category>
		<category><![CDATA[search engine]]></category>
		<category><![CDATA[shopping cart]]></category>
		<category><![CDATA[study]]></category>
		<category><![CDATA[weekly review]]></category>
<category>google</category><category>usability</category><category>web design</category>
		<guid isPermaLink="false">http://www.tommylacroix.com/2008/03/14/usability-review-week-11/</guid>
		<description><![CDATA[Another crazy week, and not so much good usability articles appeared on my radar. Yet, there&#8217;s a few, and here they are. Is Customer Experience Recession-Proof? (03/14/2008) eCommerce Usability Review: Advanced Search Pages (03/13/2008) 11 Ways to Fill Your Shopper&#8217;s Cart (03/12/2008) Google to start to implement site performance metrics in SEM Quality Score (03/07/2008) [...]]]></description>
			<content:encoded><![CDATA[<p>Another crazy week, and not so much good usability articles appeared on my radar. Yet, there&#8217;s a few, and here they are.</p>
<ul>
<li>Is Customer Experience Recession-Proof? (03/14/2008)</li>
<li>eCommerce Usability Review: Advanced Search Pages (03/13/2008)</li>
<li>11 Ways to Fill Your Shopper&#8217;s Cart (03/12/2008)</li>
<li>Google to start to implement site performance metrics in SEM Quality Score (03/07/2008)</li>
</ul>
<p><span id="more-55"></span><br />
<h2>Is Customer Experience Recession-Proof?</h2>
<p>Apparently, when consumer spending drops, the fight over the remaining dollars intensifies. A <a href="http://www.forrester.com/Research/Document/Excerpt/0,7211,45134,00.html" title="Customer Experience Spending Intensifies In 2008, by Forrester" target="_blank">new report from Forrester</a> goes in that direction. According to the summary, &#8220;more than 80% of respondents said that improving the usability, usefulness and enjoyability of the online experience is more important this year.&#8221; Respondents forecast increased spending in Web Analytics (68%), Usability (53%) and Behavioral Research (51%).</p>
<p>Via: <a href="http://blogs.cioinsight.com/research_central/content001/no_recession_for_web_site_improvement_1.html" title="Is Customer Experience Recession-Proof?, by Allan Alter from CIO Insight">Research Central @ CIO Insight</a></p>
<h2>eCommerce Usability Review: Advanced Search Pages</h2>
<p>Yesterday, Varien published an <a href="http://www.varien.com/miscellaneous/ecommerce-usability-review-advanced-search-pages/" title="Usability review on advanced search page attributes" target="_blank">advanced search page attributes review</a>, that is somewhat a sequel to  <a href="http://www.varien.com/ecommerce/ecommerce-product-search-web-gallery/" title="Usability review on search page attributes" target="_blank">usability review on search page attributes</a>. Same concept as before, the folks take a couple of very good, good and bad pages to display what advanced search engine pages out there allow the user to do. I&#8217;m particularilly a fan of the &#8220;refine search&#8221; concept,<br />
as it is in harmony with the progressive disclosure principle.</p>
<p>Via: <a href="http://www.varien.com/miscellaneous/ecommerce-usability-review-advanced-search-pages/" title="Usability review on advanced search page attributes" target="_blank">Varien&#8217;s eCommerce Cache Blog</a></p>
<p>See also: <a href="http://www.varien.com/ecommerce/usability-gift-registries/" title="Usability of gift registries, at Varien" target="_blank">Usability of gift registries, also at Varien</a></p>
<h2>11 Ways to Fill Your Shopper&#8217;s Cart</h2>
<p>I liked this one as it helped complete my eCommerce site functionality checklist. Most of Stoney deGeyter&#8217;s tips are obvious if you already designed a few eCommerce sites (search engine, product comparison guides, product reviews, etc.), but the list is brief and well assembled, which makes it a good reference tool to save you some thinking time.</p>
<p>Via:  <a href="http://www.searchengineguide.com/stoney-degeyter/11-ways-fill-your-shoppers-cart.php" title="11 Ways to Fill Your Shopping Cart, at Search Engine Guide" target="_blank">Search Engine Guide</a></p>
<h2>Google to start to implement site performance metrics in SEM Quality Score</h2>
<p>Earlier this week, Google released a post indicating that they will start to consider the landing page load time in the calculation of the Quality Score. The guys at <a href="http://www.traffick.com/2008/03/site-performance-increasingly-important.asp" title="Site Performance Increasingly Important to SEM Performance, at Traffick" target="_blank">Traffick </a>see it as the beginning of a trend, and I tend to agree after reading <a href="http://www.seobythesea.com/?p=1014" title="Yahoo Automates Usability Consulting, at SEO by the SEA" target="_blank">Yahoo&#8217;s usability patent filling last week</a>.</p>
<p>Via: <a href="http://www.traffick.com/2008/03/site-performance-increasingly-important.asp" title="Site Performance Increasingly Important to SEM Performance, at Traffick" target="_blank">Traffick </a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tommylacroix.com/2008/03/14/usability-review-week-11/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usability review of the week (March 7th, 08)</title>
		<link>http://www.tommylacroix.com/2008/03/07/usability-review-week-10/</link>
		<comments>http://www.tommylacroix.com/2008/03/07/usability-review-week-10/#comments</comments>
		<pubDate>Fri, 07 Mar 2008 13:06:19 +0000</pubDate>
		<dc:creator>tlacroix</dc:creator>
				<category><![CDATA[Usability]]></category>
		<category><![CDATA[css framework]]></category>
		<category><![CDATA[jakob nielsen]]></category>
		<category><![CDATA[roi]]></category>
		<category><![CDATA[study]]></category>
		<category><![CDATA[weekly review]]></category>
<category>css</category><category>framework</category><category>html</category><category>seo</category><category>usability</category><category>web design</category>
		<guid isPermaLink="false">http://www.tommylacroix.com/2008/03/07/usability-review-week-10/</guid>
		<description><![CDATA[Here&#8217;s what I stumbled upon this week, on the web, about usability. The reviews are quite brief as this has been a crazy week for me. Jakob Nielsen&#8217;s reports usability ROI decline(03/04/2008) Yahoo Automates Usability Consulting (03/03/2008) Study: Introductory Paragraphs and Tabs Don’t Aid Reading Comprehension Online (05/03/2008) Measuring satisfaction: Beyond the usability questionnaire (03/03/2008) [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s what I stumbled upon this week, on the web, about usability. The reviews are quite brief as this has been a crazy week for me.</p>
<ul>
<li>Jakob Nielsen&#8217;s reports usability ROI decline(03/04/2008)</li>
<li>Yahoo Automates Usability Consulting (03/03/2008)</li>
<li>Study: Introductory Paragraphs and Tabs Don’t Aid Reading Comprehension Online (05/03/2008)</li>
<li>Measuring satisfaction: Beyond the usability questionnaire (03/03/2008)</li>
</ul>
<p><span id="more-53"></span></p>
<h2>Jakob Nielsen&#8217;s reports usability ROI decline</h2>
<p><a href="http://www.useit.com/" title="Jakob Nielsen UseIt.com" target="_blank">Jakob Nielsen</a> reports that <a href="http://www.useit.com/alertbox/roi.html" title="Average usability ROI of web sites, Jaokb Nielsen, 2008" target="_blank">average the usability ROI of web sites</a> declined from 135% (2002) to 83% (2008). Nielson gives a few explanations to the decline. Two of them are :</p>
<blockquote><p>We have now harvested most of the low-hanging fruit from the truly horrible websites that dominated the lost decade of Web usability (approximately 1993–2003). In those early years, Web design was abominable — think splash screens, search that didn’t find anything, bloated graphics everywhere. The only good thing about these early designs was that they were so bad that it was easy for usability people to be heroes: even the smallest study would inevitably reveal several immense opportunities for improvement.</p></blockquote>
<p>Via: <a href="http://www.littlespringsdesign.com/blog/2008/03/04/usability-roi/Little" title="Usability ROI, on Little Spring Design">Little Sprint Design</a></p>
<h2>Yahoo Automates Usability Consulting</h2>
<p>A recent <a href="http://www.yahoo.com" title="Yahoo" target="_blank">Yahoo</a> <a href="http://appft1.uspto.gov/netacgi/nph-Parser?Sect1=PTO2&amp;Sect2=HITOFF&amp;u=%2Fnetahtml%2FPTO%2Fsearch-adv.html&amp;r=1&amp;p=1&amp;f=G&amp;l=50&amp;d=PG01&amp;S1=20080040195.PGNR.&amp;OS=dn/20080040195&amp;RS=DN/20080040195" title="Quantitative Analysis of Web Page Clutter that Accounts for Subjective Preferences" target="_blank">patent application</a> lists usability factors a search engine could use to determine how usable a web page is.  Why would Yahoo be interested in knowing?  Quoting the authors of the document :</p>
<blockquote><p>It can be important to make web pages easy and pleasing to use, which can be particularly important for web pages it is desired to monetize.</p>
<p>This may include, for example, advertisement-containing web pages (of a so-called “web portal,” for example), for which an advertiser pays money when a user views the web page and activates a link of the advertisement.</p>
<p>If such web pages are not easy and pleasing to use, the money-making potential of those web pages can be jeopardized. One conventional indication of whether a web page is easy and pleasing to use is called “clutter.”</p></blockquote>
<p>I personally crave for a usability test engine to replace my old boring evaluation checklist. Next step would be a Google Analytics module that would analyze the browsing patterns.</p>
<p>Via: <a href="http://www.seobythesea.com/?p=1014" title="Yahoo Automates Usability Consulting, by SEO by the SEA" target="_blank">SEO by the SEA</a></p>
<h2>Study: Introductory Paragraphs and Tabs Don’t Aid Reading Comprehension Online</h2>
<p>A recent study by the University of Washington analyzes the impact of introductory paragraphs (presence of the paragraph, and presence of links in the paragraph), and tabbed navigation.</p>
<p>Cutting to the chase, users apparently like tabs, but introductory text might have no effect on comprehension. Anchored text is helps increasing comprehension &#8212; especially on how the concepts relate to each other &#8212; but decreases user satisfaction, especially when there&#8217;s no tabbed navigation present. I strongly encourage you to spend 5 minutes to read <a href="http://faithfulweb.wordpress.com/2008/03/05/usability-tabs-links/" title="Study: Introductory Paragraphs and Tabs Don’t Aid Reading Comprehension Online, at Faithful Web" target="_blank">Faithful Web summary</a>.<br />
Via: <a href="http://faithfulweb.wordpress.com/2008/03/05/usability-tabs-links/" title="Study: Introductory Paragraphs and Tabs Don’t Aid Reading Comprehension Online, from FaithfulWeb" target="_blank">Faithful Web</a></p>
<h2>Measuring satisfaction: Beyond the usability questionnaire</h2>
<p>David Travis from UserFocus describes the criticism-reluctancy problem in rational usability testing, and provides a method to overcome this problem.</p>
<p>This is very similar to a few focus group interview techniques used in marketing research, but applied to usability testing.</p>
<p>Via: <a href="http://www.userfocus.co.uk/articles/satisfaction.html" title="Measuring satisfaction: Beyond the usability questionnaire, from UserFocus" target="_blank">UserFocus</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tommylacroix.com/2008/03/07/usability-review-week-10/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Dynamic web site development workflow</title>
		<link>http://www.tommylacroix.com/2008/02/27/workflow-dynamic-web-development/</link>
		<comments>http://www.tommylacroix.com/2008/02/27/workflow-dynamic-web-development/#comments</comments>
		<pubDate>Wed, 27 Feb 2008 13:39:04 +0000</pubDate>
		<dc:creator>tlacroix</dc:creator>
				<category><![CDATA[Usability]]></category>
		<category><![CDATA[Web development]]></category>
		<category><![CDATA[functional analysis]]></category>
		<category><![CDATA[planning]]></category>
		<category><![CDATA[postmortem]]></category>
		<category><![CDATA[technical analysis]]></category>
		<category><![CDATA[workflow]]></category>
<category>programming</category><category>web design</category><category>wireframe</category><category>workflow</category>
		<guid isPermaLink="false">http://www.tommylacroix.com/2008/02/27/workflow-dynamic-web-development/</guid>
		<description><![CDATA[I found an article about static web design workflow by Josh at Tutorial a day. While his process is great for static web sites, it isn&#8217;t adapted to dynamic web design, with a PHP/ASP/DotNET/JSP/ColdFusion (yuk) backend that is. I&#8217;ll try to briefly cover every step we &#8212; at Quantik Solutions &#8212; do to ensure the [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.tommylacroix.com/wp-content/uploads/2008/02/web-process-2.gif" alt="Dynamic web site development workflow" style="margin: 0pt 0pt 5px 5px; float: right" /><img src="http://www.tommylacroix.com/wp-content/uploads/2008/02/web-process.gif" alt="Basic circular development process" style="margin: 0pt 5px 5px 0pt; float: left" />I found an article about <a href="http://tutorialaday.com/web-design-workflow-complete-overview/" title="Static web design workflow, by Josh at Tutorial a day" target="_blank">static web design workflow by Josh at Tutorial a day</a>. While his process is great for static web sites, it isn&#8217;t adapted to dynamic web design, with a PHP/ASP/DotNET/JSP/ColdFusion (yuk) backend that is.</p>
<p>I&#8217;ll try to briefly cover every step we &#8212; at <a href="http://www.quantiksolutions.com/" title="Quantik Solutions" target="_blank">Quantik Solutions</a> &#8212; do to ensure the delivery of a web site that meet the client and the user needs. This being an overview, I will try to develop each step in a separate post later on.</p>
<p><strong>Step 1. Market, history and present situation analysis</strong></p>
<p>This basically consist in look to the client&#8217;s past and actual web site, and its competitors. The objective is too get a list of do&#8217;s, keepers and don&#8217;t, either from the functionalities of the analyzed sites, or from functionalities that are missing from the sites. We analyze available web statistics to get quantitative information about what informations the visitors seek the most and the less.</p>
<p>This step also consist in finding the characteristics the major <em><a href="http://en.wikipedia.org/wiki/Personas" title="Definition of personas at Wikipedia" target="_blank"><abbr title="Personas are fictitious characters that are created to represent the different user types within a targeted demographic that might use a site or product.">personas</abbr></a></em>:</p>
<ul>
<li>What are their demographics? (age, sex, education, revenue, etc.)</li>
<li>What is their internet knowledge? (often based on their demographics)</li>
<li>What information do they look for on the site, in the first 30 seconds, in first 2 minutes, in the first 10 minutes?</li>
<li>What is their technological profile? (ie. which browser, JavaScript support, Flash version support, screen resolution, etc.)</li>
</ul>
<p><strong>Step 2. Needs and requirement gathering</strong></p>
<p>Usually &#8212; but strange enough not always &#8212; the redesign or refectory of a site is triggered by new requirements or new needs. The objective of this step is to get a list of all of them, but also to discover latent needs and requirements, or to convert requirements to strategies. We also try to get an idea of the client&#8217;s budget.</p>
<p>For example, a client could require to improve its web sales by 10%.</p>
<ul>
<li>A latent requirement could be that the checkout process is simpler, as it has 10 steps right now ;</li>
<li>His 10% improvement requirement could be converted to an immediate or delayed up-selling strategy.</li>
</ul>
<p>It might look like rocket science, but all the answers usually come quickly and easily after the market analysis at the previous step.</p>
<p><span id="more-34"></span><strong>Step 3. Information architecture</strong></p>
<p>This basically consists in grouping related information in sections. We use the card sorting technique I&#8217;ll cover later in another post.</p>
<p><strong>Step 4. Functional planning</strong></p>
<p>This stage consists of drawing annotated wire frames of the major interfaces. We do a first version on paper or on a white board at first (that we scan or capture with a digital camera for archives), then <a href="http://www.tommylacroix.com/2008/02/20/wireframe-toolkit-for-visio/" title="Visio wire frame template and stencils">using Visio and UXD wire frame template/stencils</a>.</p>
<p>We try to separate this from the design to make sure that we don&#8217;t end up with a nice looking but unusable web site.</p>
<p>Our main usuability guidelines are :</p>
<ul>
<li><strong>Learnability</strong>: a user who doesn&#8217;t know the web site design, functionalities and information architecture must be able to find what he looks for quickly.</li>
<li><strong>Memorability</strong>:  a user who knows the site must be able to quickly remember its functionalities when he returns to it after a prolonged period.</li>
<li><strong>Efficiency</strong>: a user who knows the site must be able to find what he looks for quickly, and be able to use more advanced features (search engine, related content boxes, etc.) to do so.</li>
<li><strong>Errors</strong>: a user must make as little browser mistake as possible, and misleading elements must be remove.</li>
<li><strong>Satisfaction</strong>: a user must enjoy browsing the site.</li>
</ul>
<p><strong>Step 5. Technical planning</strong></p>
<p>This step consists in planning the software architecture behind the site. Database models are drawn, SQL queries are written, programming guidelines are outlined, browser compatibility and hosting requirements are stated, and speed/load objectives are identified and quantified.</p>
<p><strong>Step 6. Cost analysis</strong></p>
<p>At this step, we know exactly how the project is going to be done. Hence, a precise cost analysis can be made. We base the cost analysis on previous project and client history. We add a budget for quality assessment and client communication and management, both based on internal and client-specific historical ratios (some clients are high maintenance, some are low maintenance).</p>
<p><strong>Step 7. Design</strong></p>
<p>We don&#8217;t do any web design at Quantik Solutions because it isn&#8217;t our strength. We rely on experience web designers instead. So they typically draw two front pages, then one is picked by the client; then they draw one to three sub pages, that are adjusted following the client&#8217;s feedback.</p>
<p><strong>Step 8. Integration, programming, and quality insurance</strong></p>
<p>Integrate, code, test. The requirements, functional and technical analysis are used to make sure no deliverable has been forgotten.</p>
<p><strong>Step 9. Production </strong><strong>postmortem</strong></p>
<p>What did we do well, and what didn&#8217;t we? Most of the time, the answer to improving your processes and workflow are right under your nose in everybody&#8217;s head. We make sure it gets out and ends on paper. The objective of this step is a bullet form or keepers and goers.</p>
<p><strong>Step 10. Project postmortem</strong></p>
<p>After a few weeks or months, we update the information collected during step 1.</p>
<ul>
<li>What did the client think of the development process?</li>
<li>What did the client hear from the users about the new site?</li>
<li>After web statistics analysis, what actually seem to works and what doesn&#8217;t?</li>
<li>Did the client and user needs change? If so, in what way?</li>
</ul>
<p>Often, this leads to a micro iteration where minor changes are brought to the site (revision of step 3 to 8), or to a complete iteration (steps 1 to 10).</p>
<p><strong>Conclusion</strong></p>
<p>This process isn&#8217;t perfect, and we keep on learning on how to improve it. Therefore, we make sure that we get our folks&#8217; and clients&#8217; opinion and ideas about it.</p>
<p>It can also be too heavy for some small projects. Thus, some steps are sometimes driven in an informal way, or using a template that fits the typical project with minor adjustments.</p>
<p><strong>Further reading</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tommylacroix.com/2008/02/27/workflow-dynamic-web-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Detecting your visitors timezone</title>
		<link>http://www.tommylacroix.com/2008/02/25/detect-timezone-with-javascript/</link>
		<comments>http://www.tommylacroix.com/2008/02/25/detect-timezone-with-javascript/#comments</comments>
		<pubDate>Mon, 25 Feb 2008 14:44:29 +0000</pubDate>
		<dc:creator>tlacroix</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[detection]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[timezone]]></category>
		<category><![CDATA[Web development]]></category>
<category>detection</category><category>html</category><category>javascript</category><category>web development</category>
		<guid isPermaLink="false">http://www.tommylacroix.com/2008/02/25/detect-timezone-with-javascript/</guid>
		<description><![CDATA[Most web applications in this World 2.0 target international users distributed among many different timezones. It is pretty simple to ask the users what their timezone is when they registered to your site. This article aims to solve the case of unregistered users who you can&#8217;t ask in a usable way. The solution isn&#8217;t perfect, [...]]]></description>
			<content:encoded><![CDATA[<p><img style="border: 1px solid black; margin: 0pt 5px 5px 0pt; float: left" src="http://www.tommylacroix.com/wp-content/uploads/2008/02/timezone.thumbnail.gif" alt="Timezone map (from netschool.de)" />Most web applications in this World 2.0 target international users distributed among many different <a title="Time zones, at Wikipedia" href="http://en.wikipedia.org/wiki/Time_zone" target="_blank">timezones</a>. It is pretty simple to ask the users what their timezone is when they registered to your site. This article aims to solve the case of unregistered users who you can&#8217;t ask in a usable way. The solution isn&#8217;t perfect, but it&#8217;s better than nothing.</p>
<p>In theory and technologically, we could determine what timezone the user is in by:</p>
<ul>
<li>Using a geo location database to guess their longitude and latitude, and then find the probable timezone from it ;</li>
<li>Using JavaScript to read the user&#8217;s workstation clock and calculate the probable timezone from it. <a title="Detecting your visitors timezone demonstration" href="http://www.tommylacroix.com/demos/timezone/" target="_self">You can see a live demo here</a>.</li>
</ul>
<p>Geo location, while pretty simple nowadays with <a href="http://www.linuxjournal.com/article/7856" target="_blank">free databases floating around</a>, leaves us with a problem: the free databases are often not good enough to pin point a precise longitude and latitude, which will cause garbage in and garbage out when trying to translate it to a timezone. Moreover, the non-free and precise databases are pretty expensive compared to the added value of timezone detection, and are most likely not worth buying just for this purpose.</p>
<p><span id="more-32"></span>JavaScript clock reading on its side offers a pretty simple yet functional solution. The two downsides are:</p>
<ul>
<li>It is impossible to detect the timezone for users who disabled JavaScript (a very few in the AJAX world).</li>
<li>The precision depends on the exactness of the users&#8217; computer clock settings, as its the piece of information we base our calculation on.</li>
</ul>
<p>Here are the three macroscopic steps for the detection:</p>
<ul>
<li>Try to detect the user&#8217;s timezone through JavaScript, then send it via an XML-HTTP call to a script that will save it either as a cookie or as a session. Alternatively, you could use the JavaScript setcookie function.</li>
<li>If detection is impossible (JavaScript is disabled), try to read the previously detected timezone in a cookie.</li>
<li>If no timezone can be detected, use a default one (or chain in the geolocation method).</li>
</ul>
<p>The detection code itself is:</p>
<pre style="border: 1px solid black; margin: 0pt 40px 20px; padding: 4px; background-color: #fafafa; color: #5f5584"><code>function setTimeZone() {
 	var xmlhttp;
 	timezone = "EDT";</code>	/* Initialize httpRequest object */
 	if (window.ActiveXObject) {
 	 	xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
 	} else if (window.XMLHttpRequest) {
 	 	xmlhttp = new XMLHttpRequest();
 	}
 	xmlhttp.open("POST", "/timezone-controller.php",true);
 	xmlhttp.onreadystatechange=function() {
 	 	if (xmlhttp.readyState==4) {
 	 	 	// Do nothing
 	 	}
 	}

 	xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
 	var visitortime = new Date();
 	xmlhttp.send('epoch='+visitortime.getTime()/1000+
 	 	'&amp;timezoneoffset='+visitortime.getTimezoneOffset()/60);
} setTimeZone();</pre>
<p>I personally prefer to use the <code>epoch</code> value rather than the <code>timezoneoffset</code> one, as, in my experience, local timezone settings are more often incorrectly set than local time.</p>
<p>In conclusion, it is possible to detect your users&#8217; timezone in a fairly simple way using JavaScript, so you can present them dates and times relative to their location, without having to ask them.</p>
<p>However, the method being imperfect, the safest way to determine their exact timezone will always be to ask them. Thus, the implementation of this method shouldn&#8217;t replace the parameter in their profile.</p>
<p><small><br />
World timezone map found on <a href="http://www.netschool.de/erd/timezone.gif" target="_blank">netschool.de</a>.<br />
Article previously published in French at <a href="http://www.quantiksolutions.com/fr/articles/detecter-le-fuseau-horaire-de-vos-visiteurs.html" target="_blank">Quantik Solutions</a>.<br />
Code distributed under the <a title="GNU Lesser General Public License" href="http://www.gnu.org/copyleft/lesser.html" target="_blank">LGPL license</a>.</small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tommylacroix.com/2008/02/25/detect-timezone-with-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Examples of interfaces for usability-centric designers</title>
		<link>http://www.tommylacroix.com/2008/02/21/examples-of-interfaces-for-usability-centric-designers/</link>
		<comments>http://www.tommylacroix.com/2008/02/21/examples-of-interfaces-for-usability-centric-designers/#comments</comments>
		<pubDate>Thu, 21 Feb 2008 14:02:19 +0000</pubDate>
		<dc:creator>tlacroix</dc:creator>
				<category><![CDATA[Usability]]></category>
		<category><![CDATA[Web development]]></category>
		<category><![CDATA[examples]]></category>
		<category><![CDATA[interfaces]]></category>
		<category><![CDATA[templates]]></category>
		<category><![CDATA[web design]]></category>
<category>example</category><category>interfaces</category><category>usability</category><category>web design</category>
		<guid isPermaLink="false">http://www.tommylacroix.com/2008/02/21/examples-of-interfaces-for-usability-centric-designers/</guid>
		<description><![CDATA[Why re-invent the wheel? One of the principles of usability is to make your functionalities work the same way that most people do, so you&#8217;re visitors will be in &#8220;known territory&#8221; when they come across your site. Check out Factory Joe&#8217;s examples of everything from tag clouds and video players to headers and footers. Founds [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.tommylacroix.com/wp-content/uploads/2008/02/2196147333_19bee8bac3.thumbnail.jpg" alt="Example 404 interface" style="border: 1px solid black; float: left; margin-right: 10px; margin-bottom: 5px" />Why re-invent the wheel? One of the principles of usability is to make your functionalities work the same way that most people do, so you&#8217;re visitors will be in &#8220;known territory&#8221; when they come across your site.</p>
<p>Check out Factory Joe&#8217;s <a href="http://www.flickr.com/photos/factoryjoe/collections/72157600001823120/">examples</a> of everything from <a href="http://www.flickr.com/photos/factoryjoe/sets/72157600013680800/">tag clouds</a> and <a href="http://www.flickr.com/photos/factoryjoe/sets/72157600347160659/">video players</a> to <a href="http://www.flickr.com/photos/factoryjoe/sets/72157600112125268/">headers</a> and <a href="http://www.flickr.com/photos/factoryjoe/sets/72157594487444992/">footers</a>.</p>
<p>Founds on <a href="http://uxd.forumone.com/archives/135-Examples-Galore.html" target="_blank">UE&amp;D</a> blog (see blogroll).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tommylacroix.com/2008/02/21/examples-of-interfaces-for-usability-centric-designers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wireframe toolkit for Visio</title>
		<link>http://www.tommylacroix.com/2008/02/20/wireframe-toolkit-for-visio/</link>
		<comments>http://www.tommylacroix.com/2008/02/20/wireframe-toolkit-for-visio/#comments</comments>
		<pubDate>Wed, 20 Feb 2008 16:43:18 +0000</pubDate>
		<dc:creator>tlacroix</dc:creator>
				<category><![CDATA[Usability]]></category>
		<category><![CDATA[Web development]]></category>
		<category><![CDATA[web design]]></category>
		<category><![CDATA[wire frame]]></category>
		<category><![CDATA[wireframe]]></category>
<category>tool</category><category>usability</category><category>web design</category><category>wireframe</category>
		<guid isPermaLink="false">http://www.tommylacroix.com/2008/02/20/wireframe-toolkit-for-visio/</guid>
		<description><![CDATA[Have you been looking for a cool wireframe kit (template and stencils) for Visio? I&#8217;ve been, and tried many. This is the one I prefer, from the guys at User Experience and Design. Give it a shot, and let me know if you came across a better one, as I&#8217;m always open to improvement.]]></description>
			<content:encoded><![CDATA[<p>Have you been looking for a cool wireframe kit (template and stencils) for Visio? I&#8217;ve been, and tried many. <a href="http://uxd.forumone.com/archives/105-Scaled-Visio-Wireframe-Templates-Stencils.html" title="UXD Wire Frame Template and Stencils for Visio" target="_blank">This is the one I prefer</a>, from the guys at User Experience and Design. Give it a shot, and let me know if you came across a better one, as I&#8217;m always open to improvement.</p>
<p style="text-align: center"> <a href="http://uxd.forumone.com/archives/105-Scaled-Visio-Wireframe-Templates-Stencils.html" title="UXD Wire Frame Template and Stencils for Visio" target="_blank"><img src="http://www.tommylacroix.com/wp-content/uploads/2008/02/wireframe.gif" alt="Wireframe" border="0" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tommylacroix.com/2008/02/20/wireframe-toolkit-for-visio/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

