<?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>Grails Rocks</title>
	<atom:link href="http://www.anyware.co.uk/2005/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.anyware.co.uk/2005</link>
	<description>Grails, Apple, usability and world stuff</description>
	<lastBuildDate>Fri, 27 Jan 2012 13:52:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Getting started with Arduino / Rainbowduino</title>
		<link>http://www.anyware.co.uk/2005/2012/01/17/getting-started-with-arduino-rainbowduino/</link>
		<comments>http://www.anyware.co.uk/2005/2012/01/17/getting-started-with-arduino-rainbowduino/#comments</comments>
		<pubDate>Tue, 17 Jan 2012 10:30:00 +0000</pubDate>
		<dc:creator>Marc Palmer</dc:creator>
				<category><![CDATA[Groovy and Grails]]></category>
		<category><![CDATA[Programming links]]></category>

		<guid isPermaLink="false">http://www.anyware.co.uk/2005/?p=1135</guid>
		<description><![CDATA[I recently bought some Arduino microcontroller/prototyping boards and components. The plan is to rediscover my childhood interest in electronics and familiarise myself with these tools so that maybe in future I can help teach some of this at schools. This is because I believe that its the practical stuff that can integrate with other school [...]]]></description>
			<content:encoded><![CDATA[<p>I recently bought some <a href="http://arduino.cc">Arduino</a> microcontroller/prototyping boards and components. The plan is to rediscover my childhood interest in electronics and familiarise myself with these tools so that maybe in future I can help teach some of this at schools. This is because I believe that its the practical stuff that can integrate with other school lessons that can give young people the best start at programming.</p>
<p>The great thing is that actually, with only a little knowledge, doing this stuff is really easy. The Arduino board designs and software are open source, which is a good thing. However as usual this means the docs can be problematic.</p>
<p><span id="more-1135"></span>There&#8217;s a confusing array of Arduino hardware out there. The boards have the ATmega micro controller chips on them that you program, and lots of digital and analog input/outputs so you can control and measure things. There are boards with Ethernet, Wi-fi, USB and even LED matrix drivers.</p>
<h2>Basic Arduino (UNO)</h2>
<p>Using this Arduino which has just a USB port and the I/O connectors, plus a bread board and 4-digit 7-segment LED display from an <a href="http://earthshineelectronics.com/">Earthshine</a> starter kit, I managed after digging out the spec sheet on the display, to create a counter from 0001 to 9999. This sounds trivial, but it has a few challenges:</p>
<ol>
<li>The LED display is basically 4 x 8 LEDs (7 segment + decimal point)</li>
<li>There are only 12 pins on it. Huh?</li>
<li>If you don&#8217;t send power to one of the LEDs, it goes off.</li>
</ol>
<p>The spec sheet showed that 4 pins control which of the 4 digits you are addressing &#8211; set them LOW (common cathode) to enable the corresponding digit.</p>
<p>Then you set some of the other 8 pins HIGH to represent the digit or symbol you want to show.</p>
<p>So to set all 4 digits without any shift register chips or other smarts to &#8220;remember&#8221; the state of segments for each digit, you have program the Arduino to continually loop through the 4 selector pins, set the segment pins HIGH, wait a few milliseconds, then set the selector pin for that digit HIGH (to turn it off), and then repeat the same process for the next digit&#8217;s selector pin. What happens is that each digit is illuminated for say 5ms and then it moves to the next one.</p>
<p>They are continually going on and off, but because you constantly loop at high speed over them, it appears to be a continuous display.</p>
<h2>Much more fun &#8211; the Rainbowduino</h2>
<p>The <a href="http://www.seeedstudio.com/wiki/Rainbowduino_v3.0">Rainbowduino</a> is a self contained Arduino board and the latest v3.0 one has built in mini-USB. So its just like an Arduino UNO but has a bunch of other controllers to drive an 8&#215;8 RGB LED matrix with constant current (which I think means when lots of LEDs are on, they stay the same brightness). CAUTION: the LEDs are also seemingly as bright as the sun and staring at them is likely to leave you with a disturbing 8&#215;8 grid of dots burnt into your retina.</p>
<p>So I bought the Rainbowduino plus an 8&#215;8 RGB LED Matrix. The Rainbowduino is built to have the matrix directly plugged into the top of it, which is very handy.</p>
<div id="attachment_1140" class="wp-caption aligncenter" style="width: 302px"><a href="http://www.anyware.co.uk/2005/wp-content/uploads/2012/01/rainbowduino-off.jpg?9d7bd4"><img class="size-medium wp-image-1140 " title="Rainbowduino board plus LED matrix mounted on top" src="http://www.anyware.co.uk/2005/wp-content/uploads/2012/01/rainbowduino-off-e1326794159242-292x300.jpg?9d7bd4" alt="" width="292" height="300" /></a><p class="wp-caption-text">Rainbowduino board plus LED matrix mounted on top</p></div>
<p>There are some tricks to getting this working however:</p>
<ol>
<li>Unlike the Arduino UNO, my Mac would not recognise the Rainbowduino when plugged in to USB. I had to install the <a href="http://www.ftdichip.com/Drivers/VCP.htm">&#8220;FTDI&#8221; drivers from here</a>. Thanks to @andydavies for the tip there</li>
<li>The docs on Rainbowduino are sketchy, and seem to be mainly targeted at an LED 3D cube rather than the matrix, and using the Processing language (which is not what the Arduino IDE uses).</li>
<li>It turns our there are several options for controlling this matrix. You can flash your own Arduino &#8220;sketches&#8221; (programs) directly onto the Rainbowduino, or you can use the I2C serial protocol to drive the Rainbowduino from another Arduino &#8211; I am guessing this means the Rainbowduino ATMega has a custom boot loader that supports serial comms to drive the display. I may be wrong.</li>
</ol>
<p>To solve (2) I had to find the driver code that would work with the Arduino IDE. The <a href="http://www.seeedstudio.com/wiki/Rainbowduino_v3.0#Resources">v3 Rainbowduino driver is here</a>. If you save that to ~/Documents/Arduino/Libraries/Rainbowv3 or similar (for Mac OS X at least that is where it is) and restart Arduino IDE, you will see you can now insert it into your Arduino sketch using the &#8220;Import Library&#8230;&#8221; menu option.</p>
<p>You will then find it does not compile, complaining it cannot find &#8220;WProgram.h&#8221;. This is I think because the library is built to run with &#8220;Wiring&#8221; programming language. To fix this you need to edit the Rainbowduino.h file from the driver that you saved, and change the #include &lt;WProgram.h&gt; to &lt;Arduino.h&gt;.</p>
<p>After that you can use the driver, which is incredibly simple:</p>
<ol>
<li>in setup() call Rb.init()</li>
<li>in loop() call some Rb methods such as: Rb.blankDisplay() and Rb.setPixelXY(x, y, rgbcolour)</li>
</ol>
<div id="attachment_1141" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.anyware.co.uk/2005/wp-content/uploads/2012/01/rainbowduino-spectrum.jpg?9d7bd4"><img class="size-medium wp-image-1141 " title="Rainbowduino with diagonal spectrum" src="http://www.anyware.co.uk/2005/wp-content/uploads/2012/01/rainbowduino-spectrum-e1326794503914-300x277.jpg?9d7bd4" alt="" width="300" height="277" /></a><p class="wp-caption-text">Rainbowduino with diagonal spectrum</p></div>
<p>Why so dark? LEDs are too bright to photograph without a filter. I put lots of tissue paper over them.</p>
<p>So here&#8217;s an example to apply the colour spectrum diagonally to the entire grid in action:</p>
<script src="https://gist.github.com/1626042.js"></script><noscript><p>View the code on <a href="https://gist.github.com/1626042">Gist</a>.</p></noscript>
<p>Note that if you find your reds are not working you probably have a C typing problem, and need to explicitly cast your values to uint32_t to avoid the RR of your RRGGBB being lost to 16bit accuracy.</p>
<p>And seeing as most of my life is spent in <a href="http://grails.org">Grails</a>&#8230; this wouldn&#8217;t be complete without a video of the Grails cup shining in all its 8&#215;8 glory.</p>
<div style='text-align:center;'>
<object type="application/x-shockwave-flash" width="400" height="300" data="http://www.vimeo.com/moogaloop.swf?clip_id=35189087&amp;server=www.vimeo.com&amp;fullscreen=1&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=01AAEA">
	<param name="quality" value="best" />
	<param name="allowfullscreen" value="true" />
	<param name="scale" value="showAll" />
	<param name="movie" value="http://www.vimeo.com/moogaloop.swf?clip_id=35189087&amp;server=www.vimeo.com&amp;fullscreen=1&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=01AAEA" />
	<param name="wmode" value="opaque" />
</object>
</div>
<p>And here&#8217;s the code, if you want some Grails glory yourself:</p>
<script src="https://gist.github.com/1626085.js"></script><noscript><p>View the code on <a href="https://gist.github.com/1626085">Gist</a>.</p></noscript>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.anyware.co.uk/2005/2012/01/17/getting-started-with-arduino-rainbowduino/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>The new 4OD web player is shit</title>
		<link>http://www.anyware.co.uk/2005/2011/11/23/the-new-4od-web-player-is-shit/</link>
		<comments>http://www.anyware.co.uk/2005/2011/11/23/the-new-4od-web-player-is-shit/#comments</comments>
		<pubDate>Wed, 23 Nov 2011 22:34:19 +0000</pubDate>
		<dc:creator>Marc Palmer</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[usability]]></category>

		<guid isPermaLink="false">http://www.anyware.co.uk/2005/2011/11/23/the-new-4od-web-player-is-shit/</guid>
		<description><![CDATA[Tonight my wife and I wanted to catch up with Misfits on 4OD. The result can only be described as being shafted by bad business choices, bad design and bad code. We started off trying to watch it on the tv via AirPlay to the apple tv, from the iPad. That one sentence tells you [...]]]></description>
			<content:encoded><![CDATA[<p>Tonight my wife and I wanted to catch up with Misfits on 4OD. The result can only be described as being shafted by bad business choices, bad design and bad code. </p>
<p><span id="more-1125"></span></p>
<p>We started off trying to watch it on the tv via AirPlay to the apple tv, from the iPad. That one sentence tells you that apple are certain to raid the tv market. Remove two components from that list. </p>
<p>Anyway it was fail. Every three minutes or so the 4OD app stopped streaming to apple tv. BBC iPlayer in Safari streams fine so it&#8217;s either the 4od app not liking AirPlay or a new iOS 5 bug as we did this fine before 5.0.1</p>
<p>We resorted to watching on the MacBook pro as we had done in the past fine.</p>
<p>Harbinger of what was to follow &#8211; channel 4 site demanded I upgrade Flash first. Fine</p>
<p>We start watching. Subjected to 3 mandatory viewing ads at the start all is well for a while.</p>
<p>Another ad break, another 3 ads. Some repeated from before. Watch some more. </p>
<p>Oh noes! Pop up message saying there&#8217;s an error and the content can&#8217;t be played. Video stops. Hmm. Press play again. Starts from beginning.</p>
<p>Watch first three ads I enjoyed so much again. Unmissable, really.</p>
<p>Fast forward to next mandatory ad section to try to get to where we were. </p>
<p>Watch 3 more ads a second time. Its awesome.</p>
<p>Watch some more misfits at last. </p>
<p>Oh noes! Error message again. Video carries on though. Message goes away by itself after many seconds. Hooray! Watch some more. </p>
<p>Error message again! Video stops. Press play again. Yay! Carries on from 2 ad breaks back, but not from the start. We&#8217;re blessed! Skip to ad break before last error point. Bonus! Only see 1 repeat ad!</p>
<p>Oh noes! The missing 2 ads are undead and <strong>playing in the background somehow &#8211; audio is mixed with programme audio</strong>. Press space to try to pause to work out what is going on. Pressing space doesn&#8217;t pause. It opens a new browser window with an advert for Assassins Creed &#8211; one of the ads we were not currently viewing. Soon discover clicking anywhere on the player window launches last ad&#8217;s website. Just what I wanted. Especially 5 minutes after avidly watching an ad. </p>
<p>I have no other browser tabs or windows open with the video streams of the ads. Player has simply gone mad. We wait for ads we cannot see but can hear to finish. </p>
<p>Unpause the player, full screen it again, watch more misfits. </p>
<p>Oh noes! Another error message. Video carries on, message obscuring screen for minutes. </p>
<p>Bonus! Audio from ads we cannot see becomes mixed in again! Now I have mastered this streaming tv technology I know to pause the video, mute the audio, wait a few minutes, unmute, resume video. Perfect!</p>
<p>We carry on watching, we&#8217;re 38 minutes into a 45 minute programme &#8211; but its taken over an hour to get this far. The magic of tv is somewhat eroded. Only in part due to more ads than content. </p>
<p>Oh noes! A few minutes before the end another error message, video stops. Press play&#8230; back at the beginning! YES! I had forgotten those original ads at the start that were repeated throughout, and wanted to catch up on those again. Thank you Channel 4.</p>
<p>The final insult, though perhaps merciful: the laptop battery runs out and it all shuts down. </p>
<p>I pick up the iPad, open 4od app, press play on Misfits. Have to watch one short ad, then can instantly jump to the last few minutes and watch it flawlessly while holding the iPad aloft.</p>
<p>This experience speaks volumes about the state of current computing, tv, media, advertising and software development.</p>
<p>If it weren&#8217;t for the iOS AirPlay bug none of this would have happened. </p>
<p>Fear the Apple TV chaps. </p>
<p>Oh, and there must be a separate team doing 4OD for iPad, cos the experience is infinitely better than the web one. Far fewer ads. Rapid seeking. No upgrades. No Flash. Great content. Anywhere. </p>
<p>That&#8217;s all you need &#8211; happy consumers.</p>
<p>And believe it or not that&#8217;s what advertisers need. </p>
<p>I&#8217;ve been good so far. Here the NSFW summary: OH FOR FUCK&#8217;S SAKE WHAT ON EARTH DO THOSE WANKERS THINK THEY ARE DOING?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.anyware.co.uk/2005/2011/11/23/the-new-4od-web-player-is-shit/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The joy and singular terror of mushrooms</title>
		<link>http://www.anyware.co.uk/2005/2011/11/14/the-joy-and-singular-terror-of-mushrooms/</link>
		<comments>http://www.anyware.co.uk/2005/2011/11/14/the-joy-and-singular-terror-of-mushrooms/#comments</comments>
		<pubDate>Mon, 14 Nov 2011 15:28:32 +0000</pubDate>
		<dc:creator>Marc Palmer</dc:creator>
				<category><![CDATA[Family life]]></category>
		<category><![CDATA[Food]]></category>
		<category><![CDATA[World]]></category>

		<guid isPermaLink="false">http://www.anyware.co.uk/2005/?p=1110</guid>
		<description><![CDATA[For the first time in years my family and I had a wonderfully successful fungus foray in The Forest of Dean. The kids are just now old enough to tolerate a couple of hours of walking and searching in the woods. I&#8217;ve been picking mushrooms for about 15 years now, though not that regularly. We [...]]]></description>
			<content:encoded><![CDATA[<p>For the first time in years my family and I had a wonderfully successful fungus foray in The Forest of Dean. The kids are just now old enough to tolerate a couple of hours of walking and searching in the woods.</p>
<p>I&#8217;ve been picking mushrooms for about 15 years now, though not that regularly. We were blessed with finding a good amount of Ceps and a lot of Wood Blewit this time, along with some Blushing Wood Mushroom and some small Horse Mushroom. Just before cooking my wife asked me to confirm the young white Horse mushrooms were what I thought and I said yes of course. I&#8217;m experienced after all. I know how to identify Agaricus species.<br />
<span id="more-1110"></span><br />
I cooked some ceps, blewits, wood mushroom and the horse mushroom with some spaghetti, garlic and thyme for me, my wife and kids. It was well received by all.</p>
<p><a href="http://www.anyware.co.uk/2005/wp-content/uploads/2011/11/589a0ae80e1511e1a87612313804ec91_7.jpg?9d7bd4"><img class="alignnone size-medium wp-image-1113" style="margin-top: 8px; margin-bottom: 8px;" title="589a0ae80e1511e1a87612313804ec91_7" src="http://www.anyware.co.uk/2005/wp-content/uploads/2011/11/589a0ae80e1511e1a87612313804ec91_7-300x300.jpg?9d7bd4" alt="" width="300" height="300" /></a><br />
After the meal I started to wonder. My wife&#8217;s questioning made me suddenly anxious as to whether my Horse Mushroom identification was correct. I thought: they were a bit small actually for horse mushroom, and the &#8220;cog&#8221; pattern on the ring wasn&#8217;t so well defined. They didn&#8217;t stain brightly yellow, I double checked.</p>
<p>I was feeling a bit tense, wondering if I felt truly sick. The abject fear that perhaps I had fed Death Caps or Destroying Angel to my entire family alone started making me feel ill. You simply cannot *feed* your children a mushroom that you cannot identify &#8211; this is a potentially lethal mistake. I went over the id of all the really poisonous white/yellow mushrooms again and my memory of how they looked (another foolish mistake &#8211; not keeping one back from cooking).</p>
<p>I ended up the evening pretty certain that what we had was indeed an Agaricus, the Wood mushroom <a href="http://www.mykoweb.com/CAF/species/Agaricus_silvicola.html">Agaricus Silvicola</a> &#8211; a fine eating mushroom at that. Not &#8211; thankfully due to my in-built &#8220;Agaricus identification skills&#8221; but sadly not through real conscious identification &#8211; a <a href="http://en.wikipedia.org/wiki/Amanita_virosa">Destroying Angel</a>.</p>
<p>I can only say how genuinely mortifying it is to be in this kind of situation &#8211; even if just through a bought of self-doubt &#8211; wondering if in 8-12 hours your entire family will start suffering the dreadful symptoms of often fatal Amanita poisoning that begins with diarrhoea and ends with kidney failure.</p>
<p>Moral of the story: even if you&#8217;re experienced at picking mushrooms don&#8217;t let excitement get the better of you &#8211; remember the perils of identifying the &#8220;small white mushroom&#8221;. In future I&#8217;ll be steering clear of them. I never want to feel that fear again.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.anyware.co.uk/2005/2011/11/14/the-joy-and-singular-terror-of-mushrooms/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Resources 1.1(.1) plugin released</title>
		<link>http://www.anyware.co.uk/2005/2011/10/21/resources-1-1-1-plugin-released/</link>
		<comments>http://www.anyware.co.uk/2005/2011/10/21/resources-1-1-1-plugin-released/#comments</comments>
		<pubDate>Fri, 21 Oct 2011 00:31:07 +0000</pubDate>
		<dc:creator>Marc Palmer</dc:creator>
				<category><![CDATA[Groovy and Grails]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[plugin release]]></category>

		<guid isPermaLink="false">http://www.anyware.co.uk/2005/?p=1094</guid>
		<description><![CDATA[After a frantic 12 hours or so of coding and debugging, I managed to release version 1.1.1 of the Resources plugin for Grails today. It was meant to be 1.1 but there was a bug that needed fixing immediately after releasing so 1.1.1 is where we&#8217;re at. This version is tested with Grails 1.3.7 and [...]]]></description>
			<content:encoded><![CDATA[<p>After a frantic 12 hours or so of coding and debugging, I managed to release version 1.1.1 of the <a href="http://grails.org/plugin/resources">Resources plugin</a> for <a href="http://grails.org">Grails</a> today.</p>
<p>It was meant to be 1.1 but there was a bug that needed fixing immediately after releasing so 1.1.1 is where we&#8217;re at. This version is tested with Grails 1.3.7 and Grails 2.0 RC1 which is set to drop this weekend.</p>
<p>What&#8217;s new in this release of Resources?</p>
<p>Well aside from some useful bug fixes there&#8217;s a few interesting changes:</p>
<ol>
<li>If you forget to include r:layoutResources tags, you will get an error in the console. The error may or may not display in the browser currently depending on whether you used site mesh layouts or not. We may be able to improve this in future. This means that people who wondered where their JS code was disappearing to after installing Resources into a 2.0 app will now get an error telling them that they need to add r:layoutResources.</li>
<li>There is now support for laying out arbitrary dispositions by passing a &#8220;disposition&#8221; to the r:layoutResources tag. This means you can position sets of resources wherever you like in the output, using multiple dispositions. Currently this is only relevant for JavaScript but in future we should be able to support images so that you can e.g. have a bunch of &#8220;preloaded&#8221; images that are hidden in the page somewhere.</li>
<li>The integration with Grails 2.0 has been &#8220;finalized&#8221; now. The ResourceService has changed to a &#8220;grailsResourceProcessor&#8221; bean, and all g:javascript invocations result in called to r:require or r:script as necessary. The default layouts in 2.0 now use layoutResources and a default &#8220;application&#8221; module exists in new projects.</li>
</ol>
<p>There are still some outstanding important bugs that I will endeavour to fix soon, as well as improving the error reporting on all fronts.</p>
<p>Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.anyware.co.uk/2005/2011/10/21/resources-1-1-1-plugin-released/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>The web is doomed. Native will rule. I&#8217;m not alone.</title>
		<link>http://www.anyware.co.uk/2005/2011/09/27/the-web-is-doomed-native-will-rule-im-not-alone/</link>
		<comments>http://www.anyware.co.uk/2005/2011/09/27/the-web-is-doomed-native-will-rule-im-not-alone/#comments</comments>
		<pubDate>Tue, 27 Sep 2011 20:54:35 +0000</pubDate>
		<dc:creator>Marc Palmer</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Ideas]]></category>
		<category><![CDATA[usability]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[native]]></category>
		<category><![CDATA[platforms]]></category>
		<category><![CDATA[standards]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.anyware.co.uk/2005/?p=1083</guid>
		<description><![CDATA[A great piece by Joe Hewitt, who writes far better than I. This is pure killer: The arrogance of Web evangelists is staggering. They take for granted that the Web will always be popular regardless of whether it is technologically competitive with other platforms. They place ideology above relevance. Haven&#8217;t they noticed that the world [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://joehewitt.com/post/web-technologies-need-an-owner/">A great piece by Joe Hewitt</a>, who writes far better than I. This is pure killer:</p>
<blockquote><p>The arrogance of Web evangelists is staggering. They take for granted that the Web will always be popular regardless of whether it is technologically competitive with other platforms. They place ideology above relevance. Haven&#8217;t they noticed that the world of software is ablaze with new ideas and a growing number of those ideas are flat out impossible to build on the Web? I can easily see a world in which Web usage falls to insignificant levels compared to Android, iOS, and Windows, and becomes a footnote in history. That thing we used to use in the early days of the Internet.</p></blockquote>
<p>As those of you who read my previous post on the possibility <a href="http://www.anyware.co.uk/2005/2011/07/27/native-will-beat-web-apps-on-desktop-too/" title="Native will beat web apps on desktop too">native could eclipse web on the desktop</a> will know, I could not agree more. It&#8217;s not something I want, but I believe it may be inevitable. Even if Joe&#8217;s mooted guardians/CEOs of &#8220;the web&#8221; materialised, there&#8217;s no guarantee they would produce something compelling enough for the average user to use in preference to native apps.</p>
<p>Joe&#8217;s piece is bang on, in that the web geeks of the world are in complete denial of this and the dead weight of design-by-committee that will forever drag the core web technologies down.</p>
<p>Also ties into a tweet that I saw today:</p>
<blockquote><p><a href="http://twitter.com/hnshah">@hnshah</a>: &#8220;As far as the customer is concerned, the interface is the product.&#8221; Jef Raskin</p></blockquote>
<p>There are a couple of ways to interpret this, but mine is &#8220;customers don&#8217;t give a shit how you implemented this or what your constraints are&#8221;. </p>
<p>What they see, feel and experience in front of them is what they care about.</p>
<p>Web devs who deny this is the case are just sticking with what they know, and companies sticking to web development are doing this purely for cost reasons that make not one jot of difference to the customer. Seriously, who wants to learn Objective-C, code Android, or Windows or OS X when they can already do HTML + JS? You can see the logic &#8211; it&#8217;s &#8220;cross platform&#8221;. It is however self-interest, and this does not drive the software market. The customer does, and the customer is rarely happy in the long term with lowest-common-denominator UX and functionality.</p>
<p>The web offers no gain for the customer <em>whatsoever</em> vs native. The converse is true for native vs web.</p>
<p>Yes I make a living from making <a href="http://grailsrocks.com">web app stuff</a>. For now at least.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.anyware.co.uk/2005/2011/09/27/the-web-is-doomed-native-will-rule-im-not-alone/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Optimising your Application with Grails Resources Plugin</title>
		<link>http://www.anyware.co.uk/2005/2011/09/12/optimising-your-application-with-grails-resources-plugin/</link>
		<comments>http://www.anyware.co.uk/2005/2011/09/12/optimising-your-application-with-grails-resources-plugin/#comments</comments>
		<pubDate>Mon, 12 Sep 2011 20:16:04 +0000</pubDate>
		<dc:creator>Marc Palmer</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Groovy and Grails]]></category>
		<category><![CDATA[article]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[ui]]></category>

		<guid isPermaLink="false">http://www.anyware.co.uk/2005/?p=906</guid>
		<description><![CDATA[It&#8217;s been nearly a year since we first announced the Resources framework for Grails. It&#8217;s about time we looked at some of the more advanced features that it provides so that you can make the most of this very powerful plugin. The start of this article will go over some of the basics again, as [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been nearly a year since we first announced the <a href="http://grails.org/plugin/resources">Resources framework</a> for <a href="http://grails.org">Grails</a>. It&#8217;s about time we looked at some of the more advanced features that it provides so that you can make the most of this very powerful plugin.</p>
<p><span id="more-906"></span>The start of this article will go over some of the basics again, as they are a prerequisite for understanding the more advance topics covered later in the piece.</p>
<h2>Recap: What is Resources framework for?</h2>
<p style="text-align: center;"><a class="lightbox" href="http://www.anyware.co.uk/2005/wp-content/uploads/2011/09/Resources-article-diagram.png?9d7bd4"><img class="size-full wp-image-968 aligncenter" title="Resources article diagram" src="http://www.anyware.co.uk/2005/wp-content/uploads/2011/09/Resources-article-diagram.png?9d7bd4" alt="" width="464" height="216" /></a></p>
<p>It solves the growing problems around application and plugin static resources. Your CSS, JS and other files have dependencies on each other, and must load in the correct order. You also want to optimize these so that your application loads quickly and caches well for your users.</p>
<p>It provides a way to declare your resources, their dependencies, and a processing chain to modify the resources and response headers to perform all manner of tasks such as bundling multiple resource files into one file, zipping the response, applying long-term client-side caching, or compiling Less or Sass files to regular CSS on the fly.</p>
<h2>Where do I start?</h2>
<p>First you install the &#8220;<a href="http://grails.org/plugin/resources">resources</a>&#8221; plugin. To actually see some magic happening you probably want to also install the <a href="http://grails.org/plugin/cached-resources">cached-resources</a> and/or <a href="http://grails.org/plugin/zipped-resources">zipped-resources</a> plugins also, but this is not a requirement.</p>
<p>Then you declare some resources in your app, or pull some in from a plugin that supports Resources. Let&#8217;s start by declaring a resource that exists in your application, say main.css. To do this you create a file in <strong>grails-app/conf/</strong> with a name that ends in &#8220;<strong>Resources.groovy</strong>&#8220;. So we might create <strong>AppResources.groovy</strong> and use the DSL to declare the resource:</p>
<script src="https://gist.github.com/1211514.js"></script><noscript><p>View the code on <a href="https://gist.github.com/1211514">Gist</a>.</p></noscript>
<p>This is a module declaration. For full details see the <a href="http://grails-plugins.github.com/grails-resources">Resources documentation</a>, but in essence this declares a resource module called &#8220;common&#8221; and it has one CSS resource in it, the file supplied by your application in <strong>web-app/css/main.css</strong>, and on JS file.</p>
<p>So far, so good. Now you need to pull this resource into a page. To do this requires using some Resources tags.</p>
<h2>Using resources in your pages</h2>
<p>There are two main tags involved in using resources, with some others that provide extra features. The main two are <strong>r:require</strong> and <strong>r:layoutResources</strong>.</p>
<p>The <strong>r:require</strong> tag tells the framework which resource modules the current GSP requires. The framework will make sure that all the resources declared in those modules are pulled in in the correct order.</p>
<p>To achieve this, you need to include <strong>r:layoutResources</strong> tags in your &lt;head&gt; and &lt;body&gt; sections. Typically you do this in your SiteMesh layout. You use two calls because one will render the resources that you need to link to in the &lt;head&gt; section of your page (all your CSS, and some of your JavaScript, maybe some favico or iPhone icons). The other goes at the end of the &lt;body&gt; of your page, to render any &#8220;deferred&#8221; resources, which is usually just your JavaScript code.</p>
<p>So here&#8217;s an example of a Grails Sitemesh layout using these tags:</p>
<script src="https://gist.github.com/1211550.js"></script><noscript><p>View the code on <a href="https://gist.github.com/1211550">Gist</a>.</p></noscript>
<p>Here you see that you still use the normal Grails sitemesh tags to layout the head and body. These provide the route for you GSP page to actually affect the output, including the output of the Resources plugin&#8217;s <strong>r:layoutResources</strong> tags. That&#8217;s because your GSP will call <strong>r:require</strong> and <strong>r:script</strong> tags something like this:</p>
<script src="https://gist.github.com/1211555.js"></script><noscript><p>View the code on <a href="https://gist.github.com/1211555">Gist</a>.</p></noscript>
<p>This GSP is set to use a Sitemesh layout like the example one given earlier. It uses the <strong>r:require</strong> tag to say that this page needs the &#8220;app&#8221; resource module. Using this information, the <strong>r:layoutResources</strong> tags will render links to all the CSS, JS and other resources of that &#8220;common&#8221; module, in the correct places.</p>
<p>This means that some may end up in head, and some may end up in body. Remember that we invoked <strong>r:layoutResources</strong> twice, once in each location? Well, that&#8217;s why.</p>
<h2>What is this &#8220;disposition&#8221; stuff?</h2>
<p>The disposition of a resource tells the framework which part of the page it belongs &#8211; its a form of arbitrary grouping. The default dispositions supported are &#8220;head&#8221; and &#8220;defer&#8221; but in fact resources can define any disposition they like &#8211; and this can be useful for declaring resources that are not rendered by the normal layoutResources calls (more about this later).</p>
<p>The framework applies a default disposition based on the type of the resource &#8211; so CSS always defaults to &#8220;head&#8221; but JavaScript always defaults to &#8220;defer&#8221;, so that it runs only when the rest of the page has loaded. Images and icons are also supported to represent favicon and iPhone icons, which render in &#8220;head&#8221;.</p>
<p>Resource modules usually contain multiple resources and the main reason to specify a disposition when declaring a resource is to force JavaScript to load in the &lt;head&gt; section of the page. To achieve that you just update your resource declaration to include a &#8220;disposition&#8221; attribute:</p>
<script src="https://gist.github.com/1211561.js"></script><noscript><p>View the code on <a href="https://gist.github.com/1211561">Gist</a>.</p></noscript>
<p>Now your page will load with jQuery in the head section, with no code changes to your layout or GSP!</p>
<h2>Dependencies</h2>
<p>So far, so good but how do we control the order of resources when they are pulled into the page? How can I make sure that my application JS or CSS code always loads after the JS and CSS from a plugin that I&#8217;m using?</p>
<p>This is where Resources dependencies come in. There are two simple rules</p>
<ol>
<li>Resources from a given module are loaded in the order they are defined in the module</li>
<li>Resources from modules are loaded in module dependency order</li>
</ol>
<p>The first rule ensures that when you declare resources you can intuitively see which CSS or JS loads before another.</p>
<p>The second rule uses the &#8220;dependsOn&#8221; method in module declarations to list the names of other resource modules on which the module depends. Those will always be loaded before the module that depends on them. Here&#8217;s an example declaration that alters our specimen module to depend on the jQuery plugin&#8217;s query module instead, and jQuery UI:</p>
<script src="https://gist.github.com/1211581.js"></script><noscript><p>View the code on <a href="https://gist.github.com/1211581">Gist</a>.</p></noscript>
<p>Notice that we have specified both jQuery UI and jQuery in the dependsOn. We don&#8217;t need to. However notice that they are also declared in the &#8220;wrong&#8221; order. This is to illustrate that the order you use here is not important &#8211; the &#8216;jquery-ui&#8217; module declared by the Grails jQueryUI plugin depends on on &#8216;jquery&#8217; (provided by the Grails jQuery plugin) as well &#8211; so it will always make sure that is loaded first.</p>
<p>As your application does not define those two modules, you would need to install the Grails jQuery-UI plugin &#8211; or define them yourself. Including the jQuery-UI plugin automatically pulls in the jQuery plugin for you, because of Grails&#8217; transitive plugin dependencies. TheResources framework was designed to work hand in hand with the other Grails dependency mechanisms.</p>
<p>So now you have done this, you still have no changes to make to your GSP! It still just requires the &#8220;common&#8221; module. Notice how this has decoupled your GSPs and layouts from the details of the resources that they need. This is an important feature that gives you great scope to modularise your resources, and even have page-specific modules if you like that contain nothing other than dependencies themselves:</p>
<script src="https://gist.github.com/1211564.js"></script><noscript><p>View the code on <a href="https://gist.github.com/1211564">Gist</a>.</p></noscript>
<p>With this, an edit.gsp could just <strong>r:require</strong> the &#8220;editPage&#8221; module and never care about the explicit details of what is required.</p>
<h2>Dealing with your ugly inline Javascript</h2>
<p>You already know that inline Javascript is pretty horrendous, but some things are just plain shameful and yet we can&#8217;t help ourselves. Frequently you want to write a Grails taglib that simplifies using a JS library and to do that it must render some code inline when the tag is invoked.</p>
<p>With Resources you can trivially throw this JS code around to wherever you like. You can have the code render in &lt;head&gt; or at the end of the body, and it will automatically do so after loading the resources that the page depends on. To do this you just use the &lt;<strong>r:script</strong>&gt; tag instead of a normal &lt;script&gt; or &lt;g:javascript&gt; tag:</p>
<script src="https://gist.github.com/1211607.js"></script><noscript><p>View the code on <a href="https://gist.github.com/1211607">Gist</a>.</p></noscript>
<p>In this example the script code specified in &lt;head&gt; <em>does not run immediately</em>. The <strong>r:script</strong> tag also uses &#8220;disposition&#8221; and the default is &#8220;defer&#8221; so you will find that the alert only pops up once the rest of the page has loaded, and the HTML source will show the &lt;script&gt; tag at the end of the body, after all other deferred JS code has been pulled in.</p>
<p>All such fragments in the same disposition are concatenated together, so you don&#8217;t get a long list of &lt;script&gt; tags.</p>
<p>To force a fragment of inline JS to execute in &lt;head&gt;, just add <strong>disposition=&#8221;head&#8221;</strong> to the <strong>r:script</strong> tag invocation.</p>
<p>To write your own taglibs that generate code in this way, you just output the result of calling the <strong>r.script(attrs, Closure)</strong> tag from your tag.</p>
<h2>Linking to images</h2>
<p>Images often need to be optimised or set for long-term caching. However you don&#8217;t normally need to declare them in modules. To render images correctly you should use the <strong>&lt;r:img&gt;</strong> tag anywhere in your pages as you would and HTML &lt;img&gt; tag. All you do differently is supply a uri or dir/file attribute to tell it where to load from. Other attributes are passed through:</p>
<script src="https://gist.github.com/1211623.js"></script><noscript><p>View the code on <a href="https://gist.github.com/1211623">Gist</a>.</p></noscript>
<p>That&#8217;s all there is to it.</p>
<p>There are however some extra tricks you can pull. Any tag attributes specified in a module resource declaration are honoured when rendering the link. As such this means that you can specify your width &amp; height values if you declare your image &#8211; and never have to specify them when rendering links:</p>
<script src="https://gist.github.com/1211626.js"></script><noscript><p>View the code on <a href="https://gist.github.com/1211626">Gist</a>.</p></noscript>
<p>Now any <strong>r:img</strong> links to that logo will automatically include those attributes in the output. Notice that we had to include the disposition &#8220;image&#8221; which is not a predefined disposition &#8211; it is just anything other than &#8220;head&#8221; or &#8220;defer&#8221; to prevent the image being rendered by the <strong>r:layoutResources</strong> tags.</p>
<h2>Bundling: combining files to reduce the number of requests</h2>
<p>Page load time is a combination of many factors. Those that you can control from your application itself include how many requests are needed to load your page and whether you load resource before or after your HTML content.</p>
<p>To reduce the number of requests made, you need to combine one or more resources into a single file. This is called bundling and what you do is tell Resource which files can be bundled together. This is usually dependent on how your application uses the code, and inevitably requires some compromise.</p>
<p>For example you <em>could</em> bundle all your resources into one file across your entire app &#8211; resulting in just one CSS and one JS file for the entire site. With aggressive browser caching this could yield good results, but if you have a few hundred KB of code in these files it could mean it takes a long time for people to see your site the first time they visit or empty their cache.</p>
<p>To specify the bundle that a file belongs to, just add the &#8220;bundle&#8221; attribute to resource declarations. The Resources framework will not bundle together resources that are incompatible: different content types, or those with differing &#8220;attrs&#8221;. For example CSS with <strong>media=&#8217;print&#8217;</strong> will not be bundled with screen media.</p>
<p>It does however allow you to bundle resources <em>across module boundaries</em>. This is important as you will see shortly. It also automatically bundles using the module name by default, and maintains separate bundled files for head and defer dispositions automatically.</p>
<p>That is a lot to take in, but it basically means you don&#8217;t need to worry about anything.</p>
<p>Just set the bundle attribute:</p>
<script src="https://gist.github.com/1211629.js"></script><noscript><p>View the code on <a href="https://gist.github.com/1211629">Gist</a>.</p></noscript>
<p>Here the <strong>main.css</strong>, which previously might have auto-bundled into bundle &#8220;common&#8221; if there was more than one resource in the module, will now be bundled into bundle &#8220;core&#8221;.</p>
<p>The difference has no effect for now, but what you can do is override the module declarations that came from the jQuery plugins and make them go into the same bundle. To do this we use the &#8220;overrides&#8221; mechanism to change the properties of the resource modules supplied by the plugins. We can call the <strong>defaultBundle</strong> method to change the default used by them:</p>
<script src="https://gist.github.com/1211633.js"></script><noscript><p>View the code on <a href="https://gist.github.com/1211633">Gist</a>.</p></noscript>
<p>Now all the modules will throw their resources together, and you will find your page (again with zero GSP changes) is now pulling in just three files: bundle_core_head.js, bundle_core_head.css and bundle_core_defer.js</p>
<p><span class="Apple-style-span" style="font-size: 20px; font-weight: bold;">Changing how links to resources are rendered</span></p>
<p>Under the hood, the <strong>r:layoutResources</strong> tag uses the <strong>r:external</strong> tag to render links. The <strong>r:external</strong> tag is a smart tag that writes out the &#8220;right kind&#8221; of link for a resource. So for JS files it renders &lt;script src=&#8230;&gt; tags, for CSS it renders &lt;link href=&#8230;&gt;, and so on for favicons and a few other types.</p>
<p>The key thing is that you can pass any other attributes to <strong>r:external</strong> and they will pass through to the output. It so happens that <strong>r:layoutResources</strong> pass the &#8220;attrs&#8221; Map defined in your resource declaration when calling <strong>r:external</strong> for that resource. This means you can pass any extra attributes you like to the declaration and they make it to the output.</p>
<p>A typical usage for this is to specify media:&#8217;print&#8217; on a CSS resource, because the default for this is &#8220;screen, projection&#8221;:</p>
<script src="https://gist.github.com/1211639.js"></script><noscript><p>View the code on <a href="https://gist.github.com/1211639">Gist</a>.</p></noscript>
<p>Note that if you specify these extra properties, those files will not be bundled with others, as by definition this isn&#8217;t going to work out well for you.</p>
<h2>Wrapping the link in some other code. AKA MS IE workarounds</h2>
<p>The resource declaration can also supply some wrapper markup that is used to render the link, with the generated link being passed in as a string. You normally use this to wrap a resource such that it is commented out for all browsers except MS IE:</p>
<script src="https://gist.github.com/1211648.js"></script><noscript><p>View the code on <a href="https://gist.github.com/1211648">Gist</a>.</p></noscript>
<p>The wrapper Closure is passed the link text as an argument. You are then free to pre/post-fix it with anything you like.</p>
<h2>Linking to specific resources without using the dependency mechanisms</h2>
<p>On occasion you may need to link directly to a resource that is handled by the framework, without using <strong>r:layoutResources</strong> or <strong>r:require</strong>.</p>
<p>To do this you can use <strong>r:resource</strong> to get the URL of a resource, or <strong>r:external</strong> to create a link to it. You can use these to generate absolute links to those resources, for example in an HTML email.</p>
<p>These tags accept the regular uri, url or plugin/file/dir attributes. The <strong>r:external</strong> tag also supports a &#8220;type&#8221; attribute to give it a clue what kind of link to render if it is not obvious from the file extension.</p>
<h2>Overriding resources from plugins</h2>
<p>Plugins that expose modules normally do the right thing, but sometimes you might need to supply different content for a given file, or change some of the tag attributes or the bundle used. To do this you use the overrides mechanism shown earlier in the <strong>defaultBundle</strong> example.</p>
<p>The &#8220;overrides&#8221; closure lets you specify new values for some of the module defaults for a given module, but also lets you tweak individual resources if they can be addressed uniquely. Developers must add an &#8220;id&#8221; attribute to the resource when it is declared for this to work:</p>
<script src="https://gist.github.com/1211650.js"></script><noscript><p>View the code on <a href="https://gist.github.com/1211650">Gist</a>.</p></noscript>
<p>This changes the bundle on just the resources with id &#8220;js&#8221; in the original jquery module. There might be one or more resources with that id in the module. Resources in other modules are unaffected.</p>
<p>For full details of what you can override, please see the <a href="http://grails-plugins.github.com/grails-resources">Resources plugin documentation</a>.</p>
<h2>Using r:require in GSP fragments</h2>
<p>Using g:render to render GSP templates to build up your pages is a powerful technique. What you may not have realised is that you can completely modularise these templates now because the enclosing GSP no longer needs to know what libraries they need.</p>
<p>Yes, you can call <strong>r:require</strong> at any time in GSP rendering &#8211; including inside nested GSP templates &#8211; and the dependencies of your code will be stored along with your request and the resources all tallied up when the <strong>r:layoutResources</strong> called in your Sitemesh layout execute.</p>
<p>The only pre-requisite is that your <strong>r:require</strong> must be invoked before the corresponding <strong>r:layoutResources</strong> that you&#8217;d like to use to render it.</p>
<p>Picture how easy it is now to create portlet-like user interfaces where only the resources needed by UI elements displayed to the user will be loaded, and when they are they will be optimised. The portlets they have not installed or disabled will not load their resources if you do not render their GSP template.</p>
<h2>Dynamic requirements</h2>
<p>It is important to realise that the <strong>r:require</strong> tag can support normal GSP EL values in the modules list attribute. This brings great power because you can change the code pulled in by a page at runtime. For example you can make yourself a trivial per-user theme-switching system by storing the name of the theme they want to use in the session, and using a tag like this:</p>
<script src="https://gist.github.com/1211652.js"></script><noscript><p>View the code on <a href="https://gist.github.com/1211652">Gist</a>.</p></noscript>
<p>This will locate the theme module and all its dependencies with no further coding.</p>
<p>You could even switch the entire JS library and supporting code used by your plugin&#8217;s UI so that, for example, the user could choose between jQuery UI or YUI, or their own implementation.</p>
<h2>Including common resources in your layout</h2>
<p>Most likely you have some resources that are used in all pages using your Sitemesh layout. This is no problem because you can call <strong>r:require</strong> inside your Sitemesh layout, with the same proviso as &#8220;Using <strong>r:require</strong> in GSP fragments&#8221; &#8211; they must be invoked before the <strong>r:layoutResources</strong> call that would render them.</p>
<p>This means that in practice your individual GSP pages are likely to have only one or two module requirements as the rest is handled by the Sitemesh layout.</p>
<h2>Patterns for plugin authors</h2>
<p>Here are a few emerging patterns for plugin developers to heed when supporting the resources plugin.</p>
<ul>
<li>Specify id attributes on your resources when declaring them, to maximise the user&#8217;s opportunity to override specific details</li>
<li>Avoid monolithic modules, opting were possible to separate out functional areas such as the jQuery UI theme being separate from the jQuery UI code. This gives developers more flexibility. Obviously you must maintain correct dependencies between these</li>
<li>Put &#8220;development&#8221; un-minified versions of resources in &#8220;&lt;yourmodulename&gt;-dev&#8221; modules, so the user can pull in un-minified versions on demand, per-environment if they wish</li>
<li>Do not specify the bundling of your modules &#8211; at most use defaultBundle. No per-resource bundle attributes. Let the developer control this easily by overriding your defaultBundle settings in each module.</li>
<li>Use module names prefixed with the name of your plugin followed by a hyphen i.e. &#8220;jquery-main&#8221;, &#8220;myplugin-theme&#8221;, &#8220;acmeplugin-ui-styling&#8221;</li>
</ul>
<h2>Summing up</h2>
<p>All the things we&#8217;ve tackled here are core <a href="http://grails.org/plugin/resources">Resources</a> framework features &#8211; no extra plugins are required. The resource mapper that performs bundling is even built into the framework.</p>
<p>The real fun starts when you install some of the other mapper plugins &#8211; they may be renamed, re-encoded or even compiled from one form into another. It all happens at startup for declared resources, and at runtime for ad-hoc resources. Once it&#8217;s been done it is stored on disk on the server in that state and no more processing is done.</p>
<p>I hope you have fun with the Resources framework!</p>
<p>There are some nice refinements and maybe some new features coming in point releases at the time of writing.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.anyware.co.uk/2005/2011/09/12/optimising-your-application-with-grails-resources-plugin/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Design compromise, usability, iBooks and Apple</title>
		<link>http://www.anyware.co.uk/2005/2011/09/09/design-compromise-usability-ibooks-and-apple/</link>
		<comments>http://www.anyware.co.uk/2005/2011/09/09/design-compromise-usability-ibooks-and-apple/#comments</comments>
		<pubDate>Fri, 09 Sep 2011 10:23:25 +0000</pubDate>
		<dc:creator>Marc Palmer</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[usability]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[Ux]]></category>

		<guid isPermaLink="false">http://www.anyware.co.uk/2005/?p=908</guid>
		<description><![CDATA[I hear many people complain about the &#8220;cheesy&#8221; book binding and page metaphor in iOS iBooks and other similar UI choices Apple have made in iOS and OS X Lion. I think iBooks is a special case&#8230; here&#8217;s why. Such an interface is called skeumorphic. No I didn&#8217;t know that term until recently either. I [...]]]></description>
			<content:encoded><![CDATA[<p>I hear many people complain about the &#8220;cheesy&#8221; book binding and page metaphor in iOS iBooks and other similar UI choices Apple have made in iOS and OS X Lion. I think iBooks is a special case&#8230; here&#8217;s why.</p>
<p><span id="more-908"></span>Such an interface is called <a href="http://en.wikipedia.org/wiki/Skeuomorph" target="_blank">skeumorphic</a>. No I didn&#8217;t know that term until recently either.</p>
<p>I will say for a start that I love the iBooks page curl as you turn pages &#8211; because it is so impressively done. The page curl in e.g. Kindle for iPad doesn&#8217;t come close. It isn&#8217;t as interactive (limited axes of movement) and is much slower. This destroys the illusion.</p>
<p>Apple&#8217;s implementation is a prime example of &#8220;surprise and delight&#8221;. For those that care, at least. It must have been hard work getting such a high frame rate off that dynamic page curl code. These people know what they are doing.</p>
<p>However, the wider issue here is that the &#8220;wow&#8221; element of the implementation may well just be Apple engineers making the best of what has been asked of them.</p>
<p>What I mean here, is that the book metaphor was likely not chosen so they could show off a page curl. It is there for one reason only. <strong>Books have pages</strong>.</p>
<p>The entire concept of ebooks needs selling to the rest of the world, not to geeks. Geeks like pressing buttons to advance things. They think &#8220;realistic&#8221; interfaces are lame. It may well be that many people at Apple think so.</p>
<p>However what is Apple&#8217;s goal? It&#8217;s to sell e-reading to the masses, not the geeks. <a href="http://techcrunch.com/2011/09/02/post-pc-has-nothing-to-do-with-windows/" target="_blank">MG Siegler has had the similar realisation in terms of the entire iPad offering</a> (hmm, wasn&#8217;t it obvious from the start when iPad was announced?).</p>
<p>With this in mind you need a drop-dead intuitive user interface. You are also re-framing something that already exists in the real world. Therefore the <em>sensible</em> thing is to supply the same visual cues to the user (recommended reading: <a href="https://www.amazon.co.uk/s?ie=UTF8&amp;x=0&amp;ref_=nb_sb_ss_c_1_23&amp;y=0&amp;field-keywords=the%20design%20of%20everyday%20things&amp;url=search-alias%3Dstripbooks&amp;sprefix=the%20design%20of%20everyday%20#?_encoding=UTF8&amp;tag=marpalsblo-21&amp;linkCode=ur2&amp;camp=1634&amp;creative=19450">The Design of Everyday Things</a>).</p>
<p>If you present a novice user with a straight rendering of an ebook page with no chrome, unless they have used something like this in the past they cannot know for sure how to turn a page. There are too many options:</p>
<ul>
<li>Swipe left or right</li>
<li>Swipe up or down</li>
<li>Tap left or right</li>
<li>Tap and wait to see what pops up</li>
<li>Try to find a button to press</li>
<li>Shake the device until something happens [AKA curse the geeks who designed this crap]</li>
</ul>
<p>This is why there is a single visual cue in iBooks &#8211; a simple bitmap added which instantly gives the user an idea of what they can do and how they can expect it to work. The page edges:</p>
<p style="text-align: center;"><a class="lightbox" href="http://www.anyware.co.uk/2005/wp-content/uploads/2011/09/ibooks-ui-cue.png?9d7bd4"><img class="size-full wp-image-924 aligncenter lightbox" title="Screenshot of iBooks UI highlighting page edges" src="http://www.anyware.co.uk/2005/wp-content/uploads/2011/09/ibooks-ui-cue.png?9d7bd4" alt="Screenshot of iBooks UI highlighting page edges" width="330" height="420" /></a></p>
<p>Now, think about the implications of this. Once you add this simple image to the edge of your display the user is intuitively shown that page traversal will be horizontal.</p>
<p>The user then has an expectation that they can turn the page with their finger, after all that is what other objects (real books) they have with these page edges showing do.</p>
<p>This means you <strong>have to</strong> implement a dynamic page curl, whether you think it is cheesy or not. It needs to be a shit-hot one or it feels worse than a real book, not equal or better. Remember the sell here is &#8220;ebooks are better than real books, they are the future&#8221;. The benefits of ebooks are not that they do not have pages &#8211; they do &#8211; it is that they are portable, searchable etc. Real books have great navigation <em>built in</em>.</p>
<p>This page turning is a necessary introduction for novice users that becomes a major feature and development effort, because it is commercially very important. You need great visuals for everyday (non-geeks) to be impressed by what is essentially a document viewer.</p>
<p>For advanced users, and those new users who start to become more adept, it supports tapping on the left and right sides anyway which users will discover over time. There is no <em>need</em> to go through the effort of swiping &#8211; unless you like playing with the effect, which I certainly do because it is a joy to behold.</p>
<p>Unlike the Kindle app&#8217;s one which is laggy and feels like you have pages made out of heavy cardboard.</p>
<p>So what I&#8217;m saying here is &#8211; though I will not pretend to be able to read the minds of Apple &#8211; I am pretty sure that this was part of the thought process, it makes perfect sense.</p>
<p>People think Apple are all about design. Apple are all about the <em>user experience</em>. That means that what you see is not always an expression of the best design taste, or even what they themselves would think is the nicest presentation.</p>
<p>Its about the best presentation for everyday non-geeks, who are the people slapping down dollars hand over fist to buy the iPad &#8211; not the Android geeks who are still waiting for a non-iPad tablet that&#8217;s actually useful.</p>
<p>Usable design is not about elegant zen-like perfection &#8211; it&#8217;s about making things that people are comfortable with and can use without learning much, if anything.</p>
<p>The page effect on Address Book in OS X Lion however, is a different matter. It serves no purpose except to stop the app looking quite so dull as it did before. Unless there are touch-capable OS X machines out there we don&#8217;t know about&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.anyware.co.uk/2005/2011/09/09/design-compromise-usability-ibooks-and-apple/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Native will beat web apps on desktop too</title>
		<link>http://www.anyware.co.uk/2005/2011/07/27/native-will-beat-web-apps-on-desktop-too/</link>
		<comments>http://www.anyware.co.uk/2005/2011/07/27/native-will-beat-web-apps-on-desktop-too/#comments</comments>
		<pubDate>Wed, 27 Jul 2011 10:53:20 +0000</pubDate>
		<dc:creator>Marc Palmer</dc:creator>
				<category><![CDATA[Ideas]]></category>
		<category><![CDATA[Programming links]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.anyware.co.uk/2005/?p=832</guid>
		<description><![CDATA[As mooted in all the native vs. web mobile app discussions, the classic issue of access to all the raw platform features comes to the fore. This is even more important on desktop if you are making actual apps rather than services.]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s OK, I have two sets of flameproof clothing on.</p>
<p>Further to my contribution to the <a href="http://www.anyware.co.uk/2005/2011/06/13/the-web-does-not-a-mobile-app-make/">everlasting mobile web apps vs native debate</a> I was discussing these issues again with good friend <a href="http://twitter.com/spugamola">Richard</a> (who is truly called a platform ninja), and again cropped up the &#8220;why is a tablet different from a desktop then? why is native better for tablets and not desktop?&#8221; question.</p>
<p><span id="more-832"></span>Here&#8217;s my take on this, and I&#8217;m going to keep it short:</p>
<ol>
<li>The web is a shit platform for making applications. All this effort we developers are putting into it to is well out of scope.</li>
<li>As many others have noted the primary attraction is that it is easy/easier to make cross platform apps with a web browser.</li>
<li>My conjecture is that point (2) is the only reason people have accepted desktop &#8220;apps&#8221; that are web based.  There was no other choice presented to the users, and the developers had no other choice.</li>
</ol>
<p>The failure of Java as a cross platform UI/desktop consumer app environment is to blame for point (3).</p>
<p>It meant app developers had to begrudgingly support a mass market of Windows devs while actually using Linux or Macs themselves because Windows back in the 3.1 -&gt; XP days was so unutterably shit. If you&#8217;re afraid of writing native apps for iOS or Android, you should have tried writing Win32 applications back in the 90s.</p>
<p>So the web came, and these devs <strong>had</strong> to keep their apps supporting Linux because they used Linux themselves or had Linux guys screaming at them &#8211; but largely ignored the MacOS users (hey I should know, I was one of these developers). The only way to do this was with the web.</p>
<p>Desktop apps, even if you could find a cross platform framework that was not total shit (this is impossible, an immutable rule of the cosmos), require lots of support, required per-platform installation scripts and documentation. Oh and nobody really paid for apps after the initial trend of Shareware subsided.</p>
<p>Consumers didn&#8217;t want to pay Joe Bloggs $20 for this or that.</p>
<p>So freemium was born, where we all have web apps and only a select few make real money. We don&#8217;t care if they actually <em>need</em> to be web apps, we just choose it as a default because it is what we know, and we are scarred by the memories of 1990s native development.</p>
<p>Well here&#8217;s the reality check. It&#8217;s nearly 20 years later. Expectations of apps are much higher now. Quality and UX is much more important. Making cross platform (including mobile) web apps is now harder than it ever was because there&#8217;s so many more layers of stuff we have to schlep into the apps, and reams of JavaScript to do anything half decent. To still fall far short of any meaningful native integration with the desktop O/S&#8217;s features.</p>
<p>&#8230;and now Apple and others are creating high quality app stores for native desktop software. This means that there is a simple &#8220;arms length&#8221; route to market. Millions and millions of users who can and will pay you $5 for your native app. Which, when you have made it native, is likely to be quite easy to port to at least 1 mobile platform as well.</p>
<p>As mooted in all the native vs. web mobile app discussions, the classic issue of access to all the raw platform features comes to the fore. This is even more important on desktop if you are making actual <strong>apps</strong> rather than <strong>services</strong>.</p>
<p>Ergo, <strong>I see a distinct possibility that the stage is set to that native desktop could actually kill the notion of the web &#8220;app&#8221;</strong>. By apps I am talking things that are distinguished from online services. The web is document retrieval and viewing. That&#8217;s always what it was designed for.</p>
<p>Photoshop, Keynote, Email, bla bla. These can be much better as native apps &#8211; there have  been many impressive attempts at web versions of such e.g. 280Slides, Google Mail etc.</p>
<p>However the cloud is not the place for the hosting these desktop apps. The cloud is just the place where you store the data.</p>
<p>People are used to cheap tangible purchases on mobile. They will expect the same on desktop. Its a massive opportunity for developers again to create really compelling applications. Free of the shackles of the 1990s &#8211; both in the sense that native platforms are much nicer to develop for now, and that the constraint of limiting your ideas to what is capable in a browser that 80% of your market uses can now be lifted.</p>
<p>Go and build great native desktop apps, go and build great web services. Don&#8217;t mix them up.</p>
<p>[Before you dismiss me as a madman, I've written many native Win32 apps in C, C++, Delphi. I've written many web services from right back when Mosaic was the only browser we had. I've also written and ported many J2ME mobile apps. I've also made my living off selling shareware as well as consulting.]</p>
<p>[Also interesting read here: <a href="http://mattgemmell.com/2011/07/22/apps-vs-the-web">http://mattgemmell.com/2011/07/22/apps-vs-the-web</a>]</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.anyware.co.uk/2005/2011/07/27/native-will-beat-web-apps-on-desktop-too/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Results of the Grailsrocks Survey</title>
		<link>http://www.anyware.co.uk/2005/2011/06/17/results-of-the-grailsrocks-survey/</link>
		<comments>http://www.anyware.co.uk/2005/2011/06/17/results-of-the-grailsrocks-survey/#comments</comments>
		<pubDate>Fri, 17 Jun 2011 09:04:43 +0000</pubDate>
		<dc:creator>Marc Palmer</dc:creator>
				<category><![CDATA[Groovy and Grails]]></category>

		<guid isPermaLink="false">http://www.anyware.co.uk/2005/?p=827</guid>
		<description><![CDATA[A few weeks back I ran a little survey to get a rough idea of opinion on paid support for Grails plugins, as well as some potentially useful community stats. The most interesting figures for me are that almost 50% of respondents do think there is a need for commercial plugin support, and that a [...]]]></description>
			<content:encoded><![CDATA[<p>A few weeks back I ran a little survey to get a rough idea of opinion on paid support for <a href="http://grails.org">Grails</a> plugins, as well as some potentially useful community stats.</p>
<p><span id="more-827"></span></p>
<p>The most interesting figures for me are that almost 50% of respondents do think there is a need for commercial plugin support, and that a lot of respondents&#8217; companies already pay for commercial tools and support.</p>
<p><a href="http://www.anyware.co.uk/2005/wp-content/uploads/2011/06/Screen-Shot-2011-09-05-at-15.36.03.png?9d7bd4"><img class="alignnone size-full wp-image-846" title="Grails Rocks Survey #1 Fragment" src="http://www.anyware.co.uk/2005/wp-content/uploads/2011/06/Screen-Shot-2011-09-05-at-15.36.03.png?9d7bd4" alt="" width="514" height="201" /></a></p>
<p><a href="http://www.anyware.co.uk/2005/wp-content/uploads/2011/06/Screen-Shot-2011-09-05-at-15.36.03.png?9d7bd4"></a>Also it was interesting to see the breakdown of usage of <a href="http://grailsrocks.com">my existing plugins</a>, as well as the spread of Grails versions in use. This survey happened just after the release of Grails 1.3.7.</p>
<p><a title="Grailsrocks plugin survey 2011" href="/grailsrocks/grailsrocks-plugin-market-2011-survey-results.html">View the survey results here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.anyware.co.uk/2005/2011/06/17/results-of-the-grailsrocks-survey/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The web does not a mobile app make.</title>
		<link>http://www.anyware.co.uk/2005/2011/06/13/the-web-does-not-a-mobile-app-make/</link>
		<comments>http://www.anyware.co.uk/2005/2011/06/13/the-web-does-not-a-mobile-app-make/#comments</comments>
		<pubDate>Mon, 13 Jun 2011 13:05:11 +0000</pubDate>
		<dc:creator>Marc Palmer</dc:creator>
				<category><![CDATA[Ideas]]></category>
		<category><![CDATA[Other]]></category>
		<category><![CDATA[Programming links]]></category>
		<category><![CDATA[usability]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[mobile]]></category>

		<guid isPermaLink="false">http://www.anyware.co.uk/2005/?p=808</guid>
		<description><![CDATA[This is a rant about the Web vs. Native debate in mobile. I&#8217;m very squarely on the &#8220;Native is best&#8221; side. Obviously if you don&#8217;t have the funds/expertise to make a native app then you&#8217;ll choose web &#8211; but I would wager this is only viable if you don&#8217;t actually want to make money out [...]]]></description>
			<content:encoded><![CDATA[<p>This is a rant about the Web vs. Native debate in mobile.</p>
<p>I&#8217;m very squarely on the &#8220;Native is best&#8221; side. Obviously if you don&#8217;t have the funds/expertise to make a native app then you&#8217;ll choose web &#8211; but I would wager this is only viable if you don&#8217;t actually want to make money out of the app. Unless you have some amazingly compelling content (like pictures of naked people) that can not be got at by native means.</p>
<p><span id="more-808"></span>The thing is, I&#8217;m not really interested in arguing this any more as its a classic polarized debate like the Mac/PC or Linux/Windows ceaseless arguments. However most people in web development seem to be very anti-native, and as I&#8217;m often the outsider in such things, but also sometimes right, I need to set out my stall so that I can try to keep my mouth shut in any more such discussions!</p>
<p>Let&#8217;s get this straight. Web is <strong>the</strong> perfect platform for presenting documents. It is what it was designed for. Everything else has been a hack. We have many very clever and useful libraries such as jQuery to make web application development half-passable. However anybody who seriously thinks these are anything close to a great development platform is chugging on a crack pipe.</p>
<p>Or not an actual developer, but a web site designer who wants to cash in on making mobile apps.</p>
<p>Before you stop reading &#8211; I&#8217;m a web app dev of many years, and also did more than my fair share of mobile development.</p>
<p>The Web is no cure-all, it is an ugly hack of document rendering turned into interactive UI paradigm. The only selling point for it is that it is cross platform. But your experience &#8211; even on powerful desktops &#8211; varies widely based on CPU, RAM, and browser &#8211; it is simply impossible to make great cross platform apps because to do so is to ignore the native OS paradigms, or poorly mimick them.</p>
<p>Why is it that we are still amazed when someone creates some &#8220;fast&#8221; game in JS and CSS, or creates some amazing new visual trick like&#8230; and animated background or &#8230; 3D!</p>
<p>I means seriously, WTF people? We were doing this stuff on ATARI ST when I was a teenager (&gt; 20 years ago), and this still gets a &#8220;wow&#8221; when somebody manages to make the godawful browser tech stack do the same using CSS and JS? That&#8217;s not progress, that&#8217;s a SHITTY PLATFORM FOR APPS. Its like we all became stupid and forgot everything that goes on in the rest of the tech world once the web hit.</p>
<p>We&#8217;re amazed when stuff like this is done because its so damned hard to do anything good in a web browser. That&#8217;s why designers and animators used Flash so much and cursed us for a decade. It is nothing more than triumph against adversity.</p>
<p>The native OS paradigms (visual or otherwise) issue is borne out in the great many &#8220;Cross platform&#8221; frameworks that have existed over the decades. If you don&#8217;t know the awfulness of J2ME, or Java desktop UIs (Swing), or Tcl/Tk and all the old C++ cross platform toolkits, you have no idea how bad things get. This is in part a reason why Java never took off <strong>even when delivered via the web</strong> and is also part of why Android and iOS are eating the lunch of all the other phone O/Ses whose only realistic entry point was J2ME.</p>
<p>Anybody reading this remember WAP? The mobile Internet that was, right on your phone, back in the early 2000s. What a crock of shit. Why? The UI had no personality, and no styling. It was slow and clunky, and admittedly ran on shitty phones with tiny screens.</p>
<p>WAP lost out to J2ME &#8211; a lesser of two evils &#8211; which you could consider a &#8220;native&#8221; app vs. WAP&#8217;s &#8220;web&#8221; approach. J2ME won that battle, <em>even though</em> people (like me) had to write sometimes 30+ different ports of the same application to handle different handsets. And we&#8217;re not talking just different graphics/screen size here, different data/game levels, different media, different code workarounds to handle bugs and resource limitations.</p>
<p>But <strong>still</strong> it was better than WAP. You had complete control (if you ignored all the J2ME horrible UI libraries) and could draw pixels. WAP&#8230; you could show stuff on screen badly, and maybe submit some forms.</p>
<p>Web on mobile is today&#8217;s WAP, in the same way that Native (Android/iOS/Windows Mobile/WebOS) is today&#8217;s J2ME. For compelling apps you need to use native stuff. What language you use to write that is less important. i.e. PhoneGap apps that use JS to glue together web UI and native features like location, camera etc are native apps. They are just slower, clunkier, non-native UI and feature-limited compared to true native apps.</p>
<p>The pace of development in mobile devices is now unlike anything we have seen before. 6-12 month refresh cycles of hardware and OS releases means the web will never catch up, not even close.</p>
<p>The ease of development used to be a USP of web sites, but this is most definitely not true for non-trivial web apps. For a start, for anything non-trivial you need a back-end server app and all that entails.</p>
<p>Web developers who think web apps can replace native apps ignore another major issue aside from native capabilities and integration &#8211; resources. When was the last time you, as a web developer, cared about how much memory visitors to your site had, or how fast their CPU was?</p>
<p>As a result performance of web applications varies immensely across clients and this matters even for simple forms or content display (layout complexity, images etc). On mobile this is a critical issue. You have to test your web app on every target device your users may be using.</p>
<p>Think about that.</p>
<p>You&#8217;re doing that right now for maybe 3-4 browsers across maybe 2-3 OSes (you are, aren&#8217;t you?).</p>
<p>Now extrapolate that level of work to every mobile device out there (especially the large number of Androids), as they all have difference browsers <strong>and</strong> vastly constrained resources, <strong>and</strong> different pixels-per-inch which affects usability of touch UIs.</p>
<p>Native development doesn&#8217;t skip this problem completely, but it gives you a feel for the size of the challenge that awaits you. Using native UI widgets you are at least nearly guaranteed some reasonable behaviour out of the box.</p>
<p>The point is that web development might get you somewhere, but it is unlikely to get you compelling revenue-generating apps unless your product is incredibly trivial and unique &#8211; unless you focus, like J2ME developers had to &#8211; on the devices that make up the largest market share &#8211; so iPhones and hopefully just a few of the Android handsets. Oh and maybe a HP device too, eh? Oh and Windows Phone.</p>
<p>If you are selling an &#8220;app&#8221; commercially you better be sure you can deliver it in working order to your end user. Make that a &#8220;paying&#8221; user. Not so many of those on the real web are there.</p>
<p>Many web developers fail to understand that mobile devices are &#8220;embedded systems&#8221;, it is not just your desktop web available in your hand. The user expectations are entirely different from desktops. Its so frustrating that people don&#8217;t seem to get that this is consumer electronics: where you push an ON button and stuff happens right there and then.</p>
<p>You pick up a phone to do something, it has to do it quickly, cleanly and reliably. The user does not see a mobile device as a mobile desktop (though more powerful than PCs we used not too long ago) where its OK to spend 15s loading, bombard them with some pointless screens, download a ton of crap off the web.</p>
<p>Even a great deal of native apps fail horribly at this. They take too long to load, the UX is poor due to excessive navigation etc. I have some laughably bad iOS apps installed on my devices &#8211; which occurs because there is no try before you buy / returns policy, a major flaw that needs to be rectified. And if it does get rectified, you better fear for your app-store hosted web apps.</p>
<p>The fact is mobile devices are now so desirable as a platform precisely because of Apple&#8217;s iPhone and the native iOS. Web developers may see these as sexy devices they&#8217;d like to do stuff on, but everybody else sees these as great things that work better and faster than their old computer, with less fuss and (so far) no viruses &#8211; and nobody thinks of these as being like web apps but packaged up. Web applications pull it back to the sluggish land of the desktop. Response time is everything in touch interfaces.</p>
<p>As for native OS integration, whether using HTML5 features (s<em>till</em> not fully standardized) or custom JS APIs á la PhoneGap, the features available will <strong>always</strong> lag behind native apps, and will <strong>usually</strong> lag behind in performance. HTML standards processes are inordinately slow and protracted. Never, ever expect and quick turnaround innovation from HTML. Just forget it.</p>
<p>&#8220;But my app is not performance dependent&#8221;. Yes it bloody is. If the user taps or drags stuff and it doesn&#8217;t happen in smooth realtime like native apps, you stick out like a shit on the arctic tundra. Remember that your app is competing UX wise with all the great default apps shipped on the device (well at least as far as iOS goes).</p>
<p>&#8220;But I don&#8217;t need native integration or true native UI&#8221;. Yes you do &#8211; as soon as you have any form of native competition. And if you are pursuing a market that actually generates decent income, you can bet people will come with native equivalents.</p>
<p>Some people point to WebOS &#8211; it&#8217;s web based technology. However it is effectively native, another proprietary platform. Its yet another OS to port to. Are people seriously saying that, even if performance issues don&#8217;t emerge from this, that they&#8217;d like to use all this hacked together HTML/CSS/JS crud we&#8217;ve amassed over the last 10-15 years to write apps for a tiny device that can have a perfectly good, fast, tightly integrated app written using the well-documented libraries provided in a native language? It&#8217;s a little like writing scalable web app back ends using BASIC. You could do it but&#8230; its the wrong tool for the job.</p>
<p>An interesting blip here is Symbian. This was a native OS platform on all the big Nokia devices. However it failed &#8211; the crown went to the UX-inferior J2ME platform present on the same handsets. Why? Presumably because there was no commercial marketplace of any worth for the apps (the handsets always featured low in app sales, a very small % of total market), and the devices it ran on were the horrible Nokia bricks that cursed us for the last 10 years, cost a fortune and had bad battery life.</p>
<p>In a nutshell the Web is a pile of cobbled together crap &#8211; from an application development point of view.</p>
<p>We can put up with this for true web applications/services as we can&#8217;t face writing native Windows, Linux and Mac OS X clients for our apps &#8211; it makes us gush when a tool like jQuery reduces the pain level by another 10%. Our users are accustomed to this paradigm, and for many of our apps we don&#8217;t need any whizzbangs that require really obscene hacks like Flash for camera access etc. Because their PCs/Macs are a bit of a hassle to maintain they appreciate not having to install apps. They also don&#8217;t expect always-on connectivity so settle for &#8220;just while I&#8217;m sitting at the computer&#8221;.</p>
<p>Even with tablets, there is no point making a web-based app for them. Just make your normal site work well on tablets. Desktop users will likely appreciate the improvements too. I can see the attraction of making a tablet-optimized &#8220;app&#8221; because its reasonably quick and cheap, but really, put that work into your regular web UI. For a Rolls Royce experience for your tablet users, give them a native app if it is commercially sound to do so.</p>
<p>The User expectations of mobile, including tablets are completely different. The device is a tool to get stuff done. In contrast to &#8220;I&#8217;m now sitting at my computer doing a bunch of stuff&#8221;.</p>
<p>Let&#8217;s not even talk about battery usage&#8230;</p>
<p>Bottom line: Mobile development is really hard work, involves lots of time and testing, the likes of which desktop web app developers have little idea about. Browser wars are nothing compared to real cross platform dev where the end product is high quality.</p>
<p>If you&#8217;re going to do it properly, do it native.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.anyware.co.uk/2005/2011/06/13/the-web-does-not-a-mobile-app-make/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: enhanced
Database Caching 8/15 queries in 0.022 seconds using disk: basic

Served from: www.anyware.co.uk @ 2012-02-08 20:29:00 -->
