<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns: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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Unusual Subroutines</title>
	
	<link>http://www.allen-poole.com/wordpress</link>
	<description>Programming and business</description>
	<lastBuildDate>Tue, 21 Feb 2012 21:55:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/unusual-subroutines" /><feedburner:info uri="unusual-subroutines" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>The lessons of Tea</title>
		<link>http://feedproxy.google.com/~r/unusual-subroutines/~3/MF21cJiBcqc/</link>
		<comments>http://www.allen-poole.com/wordpress/2012/02/the-lessons-of-tea/#comments</comments>
		<pubDate>Tue, 21 Feb 2012 21:53:37 +0000</pubDate>
		<dc:creator>Christopher Allen-Poole</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[excellence]]></category>

		<guid isPermaLink="false">http://www.allen-poole.com/wordpress/?p=1383</guid>
		<description><![CDATA[I really like Twinnings Earl Grey bagged tea. I do. This isn&#8217;t because it will always provide a great cup, sometimes it won&#8217;t even provide a good cup, but it will always provide an adequate cup. And I do have &#8230; <a href="http://www.allen-poole.com/wordpress/2012/02/the-lessons-of-tea/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I really like Twinnings Earl Grey bagged tea. I do.</p>
<p>This isn&#8217;t because it will always provide a great cup, sometimes it won&#8217;t even provide a good cup, but it will always provide an adequate cup.</p>
<p>And I do have good tea at my disposal &mdash; I have tea carried by hand from India and Nepal and tea from some excellent vendors (and I don&#8217;t just mean Teavana). I have a real teapot (which I bought from some cloistered monks), good infusers and a good source of fresh, filtered water. But I like Twinnings.</p>
<p>&#8220;Why?&#8221; you might ask. After all, they aren&#8217;t exactly known for quality. Not only are they bagged, but they aren&#8217;t even top quality bagged (and I have some of that, too). Well, because the tea is always decent. No matter how you abuse Twinnings (over-steep, under-steep, drink cold, drink hot), it will always be <em>decent</em>. If you over-steep good tea, or drink it after it cools too much, the tea starts getting bitter. The wonderful aromas mute and sour and the experience is more-or-less ruined.</p>
<p>Now, sometimes I do have the time to actually sit and wait for my tea to really brew. When I have that time, I will most certainly go and brew good tea. After all, I have time. But time is often a commodity, and waiting an extra 3-5 minutes for the tea to brew is not exactly the easiest thing in the world.</p>
<hr />
So, what does this have to do with life the universe and everything? Simple. It is an illustration of how consistent adequacy is far superior to occasional excellence.</p>

<img src="http://feeds.feedburner.com/~r/unusual-subroutines/~4/MF21cJiBcqc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.allen-poole.com/wordpress/2012/02/the-lessons-of-tea/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.allen-poole.com/wordpress/2012/02/the-lessons-of-tea/</feedburner:origLink></item>
		<item>
		<title>Appcelerator’s Titanium: Inherit from Ti objects.</title>
		<link>http://feedproxy.google.com/~r/unusual-subroutines/~3/2vfr4TrB2jY/</link>
		<comments>http://www.allen-poole.com/wordpress/2011/12/appcelerators-titanium-inherit-from-ti-objects/#comments</comments>
		<pubDate>Tue, 27 Dec 2011 19:24:01 +0000</pubDate>
		<dc:creator>Christopher Allen-Poole</dc:creator>
				<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[appcelerator]]></category>
		<category><![CDATA[frameworks]]></category>
		<category><![CDATA[inheritence]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[titanium]]></category>

		<guid isPermaLink="false">http://www.allen-poole.com/wordpress/?p=1379</guid>
		<description><![CDATA[So, in Titanium, you are unable to extend the native classes. You&#8217;re also unable to add methods to native objects or re-assign methods (so, if you wanted to, say, modify an object so that the &#8220;hide&#8221; function triggers an event, &#8230; <a href="http://www.allen-poole.com/wordpress/2011/12/appcelerators-titanium-inherit-from-ti-objects/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>So, in Titanium, you are unable to extend the native classes. You&#8217;re also unable to add methods to native objects or re-assign methods (so, if you wanted to, say, modify an object so that the &#8220;hide&#8221; function triggers an event, tough sh*t). There is, however, a decent way of getting around this inadequacy (read: violant violation of the ECMA standards, but who are we to judge).</p>
<pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> Klass <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">toView</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #000066; font-weight: bold;">return</span> Klass.<span style="color: #660066;">prototype</span> <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
Klass.<span style="color: #660066;">prototype</span> <span style="color: #339933;">=</span> Ti.<span style="color: #660066;">UI</span>.<span style="color: #660066;">createView</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #009966; font-style: italic;">/*... the rest of the parameters here (as usual) ... */</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> view <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Klass<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre>
<p>Then, if you want to add the object to a window, you need to remember to call <code>win.add(view.toView())</code>, but it means you can now carry around the data object with *all* of its data.</p>

<img src="http://feeds.feedburner.com/~r/unusual-subroutines/~4/2vfr4TrB2jY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.allen-poole.com/wordpress/2011/12/appcelerators-titanium-inherit-from-ti-objects/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.allen-poole.com/wordpress/2011/12/appcelerators-titanium-inherit-from-ti-objects/</feedburner:origLink></item>
		<item>
		<title>jQuery without a DOM</title>
		<link>http://feedproxy.google.com/~r/unusual-subroutines/~3/HGlhvtPxlLQ/</link>
		<comments>http://www.allen-poole.com/wordpress/2011/12/jquery-without-a-dom/#comments</comments>
		<pubDate>Mon, 26 Dec 2011 15:32:38 +0000</pubDate>
		<dc:creator>Christopher Allen-Poole</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://www.allen-poole.com/wordpress/?p=1368</guid>
		<description><![CDATA[If you&#8217;re ever using jQuery without a proper DOM, you may want to use this. It provides enough of a DOM-like syntax to suffice. (Literally, this is every function which jQuery calls on the DOM directly (assuming no selectors). I &#8230; <a href="http://www.allen-poole.com/wordpress/2011/12/jquery-without-a-dom/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re ever using jQuery without a proper DOM, you may want to use this. It provides enough of a DOM-like syntax to suffice. (Literally, this is every function which jQuery calls on the DOM directly (assuming no selectors). I really wish they abstracted the AJAX functionality so that it would be trivial to use it without the whole framework)
<pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> emptyFunction <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #3366CC;">&quot;&quot;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
      gebi <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>elm<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#123;</span>
					nodeType<span style="color: #339933;">:</span> <span style="color: #3366CC;">''</span><span style="color: #339933;">,</span>
					innerHTML<span style="color: #339933;">:</span> <span style="color: #3366CC;">''</span><span style="color: #339933;">,</span>
					insertBefore<span style="color: #339933;">:</span> emptyFunction<span style="color: #339933;">,</span>
					removeChild<span style="color: #339933;">:</span> emptyFunction<span style="color: #339933;">,</span>
					appendChild<span style="color: #339933;">:</span> emptyFunction<span style="color: #339933;">,</span>
					getAttribute<span style="color: #339933;">:</span> emptyFunction<span style="color: #339933;">,</span>
					setAttribute<span style="color: #339933;">:</span> emptyFunction<span style="color: #339933;">,</span>
					getElementsByTagName<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
						<span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
					<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
					style<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
				<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
window <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
	document<span style="color: #339933;">:</span><span style="color: #009900;">&#123;</span>
		getElementById<span style="color: #339933;">:</span> gebi<span style="color: #339933;">,</span>
		createComment<span style="color: #339933;">:</span> emptyFunction<span style="color: #339933;">,</span>
		createElement<span style="color: #339933;">:</span> gebi<span style="color: #339933;">,</span>
		createDocumentFragment<span style="color: #339933;">:</span> gebi<span style="color: #339933;">,</span>
		documentElement<span style="color: #339933;">:</span> ntx.<span style="color: #660066;">extend</span><span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#123;</span>
			createElement<span style="color: #339933;">:</span> gebi<span style="color: #339933;">,</span>
			childNodes<span style="color: #339933;">:</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #003366; font-weight: bold;">var</span> g <span style="color: #339933;">=</span> gebi<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#91;</span>g<span style="color: #009900;">&#93;</span>
			<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> gebi<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
	location<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
		href<span style="color: #339933;">:</span><span style="color: #3366CC;">&quot;&quot;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
	navigator<span style="color: #339933;">:</span><span style="color: #009900;">&#123;</span>
		userAgent<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;&quot;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre>

<img src="http://feeds.feedburner.com/~r/unusual-subroutines/~4/HGlhvtPxlLQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.allen-poole.com/wordpress/2011/12/jquery-without-a-dom/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.allen-poole.com/wordpress/2011/12/jquery-without-a-dom/</feedburner:origLink></item>
		<item>
		<title>Big-O is important, damn it!</title>
		<link>http://feedproxy.google.com/~r/unusual-subroutines/~3/fcdoZD8acyI/</link>
		<comments>http://www.allen-poole.com/wordpress/2011/12/big-o-is-important-damn-it/#comments</comments>
		<pubDate>Thu, 22 Dec 2011 20:47:48 +0000</pubDate>
		<dc:creator>Christopher Allen-Poole</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.allen-poole.com/wordpress/?p=1360</guid>
		<description><![CDATA[A fried of mine recently complained that they sent his package east to send it west, and if they only sent it west it would be faster. My response: The process is local post office -> central hub -> local &#8230; <a href="http://www.allen-poole.com/wordpress/2011/12/big-o-is-important-damn-it/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>A fried of mine recently complained that they sent his package east to send it west, and if they only sent it west it would be faster.</p>
<p>My response:<br />
The process is local post office -> central hub -> local post office. It means that all routes are 2 long, but it means you only need to support routes to and from that hub. At most, that is 2 * number of post office. </p>
<p>On the other hand, if they were to support &#8220;every post office to every post office&#8221; that would be (number of post offices)!. </p>
<p>So, if there are, say, 1000 post offices, the hub plan means that there are only 2000 routes at most. If each office were to send to each other office, that would be 1000<sup>2</sup>, or 1,000,000&#8230;</p>

<img src="http://feeds.feedburner.com/~r/unusual-subroutines/~4/fcdoZD8acyI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.allen-poole.com/wordpress/2011/12/big-o-is-important-damn-it/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.allen-poole.com/wordpress/2011/12/big-o-is-important-damn-it/</feedburner:origLink></item>
		<item>
		<title>Ubuntu location of Empathy logs</title>
		<link>http://feedproxy.google.com/~r/unusual-subroutines/~3/ZrdDpLk93HY/</link>
		<comments>http://www.allen-poole.com/wordpress/2011/12/ubuntu-location-of-empathy-logs/#comments</comments>
		<pubDate>Thu, 08 Dec 2011 08:37:54 +0000</pubDate>
		<dc:creator>Christopher Allen-Poole</dc:creator>
				<category><![CDATA[Products]]></category>
		<category><![CDATA[empathy]]></category>
		<category><![CDATA[IM]]></category>
		<category><![CDATA[logs]]></category>
		<category><![CDATA[telepathy]]></category>

		<guid isPermaLink="false">http://www.allen-poole.com/wordpress/?p=1355</guid>
		<description><![CDATA[I&#8217;m writing this post because the rest of the interwebs seems to be hopelessly out of date. Hopefully some search engine will find my site and lead people here. Anyway, the location of the log files for Empathy in Ubuntu &#8230; <a href="http://www.allen-poole.com/wordpress/2011/12/ubuntu-location-of-empathy-logs/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m writing this post because the rest of the <a href="http://ubuntuforums.org/showthread.php?t=1163726">interwebs</a> seems to be hopelessly out of date. Hopefully some search engine will find my site and lead people here.</p>
<p>Anyway, the location of the log files for Empathy in Ubuntu 10x-11.x is: <br /><code>./.local/share/TpLogger/logs/</code></p>
<p>This is because while the default bundled IM client is Empathy, it is used as a part of Telepathy (hence the &#8220;TpLogger&#8221; part). It is annoying as anything to figure this out especially since (as of this date), the official <a href="http://live.gnome.org/Empathy/FAQ#Where_does_Empathy_save_files_.28accounts.2C_logs.2C_configuration.29.3F">FAQ</a> does not come up as part of the top 5 search results on Google.</p>

<img src="http://feeds.feedburner.com/~r/unusual-subroutines/~4/ZrdDpLk93HY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.allen-poole.com/wordpress/2011/12/ubuntu-location-of-empathy-logs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.allen-poole.com/wordpress/2011/12/ubuntu-location-of-empathy-logs/</feedburner:origLink></item>
		<item>
		<title>Don’t change my UI, that is bad UX</title>
		<link>http://feedproxy.google.com/~r/unusual-subroutines/~3/vztZCX8Sox8/</link>
		<comments>http://www.allen-poole.com/wordpress/2011/12/dont-change-my-ui-that-is-bad-ux/#comments</comments>
		<pubDate>Wed, 07 Dec 2011 21:43:37 +0000</pubDate>
		<dc:creator>Christopher Allen-Poole</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[ui]]></category>
		<category><![CDATA[ux]]></category>

		<guid isPermaLink="false">http://www.allen-poole.com/wordpress/?p=1346</guid>
		<description><![CDATA[Two percent of the people think; three percent of the people think they think; and ninety-five percent of the people would rather die than think&#8212; attributed to both Thomas Alva Edison and George Bernard Shaw While I would love to &#8230; <a href="http://www.allen-poole.com/wordpress/2011/12/dont-change-my-ui-that-is-bad-ux/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<blockquote><p>Two percent of the people think; three percent of the people think they think; and ninety-five percent of the people would rather die than think<br />&mdash; attributed to both Thomas Alva Edison and George Bernard Shaw<sup>[<a href="#dont-change-my-ui-that-is-bad-ux-n-1" class="footnoted" id="to-dont-change-my-ui-that-is-bad-ux-n-1">1</a>]</sup></p></blockquote>
<p><span id="more-1346"></span><br />
While I would love to maintain that I am always in that top 2%<sup>[<a href="#dont-change-my-ui-that-is-bad-ux-n-2" class="footnoted" id="to-dont-change-my-ui-that-is-bad-ux-n-2">2</a>]</sup>, there is one place where I am decidedly happy to be in the non-thinkers category: user experience.</p>
<p>Now, don&#8217;t get me wrong, I actually care a great deal about the experience that people who use my software have: it is incredibly important that you treat people like me well. On the other hand, when I want to use something, I want it to be completely intuitive. And you know what makes something 100% non-intuitive? Changing the UI.</p>
<p>Big news of late is that Google has been changing its UI. Lesser news of late is that Ubuntu and Gnome have been updated <sup>[<a href="#dont-change-my-ui-that-is-bad-ux-n-3" class="footnoted" id="to-dont-change-my-ui-that-is-bad-ux-n-3">3</a>]</sup>. While I am sure that there was some compelling reason that this was done, a change in UI is almost always a bad idea.</p>
<p>Why do I say this? Well, I could cite <a href="http://www.joelonsoftware.com/design/1stDraft/03.html">joelonsoftware</a>, I think that numbers are more compelling. Think of it this way: Google is going through a major revision. I find that most tasks take me an extra second or two per day. Chump change, right? Well, not really.</p>
<p>Google had about 145 million<sup>[<a href="#dont-change-my-ui-that-is-bad-ux-n-4" class="footnoted" id="to-dont-change-my-ui-that-is-bad-ux-n-4">4</a>]</sup> people looking at its site a month<sup>[<a href="#dont-change-my-ui-that-is-bad-ux-n-5" class="footnoted" id="to-dont-change-my-ui-that-is-bad-ux-n-5">5</a>]</sup>. Now, look at that number. Assume 5 seconds per user are wasted on this site, multiply by number of users, divide that by 3,600 (the number of seconds in an hour). Then multiply the result by, say, $5.15<sup>[<a href="#dont-change-my-ui-that-is-bad-ux-n-6" class="footnoted" id="to-dont-change-my-ui-that-is-bad-ux-n-6">6</a>]</sup>. For those who can&#8217;t do 10 digit floating point math in their heads, that&#8217;s <strong>$1,036,865.67</strong>. That number is per month. And it is lost because of a UI change.</p>
<p>When you change your UI, you cause people to pause and look for the function that the individual would like to see. This means that they are spending time doing something which is non-productive and frustrating. It means that you are not only making them less productive, you are costing them (and possibly you) money. Even worse, a major change in UI not only invalidates the experience your users expect, causes them to invest time in <em>unlearning</em>, and not in that cool Yoda way, but more in that &#8220;I want to stab myself in the eye because this experience sucks&#8221; sort of way.</p>
<p>And Google is not the only one to pull this. Ubuntu 11 (and Gnome 3 by proxy) was even <a href="http://felipec.wordpress.com/2011/06/16/after-two-weeks-of-using-gnome-3-i-officially-hate-it/">worse</a>. One of the issues people had with Vista is that they had no idea where the heck anything was anymore (I&#8217;ll argue that Windows 7 was able to survive only because it was able to build on the foundation of, believe it or not, Vista).</p>
<p>All of this considered, I would think it would be considered in a company&#8217;s best interest to make it possible to view older forms of the UI. This might be a bit more difficult on, say, a desktop application paradigm, but it is something Google should seriously consider.</p>
<p>All of this necessarily brings the idea of Windows 8 to mind. It is another revolution, and MS has not consistently batted 1000 on these revolutions<sup>[<a href="#dont-change-my-ui-that-is-bad-ux-n-7" class="footnoted" id="to-dont-change-my-ui-that-is-bad-ux-n-7">7</a>]</sup>. But who knows, maybe I&#8217;m just not Metro enough.</p>

<ol class="footnotes">
	<li class="footnote" id="dont-change-my-ui-that-is-bad-ux-n-1"><strong><sup>[1]</sup></strong> Note: Edison quote is purported to be 5% thinkers, 10% think-thinkers, and 85% non-thinkers <a class="note-return" href="#to-dont-change-my-ui-that-is-bad-ux-n-1">&#x21A9;</a></li>
	<li class="footnote" id="dont-change-my-ui-that-is-bad-ux-n-2"><strong><sup>[2]</sup></strong> (and who knows, maybe I am? But my experience is that those who say this type of thing are snobbish and only count &#8220;those who think&#8221; as &#8220;people who are intelligent and happen to agree with me,&#8221; and &#8220;intelligent&#8221; is subjective there.) <a class="note-return" href="#to-dont-change-my-ui-that-is-bad-ux-n-2">&#x21A9;</a></li>
	<li class="footnote" id="dont-change-my-ui-that-is-bad-ux-n-3"><strong><sup>[3]</sup></strong> 11.10, for those who are keeping score <a class="note-return" href="#to-dont-change-my-ui-that-is-bad-ux-n-3">&#x21A9;</a></li>
	<li class="footnote" id="dont-change-my-ui-that-is-bad-ux-n-4"><strong><sup>[4]</sup></strong> Actually, that&#8217;s 144,959,861 <a class="note-return" href="#to-dont-change-my-ui-that-is-bad-ux-n-4">&#x21A9;</a></li>
	<li class="footnote" id="dont-change-my-ui-that-is-bad-ux-n-5"><strong><sup>[5]</sup></strong> <a href="http://blog.compete.com/2011/03/29/compete-ranking-of-top-50-web-sites-for-february-2011-reveals-familiar-dip/">List of top 50 sites by unique visitor count</a> <a class="note-return" href="#to-dont-change-my-ui-that-is-bad-ux-n-5">&#x21A9;</a></li>
	<li class="footnote" id="dont-change-my-ui-that-is-bad-ux-n-6"><strong><sup>[6]</sup></strong> Lowest minimum wage in the US as of today&#8217;s date. <a class="note-return" href="#to-dont-change-my-ui-that-is-bad-ux-n-6">&#x21A9;</a></li>
	<li class="footnote" id="dont-change-my-ui-that-is-bad-ux-n-7"><strong><sup>[7]</sup></strong> My experience is that the general consensus is that the new &#8220;ribbon&#8221; paradigm is considered awful by, I don&#8217;t know, everyone <a class="note-return" href="#to-dont-change-my-ui-that-is-bad-ux-n-7">&#x21A9;</a></li></ol>
<img src="http://feeds.feedburner.com/~r/unusual-subroutines/~4/vztZCX8Sox8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.allen-poole.com/wordpress/2011/12/dont-change-my-ui-that-is-bad-ux/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.allen-poole.com/wordpress/2011/12/dont-change-my-ui-that-is-bad-ux/</feedburner:origLink></item>
		<item>
		<title>Inconsistency: A most dangerous game</title>
		<link>http://feedproxy.google.com/~r/unusual-subroutines/~3/7zqyTduJpV0/</link>
		<comments>http://www.allen-poole.com/wordpress/2011/11/inconsistency-a-most-dangerous-game/#comments</comments>
		<pubDate>Wed, 23 Nov 2011 20:15:19 +0000</pubDate>
		<dc:creator>Christopher Allen-Poole</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Code theory]]></category>
		<category><![CDATA[Communication]]></category>
		<category><![CDATA[Inter-personal Relations]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[consistency]]></category>
		<category><![CDATA[inconsistency]]></category>
		<category><![CDATA[worst practitices]]></category>

		<guid isPermaLink="false">http://www.allen-poole.com/wordpress/?p=1313</guid>
		<description><![CDATA[One of the absolutely worst things you can do in the entire world is being 99% consistent. While this is especially apt in code, it is a general truth in life. Small inconsistencies are deadly. Don&#8217;t believe me? Two characters &#8230; <a href="http://www.allen-poole.com/wordpress/2011/11/inconsistency-a-most-dangerous-game/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<blockquote><p>One of the absolutely worst things you can do in the entire world is being 99% consistent.</p></blockquote>
<p>While this is especially apt in code, it is a general truth in life. Small inconsistencies are deadly. Don&#8217;t believe me? Two characters difference has cost the U.S. government <a href="http://articles.cnn.com/1999-09-30/tech/9909_30_mars.metric.02_1_climate-orbiter-spacecraft-team-metric-system?_s=PM:TECH">$125 million dollars</a>.<br />
<span id="more-1313"></span></p>
<style>img{ padding: 5px; }</style>
<p>The human brain is the single greatest pattern matching device which has ever been created. We are genetically hard-coded to see things like <code>1,2,3,4,5,6,7,8...</code> and expect that the next number in the sequence should be 9. (This is also why so many people are outright infuriated by the philosopher <a href="http://en.wikipedia.org/wiki/David_Hume">David Hume</a>).</p>
<p>And this is right and good. It allows us to do things like accurately predict future events: fun fact, a professional athlete is able to know where the ball will be in the next second. Without this ability, there would be a good deal more errors.(I&#8217;m not sure if that would make the games more or less entertaining&#8230;) More importantly (for those who actively endanger everyone around them by picking up a ball, like me), this ability makes speed reading possible &mdash; much of speed reading is about allowing the eye to pick up substantially less extra information and allowing the brain to fill in the blanks. spreeder.com actually has a setting which gets rid of &#8220;stopwords&#8221; like &#8220;the&#8221; and &#8220;and&#8221; because the brain is perfectly capable of understanding without them.<br />
<img src="http://allen-poole.com/images/mistake.jpeg" alt="mistake jpg" align="left"/><br />
But it also makes it substantially more difficult to spot small errors. This is why certain optical illusions work (suck as the <a href="http://psychology.about.com/od/sensationandperception/ig/Optical-Illusions/Kanizsa-Triangle-Illusion.htm" style="width:80px">Kanizsa triangle</a>); it is why people don&#8217;t see exchanged letters in words<sup>[<a href="#inconsistency-a-most-dangerous-game-n-1" class="footnoted" id="to-inconsistency-a-most-dangerous-game-n-1">1</a>]</sup>; and it is why the text to the left is so infuriating to so many people (yes, there is an error, and  you can see the footnote if you want the answer<sup>[<a href="#inconsistency-a-most-dangerous-game-n-2" class="footnoted" id="to-inconsistency-a-most-dangerous-game-n-2">2</a>]</sup>). In all of these cases, you are basically firing into the brain&#8217;s largest blind-spot: you are taking advantage of the brain&#8217;s almost obsessive desire to normalize data, the compulsive desire to make &#8220;D&#8221; follow after &#8220;C&#8221; even in cases it has no business being there.</p>
<p>To make matters worse, as the inconsistency gets to be smaller, the harder it is to spot. Amusingly, in situations where we can expect that there will be no pattern we actually do much better. My favorite example is PHP (inconsistent) vs. Python (<em?almost</em> entirely consistent). Most people complain about the inconsistencies &mdash; some times PHP uses underscores, sometimes it uses CamelCase, other times it uses mixedCase, and sometimes it simply concatenates the names of variables and functions &mdash; but this is actually a <em>strength</em>. <img src="http://allen-poole.com/images/php_python.jpeg" alt="" align="right"/>Why? Because you know that you can expect this and so you take time to learn when each happens. And while Python is far more consistent, Python 2 actually used a mixture of mixedCase, CamelCase, and underscore delineation. This means that trying to rely on the consistency of the language will actually set you up for failure!</p>
<p>All of the attempts to get consistent user experience, all of the attempts to give things &#8220;a narrative&#8221; boil down to the question, &#8220;How can we set and fulfill expectations?&#8221; Or, more aptly, &#8220;How can we create a pattern which the user can rely on?&#8221; Further, all of the questions about giving code a &#8220;consistent standard&#8221; are an attempt to make experience for the programmer as uneventful as possible &mdash; <code>doThisThing</code> v.s. <code>DoThisThing</code> is more than just a custom dreamed up by some theorist, it is a mindset and it is something which we must be able to trust.</p>
<p>And it is through consistency that large systems become learnable. It is in consistency that code is maintainable. </p>
<p>After all, the learning curve of a given program is directly related to maintainability of that code. Maintainability is directly related to code meeting the expectations of those who are maintaining it. Length and breadth, number of commands involved, and Cyclomatic complexity pale in efficacy in comparison to having code which works as expected, even if it doesn&#8217;t work.<br />
<img src="http://allen-poole.com/images/wtfm.jpg" alt="" align="left"/><br />
Don&#8217;t believe me? Well, what do you think a &#8220;gotcha&#8221; is? It isn&#8217;t created by people being entirely consistent with themselves. No, it is in people being <em>counter</em>-intuitive. What do you think causes the &#8220;WTF/minute&#8221; standard? It isn&#8217;t thoughts like, &#8220;My word. He did something remarkably similar using similar vocabulary twenty lines ago!&#8221;</p>
<p>I suppose that at this point, I might do well to address the obvious objection, &#8220;What about the coder who consistently does things wrong? What about the one who thinks he is being consistent by naming three things &#8216;var1&#8242;, &#8216;var2&#8242;, and &#8216;var3&#8242;&#8221; Well, what about him? He&#8217;s an idiot. Assuming no other faults (a bad assumption) he has made at least one major inconsistency &mdash; things with like names do not serve like purpose.</p>
<p>The more we keep this rule in mind, the better off we will be. The more we aim for consistency as a mindset, the cleaner and clearer our code will become. And if we keep consistency as job one, it means that we can also expect that our architectures will be clearer too. And while I&#8217;ll not go so far as to call it a panacea, it is abundantly obvious that this is something which we need to keep as a golden standard and deviation should be avoided whenever possible.</p>

<ol class="footnotes">
	<li class="footnote" id="inconsistency-a-most-dangerous-game-n-1"><strong><sup>[1]</sup></strong> It&#8217;s true poeple generally fail to recognize that a word has had two letters transposed. <a class="note-return" href="#to-inconsistency-a-most-dangerous-game-n-1">&#x21A9;</a></li>
	<li class="footnote" id="inconsistency-a-most-dangerous-game-n-2"><strong><sup>[2]</sup></strong> How many definite articles do you see? <a class="note-return" href="#to-inconsistency-a-most-dangerous-game-n-2">&#x21A9;</a></li></ol>
<img src="http://feeds.feedburner.com/~r/unusual-subroutines/~4/7zqyTduJpV0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.allen-poole.com/wordpress/2011/11/inconsistency-a-most-dangerous-game/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.allen-poole.com/wordpress/2011/11/inconsistency-a-most-dangerous-game/</feedburner:origLink></item>
		<item>
		<title>Mapping of HTML5 tags to their legal attributes</title>
		<link>http://feedproxy.google.com/~r/unusual-subroutines/~3/ZPpFldAfSJA/</link>
		<comments>http://www.allen-poole.com/wordpress/2011/11/mapping-of-html5-tags-to-their-legal-attributes/#comments</comments>
		<pubDate>Tue, 22 Nov 2011 07:36:05 +0000</pubDate>
		<dc:creator>Christopher Allen-Poole</dc:creator>
				<category><![CDATA[PyFram]]></category>
		<category><![CDATA[html5]]></category>

		<guid isPermaLink="false">http://www.allen-poole.com/wordpress/?p=1305</guid>
		<description><![CDATA[You know what would be great? If someone were to create a map of all of the HTML5 attributes to their legal properties. Oh, wait, I did. Use: &#62;&#62;&#62; view.tags.get_attributes&#40;'a'&#41; &#40;'accesskey', 'class', 'contenteditable', 'contextmenu', 'dir', 'draggable', 'dropzone', 'hidden', 'id', 'lang', &#8230; <a href="http://www.allen-poole.com/wordpress/2011/11/mapping-of-html5-tags-to-their-legal-attributes/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>You know what would be great? If someone were to create a map of all of the HTML5 attributes to their legal properties. Oh, wait, <a href="https://github.com/cwallenpoole/PyFram-Tutorial/blob/master/wk9/view/tags/attributes.py">I did</a>.<br />
<span id="more-1305"></span><br />
Use:
<pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> view.<span style="color: black;">tags</span>.<span style="color: black;">get_attributes</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'a'</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#40;</span><span style="color: #483d8b;">'accesskey'</span>, <span style="color: #483d8b;">'class'</span>, <span style="color: #483d8b;">'contenteditable'</span>, <span style="color: #483d8b;">'contextmenu'</span>, <span style="color: #483d8b;">'dir'</span>, <span style="color: #483d8b;">'draggable'</span>,
<span style="color: #483d8b;">'dropzone'</span>, <span style="color: #483d8b;">'hidden'</span>, <span style="color: #483d8b;">'id'</span>, <span style="color: #483d8b;">'lang'</span>, <span style="color: #483d8b;">'spellcheck'</span>, <span style="color: #483d8b;">'style'</span>, <span style="color: #483d8b;">'tabindex'</span>, <span style="color: #483d8b;">'title'</span>,
<span style="color: #483d8b;">'href'</span>, <span style="color: #483d8b;">'target'</span>, <span style="color: #483d8b;">'rel'</span>, <span style="color: #483d8b;">'media'</span>, <span style="color: #483d8b;">'hreflang'</span>, <span style="color: #483d8b;">'type'</span>, <span style="color: #483d8b;">'onabort'</span>, <span style="color: #483d8b;">'onblur'</span>,
<span style="color: #483d8b;">'oncanplay'</span>, <span style="color: #483d8b;">'oncanplaythrough'</span>, <span style="color: #483d8b;">'onchange'</span>, <span style="color: #483d8b;">'onclick'</span>, <span style="color: #483d8b;">'oncontextmenu'</span>,
<span style="color: #483d8b;">'oncuechange'</span>, <span style="color: #483d8b;">'ondblclick'</span>, <span style="color: #483d8b;">'ondrag'</span>, <span style="color: #483d8b;">'ondragend'</span>, <span style="color: #483d8b;">'ondragenter'</span>,
<span style="color: #483d8b;">'ondragleave'</span>, <span style="color: #483d8b;">'ondragover'</span>, <span style="color: #483d8b;">'ondragstart'</span>, <span style="color: #483d8b;">'ondrop'</span>, <span style="color: #483d8b;">'ondurationchange'</span>,
<span style="color: #483d8b;">'onemptied'</span>, <span style="color: #483d8b;">'onended'</span>, <span style="color: #483d8b;">'onerror'</span>, <span style="color: #483d8b;">'onfocus'</span>, <span style="color: #483d8b;">'oninput'</span>, <span style="color: #483d8b;">'oninvalid'</span>,
<span style="color: #483d8b;">'onkeydown'</span>, <span style="color: #483d8b;">'onkeypress'</span>, <span style="color: #483d8b;">'onkeyup'</span>, <span style="color: #483d8b;">'onload'</span>, <span style="color: #483d8b;">'onloadeddata'</span>,
<span style="color: #483d8b;">'onloadedmetadata'</span>, <span style="color: #483d8b;">'onloadstart'</span>, <span style="color: #483d8b;">'onmousedown'</span>, <span style="color: #483d8b;">'onmousemove'</span>,
<span style="color: #483d8b;">'onmouseout'</span>, <span style="color: #483d8b;">'onmouseover'</span>, <span style="color: #483d8b;">'onmouseup'</span>, <span style="color: #483d8b;">'onmousewheel'</span>, <span style="color: #483d8b;">'onpause'</span>,
<span style="color: #483d8b;">'onplay'</span>, <span style="color: #483d8b;">'onplaying'</span>, <span style="color: #483d8b;">'onprogress'</span>, <span style="color: #483d8b;">'onratechange'</span>, <span style="color: #483d8b;">'onreset'</span>, <span style="color: #483d8b;">'onscroll'</span>,
<span style="color: #483d8b;">'onseeked'</span>, <span style="color: #483d8b;">'onseeking'</span>, <span style="color: #483d8b;">'onselect'</span>, <span style="color: #483d8b;">'onshow'</span>, <span style="color: #483d8b;">'onstalled'</span>, <span style="color: #483d8b;">'onsubmit'</span>,
<span style="color: #483d8b;">'onsuspend'</span>, <span style="color: #483d8b;">'ontimeupdate'</span>, <span style="color: #483d8b;">'onvolumechange'</span>, <span style="color: #483d8b;">'onwaiting'</span><span style="color: black;">&#41;</span></pre>
<p>It&#8217;s that simple.</p>

<img src="http://feeds.feedburner.com/~r/unusual-subroutines/~4/ZPpFldAfSJA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.allen-poole.com/wordpress/2011/11/mapping-of-html5-tags-to-their-legal-attributes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.allen-poole.com/wordpress/2011/11/mapping-of-html5-tags-to-their-legal-attributes/</feedburner:origLink></item>
		<item>
		<title>PyFram: Create your HTML Tags!</title>
		<link>http://feedproxy.google.com/~r/unusual-subroutines/~3/cEp9h0Ss5I0/</link>
		<comments>http://www.allen-poole.com/wordpress/2011/11/pyfram-create-your-html-tags/#comments</comments>
		<pubDate>Sat, 19 Nov 2011 01:24:05 +0000</pubDate>
		<dc:creator>Christopher Allen-Poole</dc:creator>
				<category><![CDATA[PyFram]]></category>
		<category><![CDATA[PyFram tutorial]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[html tags]]></category>

		<guid isPermaLink="false">http://www.allen-poole.com/wordpress/?p=1299</guid>
		<description><![CDATA[I created an easy way to create smart HTML tags. You can see the source here. Basically, it&#8217;ll let you create a tag object which restricts what properties you can assign it. This means that you&#8217;ll get an error if &#8230; <a href="http://www.allen-poole.com/wordpress/2011/11/pyfram-create-your-html-tags/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I created an easy way to create smart HTML tags. You can see the source <a href="https://github.com/cwallenpoole/PyFram-Tutorial/blob/master/wk9/view/tags.py">here</a>.</p>
<p>Basically, it&#8217;ll let you create a tag object which restricts what properties you can assign it. This means that you&#8217;ll get an error if you try to assign a property which does not exist.</p>
<p>Check it out:
<pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> tag = view.<span style="color: black;">tags</span>.<span style="color: black;">Tag</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'a'</span>,href=<span style="color: #483d8b;">'foo'</span>,valid=<span style="color: black;">&#91;</span><span style="color: #483d8b;">'href'</span>,<span style="color: #483d8b;">'title'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> tag.<span style="color: black;">contents</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span>view.<span style="color: black;">tags</span>.<span style="color: black;">Tag</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'img'</span>,src=<span style="color: #483d8b;">'angry.gif'</span>,valid=<span style="color: black;">&#91;</span><span style="color: #483d8b;">'src'</span>,<span style="color: #483d8b;">'title'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> tag
<span style="color: #66cc66;">&lt;</span>a href=<span style="color: #483d8b;">&quot;foo&quot;</span> <span style="color: #66cc66;">&gt;&lt;</span>img src=<span style="color: #483d8b;">&quot;angry.gif&quot;</span> /<span style="color: #66cc66;">&gt;&lt;</span>/a<span style="color: #66cc66;">&gt;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> tag.<span style="color: black;">src</span> = <span style="color: #483d8b;">&quot;timbuktu&quot;</span>
Traceback <span style="color: black;">&#40;</span>most recent call last<span style="color: black;">&#41;</span>:
  File <span style="color: #483d8b;">&quot;&lt;stdin&gt;&quot;</span>, line <span style="color: #ff4500;">1</span>, <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #66cc66;">&lt;</span>module<span style="color: #66cc66;">&gt;</span>
  File <span style="color: #483d8b;">&quot;view/tags.py&quot;</span>, line <span style="color: #ff4500;">28</span>, <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #0000cd;">__setattr__</span>
    <span style="color: #ff7700;font-weight:bold;">elif</span> <span style="color: #008000;">hasattr</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>,<span style="color: #483d8b;">&quot;attrs&quot;</span><span style="color: black;">&#41;</span>:
  File <span style="color: #483d8b;">&quot;view/tags.py&quot;</span>, line <span style="color: #ff4500;">35</span>, <span style="color: #ff7700;font-weight:bold;">in</span> trigger_keyerror
&nbsp;
<span style="color: #008000;">KeyError</span>: <span style="color: #483d8b;">'&quot;src&quot; is not a valid attribute for a a tag.
&gt;&gt;&gt; tag.href = &quot;http://google.com&quot;
&gt;&gt;&gt; tag
&lt;a href=&quot;http://google.com&quot; &gt;&lt;img src=&quot;angry.gif&quot; /&gt;&lt;/a&gt;</span></pre>
<p>Then there is the <code>UnstrictTag</code>, which will allow all attributes to pass:
<pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> tag = view.<span style="color: black;">tags</span>.<span style="color: black;">UnstrictTag</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'a'</span>,href=<span style="color: #483d8b;">'foo'</span>,valid=<span style="color: black;">&#91;</span><span style="color: #483d8b;">'href'</span>,<span style="color: #483d8b;">'title'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#123;</span><span style="color: #483d8b;">'href'</span>: <span style="color: #483d8b;">'foo'</span><span style="color: black;">&#125;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> tag.<span style="color: black;">contents</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span>view.<span style="color: black;">tags</span>.<span style="color: black;">Tag</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'img'</span>,src=<span style="color: #483d8b;">'angry.gif'</span>,valid=<span style="color: black;">&#91;</span><span style="color: #483d8b;">'src'</span>,<span style="color: #483d8b;">'title'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#123;</span><span style="color: #483d8b;">'src'</span>: <span style="color: #483d8b;">'angry.gif'</span><span style="color: black;">&#125;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> tag
<span style="color: #66cc66;">&lt;</span>a href=<span style="color: #483d8b;">&quot;foo&quot;</span> <span style="color: #66cc66;">&gt;&lt;</span>img src=<span style="color: #483d8b;">&quot;angry.gif&quot;</span> /<span style="color: #66cc66;">&gt;&lt;</span>/a<span style="color: #66cc66;">&gt;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> tag.<span style="color: black;">foo</span> = <span style="color: #ff4500;">1</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> tag
<span style="color: #66cc66;">&lt;</span>a href=<span style="color: #483d8b;">&quot;foo&quot;</span> foo=<span style="color: #483d8b;">&quot;1&quot;</span> <span style="color: #66cc66;">&gt;&lt;</span>img src=<span style="color: #483d8b;">&quot;angry.gif&quot;</span> /<span style="color: #66cc66;">&gt;&lt;</span>/a<span style="color: #66cc66;">&gt;</span></pre>
<p>I admit it does need an official test framework built, and the comments are missing. That&#8217;s for next week.</p>

<img src="http://feeds.feedburner.com/~r/unusual-subroutines/~4/cEp9h0Ss5I0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.allen-poole.com/wordpress/2011/11/pyfram-create-your-html-tags/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.allen-poole.com/wordpress/2011/11/pyfram-create-your-html-tags/</feedburner:origLink></item>
		<item>
		<title>My browser does too much.</title>
		<link>http://feedproxy.google.com/~r/unusual-subroutines/~3/ycFcQMZAZDk/</link>
		<comments>http://www.allen-poole.com/wordpress/2011/11/my-browser-does-too-much/#comments</comments>
		<pubDate>Wed, 16 Nov 2011 20:25:10 +0000</pubDate>
		<dc:creator>Christopher Allen-Poole</dc:creator>
				<category><![CDATA[Chrome]]></category>
		<category><![CDATA[Products]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[os]]></category>
		<category><![CDATA[separation of concerns]]></category>

		<guid isPermaLink="false">http://www.allen-poole.com/wordpress/?p=1265</guid>
		<description><![CDATA[img{ padding:5px;} We&#8217;ve entered the age of the browser. Even without such things as Eyeos, we&#8217;ve come to the point where you can literally do anything without leaving Chrome, Firefox, or even Internet Explorer. Need email? We got that. What &#8230; <a href="http://www.allen-poole.com/wordpress/2011/11/my-browser-does-too-much/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<style>img{ padding:5px;}</style>
<p><img src="http://imgs.xkcd.com/comics/mac_pc.png" alt="Requisite XKCD reference" align="right" />We&#8217;ve entered the age of the browser. Even without such things as Eyeos, we&#8217;ve come to the point where you can literally do <em>anything</em> without leaving Chrome, Firefox, or even Internet Explorer. Need email? We got that. What about RSS? Do you have a document you want to edit?</p>
<p>Heck, you can even get an SSH plugin for Firefox.<span id="more-1265"></span></p>
<p>Does this strike anyone else as odd? I mean, when else do we have a program which does so much? Really, can you imagine someone coming up with a proposal which reflected a modern browser?<br />
<blockquote>Yes, sir. We want something which can function as a document editor, but we also want to play games on it, and when it is necessary, we want to be able to communicate instantly with text. And make it hook up to the phone too. Oh, it also has to be able to re-size images on the fly, it needs to have an incredibly verbose scripting language and a simple interface</p></blockquote>
<p>If I had a client who said that they wanted that as a desktop application, I would likely tell them to <a href="http://www.youtube.com/watch?v=YceMsNXYmaw">&#8220;get out of my office&#8221;</a>. I&#8217;d like to think that I&#8217;m not the only one in that thought too.</p>
<p>This is, to be frank, a severe lack of separation of concerns. It flies in the face of everything we are supposed to teach and believe as developers, but it does not concern us in the least. Heck, we like it so much that it is becoming more common for our OS&#8217;s to be <em>more</em> integrated with the magical interwebs.</p>
<p>Five years ago, if I wanted to listen to music, I would open a music application. If I wanted to write a document, I would open a word processor (OpenOffice likely). My life was very GNU, I would use a series of tools, each of which did one thing, and did that one thing well. And yes, this did lead to some code duplication, and it took proportionately more space of the hard drive, but it made sense. Right now, we have exactly what the ideallists stood against.</p>
<p><img src="http://allen-poole.com/images/mosaic.png" alt="Early Mozilla browser" align="left"/>I would be lying to say that this is shocking though. The browser is a great equalizer: you can build a legitimate webpage which will render in every operating system in 61 characters<sup>[<a href="#my-browser-does-too-much-n-1" class="footnoted" id="to-my-browser-does-too-much-n-1">1</a>]</sup>. While you can print hello world in <a href="http://c2.com/cgi/wiki?HqNinePlusLanguage">as few as one character</a> that requires an interpreter which might not be available in all platforms, or it might require a custom install script. </p>
<p>The browser has offered us not only a single entry point, but it has also provided a default set of tools to work with. HTML, CSS, and JavaScript are now the basic staples of the vast majority of developers who have to do anything involving a user. With the cost of development at an all-time low in browsers, actual application development is understandably going to take a hit &mdash; why publish with a limited domain unless you have to?</p>
<p>And isn&#8217;t it amazing? We came all this way. We made startling advancements. We can now access our data everywhere&#8230; and it basically means that we have wound up using <kbd>Ctrl</kbd> instead of <kbd>Alt</kbd>. Wow, I mean, wow.</p>
<p><img src="http://allen-poole.com/images/tagz.png" alt="Tag fatigue" align="right"/>But, now, instead of having a large number of programs, I have <a href="http://www.youtube.com/watch?v=5scpDev1qps">57 tabs and nothing on.</a> It makes me dream of a world<sup>[<a href="#my-browser-does-too-much-n-2" class="footnoted" id="to-my-browser-does-too-much-n-2">2</a>]</sup> where we can somehow get beyond this. Somehow we must push through this looking glass we call a &#8220;browser&#8221; and into something more.</p>
<p>The implication: the OS of the future will be nothing like the OS of the past. It will, in essence, <em>BE</em> a browser. It will solely exist to consume services and expose that functionality to the user. But we daren&#8217;t call it distributed, we can&#8217;t. The only real collection that exists is the list of products which we have signed up for, but those will simply serve as references to which services we use, they will not be those services in themselves.<sup>[<a href="#my-browser-does-too-much-n-3" class="footnoted" id="to-my-browser-does-too-much-n-3">3</a>]</sup></p>
<p>Now, you might ask how I know this will happen. Well, it is already happening. In addition to the online applications which were mentioned earlier, there is the tablet. The tablet <em>is the embodiment</em> of this ideal, and as the tablet will almost certainly continue to gain market share, so will its interface. </p>
<p>Right now, we live in a world where there is exactly one type of program which is good at making requests like this and so it does everything. But the tablet has show us that we can simply push that issue back, we can make it so that the primary interface for making requests is the OS itself. Once that normalizes, once that becomes standard, we will live in a different world &mdash; one where there will be almost no distinguishing between the terminal and the network. And maybe, just maybe, I&#8217;ll be able to close one or two of these extensions and rely on only a few tabs at once.<sup>[<a href="#my-browser-does-too-much-n-4" class="footnoted" id="to-my-browser-does-too-much-n-4">4</a>]</sup></p>

<ol class="footnotes">
	<li class="footnote" id="my-browser-does-too-much-n-1"><strong><sup>[1]</sup></strong> The minimum required for a legitimate HTML 5.0 file is 49 characters, but then you need the mandatory &#8220;Hello world.&#8221;: <code>&lt;!doctype html&gt;&lt;html&gt;&lt;head /&gt;&lt;body&gt;Hello world.&lt;/body&gt;&lt;/html&gt;</code> <a class="note-return" href="#to-my-browser-does-too-much-n-1">&#x21A9;</a></li>
	<li class="footnote" id="my-browser-does-too-much-n-2"><strong><sup>[2]</sup></strong> Random song tangent: a place where dreams are born and time is never planned. Somewhere, out there, beneath the pale moonlight, there&#8217;s a place for us, somewhere a place for us. <a class="note-return" href="#to-my-browser-does-too-much-n-2">&#x21A9;</a></li>
	<li class="footnote" id="my-browser-does-too-much-n-3"><strong><sup>[3]</sup></strong> The implications for things like digital rights management should be astounding: never again will piracy be possible: each user will simply maintain a specific connection to the web and there will be no way to use more than one instance at a time. <a class="note-return" href="#to-my-browser-does-too-much-n-3">&#x21A9;</a></li>
	<li class="footnote" id="my-browser-does-too-much-n-4"><strong><sup>[4]</sup></strong> Who am I kidding? I&#8217;ll always have 50 tabs open&#8230; oh well, maybe the next revolution <a class="note-return" href="#to-my-browser-does-too-much-n-4">&#x21A9;</a></li></ol>
<img src="http://feeds.feedburner.com/~r/unusual-subroutines/~4/ycFcQMZAZDk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.allen-poole.com/wordpress/2011/11/my-browser-does-too-much/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.allen-poole.com/wordpress/2011/11/my-browser-does-too-much/</feedburner:origLink></item>
	</channel>
</rss>

