<?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>Web 3.0, 6 Bladed Razors, 7 Minute Abs &#187; Application Design</title>
	<atom:link href="http://www.zachleat.com/web/category/general/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.zachleat.com/web</link>
	<description></description>
	<lastBuildDate>Fri, 09 Dec 2011 21:53:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>A Mobile Web Divided</title>
		<link>http://www.zachleat.com/web/a-mobile-web-divided/</link>
		<comments>http://www.zachleat.com/web/a-mobile-web-divided/#comments</comments>
		<pubDate>Tue, 09 Aug 2011 03:25:57 +0000</pubDate>
		<dc:creator>Zach Leatherman</dc:creator>
				<category><![CDATA[Application Design]]></category>

		<guid isPermaLink="false">http://www.zachleat.com/web/?p=1079</guid>
		<description><![CDATA[Unless you&#8217;ve been living comfortably under an elaborate dwelling constructed entirely out of rock, you&#8217;re aware of the growing popularity of smartphones and other mobile devices. With that growth we&#8217;ve witnessed a bumper crop of component libraries and frameworks to enable us to create mobile web sites and applications. One Web, Two Web Primer There [...]]]></description>
			<content:encoded><![CDATA[<p>Unless you&#8217;ve been living comfortably under an elaborate dwelling constructed entirely out of rock, you&#8217;re aware of the growing popularity of smartphones and other mobile devices.  With that growth we&#8217;ve witnessed a bumper crop of component libraries and frameworks to enable us to create mobile web sites and applications.</p>
<h2 id="primer">One Web, Two Web Primer</h2>
<p>There are two different approaches one can take when developing a mobile web site.  The first approach has been assigned the delightfully inclusive moniker <a href="http://www.w3.org/TR/mobile-bp/#OneWeb">&#8216;<em>One Web</em>&#8216;</a>. <em>One Web</em> involves creating a single web site accessible from both mobile and desktop web browsers and the site&#8217;s presentation is custom tailored at run time to the capabilities of the user&#8217;s device.</p>
<p>The second approach involves creating two completely separate web sites, one for mobile and one for the desktop.  The advantage with this approach is that content and the user interface can be tailored specifically for mobile, as the user&#8217;s context while using each site is likely to be drastically different.  An obvious nickname for this approach might be <em>&#8216;Two Web&#8217;</em>.</p>
<p><em>Two Web</em> involves a white list of mobile User Agents that server side code uses to detect mobile devices and redirects them to a mobile specific site.  The remaining User Agents are left to view the desktop version.  An improvement to this approach allows end users to opt-out of the mobile version by simply clicking on a link that redirects to the desktop version and persists the setting (often using a cookie).</p>
<p>With <em>One Web</em> the site is customized and adapted based primarily on screen dimension, orientation, and pixel density. Contrast that to <em>Two Web</em>, which usually divides touch screen and non touch screen devices. While this may make it easier on developers, it&#8217;s awkward for users. For example, consider Google Plus on an iPad. The entire experience feels like it was intended for a small screen, and feels barren and feature-poor on the larger tablet screen. The full Google Plus web site would be better for the iPad.</p>
<p>Other downsides to <em>Two Web</em> include maintenance of two separate code bases, maintenance of the User Agent white list as new devices are released, and dependency on server side code to redirect mobile User Agents to the mobile site.</p>
<p>Developers should also be aware of the historical precedence of browser vendors <em>borrowing</em> User Agent strings from other devices as they become popular. That&#8217;s why almost all User Agents in existence today contain the string &#8220;Mozilla&#8221; and why WebKit User Agents contain &#8220;like Gecko.&#8221;  Come to think of it, User Agent theft happens most often when the target is Netscape or Netscape progeny.</p>
<h2 id="choice">Make Your Choice</h2>
<p>An informed reader might already be aware of the choice between One and <em>Two Web</em>.  What you might not be aware of is that your mobile JavaScript libraries and toolkits may have already made this choice for you.  The mobile web development space is clouded with tools that don&#8217;t document their requirement of <em>Two Web</em>.</p>
<p>Most of the tools that have been reviewed below have focused on WebKit support only.  It is not the author&#8217;s desire to simply suggest that these tools should work on non-WebKit mobile browsers.  <strong>The tools we use should not create a web divided between mobile and desktop.</strong>  In a theoretical world where WebKit has a global monopoly on both mobile and desktop web browsing, it would still create problems if sites are restricted to mobile only or desktop only. Developers must be aware of the compromises we&#8217;ve inherited from our tools.</p>
<p>As of June 2011, mobile web browsing is <a href="http://en.wikipedia.org/wiki/Usage_share_of_web_browsers#Summary_table">only 6.5% of all web browsing</a>, while 24.5% of all web browsing is desktop WebKit (non-mobile browsers like Chrome or Safari).  While evidence would suggest that the share of mobile web browsing will increase, we should be very cautious to assume that WebKit (mobile or desktop) will ever reach anything close to 100% market share.</p>
<p>Let&#8217;s look at how a few sample pages render in a few desktop browsers.  (<em>Keep in mind that I did not test in the other major rendering engine, Presto currently used by Opera 11.5</em>)</p>
<h3><a href="http://dev.sencha.com/deploy/touch/examples/nestedlist/">Sencha Touch 1.1.0</a></h3>
<table>
<thead>
<tr>
<th>Trident (IE9)<br/><br />
Not Supported</th>
<th>Gecko (Firefox 5)<br/><br />
Not Supported</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="http://www.zachleat.com/web/wp-content/uploads/2011/07/Screen-Shot-2011-07-26-at-10.48.51-PM.png"><img src="http://www.zachleat.com/web/wp-content/uploads/2011/07/Screen-Shot-2011-07-26-at-10.48.51-PM.png" alt="" title="Sencha Touch in IE9" width="275" height="362" class="alignnone size-full wp-image-1120" /></a></td>
<td><img src="http://www.zachleat.com/web/wp-content/uploads/2011/07/Screen-Shot-2011-07-26-at-10.31.41-PM.png" alt="" title="Sencha Touch in Firefox" width="272" height="362" class="alignnone size-full wp-image-1118" /></td>
</tr>
</tbody>
</table>
<p>Instead of a nice list with large click targets, we&#8217;re greeted with a simple white screen. No error messages detailing a JavaScript error occurred on the page. No warning saying the web browser being used here isn&#8217;t supported (the bane of Progressive Enhancement advocates). Really bad user experience here.</p>
<p>Officially, Sencha Touch support is not &#8220;anything WebKit&#8221; as some have suggested.  It officially supports Apple iOS 3+, Android 2.1+, and BlackBerry 6+ devices.  It does not include WebOS, which is a WebKit browser, <strong>nor does it include any desktop web browsers.</strong></p>
<h3><a href="http://www.dhtmlx.com/touch/samples/apps/uidemo/index.html">DHTMLx Touch v.1.0 RC</a></h3>
<table>
<thead>
<tr>
<th>Trident (IE9)<br/><br />
Not Supported</th>
<th>Gecko (Firefox 5)<br/><br />
Not Supported</th>
</tr>
</thead>
<tbody>
<tr>
<td><img src="http://www.zachleat.com/web/wp-content/uploads/2011/07/Screen-Shot-2011-07-27-at-6.26.50-PM.png" alt="" title="DHTMLx Touch in IE9" width="275" height="364" class="alignnone size-full wp-image-1130" /></td>
<td><img src="http://www.zachleat.com/web/wp-content/uploads/2011/07/Screen-Shot-2011-07-26-at-10.16.48-PM.png" alt="" title="DHTMLx Touch in Firefox" width="272" height="361" class="alignnone size-full wp-image-1115" /></td>
</tr>
</tbody>
</table>
<p>DHTMLx Touch operated much better than Sencha Touch on desktop browsers. Despite the fact that many of the demos on their website are hidden behind QR codes.  You can use a <a href="http://zxing.org/w/decode.jspx">QR decoder</a> to get the URLs for viewing on your desktop device. As for official web browser support, the DHTMLx Touch web site states:</p>
<blockquote><p>While browsing the demos of DHTMLX Touch, note that the framework requires a mobile device to display and work correctly. You can also run the demos on standard PCs in Firefox 3.6 and above, and WebKit browsers (Safari, Chrome, etc.), but there still can be some issues since DHTMLX Touch is optimized for mobile devices.</p></blockquote>
<p>Unfortunately, even though it works for the most part, desktop web browsers are still unsupported.  It should also be noted that DHTMLx isn&#8217;t full WebKit either, as Blackberry 6 is not yet officially supported.</p>
<h3><a href="http://chrism.dojotoolkit.org/mobile-0.2/make_samples/dojo-samples/demos/mobile-gallery/demo.html">Dojo Mobile 0.2</a></h3>
<table>
<thead>
<tr>
<th>Trident (IE9)<br/><br />
Supported</th>
<th>Gecko (Firefox 5)<br/><br />
Supported</th>
</tr>
</thead>
<tbody>
<tr>
<td><img src="http://www.zachleat.com/web/wp-content/uploads/2011/08/Screen-Shot-2011-08-08-at-9.51.41-PM.png" alt="" title="Dojo Mobile in IE9" width="277" height="366" class="alignnone size-full wp-image-1140" /></td>
<td><img src="http://www.zachleat.com/web/wp-content/uploads/2011/07/Screen-Shot-2011-07-26-at-10.18.51-PM.png" alt="" title="Dojo Mobile in Firefox" width="271" height="363" class="alignnone size-full wp-image-1116" /></td>
</tr>
</tbody>
</table>
<p>Dojo Mobile also did fairly well. There were a few minor rendering issues with WebKit prefixed gradients (and no background color fallback) which I would consider to be very minor bugs.  Here&#8217;s the good news from the <a href="http://dojotoolkit.org/reference-guide/dojox/mobile.html#id5">Dojo documentation</a>:</p>
<blockquote><p>Dojox.mobile supports not only webkit-based mobile browsers, but also non-CSS3 desktop browsers such as IE and (older) Firefox.</p></blockquote>
<h3><a href="http://jquerymobile.com/demos/1.0b2/#/demos/1.0b2/docs/lists/index.html">jQuery Mobile 1.0b2</a></h3>
<table>
<thead>
<tr>
<th>Trident (IE9)<br/><br />
Supported</th>
<th>Gecko (Firefox 5)<br/><br />
Supported</th>
</tr>
</thead>
<tbody>
<tr>
<td><img src="http://www.zachleat.com/web/wp-content/uploads/2011/08/Screen-Shot-2011-08-08-at-10.05.50-PM.png" alt="" title="jQuery Mobile in IE9" width="277" height="365" class="alignnone size-full wp-image-1143" /></td>
<td><img src="http://www.zachleat.com/web/wp-content/uploads/2011/07/Screen-Shot-2011-07-26-at-10.08.24-PM.png" alt="" title="jQuery Mobile in Firefox" width="272" height="361" class="alignnone size-full wp-image-1111" /></td>
</tr>
</tbody>
</table>
<p>In most of the other frameworks, cross browser compatibility documentation felt like an afterthought mentioned in passing.  Not jQuery Mobile. It has the most complete <a href="http://jquerymobile.com/gbs/">web browser support documentation</a> of any mobile component framework.  Not only is their documentation the best, their device support is the most comprehensive.  The project officially supports Internet Explorer all the way back to version 7, which speaks volumes to their commitment to allow the developer to make the choice between <em>One Web</em> and <em>Two Web</em>.</p>
<h2>Conclusion</h2>
<p>If you&#8217;re developing Hybrid Native applications using software like <a href="http://www.phonegap.com/">PhoneGap</a>, desktop web browser support doesn&#8217;t matter here.  Feel free to disregard this entire article.</p>
<p>However, if you are developing for the web I would encourage you to look strongly at <em>One Web</em> as the default choice, and use <em>Two Web</em> as the exception when your content and context require drastically different non-adaptable versions of the site for mobile devices.  Certainly I&#8217;m not suggesting that either <em>One or Two Web</em> are silver bullets.  But we should all be aware of how the tools we choose weigh on our decision, and how this decision will affect our users in the future.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zachleat.com/web/a-mobile-web-divided/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Pragmatic Progressive Enhancement</title>
		<link>http://www.zachleat.com/web/pragmatic/</link>
		<comments>http://www.zachleat.com/web/pragmatic/#comments</comments>
		<pubDate>Tue, 10 May 2011 04:11:47 +0000</pubDate>
		<dc:creator>Zach Leatherman</dc:creator>
				<category><![CDATA[Application Design]]></category>
		<category><![CDATA[Opinion]]></category>

		<guid isPermaLink="false">http://www.zachleat.com/web/?p=990</guid>
		<description><![CDATA[A few weeks ago at the jQuery Conference (San Francisco 2011), Nicholas Zakas delivered a wildly entertaining presentation entitled &#8220;Progressive Enhancement 2.0&#8243; (slides 65-79 are especially great), updating the basic rules of PE for a modern age. While prior Progressive Enhancement techniques included layering content, presentation, and behavior (conveniently represented as HTML, CSS, and JavaScript). [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.zachleat.com/web/wp-content/uploads/2011/05/juniper.jpg" alt="" title="Juniper Plant" style="width: 100%" class="alignnone size-full wp-image-1006" /></p>
<p>A few weeks ago at the jQuery Conference (San Francisco 2011), Nicholas Zakas delivered a wildly entertaining presentation entitled <strong><a href="http://www.slideshare.net/nzakas/progressive-enhancement-20">&#8220;Progressive Enhancement 2.0&#8243;</a></strong> (slides 65-79 are especially great), updating the basic rules of <abbr title="Progressive Enhancement">PE</abbr> for a modern age.  While prior Progressive Enhancement techniques included layering content, presentation, and behavior (conveniently represented as HTML, CSS, and JavaScript). <abbr title="Progressive Enhancement">PE</abbr> 2.0 (not to be confused with our other 2nd generation friend, the Web) involves <strong>multiple layers of CSS</strong> for differing device capabilities (rounded corners for example) and <strong>multiple layers of JavaScript</strong> (ECMAScript 5 capable browsers, for example).  He made the argument that this also included <strong>ignoring older browsers</strong> (in some cases) and only moving forward with new functionality for newer, more capable devices.</p>
<p>Like any web developer that believes in getting actual work done, I agree with his argument but not without exemption.</p>
<h2>Pieces of Flair</h2>
<p>The benefit of Progressive Enhancement pays off when your code encounters a device is <strong>incapable of interpreting the CSS or JavaScript correctly</strong> in a way the code was intended.  This could be because of a bug in the rendering or JavaScript engine (or God-forbid an error in the code itself), or it could be because the feature being utilized is newer than the device itself and it could not have supported it without clairvoyance or a time machine.</p>
<p>The example Nicholas used to display this case was the Twitter home page, which uses CSS border-radius to display rounded corners.  In user agents that don&#8217;t support border-radius, such as IE &lt;9, the elements have sharp rectangular corners.  Using Progressive Enhancement here is a no-brainer, especially for features (like rounded corners) that have no bearing on the actual meat of the page, the content.</p>
<p>But <strong>when the feature is the content</strong> and degradation requires additional work, the decision is more complex.  <strong>HTML5 &lt;video&gt; and &lt;audio&gt; probably aren&#8217;t an acceptible baseline</strong> for progressive enhancement yet (based on current web browser statistics), and (video/audio) may never be an acceptable baseline depending on your views on universal accessible content.  The best baseline might be a text-only transcript of the media.  It really depends on how much importance the video/audio is to the core functionality of the page.</p>
<h2>Input</h2>
<p>Historically speaking, in order of mainstream application the progression of input devices used to interact with (even back before web) applications was: keyboard, mouse, touch, and (even more recently) speech (see <a href="http://nooshu.com/experimenting-with-webkit-form-speech-input">the speech attribute on text inputs in Google Chrome</a>).  Logical progression concludes that we&#8217;ll see gesture APIs (think Microsoft Kinect) available at some point as well.  It&#8217;s very important to consider that the <strong>the mechanism of input must also be carefully layered</strong>. Start with a good baseline of keyboard support for your application, then add mouse interactions, then layer any specific (multi-)touch interactions on top of that, and so on.  You don&#8217;t want to skip any intermediate input layers.</p>
<p>In Nicholas&#8217; presentation, he presented an example of the Yahoo! homepage, specifically modified for tablet devices (slide 115).  He went on to describe that the carousel functionality on the main image on the page was not available when viewing the page in Firefox.  I think this is a good example of what happens when you skip layers of input interactions, moving straight to touch, without first layering mouse-based input.  The approach the Yahoo! team took might be okay if you can afford to develop multiple independent code bases for a single home page, but most teams are going to want to get as much out of a single code-base as they can.</p>
<h2>Cutting Fat</h2>
<p>A side benefit of targeting Progressive Enhancement to your core functionality allows you to easily add ancillary features that <strong>don&#8217;t need to span the entirety of your browser support spectrum</strong>.  Some might argue that the Carousel functionality in the Yahoo! tablet example could be considered ancillary, but the positioning and screen real estate dedicated to it suggests otherwise. Facebook&#8217;s chat in IE6 is a good example of this (slide 114).  Is chat part of the core functionality that Facebook wants to guarantee device independent access to?  Apparently not.  Making decisions in this realm involves a real cost benefit analysis, <strong>weighing the feature against user benefit, browser market share, and development/implementation time</strong>.</p>
<h2>Exceptions</h2>
<p>It&#8217;s important to note that <strong>not all things can be developed using Progressive Enhancement</strong>.  There are certain use cases in which viewing the content in a lower fidelity than the author originally intended would destroy the value of content altogether.  While these use cases are rare for most sites, most artistic endeavors can be classified as such.  Consider <a href="http://www.thewildernessdowntown.com/">The Wilderness Downtown</a>, an amazing and beautiful interactive film built by Chris Milk using HTML5.  The strong, vivid emotional connection between the film and the viewer would have been destroyed had the content been a text-based transcript, or just audio, or even just a video.  <strong>Art must not be compromised.</strong></p>
<p>Now, some of you probably read the above paragraph and are thinking to yourself that your blog also qualifies under the above exemption (you&#8217;re the guy that doesn&#8217;t have full text feeds on his RSS aren&#8217;t you?).  Just be real with yourself, most things probably don&#8217;t fit into the same level of interactivity as The Wilderness Downtown.  <strong>Don&#8217;t use art as an excuse.</strong></p>
<h2>Conclusion</h2>
<p>Start with the <strong>primary goal</strong> of each individual page, this <strong>must be universally accessible</strong>.  If the goal is to display text content, the text must be available sans-JavaScript.  If the goal is to show a video or play audio, consider a transcript as your baseline.  If the goal is to solicit form input from the end user, don&#8217;t skip input interaction layers.  But don&#8217;t be afraid to shirk best practices on things that aren&#8217;t necessary to that goal, like social media links, a real-time chat client, trends/statistics, etc. <strong>You&#8217;ll know what matters.</strong></p>
<p><em>Update: Changed the title of the article.</em><br />
<em>Update: Rather than My Yahoo!, Nicholas informed me that it was just the Yahoo! homepage.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.zachleat.com/web/pragmatic/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Device Independence on the Open Web</title>
		<link>http://www.zachleat.com/web/device-independence/</link>
		<comments>http://www.zachleat.com/web/device-independence/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 18:37:12 +0000</pubDate>
		<dc:creator>Zach Leatherman</dc:creator>
				<category><![CDATA[Application Design]]></category>

		<guid isPermaLink="false">http://www.zachleat.com/web/?p=329</guid>
		<description><![CDATA[Open Web advocacy can get pretty lonely working in Big Enterprise. Armed with slow moving standards bodies, and held back by antiquated browser support, architectural battles over tools and frameworks can get pretty hairy if you don&#8217;t approach them with the right frame of mind. Big Enterprise is traditionally known for creating development environments that [...]]]></description>
			<content:encoded><![CDATA[<p>Open Web advocacy can get pretty lonely working in Big Enterprise.  Armed with slow moving standards bodies, and held back by antiquated browser support, architectural battles over tools and frameworks can get pretty hairy if you don&#8217;t approach them with the right frame of mind.</p>
<p>Big Enterprise is traditionally known for creating development environments that foster a &#8220;get it done&#8221; mentality, often rewarding results over correctness (mileage, of course, may vary).</p>
<blockquote><p>My company uses IE6, and the application works in IE6, so it&#8217;s done!</p></blockquote>
<p>This little quagmire is amplified by the fact that when using Open Web technology, there are many ways to get things done, and most of them are incorrect.  But those mistakes don&#8217;t manifest themselves until the project is in the hands of the end user, whom we often punish for our oversight.</p>
<p>But there is hope. Using the power of web standards and Open Web best practices, we can achieve something panoramically, not microscopically, beautiful.</p>
<p>The secret sauce of building for the Web isn&#8217;t its distribution model, in which updates are managed on the web server without the need to update software on the client (although the Anti-IE6 vigilantes would tell you differently).  It most certainly isn&#8217;t development efficiency, as most people new to the game will so readily inform you of.  Cross browser quirks due to non-standard browser implementations of CSS and JavaScript, or vague standards specifications have seen to that.</p>
<blockquote><p>When I was writing Visual Basic, I got my job done so much quicker and easier!</p></blockquote>
<h2>The power of the Open Web is Device Independence.</h2>
<p>Visitors to our sites <strong>shouldn&#8217;t be met with warnings</strong> about what device they&#8217;ve chosen to use.</p>
<blockquote><p>This site viewable only in IE7+, Firefox, Chrome, or Safari, and at minimum 1024&#215;768 resolution.</p></blockquote>
<blockquote><p>This site requires Flash or Silverlight</p></blockquote>
<p>I realize that this is a controversial stance, especially given that most sites are dropping support for IE6, and more are relying on Flash and Silverlight plugins.  <strong>Architect applications to your client device usage statistics, and don&#8217;t let your tools shape the statistics for you.</strong>  Using techniques like progressive enhancement, we can ensure that our sites degrade gracefully to the capabilities of the client device.  At it&#8217;s truest form, this is basic accessibility. But, Device Independence might be a more accurate term, since accessibility is unfortunately an overloaded term scoped solely with devices tied to disabilities (screen readers, for example).  While screen readers are a very important piece, there is a bigger picture.</p>
<p>When the iPhone came out, there was an uproar because it didn&#8217;t support Flash, for battery life and other reasons.  But the uproar was from developers who had designed applications specifically for Flash!  Would you say that those Flash applications were designed with device independence in mind?  YouTube got around this by encoding their videos in MP4 format, which arguably has a higher device independence rating than the Flash format.</p>
<p>Keep in mind that we&#8217;re <strong>not attempting to handle every permutation of end user browser settings</strong>, since most don&#8217;t change the defaults.  Instead we are trying to scoop up the largest base of supported devices with the least amount of effort!  Who cares if an end user disabled JavaScript in their preferences?  I&#8217;m more worried about the mobile browser that doesn&#8217;t even support JavaScript at all.  But when you use Open Web properly, you get support for both!</p>
<h2>Output Device Independence</h2>
<ul>
<li>Full Web Browsers: Does your site work in Opera? Don&#8217;t worry about pixel perfection, that&#8217;s something completely different &#8212; does it work?</li>
<li>Web Browsers on Mobiles</li>
<li>Search Engine Spiders and other Screen Scrapers</li>
<li>Screen Readers</li>
<li>Printers: Ever had to make an entirely separate page for print-friendly version of your application? Flash/Silverlight <strong>do not</strong> print well</li>
<li>Televisions: Xbox 360, Wii, and Other Media Center Devices</li>
<li>Projectors</li>
<li><em>and more&#8230;</em></li>
</ul>
<p>Take a look at the <a href="http://www.w3.org/TR/CSS21/media.html#media-types">CSS specification for media types</a>.  The standards are there!  Support for CSS media types isn&#8217;t fool proof by any means, but the end goal is clearly visible.</p>
<h2>Input Device Independence</h2>
<p>But I&#8217;m not just talking about output device independence either.  User interfaces should be adaptable to different input devices as well.</p>
<ul>
<li>Mouse</li>
<li>Keyboard (often overlooked in web applications)</li>
<li>Touch Screens (Single and <a href="http://hacks.mozilla.org/2009/08/multi-touch-firefox/">Multi-touch</a>)</li>
<li>Voice, Motion Capture, and Facial Recognition (the standards and technology aren&#8217;t quite there yet, but <a href="http://hacks.mozilla.org/2009/06/connecting-html5-video/">progress is being made</a>)</li>
<li><em>and more&#8230;</em></li>
</ul>
<p>The world is developing the Open Web, and it isn&#8217;t limited by a single company&#8217;s goals and timelines.  At times, Open Web may seem like it&#8217;s a very slow moving <strong>glacier</strong> headed our way, but what else can you do but laugh when companies try to <strong>power their Titanic right through it</strong>?</p>
<p><em>Article originally inspired by <a href="http://developer.yahoo.com/yui/articles/gbs/#history">Yahoo&#8217;s Graded Browser Support</a>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.zachleat.com/web/device-independence/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Registration Forms Suck, Let&#8217;s Mitigate Suckiness</title>
		<link>http://www.zachleat.com/web/registration-forms-suck-lets-mitigate-suckiness/</link>
		<comments>http://www.zachleat.com/web/registration-forms-suck-lets-mitigate-suckiness/#comments</comments>
		<pubDate>Sat, 10 Jan 2009 23:59:45 +0000</pubDate>
		<dc:creator>Zach Leatherman</dc:creator>
				<category><![CDATA[Application Design]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Forms]]></category>
		<category><![CDATA[OpenID]]></category>
		<category><![CDATA[Registration]]></category>
		<category><![CDATA[Security]]></category>

		<guid isPermaLink="false">http://www.zachleat.com/web/?p=181</guid>
		<description><![CDATA[A lot of people <strong>complain about registration forms</strong>. Some people have suggested getting rid of them altogether, allowing users to utilize login credentials from accounts they already have through OpenID.  But registration forms aren't going away.  How can we make them more friendly?]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.zachleat.com/web/wp-content/uploads/2009/01/signup-form.png" alt="Signup Form" title="signup-form" width="250" height="293" class="size-full wp-image-183" style="float:right" /> A lot of people <strong>complain about registration forms</strong>. Some people have suggested getting rid of them altogether, allowing users to utilize login credentials from accounts they already have through OpenID.  But even with a highly technical audience, OpenID adoption is <a href="http://blog.stackoverflow.com/2008/10/stack-overflow-openid-case-study/">problematic</a>.</p>
<p>So, some sites have gone two ways, allowing OpenID, but also a proprietary registration system.  This too, <a href="http://www.wetpaintcentral.com/page/OpenID?t=anon">is problematic</a>.  It would seem that given a choice, the <strong>John Doe the Plumber style user will choose a proprietary account</strong> over the confusing user experience presented to them through OpenID.</p>
<p>But the annoyance doesn&#8217;t just lie with account registration for web applications.  Typing your personal information on every blog you comment at is also repetitive and unnecessary.  <a href="http://www.ajaxian.com">Some sites</a> even require account registration for something so minor and transient as a blog comment.</p>
<p>Unfortunately, for the time being, it looks like <strong>registration forms are here to stay</strong>.  So, what can we do to make those registration forms more usable, more efficient, and ultimately downright friendly?  I know that you&#8217;re ahead of me on this one: <strong>Let&#8217;s auto-complete information for the user</strong>.</p>
<p>Please keep in mind that this power can be used for both good and evil.  Essentially what we&#8217;re discussing here is data mining available information from various social networking sites on the internet, trying to glean personal information about an end user that has volunteered a piece of their data already.  What can we get from what we already have?</p>
<p>Once a user has typed in their <strong>e-mail address</strong>, we can:</p>
<ul>
<li>Retrieve Twitter profile information (<a href="http://www.wait-till-i.com/2009/01/08/using-twitter-as-a-data-provider-to-automatically-fill-forms/">example shown on Chris Heilmann&#8217;s blog</a>):
<ul>
<li>Full Name</li>
<li>Short Personal Description</li>
<li>Location</li>
<li>Web site URL</li>
<li>Time Zone</li>
<li>Favorite Colors (used on their profile)</li>
</ul>
</li>
<li>Retrieve an <strong>avatar</strong> if they&#8217;ve registered for the Gravatar web service (<a href="http://www.zachleat.com/web/2009/01/08/scare-your-visitors-with-this-javascript-gravatar-plugin/">See my earlier post discussing this</a>).</li>
<li>Get their <a href="http://gdata-javascript-client.googlecode.com/svn/trunk/samples/calendar/simple_sample/simple_sample.html">upcoming calendar events</a> from a public Google Calendar. (Perhaps not as useful for autocompleting forms, but interesting)</li>
<li>Find their <a href="http://www.flickr.com/services/api/flickr.people.findByEmail.html">UID on Flickr</a>, which gives you <a href="http://www.flickr.com/services/api/flickr.people.getInfo.html">a source</a> for:
<ul>
<li>Full Name</li>
<li>Location</li>
<li>Flickr Avatar</li>
</ul>
</li>
</ul>
<p>If you know any of their social networking usernames, you can:</p>
<ul>
<li><a href="http://developer.yahoo.com/mybloglog/V1/member_find_byservice.html">find their MyBlogLog profile</a>, if they&#8217;ve linked the service to their account (<a href="http://mybloglog.yahooapis.com/v1/user/service/twitter/zachleat?AppId=YahooDemo&#038;format=xml">Sample query, I added my twitter</a>).  Now we have:
<ul>
<li>MyBlogLog Screen Name and ID, from which you get their <a href="http://developer.yahoo.com/mybloglog/V1/member_find_byid.html">MyBlogLog profile</a>:
<ul>
<li>Nickname</li>
<li>Picture</li>
<li>Age</li>
<li>Sex</li>
<li>Location</li>
<li>A list of tags they use to describe themselves.</li>
</ul>
</li>
<li>MyBlogLog Avatar</li>
</ul>
</li>
</ul>
<p>Those are only some of the proof of concept API&#8217;s that I&#8217;ve listed here.  The interesting piece of this, is that once you have a small piece of information, it <strong>opens up the door to other searches</strong>.</p>
<p>One can only imagine how many leaves are in this tree.  For example:</p>
<ul>
<li>Facebook&#8217;s <a href="http://wiki.developers.facebook.com/index.php/Users.getInfo">Users.getInfo</a> (<a href="http://wiki.developers.facebook.com/index.php/JavaScript_Client_Library">in JavaScript</a>)</li>
<li>Yahoo&#8217;s Social Tools, get an <a href="http://developer.yahoo.com/social/rest_api_guide/introspective-guid-resource.html">end user&#8217;s GUID</a> and go to town on <a href="http://developer.yahoo.com/social/rest_api_guide/social_dir_api.html">their profile</a>.
<li>Google Contacts, I didn&#8217;t even start to look through <a href="http://code.google.com/apis/contacts/">their API&#8217;s</a>.</li>
</ul>
<p>Before you start jumping the privacy fence to a self induced heart attack, remember that <strong>all this information has been volunteered</strong> by each individual participating in each of these services.  Remember, with great power comes great responsibility.</p>
<p>What do you think?  Scary or useful?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zachleat.com/web/registration-forms-suck-lets-mitigate-suckiness/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Double Whammy: OpenID and Microformats</title>
		<link>http://www.zachleat.com/web/double-whammy-openid-and-microformats/</link>
		<comments>http://www.zachleat.com/web/double-whammy-openid-and-microformats/#comments</comments>
		<pubDate>Fri, 23 May 2008 06:13:01 +0000</pubDate>
		<dc:creator>Zach Leatherman</dc:creator>
				<category><![CDATA[Application Design]]></category>
		<category><![CDATA[Interface Design]]></category>
		<category><![CDATA[Flickr]]></category>
		<category><![CDATA[hCard]]></category>
		<category><![CDATA[microformat]]></category>
		<category><![CDATA[OpenID]]></category>
		<category><![CDATA[Technorati]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://www.zachleat.com/web/?p=141</guid>
		<description><![CDATA[<a href="http://www.ownyouridentity.com/2008/04/30/get-satisfactions-nice-import-profile-feature/">Own your Identity had a great post today</a> detailing a great feature on the signup form of the <a href="http://getsatisfaction.com/people/new">Get Satisfaction</a> site.

They rely on the fact that sites like Twitter and Flickr publish an <a href="http://microformats.org/wiki/hcard">hCard microformat</a> for all of their users publicly on their website.]]></description>
			<content:encoded><![CDATA[<h3>Microformategery</h3>
<p><a href="http://www.ownyouridentity.com/2008/04/30/get-satisfactions-nice-import-profile-feature/">Own your Identity had a great post today</a> detailing a great feature on the signup form of the <a href="http://getsatisfaction.com/people/new">Get Satisfaction</a> site.</p>
<p>They rely on the fact that sites like Twitter and Flickr publish an <a href="http://microformats.org/wiki/hcard">hCard microformat</a> for all of their users publicly on their website.  If you go to <a href="http://twitter.com/zachleat/">my twitter page</a> and view the source, you&#8217;ll find the following code available to anyone (without authentication):</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;address&gt;
   &lt;ul class=&quot;about vcard entry-author&quot;&gt;
      &lt;li&gt;&lt;span class=&quot;label&quot;&gt;Name&lt;/span&gt; &lt;span class=&quot;fn&quot;&gt;Zach Leatherman&lt;/span&gt;&lt;/li&gt;
      &lt;li&gt;&lt;span class=&quot;label&quot;&gt;Location&lt;/span&gt; &lt;span class=&quot;adr&quot;&gt;Omaha, NE USA&lt;/span&gt;&lt;/li&gt;
      &lt;li&gt;&lt;span class=&quot;label&quot;&gt;Web&lt;/span&gt; &lt;a href=&quot;http://www.zachleat.com/&quot; class=&quot;url&quot; rel=&quot;me&quot;&gt;http://www.zachle...&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;bio&quot;&gt;&lt;span class=&quot;label&quot;&gt;Bio&lt;/span&gt; &lt;span class=&quot;bio&quot;&gt;UI Programmer, JavaScript Enthusiast, Soccer Hooligan&lt;/span&gt;&lt;/li&gt;
   &lt;/ul&gt;
&lt;/address&gt;</pre></div></div>

<p>The premise here is that hCard tells you how to parse this markup to get usable information.  The <code>adr</code> CSS class tells you what my address is.  The <code>fn</code> CSS class tells you what my name is, and so on.  So, Get Satisfaction goes and spiders this page behind the scenes and autopopulates your profile with what it can find.  Pretty sweet.</p>
<p>Now, they don&#8217;t limit you to the services they provide, which are: Flickr, Technorati, Twitter, Upcoming, and last.fm.  They provide an Other category for any hCard enabled URL (your personal homepage or perhaps an <a href="http://microformats.org/wiki/hresume">hResume</a> you have posted on the web).</p>
<h3>Integrate with OpenID</h3>
<p>However, why not take it to the next level?  Why not integrate this microformat functionality WITH an openid login system?  You&#8217;d be able to kill two birds (not a twitter joke) with one stone in some cases, since both Twitter and Technorati are also OpenID producers (re-echo: We need more consumers).</p>
<p>So, not only do you get the benefits of having OpenID authentication on your website, but you&#8217;d be able to prepopulate a certain amount of profile data with an hCard parser.  And the best part is, if you already have a <a href="http://remysharp.com/2008/04/24/stop-using-openid-why-how/">nice clean user interface</a> set up to handle different OpenID producers, there wouldn&#8217;t be any additional clutter on the interface to get this benefit.  It&#8217;d be transparent to the user when it works, and fall back to a normal empty profile form when it doesn&#8217;t.</p>
<p>What I&#8217;d like to see, is more sites that are OpenID producers, also serve hCard microformats as well.  If we can get all the major producers on board, we&#8217;d have a nice tidy little system going.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zachleat.com/web/double-whammy-openid-and-microformats/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Screen Readers and Listening at the Speed of Sound</title>
		<link>http://www.zachleat.com/web/screen-readers-and-listening-at-the-speed-of-sound/</link>
		<comments>http://www.zachleat.com/web/screen-readers-and-listening-at-the-speed-of-sound/#comments</comments>
		<pubDate>Fri, 18 May 2007 00:23:38 +0000</pubDate>
		<dc:creator>Zach Leatherman</dc:creator>
				<category><![CDATA[Application Design]]></category>
		<category><![CDATA[Web Browsers]]></category>
		<category><![CDATA[Accessibility]]></category>

		<guid isPermaLink="false">http://www.zachleat.com/web/2007/05/17/screen-readers-and-listening-at-the-speed-of-sound/</guid>
		<description><![CDATA[Here is a presentation given by a guy named Victor Tsaran on how he personally uses screen readers to browse the web. As web developers, accessibility is an important aspect of our work and cannot be ignored. How many websites have you browsed that had flash navigation? If you&#8217;re not a web developer, you need [...]]]></description>
			<content:encoded><![CDATA[<p>Here is a <a href="http://yuiblog.com/blog/2007/05/14/video-intro-to-screenreaders/">presentation</a> given by a guy named Victor Tsaran on how he personally uses screen readers to browse the web.  As web developers, accessibility is an important aspect of our work and cannot be ignored.  How many websites have you browsed that had flash navigation?  If you&#8217;re not a web developer, you need to skip ahead to time stamp 25:44 to see the mega-fast speed this guy uses the screen reader at.  I couldn&#8217;t understand a single word coming out of my speaker.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zachleat.com/web/screen-readers-and-listening-at-the-speed-of-sound/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Checklist for Web Applications</title>
		<link>http://www.zachleat.com/web/checklist-for-web-applications/</link>
		<comments>http://www.zachleat.com/web/checklist-for-web-applications/#comments</comments>
		<pubDate>Tue, 20 Feb 2007 06:38:43 +0000</pubDate>
		<dc:creator>Zach Leatherman</dc:creator>
				<category><![CDATA[Application Design]]></category>

		<guid isPermaLink="false">http://www.zachleat.com/web/2007/02/20/checklist-for-web-applications/</guid>
		<description><![CDATA[As the first post in this new category of web development, I&#8217;ve decided to keep it simple and post the different components and architecture considerations a developer must consider when making a new application, especially in today&#8217;s world of in-page dynamic interaction and the complications that has put on the problems that were considered solved [...]]]></description>
			<content:encoded><![CDATA[<p>As the first post in this new category of web development, I&#8217;ve decided to keep it simple and post the different components and architecture considerations a developer must consider when making a new application, especially in today&#8217;s world of in-page dynamic interaction and the complications that has put on the problems that were considered solved in yesterday&#8217;s page level world. Mostly this is a place to collect my thoughts on this subject.</p>
<ul>
<li><strong>Automatic Print Styling</strong>: Is the page going to be able to be printed properly without a &#8220;Printer friendly&#8221; link? CSS style sheets can be used to modify the output of the page using the @media print declaration. Are the widget components you&#8217;re using in your JavaScript library able to support easy printing?</li>
<li><strong>Browser History Management</strong>: Will your application support the back button, especially with the increased usage of AJAX interactions on a full page application. Don&#8217;t use XMLHTTPRequest&#8217;s to fetch the entire content of a page. Just redirect them to a new page when you are only saving the header and the footer.</li>
<li><strong>Graded Browser Support</strong>: support of the web browsers with a large percentage of market share using the ideas put forth by Nate Koechley in his Graded Browser Support descriptions.</li>
<li><strong>Bookmark and Permanent Linking</strong>: is the behavior of your JavaScript application changing how data is being displayed? You&#8217;d better modify the URL to allow the user to bookmark link straight to the same view.</li>
<li><strong>File Compression</strong>: Minimize your CSS and JavaScript for delivery. GZip your CSS and JavaScript for browsers that support it (most all modern browsers do).</li>
<li><strong>Efficient Caching Mechanisms</strong>: server side caching of data is necessary for high volume traffic.</li>
<li><strong>Internationalization</strong> (i18n): will your application be viewed in other countries by non-English speakers? Are your dates in an international format? How about 24 hour time formats? Time zones? Do they observe Daylight Saving Time?</li>
<li><strong>Error Logging</strong>: Both server side and client side (using AJAX to log JavaScript errors can be very helpful)</li>
</ul>
<p><strong>Recommended Luxury Items</strong></p>
<ul>
<li><strong>Support mobile devices</strong>: How will your application look on a Blackberry? How does it render in Opera Mini?</li>
<li><strong>Offline Mode</strong>: Add and modify data offline, with the ability to automatically synchronize changes when an internet connection becomes available.</li>
<li><strong>Exportable data</strong>: PDF, Excel, RSS, even offline static HTML. JavaScript can sometimes give unknown results when using the browser to save the page locally. Make sure this is supported. Don&#8217;t force your users to save screenshots.</li>
</ul>
<p><strong>Enterprise Client Side Widgets</strong></p>
<ul>
<li><strong>Data Grid</strong>: businesses just love data grids. Nothing like a nice standard set of cookie cutter constraints to force upon your data.</li>
<li><strong>Charts and Graphs</strong>: metrics are important. Existing client side JavaScript charting packages can be limited when it comes to printing, or even saving the chart as an image file. These are important.</li>
</ul>
<p>There are many facets that a developer must consider when designing a new application. I hope this list will at least make you think about some things that you may not have considered before. Thanks for reading. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.zachleat.com/web/checklist-for-web-applications/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

