<?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>nascentguruism</title>
	<atom:link href="http://nascentguruism.com/feed" rel="self" type="application/rss+xml" />
	<link>http://nascentguruism.com</link>
	<description></description>
	<lastBuildDate>Tue, 13 Apr 2010 22:45:06 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Opera Mini for&#160;iPhone</title>
		<link>http://nascentguruism.com/journal/opera-mini-for-iphone</link>
		<comments>http://nascentguruism.com/journal/opera-mini-for-iphone#comments</comments>
		<pubDate>Tue, 13 Apr 2010 22:30:58 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[browsers]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Opera]]></category>
		<category><![CDATA[progressive enhancement]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://nascentguruism.com/?p=51</guid>
		<description><![CDATA[where we see how not to make an iPhone app, as illustrated by Opera Mini]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.opera.com/mobile/">Opera Mini for iPhone</a> was released this morning, and after some discussion on Twitter, I thought it might be useful (if only to <a href="http://twitter.com/chrisdavidmills">Chris</a>) to write up my thoughts. In general, though, I think <cite><a href="http://aralbalkan.com/">Aral</a></cite> <a href="http://twitter.com/aral/status/12092104843">said it best</a>:</p>

<blockquote>
  <p>Opera Mini: the Nokia browsing experience, now on iPhone.</p>
</blockquote>

<p>Essentially, Opera Mini doesn’t feel at all like an iPhone app. The gestures are all wrong to varying degrees, the interface is jarring and detracts from the pages you’re trying to view, and it’s not fast enough (its main selling point) to justify using it over Safari (particularly given the myriad interface oddities).</p>

<h2>Gestures</h2>

<h3>Scrolling</h3>

<p>Let’s start with the most basic interaction we have on iPhone: scrolling.
Scrolling on iPhone is <em>fun</em>. iPhone uses inertial scrolling; it employs
real-world physics to make scrolling feel like you’re interacting with
something physical with weight and friction. People sit and endlessly scroll
back and forth through their lists on iPhone because it’s so tactile.</p>

<p>I have to admit, I spent about five minutes simply scrolling around in Opera Mini. Not because it was <em>fun</em>, mind you, but because it felt so badly wrong. In Opera Mini, scrolling doesn’t accelerate or decelerate in the same way as elsewhere on iPhone, or bounce back when you hit a boundary.</p>

<p>But then again, sometimes it doesn’t do that: sometimes, it slides at a constant rate until it stops and then jumps in the /opposite/ direction to your gesture and scrolls a little bit in that direction. Not because it hit a page edge, though (those stop scrolling dead, mostly): these reversals tend to happen just when you think you’ve got the measure of scrolling in Opera.</p>

<p>Then there are the invisible pseudo-boundaries Opera puts into the page: if you’re within a column in the page you’re looking at (the sort that double-tapping in Safari would fill the screen with; more on that later), Opera will put a scroll boundary around that so that flinging the page across hits that boundary and stops or, more likely, scrolls a little further vertically. I suspect these boundaries are what cause the aforementioned changes in direction, come to think of it.</p>

<h3>Zooming</h3>

<p><img src="http://nascentguruism.com/wp-content/uploads/2010/04/zoom-e1271197835389.jpg" alt="" title="" />So what about the other most common gesture in Safari? Zooming in Opera is a little like scrolling: it feels like a first-cut demo that you’d get if you described how an iPhone does it to someone who had never used one, then had them build their own.</p>

<p>Opera Mini has two levels of zoom: in, or out. In Safari, if I want to zoom in just a little, I can zoom to <em>exactly</em> the level I want. I have full control. In Opera, if I’m zoomed out and pinch in either direction, for any distance, I get zoomed right in. If I’m zoomed in and pinch at all, I get zoomed out fully.</p>

<p>For a time, I thought that double-tap-to-zoom (in both directions) didn’t work in Opera Mini. As it happens, it does but you have to tap in <em>exactly</em> the same spot for both taps, or Opera considers it a scroll instead of a zoom. Unlike Safari, double-tap doesn’t zoom in on the content you tapped to fill the screen’s width, though: it simply zooms you all the way in where you double-tapped.</p>

<p>But that’s OK because you can single-tap to zoom in. Yes, you read that right: single-tap when zoomed out zooms you in. Know the site you’re visiting well enough that you know exactly which link you want to click on as soon as you see it? Well, tough: you have to zoom in and <em>then</em> click the link.</p>

<p>What if I want to focus on a picture that takes up two thirds of the page? I either have to look at it one bit at a time, fully zoomed in, or as a thumbnail when zoomed out.</p>

<p>Also: since when is zooming a browsing operation? If I’m zoomed in, why does pressing ‘Back’ zoom me out? Why can’t I just navigate back to the page prior to the current page?</p>

<h3>Text selection</h3>

<p>Remember the days when iPhone didn’t have copy and paste (or text selection), and how Apple’s solution seemed to fit into the OS so naturally?</p>

<p>Opera doesn’t. If you try to select text by pressing and holding when zoomed out, you get zoomed in (or maybe scrolled). If you try to select text when zoomed in, a spinning cursors orbits your fingertip for a few seconds and, sometimes, presents you with a popup menu. Unless you’ve lost your internet connection since loading the page, in which case it doesn’t.</p>

<p><img src="http://nascentguruism.com/wp-content/uploads/2010/04/select-op-pre.jpg" alt="" title="" />Typically, this menu offers simply ‘Select Text’. If you press-and-hold on, or near, an image, the popup menu offers, in addition to text selection, the option of opening or saving the image, as you’d see in native image selection popover dialogs.</p>

<p>So you click on ‘Select Text’, and a serifed bar cursor (rather than iPhone’s native slab bar cursor) is inserted where your finger was. You then have to click at the beginning of the text you wish to select, and drag to the end.</p>

<p>Sounds like iPhone text selection, right? Wrong: you get no insertion-point loupe like you would elsewhere on iPhone, making precise selection impossible. Made a mistake in your selection? You have to deselect (by clicking away from the popover offering to copy, search, etc.) and start again.</p>

<h2>Interface &amp; rendering</h2>

<p>Opera Mini really seems to have an inferiority complex.</p>

<p>Whenever you’re using it, the interface screams ‘you’re using Opera!’, detracting from the web pages you’re trying to read. For starters: I know I’m using Opera Mini. I clicked on the app icon on my home screen, so I really don’t need to see Opera’s logo for my entire browsing session. Sure, this is subtle and in the title bar, but it’s another un-iPhone-like touch. Worse, this title/branding bar is fixed and never leaves the screen , regardless of where you scroll.</p>

<p>The branding, though, pales in comparison to the ‘look at me!’ colour scheme. If I’m using a web browser, I’m using it to look at web pages. This means browser chrome should be kept to a minimum, fade into the background, and be relatively low-contrast.</p>

<p>It does not mean that you should make the browser chrome black and red stripes around the web page I’m trying to use. Red and black is high-contrast and, thus, attracts the eye to it. If I’m using Opera, this means my eye is drawn away from the sole reason for me using the app.</p>

<p>This, of course, is ignoring the fact that Opera commits <a href="http://news.atebits.com/post/197574144/once-you-go-black">the ultimate faux pas</a>: it uses iPhone’s light status bar instead of the black status bar, despite most of the app’s chrome being black. Whilst we’re looking at visual faux pas, the <a href="http://my.opera.com/chooseopera/blog/2010/04/13/opera-mini-5-settings">settings interface</a> is awful, using completely custom controls for everything.</p>

<p>All that said, there is one piece of Opera Mini’s interface that <em>is</em> quite nice: the tabs. Where Safari shuffles you off to a full-screen tab switcher, Opera Mini slides a pane up from the bottom of the screen with small snapshots  of your tabs stacked on top of one another, with the active tab frontmost. It’s not worlds ahead of Safari’s implementation, granted, but it’s a nice differentiator.</p>

<h2>Speed, privacy, and JavaScript</h2>

<p>I mentioned at the outset that Opera Mini isn’t fast enough to justify using it over Safari. That’s not to say it’s not faster than Safari in terms of raw page rendering speed. The problem is that the difference in speed isn’t significant enough to justify using it over Safari, particularly when you take into account the cognitive dissonance required to use it on iPhone. Sure, the page renders a second or two faster but, if it takes you an extra half-second to second-guess everything you do, what’s the point?</p>

<p>This speed-boost is achieved by Opera’s servers downloading, rendering, and compressing the requested page into one bundle, then passing that back to the user’s browser. On older phones this was a boon because they were underpowered enough that rendering HTML and CSS was a significant overhead. On iPhone, sufficient processing power makes performance increase from offloaded rendering moot, but the connection-and-compression optimisation can still be a significant benefit over slow EDGE and GPRS connections.</p>

<p>On top of that, there’s the matter of privacy: with all the data going through Opera’s servers, you have to trust Opera. If you’re just checking the news or weather, that’s no big deal. The idea of checking email, or doing mobile online banking, through Opera Mini and, thus, Opera’s cache servers (even if nothing <em>is</em> cached) concerns me.</p>

<p>And then there’s JavaScript. Opera Mini doesn’t support JavaScript. Except where it does, which tend to be the most inconvenient places. <a href="http://finance.yahoo.com/news">Yahoo! Finance News</a>, for example, sports a number of progressively enhanced personalisation features. If you visit the page in Opera Mini, it executes the first-run JavaScript but disables any further JavaScript-enhanced interactions.</p>

<p>It seems that Opera Mini runs JavaScript on the server such that pages are progressively enhanced, then delivers the rendered page to the client. For any progressively enhanced pages that hide the non-JavaScript interactions when they’re not needed (read: most of them), this will mean that Opera Mini users get a broken experience.</p>

<p>On the plus side, at least the JavaScript experience matches with the rest of the Opera Mini for iPhone&nbsp;experience.</p>]]></content:encoded>
			<wfw:commentRss>http://nascentguruism.com/journal/opera-mini-for-iphone/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>django_fireeagle</title>
		<link>http://nascentguruism.com/journal/django-fireeagle</link>
		<comments>http://nascentguruism.com/journal/django-fireeagle#comments</comments>
		<pubDate>Sat, 12 Apr 2008 14:16:24 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[api]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[fire eagle]]></category>
		<category><![CDATA[location]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://nascentguruism.com/journal/django-fireeagle</guid>
		<description><![CDATA[in which we see the launch of a small helper library]]></description>
				<content:encoded><![CDATA[<p>Just a brief note to mention that I uploaded <a href="http://django-fireeagle.googlecode.com/">my Django Fire Eagle authentication wrapper</a> to <a href="http://code.google.com/">Google Code</a>.</p>

<p>It uses (and complements) <a href="http://fireeagle.yahoo.net/developer/code/python">my Fire Eagle <abbr title="Application Programming Interface" class="caps">API</abbr> binding</a> to wrap up the process of authorising your Django application with Fire Eagle into little more than pointing your users at a <abbr title="Uniform Resource Locator" class="caps">URL</abbr> and setting them&nbsp;free.</p>]]></content:encoded>
			<wfw:commentRss>http://nascentguruism.com/journal/django-fireeagle/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sou’westerly</title>
		<link>http://nascentguruism.com/journal/sou%e2%80%99westerly</link>
		<comments>http://nascentguruism.com/journal/sou%e2%80%99westerly#comments</comments>
		<pubDate>Thu, 06 Mar 2008 01:07:43 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Alex Lee]]></category>
		<category><![CDATA[America]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[conferences]]></category>
		<category><![CDATA[Cyril Doussin]]></category>
		<category><![CDATA[D. Keith Robinson]]></category>
		<category><![CDATA[Faruk Ateş]]></category>
		<category><![CDATA[Fatty]]></category>
		<category><![CDATA[Gareth Rushgrove]]></category>
		<category><![CDATA[Journal Entries]]></category>
		<category><![CDATA[Kurafire]]></category>
		<category><![CDATA[Stuart Colville]]></category>
		<category><![CDATA[SXSW]]></category>
		<category><![CDATA[SXSW08]]></category>

		<guid isPermaLink="false">http://nascentguruism.com/journal/sou%e2%80%99westerly</guid>
		<description><![CDATA[wherein our host regales us with tales from 35,000ft. in the air]]></description>
				<content:encoded><![CDATA[<p>Given that I’m sitting [or was, at the time of writing—<abbr title="Editor">Ed.</abbr>] in a large, metal tube at about 35,000<abbr title="feet">ft.</abbr>, and <a href="http://ben-ward.co.uk/" title="Ben Ward" rel="friend met co-worker">Ben</a> is writing for his blog, I’ve been gripped by the desire to write for mine, too. Miracles, apparently, will never cease.</p>

<p>For the third year running, now, I’m on my way to Austin, Texas for&nbsp;<a href="http://2008.sxsw.com/" title="SXSW 2008"><abbr title="South by South-West">SXSW</abbr></a>.</p>

<h2>Past</h2>

<p>The first year (<a href="http://2006.sxsw.com/" title="SXSW 2006">2006</a>), travelling with <a href="http://fatbusinessman.com/" title="David “Fatty” Thompson" rel="friend met colleague">Fatty</a> (whom I had met but once before), was an incredible experience. I got to make lots of new friends and, generally, learn a huge amount and have a brilliant time.</p>

<p>Fast-forward a year to <a href="http://2007.sxsw.com/" title="SXSW 2007">2007</a> and Fatty and I were joined by Ben, and I got to share a room with the inimitable <a href="http://kurafire.net/" title="Faruk Ateş" rel="friend met colleague">Faruk</a>. There were lots of complaints, from others, of the conference becoming too big for its own boots, of too many panels with too little content, and so forth; generally, there seemed to be an air of malaise about <abbr title="South by South-West">SXSW</abbr>.</p>

<p>Socially, for me, it was bigger and better than my first year: I went to more parties, spent time with more people, and generally made more friends than in 2006. <em>It was good</em>.</p>

<h2>Present</h2>

<p>I fully expect this year to continue that trend given that, at the airport this morning, Ben and I (alas, no Fatty this year) bumped into <a href="http://muffinresearch.co.uk/" rel="friend met co-worker">Stuart Colville</a> <em>before we had even checked in</em>, Paul Duncan over breakfast, <a href="http://cyril.doussin.name/" rel="friend met co-worker">Cyril Doussin</a> and Tristan Turpin (who, along with Stuart, are on the same flight as Ben and me) just after breakfast, and <a href="http://morethanseven.net/" rel="friend met colleague">Gareth Rushgrove</a> in the departures lounge.</p>

<p>All this, mark you, <em>before we had even left Gatwick Airport</em>.</p>

<p>Granted, this was aided in no small part by the magic of <a href="http://twitter.com/">Twitter</a> (and generally being better acquainted with more people in the web scene), but there was also a certain amount of serendipity thrown in for good measure, too.</p>

<h2>Near-Future</h2>

<p>Compared to the last two years, my aims have ever-so-slightly changed, too. Rather than, as last year, placing the focus on attending sessions and parties, my focus this year will simply be on “am I making the most of this time?”. I intend to be rather mercenary about this, in fact: last year and the year before, there were times when I stayed at a party for fear of not knowing anyone at another. That shan’t happen this year.</p>

<p>Further, I intend to be very much, to use an <acronym title="Neuro-Linguistic Programming">NLP</acronym> phrase, “in the moment”. Also, in a change to normal programming, I shall be drinking alcohol (although hopefully not to <a href="http://flickr.com/">the levels of excess</a> seen at <a href="http://2007.dconstruct.com/">d.Construct 07</a>).</p>

<p>The biggest change, though, is that I shall, finally, be attending <a href="http://2008.sxsw.com/music/">SXSW music</a>. The past two years, I’ve lusted after that extra week of partying and gigs (and envied <a href="http://www.7nights.com/asterisk/" title="D. Keith Robinson" rel="friend met colleague">Keith</a> horribly when he’s stayed on); this year, I get to partake myself (along with Ben, <a href="http://csensedesign.co.uk/" rel="friend met colleague">Alex Lee</a>, and Lindsey Mooney). Not only that but, thanks to contacts in <a href="http://uk.music.yahoo.com/">Yahoo! Music UK</a>, I may have wangled access to closed recording sessions for Yahoo! Music with Ben, Alex, and Lindsey.</p>

<p>I’m looking forward to it all more than you can possibly&nbsp;imagine.</p>]]></content:encoded>
			<wfw:commentRss>http://nascentguruism.com/journal/sou%e2%80%99westerly/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTTPSConnection</title>
		<link>http://nascentguruism.com/journal/httpsconnection</link>
		<comments>http://nascentguruism.com/journal/httpsconnection#comments</comments>
		<pubDate>Thu, 06 Mar 2008 00:55:00 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[error]]></category>
		<category><![CDATA[fire eagle]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[https]]></category>
		<category><![CDATA[openssl]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ssl]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://nascentguruism.com/journal/httpsconnection</guid>
		<description><![CDATA[where our host solves all your Python HTTPS woes (not a guarantee that he’ll solve them all)]]></description>
				<content:encoded><![CDATA[<p>So apparently I now write Python.</p>

<p>In a flustered, last-minute, push to get the <a href="http://fireeagle.com/developer/">Fire Eagle Python <acronym title="Application Programming Interface">API</acronym> binding</a> ready to ship, I had to switch it to use <acronym title="Secure HyperText Transfer Protocol">HTTPS</acronym> (and point to <code>fireeagle.yahooapis.com</code>, natch).</p>

<p>Given that I’m relatively new to Python, it took a moment to realise I had simply to switch from <code>httplib.HTTPConnection</code> to <code>httplib.HTTPSConnection</code>. This would have all been fine, save one issue: apparently, the otherwise wonderful <a href="http://macports.org/">MacPorts</a> doesn’t appear to link <a href="http://www.openssl.org/"><abbr title="Open Secure Sockets Layer">OpenSSL</abbr></a> in Python by default (which, naturally, is a requirement for <acronym title="Secure HyperText Transfer Protocol">HTTPS</acronym>).</p>

<p>Without OpenSSL linked, trying to use <code>HTTPSConnection</code> (or, one would imagine, any <acronym title="Secure Sockets Layer">SSL</acronym>-related task) results in an error akin to <code>AttributeError: 'module' object has no attribute 'ssl'</code>.</p>

<p>To rectify this is, actually, very simple: run <kbd>sudo port install py25-socket-ssl</kbd> in the Terminal (assuming you’re using Python 2.5: other versions of Python will require different&nbsp;ports).</p>]]></content:encoded>
			<wfw:commentRss>http://nascentguruism.com/journal/httpsconnection/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pinpoint</title>
		<link>http://nascentguruism.com/journal/pinpoint</link>
		<comments>http://nascentguruism.com/journal/pinpoint#comments</comments>
		<pubDate>Thu, 06 Mar 2008 00:42:34 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[api]]></category>
		<category><![CDATA[fire eagle]]></category>
		<category><![CDATA[location]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[tom coates]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://nascentguruism.com/journal/pinpoint</guid>
		<description><![CDATA[in which we learn about the fantabulous Fire Eagle.]]></description>
				<content:encoded><![CDATA[<p>For those of you that haven’t seen it already, go look at <a href="http://fireeagle.com/">Fire Eagle</a>. Do it now.</p>

<p>Good, innit?</p>

<p>For those of you that don’t quite get it, the point is that it’s a central location-brokering service. You tell Fire Eagle where you are (or set your devices and <a href="http://blog.dopplr.com/index.php/2008/03/05/dopplr-at-etech-announcing-fire-eagle-integration/" title="Dopplr announces Fire Eagle integration">web apps</a> to tell it), and other applications can, if you allow them, use that data in fun and interesting ways (think auto-geo-tagging of photos on flickr, or mapping where your friends are, to name the most obvious).</p>

<p>Anyway: Fire Eagle really caught my attention and, thanks to my friendship with <a href="http://plasticbag.org/" title="Tom Coates’s Plasticbag" rel="friend met co-worker">the lovely Mr. Coates</a>, I got to play a little with its <acronym title="Application Programming Interface">API</acronym> before launch. Whilst it’s not <em>quite</em> finished yet (the methods to find users of your application within a given area, <code>within</code>, and to find recent location updates from your users, <code>recent</code>, are not there at the time of writing), the <acronym title="Application Programming Interface">API</acronym> and, indeed, website are decidedly lovely.</p>

<p>The website is friendly, playful, and takes all the hard edges off of the concept of using a web app whose sole purpose is to serve other applications and widgets. It has non-awful markup and CSS (although there are a few things I might quibble with in a code review). The <acronym title="Uniform Resource Locator">URL</acronym>s, though…</p>

<p>Oh, the <acronym title="Uniform Resource Locator">URL</acronym>s! Whoever came up with the idea of allowing <code>http://fireeagle.com/my/location/is/Austin%20TX</code> (or, indeed, any other location, but Austin, Texas is <a href="http://2008.sxsw.com/" title="South by South-West 2008">particularly apt</a> for me right now) is an evil genius after my own heart.</p>

<p><a href="http://fireeagle.com/developers/" title="Fire Eagle’s API documentation">The <acronym title="Application Programming Interface">API</acronym></a> has had as much care and attention as the web interface, though: no method is out of place, everything accepts what you’d expect. What’s more, it uses <a href="http://oauth.net/">OAuth</a> for authorising third-party applications to access user data (and Fire Eagle allows you to specify what level of granularity you want to allow per-application), so even <em>that</em> is positively simple given the existence of libraries to deal with OAuth for you.</p>

<p>If it all <em>still</em> seems like too much hard work to implement bindings for the <acronym title="Application Programming Interface">API</acronym> in your app, that’s been covered, too: there are bindings for <a href="http://fireeagle.yahoo.net/developer/code/javascript">Javascript</a>, <a href="http://fireeagle.yahoo.net/developer/code/php">PHP</a>, <a href="http://fireeagle.yahoo.net/developer/code/ruby">Ruby</a>, <a href="http://fireeagle.yahoo.net/developer/code/perl">Perl</a>, and even one for <a href="http://fireeagle.yahoo.net/developer/code/python">Python</a> written by yours truly.</p>

<p>I intend to spend a sizeable chunk of my time over the next few weeks playing with Fire Eagle, both updating my Python <acronym title="Application Programming Interface">API</acronym> binding and hacking around with various ideas I’ve had for fun, useful little apps using Fire Eagle data.</p>

<p>Now, where was&nbsp;I?</p>]]></content:encoded>
			<wfw:commentRss>http://nascentguruism.com/journal/pinpoint/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Red</title>
		<link>http://nascentguruism.com/journal/red</link>
		<comments>http://nascentguruism.com/journal/red#comments</comments>
		<pubDate>Mon, 05 Nov 2007 18:19:07 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[197]]></category>
		<category><![CDATA[car]]></category>
		<category><![CDATA[clio]]></category>
		<category><![CDATA[f1 team]]></category>
		<category><![CDATA[Journal Entries]]></category>
		<category><![CDATA[r27]]></category>
		<category><![CDATA[red]]></category>
		<category><![CDATA[renault]]></category>
		<category><![CDATA[renaultsport]]></category>

		<guid isPermaLink="false">http://nascentguruism.com/journal/red</guid>
		<description><![CDATA[in which our hero meets his new love]]></description>
				<content:encoded><![CDATA[<p>I’d been talking to John about her for quite a while before Peter finally introduced us. Dressed in close-fitting red, subtly accentuating her curves, she waited patiently outside.</p>

<p>As I approached she perked up, attentive to my presence, a youthful exuberance in her eyes. My hand lightly touching her side, she drew me closer. As I pushed all the right buttons, she progressed from a quiet whimper to an excited, throaty purr.</p>

<p>I still don’t know her name. Her number, though, is 368 of 500.<a href="http://www.flickr.com/photos/steviebm/sets/72157602936819100/"><img src="http://farm3.static.flickr.com/2094/1875843891_1f9a266ea0.jpg?v=0" alt="Photos of my new car on flickr" title=""&nbsp;/></a></p>]]></content:encoded>
			<wfw:commentRss>http://nascentguruism.com/journal/red/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Perfection</title>
		<link>http://nascentguruism.com/journal/perfection</link>
		<comments>http://nascentguruism.com/journal/perfection#comments</comments>
		<pubDate>Fri, 02 Nov 2007 22:25:46 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[behaviour]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[markup]]></category>
		<category><![CDATA[progressive enhancement]]></category>
		<category><![CDATA[style]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://nascentguruism.com/journal/perfection</guid>
		<description><![CDATA[in which our hero explains how best to build web pages]]></description>
				<content:encoded><![CDATA[<blockquote>
  <p>Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away.</p>
</blockquote>

<div>—<cite>Antoine de Saint Exupéry, ‘Terre des Hommes’ (1939)</cite></div>

<p>This sentiment is just as true for markup, style, and behaviour on the web. The trick, though, is to find the optimal balance between the four.</p>

<h2>Markup</h2>

<p>When building a page, one should assume nothing: mark it up in the most minimal, sparse way possible whilst still maintaining a logical structure.</p>

<p>No <code>class</code>es. No <code>id</code>s. No <code>div</code>s or <code>span</code>s. Just pure, semantically rich <abbr title="HyperText Markup Language" class="caps">HTML</abbr> elements.</p>

<p>Next, divide the page into major logical divisions using <code>div</code>s with apt <code>id</code>s. Use <code>class</code>es to identify patterns used throughout the page (<abbr title="confer">cf.</abbr> <a href="http://microformats.org/">Microformats</a>). At this stage, one should be adding semantic context as minimally as possible.</p>

<p>Further, this context should be added at the highest level in the <abbr title="Document Object Model" class="caps">DOM</abbr> that is appropriate, and no higher. For example, an ordered list of blog posts should not feature a class of <code>post</code> on each list item; rather, the list itself should have the class <code>posts</code>.</p>

<p>Remove redundancy in all aspects of the markup. Consider different choices of elements, even if they seem unfit for purpose.</p>

<p>If, at the end of this process, it seems like the document should be easy to style accordingly then there are probably too many styling hooks, in the form of non-semantic <code>class</code>es, <code>id</code>s and elements, in place already. Go back and think about everything once more. Make every element and attribute justify its existence.</p>

<p>By this point all functionality of the page, be it part of an application or straight prose, should be exposed and fully usable.</p>

<p><strong>All of it</strong>.</p>

<p>If there’s a single piece of functionality that you feel you can’t provide in raw <abbr class="caps">HTML</abbr>, you’re doing it wrong.</p>

<p>This doesn’t mean the interaction has to be as rich as it might be, but it should be usable.</p>

<h2>Style</h2>

<p>As with the markup, styling should be approached by using the most simple approaches possible to achieve the desired look.</p>

<p>The styling shouldn’t obfuscate any functionality: everything should still work as intended.</p>

<p>Avoid adding extra markup at all costs. If it seems that extra markup is necessary to aid styling, consider that the approach being used to acheive the style is the wrong one.</p>

<h2>Behaviour</h2>

<p>Finally, enhance the behaviour as necessary. As with styling, consider that the desire to add to the <abbr class="caps">DOM</abbr> (either before or during the life of a script) could be a sign that the solution is not the optimal one. Similarly, if styles must be added <em>before</em> any interaction occurs, separate them using some class high in the <abbr class="caps">DOM</abbr> tree.</p>

<p>If anything must be added, be they elements, <code>id</code>s, <code>class</code>es, or styles, add them at the latest possible instant and promptly remove them when unneeded. When applying behaviour use, as far as possible, already extant semantics for context.</p>

<p>Further, if the behaviour relies on styling to justify its existence, it may need rethinking.</p>

<p>Throughout all three, one should attempt to focus on the smallest area possible at a time. Break the document into its requisite parts, developing these in isolation from one another and the framework to bind them together.</p>

<p>Above all: if you’re not finding it hard, and agonising over it, you’re probably not doing it&nbsp;right.</p>]]></content:encoded>
			<wfw:commentRss>http://nascentguruism.com/journal/perfection/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tired of this&#160;phase</title>
		<link>http://nascentguruism.com/journal/tired-of-this-phase</link>
		<comments>http://nascentguruism.com/journal/tired-of-this-phase#comments</comments>
		<pubDate>Mon, 08 Oct 2007 11:49:00 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Ben Ward]]></category>
		<category><![CDATA[motivation]]></category>

		<guid isPermaLink="false">http://nascentguruism.com/journal/tired-of-this-phase</guid>
		<description><![CDATA[where Steve commits to following through on more of his goals]]></description>
				<content:encoded><![CDATA[<p><a href="http://ben-ward.co.uk/" title="Ben Ward" rel="friend met co-worker">Ben</a> has publicly <a href="http://ben-ward.co.uk/journal/getting-up/" title="‘Tired of this phase’ by Ben Ward">challenged himself</a> to not waste his pre-work mornings by sleeping through multiple alarms.</p>

<p>Whilst I don&#8217;t intend to mimic his goal (I already get up at 6:30<abbr title="ante meridiem">am</abbr> thankyouver’much), I have a habit of not doing things (posting here, writing for <a href="http://webtypography.net/">Web Typography</a>, exercising, and the list goes on) for similar reasons. I bemoan a lack of time, a fear of failure, a lack of knowledge… Anything, in fact, to excuse myself from doing things that might challenge me and require me to put effort into something.</p>

<p>So, to echo Ben’s sentiment:</p>

<blockquote>
  <p>This week, I’m taking the “don’t be so pathetic” method to not being shit at&nbsp;stuff.</p>
</blockquote>]]></content:encoded>
			<wfw:commentRss>http://nascentguruism.com/journal/tired-of-this-phase/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A vote for Ask Us Anything is a vote for&#160;awesome</title>
		<link>http://nascentguruism.com/journal/a-vote-for-ask-us-anything-is-a-vote-for-awesome-2</link>
		<comments>http://nascentguruism.com/journal/a-vote-for-ask-us-anything-is-a-vote-for-awesome-2#comments</comments>
		<pubDate>Mon, 20 Aug 2007 21:45:34 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Ask Us Anything]]></category>
		<category><![CDATA[cackhanded]]></category>
		<category><![CDATA[conferences]]></category>
		<category><![CDATA[James Aylett]]></category>
		<category><![CDATA[Journal Entries]]></category>
		<category><![CDATA[Mark Norman Francis]]></category>
		<category><![CDATA[me]]></category>
		<category><![CDATA[nascentguruism]]></category>
		<category><![CDATA[Norm!]]></category>
		<category><![CDATA[SXSW]]></category>
		<category><![CDATA[SXSW08]]></category>

		<guid isPermaLink="false">http://nascentguruism.com/journal/a-vote-for-ask-us-anything-is-a-vote-for-awesome-2</guid>
		<description><![CDATA[It would appear that the SXSW08 panel picker is live. James, Norm! and I are hoping to run an Ask Us Anything session. Vote for it, you know you want&#160;to!]]></description>
				<content:encoded><![CDATA[<p>It would appear that the <a href="http://2008.sxsw.com/">SXSW08</a> <a href="http://panelpicker.sxsw.com/">panel picker</a> is live. <a href="http://tartarus.org/james/" title="James Aylett" rel="friend met colleague">James</a>, <a href="http://cackhanded.net/" title="Mark Norman Francis" rel="friend met co-worker">Norm!</a> and I are hoping to run an <a href="http://ask-us-anything.com/">Ask Us Anything</a> session.</p>

<p><a href="http://panelpicker.sxsw.com/ideas/view/233" title="Vote for Ask Us Anything to appear live at SXSW08">Vote for it</a>, you know you want&nbsp;to!</p>]]></content:encoded>
			<wfw:commentRss>http://nascentguruism.com/journal/a-vote-for-ask-us-anything-is-a-vote-for-awesome-2/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Search, and ye shall&#160;fail</title>
		<link>http://nascentguruism.com/journal/search-and-ye-shall-fail</link>
		<comments>http://nascentguruism.com/journal/search-and-ye-shall-fail#comments</comments>
		<pubDate>Fri, 11 May 2007 10:46:21 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Alex Lee]]></category>
		<category><![CDATA[Ann McMeekin]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[graceful degredation]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Mark Norman Francis]]></category>
		<category><![CDATA[Mike Davies]]></category>
		<category><![CDATA[Norm!]]></category>
		<category><![CDATA[progressive enhancement]]></category>
		<category><![CDATA[Tim Huegdon]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[Yahoo!]]></category>
		<category><![CDATA[Yahoo! TV]]></category>

		<guid isPermaLink="false">http://nascentguruism.com/journal/search-and-ye-shall-fail</guid>
		<description><![CDATA[in which our illustrious leader solves the problems with current web search interfaces]]></description>
				<content:encoded><![CDATA[<p>There&#8217;s an accepted solution for channelled searching: offer a textbox input and a submit button, supported by a series of links to each channel of the search. The links will typically have JavaScript layered onto them (in theory, at least) to rewrite the form&#8217;s target, so that the user may refine their search before submitting it. This behaviour can be seen on <a href="http://yahoo.com/">Yahoo! <abbr title="United States" class="caps">US</abbr></a>, <a href="http://uk.yahoo.com/">Yahoo! <abbr title="United Kingdom" class="caps">UK</abbr> and Ireland</a>, <a href="http://msn.com/"><abbr title="Microsoft Network" class="caps">MSN</abbr></a>, and yes, even <a href="http://google.com/">Google</a>.</p>

<p>It <em>must</em> be the best solution, mustn&#8217;t it, if all these sites use similar techniques?</p>

<h2>The objective of my affection</h2>

<p>If we step back for a moment, to examine the user&#8217;s needs, we can see two objectives for the average searcher: <strong>find something</strong> and [<ins>perhaps</ins>] make it <em>of this type</em>.</p>

<p>The &#8216;something&#8217; for which the user is searching is, in their mind, the foremost concern. <em>Everything else</em> is secondary. When searching, a user&#8217;s first instinct will almost always be to enter their search terms (and why should it be otherwise?). Everything about a search interface is geared toward this: the keyword input has the most visual weight on the screen &#8212; on a typical search index page &#8212; and the most prominent position &#8212; either near dead-centre or in the head of the page, depending on the type of page.</p>

<p>The accepted solution, happily, cedes to this under all circumstances.</p>

<p>The second objective, then, is the type of results that will satisfy the search. The introduction of this second objective is where user behaviour will begin to deviate: depending on their priorities and personal inclinations, users&#8217; execution of this may take place before, after, or even <em>during</em> the steps to meet the primary objective. Unlike the emphasis placed on the keyword input, the type of results to return should be &#8212; and, typically, are &#8212; de-emphasised where possible, but be present &#8212; and have their presence known &#8212; should the user require them (either to confirm their beliefs or to make a change).</p>

<h2>Humbled</h2>

<p>But the accepted solution only pays lip-service to this more complex interaction: for any user without JavaScript, the only acknowledged paths for them to change the channel in which they are searching is to select it before they begin their search or, assuming that the search engine alters the links based on the latest query, directly after (and before they attempt to manipulate their search further). </p>

<p>By using JavaScript to bludgeon links into selecting from a choice of mutually exclusive channels, the user experience of what <em>should</em> be a simple search form is broken for many users when they attempt to interact with it in a way that seems natural to them. To compound this issue further, the use of links means that screen reader users may <em>never</em> be able to use this functionality, as links within the form will never be announced when they are entering their search terms.</p>

<p>The problem is that whomever has implemented these solutions (or their forebears) had the mindset of &#8216;HTML is static, JavaScript is dynamic&#8217; &#8212; or simply didn&#8217;t care enough to question the accepted norm &#8212; and so overlooked what was staring them right in the face: HTML already has a perfectly good input device for selecting one and only one item from a collection:</p>

<p>The humble radio-button.</p>

<p>Given a little semantic markup and CSS (with a smattering of JavaScript to add extra styling hooks), it&#8217;s entirely possible to style a group of radio-buttons in a more visually apt way to indicate that it is filtering the search input, whilst offering a far more interactive experience to <em>all</em> users of the site, not just those with JavaScript.</p>

<p>So I did.</p>

<p>That&#8217;s what you can see in action on the new <a href="http://uk.tv.yahoo.com/">Yahoo! <abrr title="United Kingdom" class="caps">UK</abrr> and Ireland <abbr title="Television" class="caps">TV</abbr></a> (along with <a href="http://fr.tv.yahoo.com/" title="Yahoo! France Télé">France</a>, <a href="http://de.tv.yahoo.com/" title="Yahoo! Deutschland TV">Germany</a>, <a href="http://it.tv.yahoo.com/" title="YahoO! Italia TV">Italy</a>, and <a href="http://es.tv.yahoo.com/" title="Yahoo! España TV">Spain</a>).</p>

<h2>Implementation notes</h2>

<p>As noted above, the main components of the form are a list of radio-buttons, a textbox, and a submit button. Of particular note is the way the radio-buttons are scripted and styled, and the structure of the radio-button labels relative to the form&#8217;s <code>&lt;legend&gt;</code>. Further, implementing the search this way requires that the server-side script be able to handle the new field being passed its way appropriately.</p>

<h3>Scripted style</h3>

<p>For all users, the core functionality of the radio-buttons is available, with these styled as an inline list for users with CSS enabled. The JavaScript, when enabled, will simply add a class to the root of the list, along with an extra <code>&lt;span&gt;</code> to allow styling of the labels in accordance with the design. When the radio-buttons receive focus the &#8216;selected&#8217; class is moved to the new selection. This activity takes place on focus, mark you, and not click: click events fire on the <em>originating</em> control which, when navigating with the keyboard, will mean the <em>previously selected</em> radio-button.</p>

<h3>A <code>&lt;legend&gt;</code> in its own life-time</h3>

<p>It was brought to my attention that a form&#8217;s <code>&lt;legend&gt;</code> will, by default, be announced before each and every form field by screen readers. To make this as unobtrusive as possible, each radio-button&#8217;s <code>&lt;label&gt;</code> is worded such that it makes the most possible sense when preceded by the legend text. In English, for example, the radio-buttons will be announced as &#8216;Search… the web&#8217;, &#8216;Search… for images&#8217;, and so forth (where &#8216;Search&#8217; is the form&#8217;s  <code>&lt;legend&gt;</code>).</p>

<p>The radio-buttons&#8217; full text, though, would not make sense in a visual context: they should be presented as tabs titled &#8216;Web&#8217;, &#8216;Images&#8217;, and so on. To achieve this, the visually inappropriate portions of the <code>&lt;label&gt;</code> are wrapped in <code>&lt;span&gt;</code>s and positioned outside the browser&#8217;s viewport &#8212; along with the form&#8217;s legend and the radio-buttons themselves &#8212; such that they may still be accessed by screen readers and the like.</p>

<p>Furthermore, because the radio-buttons are still present in the content of the page, keyboard users may navigate the form fully through the keyboard (using arrow keys to move between items radio-buttons in a collection).</p>

<p><ins>Once again, this can all be seen in action on the new <a href="http://uk.tv.yahoo.com/">Yahoo! <abrr title="United Kingdom" class="caps">UK</abrr> and Ireland <abbr title="Television" class="caps">TV</abbr></a> (along with <a href="http://fr.tv.yahoo.com/" title="Yahoo! France Télé">France</a>, <a href="http://de.tv.yahoo.com/" title="Yahoo! Deutschland TV">Germany</a>, <a href="http://it.tv.yahoo.com/" title="YahoO! Italia TV">Italy</a>, and <a href="http://es.tv.yahoo.com/" title="Yahoo! España TV">Spain</a>). [Links added at Mike's suggestion]</ins></p>

<h2>Thanks</h2>

<p>I can by no means take full responsibility for the successful implementation of this concept, though: I&#8217;d particularly like to thank <a href="http://cackhanded.net/" title="Mark Norman Francis's Cackhanded.net" rel="friend met co-worker">Norm!</a>, <a href="http://www.isolani.co.uk/" title="Mike Davies's isolani" rel="friend met co-worker">Mike Davies</a>, <a href="http://www.csensedesign.co.uk/" title="Alex Lee: in the arms of strangers" rel="friend met co-worker">Alex Lee</a> (our designer), <a href="http://nefariousdesigns.co.uk/" title="Tim Huegdon's Nefarious Designs" rel="friend met co-worker">Tim Huegdon</a>, and <a href="http://www.pixeldiva.co.uk/" title="Ann McMeekin: pixeldiva" rel="friend met co-worker">Ann McMeekin</a> (of the <a href="http://www.rnib.org.uk/"><abbr title="Royal National Institute of the Blind" class="caps">RNIB</abbr></a>) for all their help, advice, and patience (particularly when I got things working and made lots of excited noises at them), and this wouldn&#8217;t have ever been a reality on Yahoo! TV for Europe if it hadn&#8217;t been for the receptive, responsive attitude of the engineers working on Yahoo! Search for&nbsp;Europe.</p>]]></content:encoded>
			<wfw:commentRss>http://nascentguruism.com/journal/search-and-ye-shall-fail/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
