<?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/"
		xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
	xmlns:media="http://search.yahoo.com/mrss/"
>

<channel>
	<title>Software As She's Developed</title>
	<atom:link href="http://softwareas.com/feed" rel="self" type="application/rss+xml" />
	<link>http://softwareas.com</link>
	<description>Mahemoff's Podcast/Blog - Web, Programming, Usability from the Author of 'Ajax Design Patterns' (AjaxPatterns.org)</description>
	<lastBuildDate>Wed, 09 May 2012 18:38:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
	<copyright>Copyright © Software As She&#039;s Developed 2010 </copyright>
	<managingEditor>michael@mahemoff.com (Software As She's Developed)</managingEditor>
	<webMaster>michael@mahemoff.com (Software As She's Developed)</webMaster>
	<ttl>1440</ttl>
	<image>
		<url>http://i.imgur.com/bBD0F.png</url>
		<title>Software As She's Developed</title>
		<link>http://softwareas.com</link>
		<width>144</width>
		<height>144</height>
	</image>
	<itunes:subtitle></itunes:subtitle>
	<itunes:summary>Mahemoff&#039;s Podcast/Blog - Web, Programming, Usability from the Author of &#039;Ajax Design Patterns&#039; (AjaxPatterns.org)</itunes:summary>
	<itunes:keywords>software, agile, html5, web, ajax, programming</itunes:keywords>
	<itunes:category text="Technology">
		<itunes:category text="Software How-To" />
	</itunes:category>
	<itunes:category text="Technology" />
	<itunes:author>Software As She's Developed</itunes:author>
	<itunes:owner>
		<itunes:name>Software As She's Developed</itunes:name>
		<itunes:email>michael@mahemoff.com</itunes:email>
	</itunes:owner>
	<itunes:block>no</itunes:block>
	<itunes:explicit>no</itunes:explicit>
	<itunes:image href="http://i.imgur.com/bBD0F.png" />
		<item>
		<title>Announcing Player FM: Podcasts in Your Browser</title>
		<link>http://softwareas.com/announcing-player-fm-podcasts-in-your-browser</link>
		<comments>http://softwareas.com/announcing-player-fm-podcasts-in-your-browser#comments</comments>
		<pubDate>Wed, 09 May 2012 18:33:07 +0000</pubDate>
		<dc:creator>mahemoff</dc:creator>
				<category><![CDATA[SoftwareDev]]></category>

		<guid isPermaLink="false">http://softwareas.com/?p=1671</guid>
		<description><![CDATA[I&#8217;ve launched Player FM today, a product I&#8217;ve been wanting to make since podcasting began in 2005! It&#8217;s a way to discover, share, and play podcasts in the browser. Works pretty well in mobile browsers as well as the desktop. Learned a ton in building this thing! A few technologies in here: * Rails 3.1 [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve launched <a href="http://player.fm">Player FM</a> today, a product I&#8217;ve been wanting to make since podcasting began in 2005! It&#8217;s a way to discover, share, and play podcasts in the browser. Works pretty well in mobile browsers as well as the desktop.</p>

<p><a href="http://player.fm"><img src="http://i.imgur.com/5J1Ae.png" alt="" title="Hosted by imgur.com" /></a></p>

<p>Learned a ton in building this thing! A few technologies in here:
* Rails 3.1 on the server
* Twitter Bootstrap and Font Awesome icons
* HAML, SASS+Bourbon, CoffeeScript
* HTML5 history to keep playing while the user browses
* SoundManager 2 using Flash and falling back to HTML5 audio as appropriate
* RSS, JSON, OPML, and plain-text imports and exports</p>

<p>Any ideas for this, let me know. Hope it&#8217;s useful!</p>
 <p><a href="http://softwareas.com/?flattrss_redirect&amp;id=1671&amp;md5=c496e80f5e5319c7e97a469bf9ac0707" title="Flattr" target="_blank"><img src="http://softwareas.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://softwareas.com/announcing-player-fm-podcasts-in-your-browser/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=mahemoff&amp;popout=1&amp;url=http%3A%2F%2Fsoftwareas.com%2Fannouncing-player-fm-podcasts-in-your-browser&amp;language=en_GB&amp;category=text&amp;title=Announcing+Player+FM%3A+Podcasts+in+Your+Browser&amp;description=I%26%238217%3Bve+launched+Player+FM+today%2C+a+product+I%26%238217%3Bve+been+wanting+to+make+since+podcasting+began+in+2005%21+It%26%238217%3Bs+a+way+to+discover%2C+share%2C+and+play+podcasts+in+the+browser.+Works...&amp;tags=software%2Chtml5%2Cweb%2Cprogramming" type="text/html" />
	</item>
		<item>
		<title>Web Vs Native at State of the Browser 2</title>
		<link>http://softwareas.com/state-of-the-browser-2-web-vs-native</link>
		<comments>http://softwareas.com/state-of-the-browser-2-web-vs-native#comments</comments>
		<pubDate>Sun, 29 Apr 2012 13:26:10 +0000</pubDate>
		<dc:creator>mahemoff</dc:creator>
				<category><![CDATA[SoftwareDev]]></category>
		<category><![CDATA[Conference]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://softwareas.com/?p=1652</guid>
		<description><![CDATA[(via Steve Workman) I was at State of the Browser 2 yesterday, an event comprising reps from the browsers. I&#8217;m happy to be part of this event as I think it&#8217;s valuable for the web as a whole for devrels to get together with developers in this way. The browsers do spend a lot of [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://imgur.com/O8rIu"><img src="http://i.imgur.com/O8rIu.jpg" alt="" title="Hosted by imgur.com" /></a></p>

<p>(via <a href="http://www.steveworkman.com/html5-2/standards/2012/state-of-the-browser-2012/comment-page-1/#comment-1185">Steve Workman</a>)</p>

<p>I was at State of the Browser 2 yesterday, an event comprising reps from the browsers. I&#8217;m happy to be part of this event as I think it&#8217;s valuable for the web as a whole for devrels to get together with developers in this way. The browsers do spend a lot of time talking to each other about specs etc in meetings and mailing lists, but at State of the Browser, they&#8217;re facing the developers. So straight up, thanks to the organisers for doing a great job running this great event again.</p>

<p><a href="http://twitpic.com/9eojfe" title="Share photos on twitter with Twitpic"><img src="http://twitpic.com/show/thumb/9eojfe.jpg" width="150" height="150" alt="Share photos on twitter with Twitpic"/></a></p>

<p>Thankyou for the sketchnotes UBelly <img src='http://softwareas.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<p><a href="http://prez.mahemoff.com/state-native/">Slides for my keynote talk on Web vs Native are here</a>. I&#8217;ll highlight the four challenges of the web which</p>

<p>In order of increasing threat, I mentioned:</p>

<ul>
<li><p><em>UI</em> Low threat. A lot of the capabilities are already in place and we can already do decent UIs if not &#8220;gorgeous&#8221;/&#8221;sexy&#8221; like Path or Paper.</p></li>
<li><p><em>Offline</em> Medium threat. DHH wrote his famous <a href="http://37signals.com/svn/posts/347-youre-not-on-a-fucking-plane-and-if-you-are-it-doesnt-matter">You&#8217;re Not on a Plane argument</a> in the desktop era. Mobile is way important these days, connectivity remains sketchy, and 3G is expensive for many. The pure offline scenario may matter less, at least for many people in developed nations, but latency matters a lot to everyone. HTML5 does have offline technologies, but browser support is extremely fragmented and there are many debates about what to use where.</p></li>
<li><p><em>Device Integration</em> Medium threat. Web needs permissioned access to camera, contacts, etc. But my bigger concern is peripheral aspects like single sign-on, notifications, Android intents. These things, for the most part, are not possible in web apps. There are signs that&#8217;s changing as the speakers yesterday highlighted, e.g. Chrome&#8217;s adding Web Intents, IE&#8217;s adding native notifications like the OSX native notifications I mentioned. But it&#8217;s really early days, and I don&#8217;t see anyone talking about single sign-on for web apps, which is hugely concerning considering how personal in nature smartphones and native apps are.</p></li>
<li><p><em>Background Processing</em> High threat. This doesn&#8217;t get much play, but is something I&#8217;ve been thinking about since <a href="http://softwareas.com/non-visual-web">writing this</a> and listening to the related Jason Grigsby podcast. With modern smartphone apps, we see the long-anticipated trend of software that acts as intelligent agents. An app is not just something you open, interact with, and close. Through its smartphone vehicle, the app serves as an extra brain, extra set of eyes and ears, extra communication agent. With you at all times, proactively scanning the environment for anything useful. Sucking down content and syncing with servers. Notifying you when anything particular important happens. Web apps are shut out of this game. They are useful as long as the user is looking at them. Out of sight, out of mind. Or more generously, as long as they are still open in a tab, but they may have restricted functionality in mobile background tabs to preserve battery life. Chrome has done some work here with background apps, but it&#8217;s really early days and I don&#8217;t see anyone thinking about this problem in mobile space.</p></li>
</ul>

<p>I also mentioned monetization and competing standards as additional threats, only reason I didn&#8217;t cover them in detail is time. I did mention a little of it in the recent <a href="http://hnpod.com/episodes/html5-vs-native-apps">bonus HNPod episode on HTML5 vs Native</a> and <a href="http://storify.com/mahemoff/in-web-payments">we had a Twitter conversation about it yesterday</a>.</p>

<p><a href="http://remysharp.com/2012/04/28/notes-from-state-of-the-browser/">Remy blogged all the morning talks</a> and raised some questions about each.</p>

<p><em>Is the point: browsers don’t matter – the web does…?</em></p>

<p>The underlying assumption is that the web matters more than any individual browser.</p>

<p><em>Should the browser just be the webview?</em></p>

<p>No. Browsers add a lot of value beyond the web view. One of many examples is customisation via preferences and extensions.</p>

<p><em>“You’re not on a fucking plane” – but then do all devs know how to build apps like gmail where it’s insanely quick because they know how to work the mobile device?</em></p>

<p>Agree. It&#8217;s hard right now. And even harder if you wish to use the same core app for both online and offline (as well as desktop and mobile).</p>

<p><em>AppCache is not a replicatement (sic.) for localStorage – far from it.</em></p>

<p>Definitely not.</p>

<p><em>Is there a larger problem that the browser (and a pro) exposes data if the user wants to get to it. It makes SSO harder because of security, etc?</em></p>

<p>Yes, but just like camera access, geolocation, etc, you can handle it with permissions. If HTML5 doesn&#8217;t stay competitive with native on SSO, background apps, etc, it&#8217;s not going to be a modern platform for apps. There&#8217;s enough UI widgets already, it&#8217;s these peripheral aspects &mdash; those where security is an issue &mdash; where native is surging ahead. You can either do basic websites without app-iness or you can do apps which use the full range of possibilities available in a modern device and operating system.</p>

<p><em>Web vs. Native seems like two issues: browser and the web. Browsers being the limitation</em></p>

<p>Both as we&#8217;d want web standards too for whatever the browsers offer developers. But definitely down to the browsers and possibly the OSs when you consider SSO for example.</p>

<p><img src="https://lh3.googleusercontent.com/-TZWDF_2XkMk/T50x6LaQIlI/AAAAAAAADrk/5a_IF2oW7KU/s773/terbi.jpeg" alt="" /></p>

<p>The panel I moderated. Devrels from four browsers and the forbidden fruit. (<a href="https://twitter.com/james_smith88/status/196301531396575233/photo/1">via james_smith88</a>)</p>
 <p><a href="http://softwareas.com/?flattrss_redirect&amp;id=1652&amp;md5=4b818c8723d4a32e86b7dc37fd555410" title="Flattr" target="_blank"><img src="http://softwareas.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://softwareas.com/state-of-the-browser-2-web-vs-native/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=mahemoff&amp;popout=1&amp;url=http%3A%2F%2Fsoftwareas.com%2Fstate-of-the-browser-2-web-vs-native&amp;language=en_GB&amp;category=text&amp;title=Web+Vs+Native+at+State+of+the+Browser+2&amp;description=%28via+Steve+Workman%29+I+was+at+State+of+the+Browser+2+yesterday%2C+an+event+comprising+reps+from+the+browsers.+I%26%238217%3Bm+happy+to+be+part+of+this+event+as+I+think...&amp;tags=Conference%2Chtml5%2CWeb%2Csoftware%2Chtml5%2Cweb%2Cprogramming" type="text/html" />
	</item>
		<item>
		<title>Rails Cache Sweeper Gotchas</title>
		<link>http://softwareas.com/rails-cache-sweeper-gotchas</link>
		<comments>http://softwareas.com/rails-cache-sweeper-gotchas#comments</comments>
		<pubDate>Wed, 18 Apr 2012 02:53:43 +0000</pubDate>
		<dc:creator>mahemoff</dc:creator>
				<category><![CDATA[SoftwareDev]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Sweeper]]></category>

		<guid isPermaLink="false">http://softwareas.com/?p=1646</guid>
		<description><![CDATA[As you&#8217;ll see here, Rails cache sweepers are a tricky subject. Here are some general things I&#8217;ve learned. Sweepers are dual creatures. &#8220;Here’s the scoop: sweepers observe both your models and your controllers. They’re not half-this and half-that, they’re both_. You can define model callbacks (after_save, afterupdate, etc.), and you can also define before/after callbacks [...]]]></description>
			<content:encoded><![CDATA[<p>As you&#8217;ll <a href="http://stackoverflow.com/questions/1463714/in-rails-a-sweeper-isnt-getting-called-in-a-model-only-setup">see here</a>, Rails cache sweepers are a tricky subject. Here are some general things I&#8217;ve learned.</p>

<ul>
<li><p><a href="http://codelevy.com/2008/03/04/rails-caching-sweepers-controllers-and-models">Sweepers are dual creatures</a>. &#8220;Here’s the scoop: sweepers observe both your models and your controllers. They’re not half-this and half-that, they’re both_. You can define model callbacks (after_save, afterupdate, etc.), and you can also define before/after callbacks for any controller action (e.g. after_list_create).&#8221;</p></li>
<li><p>Notwithstanding the above, most references and despairing workarounds focus on their <em>controller</em> nature. Dandy for a web forms app, but in my case, cached content is being invalidated by daemon processes operating directly on models.</p></li>
<li><p>There&#8217;s no standard home for Sweepers. So much for convention-over-configuration <img src='http://softwareas.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . So I opted for a new app/sweepers directory and added it in <code>application.rb</code>: <code>config.autoload_paths += %W(#{config.root}/app/sweepers)</code>.</p></li>
<li><p>Now to the crux of the matter: The Sweeper still does nothing, even if it&#8217;s in the path. I don&#8217;t know why, but it&#8217;s a common problem! I had to explicitly add it as an observer: <code>config.active_record.observers = :episode_sweeper</code>. This is the <em>model</em> equivalent of people explicitly adding it to their <em>controller</em> with an <code>after_update</code> hook.</p></li>
<li><p>Now to the crux of the matter, redux: Okay, so now the sweeper is being called when models change (specifically, the models it declares it&#8217;s observing). Great. But it still doesn&#8217;t work &mdash; <code>expire_fragment</code> apparently doesn&#8217;t, because I&#8217;m still seeing the the old fragment appear in the web app. <strong>WAT?</strong> The answer turned out to be, don&#8217;t just call <code>expire_fragment()</code>. Instead, call <code>ActionController::Base.new.expire_fragment()</code>. It seems the fragment used when outputting a view is not the same as that expired by <code>expire_fragment()</code>. I&#8217;m only telling you what worked here, I can&#8217;t tell you why!</p></li>
<li><p>You can also expire cache in the Rails console for testing purposes, just call <code>ActionController::Base.new.expire_fragment()</code>. (I think you need to restart Rails (and the console) if you update the sweeper code, given that it&#8217;s set up as an arel observer in the config line above. But haven&#8217;t fully tested that.)</p></li>
</ul>

<p>This is just a basic implementation for now. A better implementation is probably to use DHH&#8217;s <a href="http://37signals.com/svn/posts/3113-how-key-based-cache-expiration-works">key-based caching approach</a>, which has the neat principle of generating a new key every time the fragment changes.</p>

<script src="https://gist.github.com/2410695.js?file=episode_sweeper.rb"></script>
 <p><a href="http://softwareas.com/?flattrss_redirect&amp;id=1646&amp;md5=5dc4ab97008ff174e97ef9bff0974c95" title="Flattr" target="_blank"><img src="http://softwareas.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://softwareas.com/rails-cache-sweeper-gotchas/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=mahemoff&amp;popout=1&amp;url=http%3A%2F%2Fsoftwareas.com%2Frails-cache-sweeper-gotchas&amp;language=en_GB&amp;category=text&amp;title=Rails+Cache+Sweeper+Gotchas&amp;description=As+you%26%238217%3Bll+see+here%2C+Rails+cache+sweepers+are+a+tricky+subject.+Here+are+some+general+things+I%26%238217%3Bve+learned.+Sweepers+are+dual+creatures.+%26%238220%3BHere%E2%80%99s+the+scoop%3A+sweepers+observe+both+your+models...&amp;tags=Cache%2CRails%2CSweeper%2Csoftware%2Chtml5%2Cweb%2Cprogramming" type="text/html" />
	</item>
		<item>
		<title>The New New Podcast</title>
		<link>http://softwareas.com/the-new-new-podcast</link>
		<comments>http://softwareas.com/the-new-new-podcast#comments</comments>
		<pubDate>Tue, 17 Apr 2012 22:54:21 +0000</pubDate>
		<dc:creator>mahemoff</dc:creator>
				<category><![CDATA[SoftwareDev]]></category>

		<guid isPermaLink="false">http://softwareas.com/?p=1637</guid>
		<description><![CDATA[It&#8217;s been a while since I&#8217;ve podcasted on this site, having shifted my attention to live gigs in recent years. But I&#8217;m pleased to say I&#8217;ve begun podcasting again at AudioBoo. Mahemoff&#8217;s Podcast at Audioboo Mahemoff&#8217;s Podcast RSS Doing my best to keep this lightweight and sticking within the base 5 minute limit for now. [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been a while since I&#8217;ve <a href='http://softwareas.com/tag/podcast'>podcasted on this site</a>, having shifted my attention to live gigs in recent years. But I&#8217;m pleased to say I&#8217;ve begun podcasting again at AudioBoo.</p>

<ul>
<li><a href='http://audioboo.fm/Mahemoff'>Mahemoff&#8217;s Podcast at Audioboo</a></li>
<li><a href='http://audioboo.fm/users/574/boos.rss'>Mahemoff&#8217;s Podcast RSS</a></li>
</ul>

<div class="ab-player" data-boourl="http://audioboo.fm/publishing/playlist?src=http://api.audioboo.fm/users/574/audio_clips.jsonp?callback=?"></div>

<script type="text/javascript"> (function() { var po = document.createElement("script"); po.type = "text/javascript"; po.async = true; po.src = "http://d15mj6e6qmt1na.cloudfront.net/assets/embed.js"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(po, s); })(); </script>

<p>Doing my best to keep this lightweight and sticking within the base 5 minute limit for now. And focusing on HTML5/web development. I&#8217;ve taken inspiration from the excellent <a href='http://boagworld.com/podcast-archive/'>Boagworld podcast</a> for this short Audioboo-powered format.</p>

<p>It&#8217;s now 7.5 years since I began my original podcast, a few months after the technology was born and shortly after I set up ye olde podcast FAQ at http://podca.st. My podcast is actually the reason I set this here blog up. <a href='http://softwareas.com/tag/podcasting'>I&#8217;ve continued</a> to be enthusiastic about the medium and it&#8217;s heartening that podcasts continue to thrive in 2012. So in addition to announcing the Audioboo, I&#8217;m pleased to say I&#8217;m working on a service to make life a little more pleasant for the fellow podcast listener. It sees the light of day Real Soon Now &mdash; please ping me at michael@mahemoff.com if you&#8217;d like early access and can give some feedback.</p>
 <p><a href="http://softwareas.com/?flattrss_redirect&amp;id=1637&amp;md5=3e97fcf9e6da5262a6a4ec8dcfa321e9" title="Flattr" target="_blank"><img src="http://softwareas.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://softwareas.com/the-new-new-podcast/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=mahemoff&amp;popout=1&amp;url=http%3A%2F%2Fsoftwareas.com%2Fthe-new-new-podcast&amp;language=en_GB&amp;category=text&amp;title=The+New+New+Podcast&amp;description=It%26%238217%3Bs+been+a+while+since+I%26%238217%3Bve+podcasted+on+this+site%2C+having+shifted+my+attention+to+live+gigs+in+recent+years.+But+I%26%238217%3Bm+pleased+to+say+I%26%238217%3Bve+begun+podcasting+again+at...&amp;tags=software%2Chtml5%2Cweb%2Cprogramming" type="text/html" />
	</item>
		<item>
		<title>Rough Notes from Johan Ronsse&#8217;s Design for Developers Slides</title>
		<link>http://softwareas.com/rough-notes-from-johan-ronsses-design-for-developers-slides</link>
		<comments>http://softwareas.com/rough-notes-from-johan-ronsses-design-for-developers-slides#comments</comments>
		<pubDate>Thu, 12 Apr 2012 18:33:58 +0000</pubDate>
		<dc:creator>mahemoff</dc:creator>
				<category><![CDATA[SoftwareDev]]></category>

		<guid isPermaLink="false">http://softwareas.com/?p=1632</guid>
		<description><![CDATA[Clearing my desk and buried at the bottom of the pile was some notes I took a while ago while running through this slideshow. My notes are just capturing a few points to remind myself later and don&#8217;t do the slides a speck of justice. So check out the slideshow instead, which Johan went through [...]]]></description>
			<content:encoded><![CDATA[<p>Clearing my desk and buried at the bottom of the pile was some notes I took a while ago while running through this slideshow. My notes are just capturing a few points to remind myself later and don&#8217;t do the slides a speck of justice. So check out the slideshow instead, which <a href='http://www.slideshare.net/Wolfr'>Johan</a> went through after his talk and optimised for reading.</p>

<div style="width:425px" id="__ss_10323363"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/Wolfr/design-for-developersonlineversionlong" title="Design for developers" target="_blank">Design for developers</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/10323363?rel=0" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe> <div style="padding:5px 0 12px"> View more presentations from <a href="http://www.slideshare.net/Wolfr" target="_blank">Johan Ronsse</a> </div> </div>

<h3>Fonts and Layout</h3>

<p>Avoid font-face for performance reasons. A good font is Verdana or Lucid Grande, fallback Lucida Sans Unicode.</p>

<p>Android: Droid Sans, WP7: Segoe UI</p>

<p>All text at least 14px
Consider 16px default
For Lucidea Grande or Verdana: 11-13px</p>

<p>Paras &lt;= 60 characters wide</p>

<p>1.1 line-height for headings, 1.5 for paragraphs</p>

<p>Grid structure: think in units of 6.</p>

<h3>Light and Shadow</h3>

<p>1-3px drop shadow</p>

<p>0-3px distance</p>

<p>Inner shadow when button is depressed</p>

<h3>Color</h3>

<p>Recommended: <a href="http://itunes.apple.com/gb/app/hues/id411811718?mt=12">Hues app</a></p>

<p>Start with three colors</p>

<p>Blend foreground color with background color for text (ie don&#8217;t just use pure gray/black if there&#8217;s a colored background)</p>

<p>Dark gray with blueish tint looks good. Blue bottom is common (e.g. on GitHub)</p>

<p>Use at least as dark as #d5d5d5 on white background</p>

<p>Pay for good icons, e.g. Picons/Pictos/Fico</p>

<p>(This was just after I took the UX Bootcamp on Visual Design, and &#8211; look away now &#8211; I&#8217;ve also posted some <a href="http://imgur.com/a/SiG2w">moodboards</a> from around then.)</p>
 <p><a href="http://softwareas.com/?flattrss_redirect&amp;id=1632&amp;md5=399ae201279ec26a770feaf9649b0492" title="Flattr" target="_blank"><img src="http://softwareas.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://softwareas.com/rough-notes-from-johan-ronsses-design-for-developers-slides/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=mahemoff&amp;popout=1&amp;url=http%3A%2F%2Fsoftwareas.com%2Frough-notes-from-johan-ronsses-design-for-developers-slides&amp;language=en_GB&amp;category=text&amp;title=Rough+Notes+from+Johan+Ronsse%26%238217%3Bs+Design+for+Developers+Slides&amp;description=Clearing+my+desk+and+buried+at+the+bottom+of+the+pile+was+some+notes+I+took+a+while+ago+while+running+through+this+slideshow.+My+notes+are+just+capturing+a...&amp;tags=software%2Chtml5%2Cweb%2Cprogramming" type="text/html" />
	</item>
		<item>
		<title>Twitter Debates Happen When Blogs Lack Comments</title>
		<link>http://softwareas.com/twitter-debates-happen-when-blogs-lack-comments</link>
		<comments>http://softwareas.com/twitter-debates-happen-when-blogs-lack-comments#comments</comments>
		<pubDate>Mon, 09 Apr 2012 14:27:53 +0000</pubDate>
		<dc:creator>mahemoff</dc:creator>
				<category><![CDATA[SoftwareDev]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[Navel-Gazing]]></category>

		<guid isPermaLink="false">http://softwareas.com/?p=1628</guid>
		<description><![CDATA[2004 Rehash Alert, Meta Alert Christian Heilmann takes people to task for conducting debates on Twitter. The irony about this is the post that triggered these debates concludes thus: I don&#8217;t have comments on my blog but I&#8217;d love to hear from you if you feel the same way (or not). Tweet at me, discuss [...]]]></description>
			<content:encoded><![CDATA[<p>2004 Rehash Alert, Meta Alert</p>

<p>Christian Heilmann <a href='http://christianheilmann.com/2012/04/08/arguments-on-twitter-are-causing-more-harm-than-good/'>takes people to task</a> for conducting debates on Twitter. The irony about this is the post that triggered these debates concludes thus:</p>

<blockquote>
I don&#8217;t have comments on my blog but I&#8217;d love to hear from you if you feel the same way (or not). Tweet at me, discuss on HN/etc, or pick some other method and I&#8217;d be happy to chat about it, just not over a beer <img src='http://softwareas.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> 
</blockquote>

<p>The double-irony is that Christian&#8217;s blog also doesn&#8217;t have comments. (I thought it did before, maybe that&#8217;s temporary.)</p>

<p>Anyway, this is an age-old debate about blogs and comments, and I sure know the pain of maintaining comments in the face of endless blogspam (see below). So while I certainly wish more blogs would have comments, I&#8217;m sympathetic to those which don&#8217;t. All I&#8217;m saying is the conversation will happen more on other channels in the absence of blog comments. Some posts are notable enough to float to the top of HN, where there&#8217;s a built-in comments mechanism. But for the rest, Twitter is going to be the place.</p>

<p><img src='http://farm7.staticflickr.com/6224/6309228132_c89633b157_b.jpg' /></p>

<p><img src='http://farm8.staticflickr.com/7023/6724823223_69a5db2e5d_b.jpg' /></p>

<p>(Incidentally, <a href='http://a.tinythread.com/'>Josh Schachter&#8217;s TinyThread</a> was quite a neat idea for offlining a conversation. Not ideal , e.g. everything&#8217;s designed around being able to tweet comments, but the basic concept had potential. Never took off though.)</p>
 <p><a href="http://softwareas.com/?flattrss_redirect&amp;id=1628&amp;md5=cbe9477c781c525fca674a39bde7bac7" title="Flattr" target="_blank"><img src="http://softwareas.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://softwareas.com/twitter-debates-happen-when-blogs-lack-comments/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=mahemoff&amp;popout=1&amp;url=http%3A%2F%2Fsoftwareas.com%2Ftwitter-debates-happen-when-blogs-lack-comments&amp;language=en_GB&amp;category=text&amp;title=Twitter+Debates+Happen+When+Blogs+Lack+Comments&amp;description=2004+Rehash+Alert%2C+Meta+Alert+Christian+Heilmann+takes+people+to+task+for+conducting+debates+on+Twitter.+The+irony+about+this+is+the+post+that+triggered+these+debates+concludes+thus%3A+I...&amp;tags=Blog%2CNavel-Gazing%2Csoftware%2Chtml5%2Cweb%2Cprogramming" type="text/html" />
	</item>
		<item>
		<title>Detecting Android Browser, But Not Chrome</title>
		<link>http://softwareas.com/detecting-android-browser-but-not-chrome</link>
		<comments>http://softwareas.com/detecting-android-browser-but-not-chrome#comments</comments>
		<pubDate>Wed, 04 Apr 2012 19:50:48 +0000</pubDate>
		<dc:creator>mahemoff</dc:creator>
				<category><![CDATA[SoftwareDev]]></category>

		<guid isPermaLink="false">http://softwareas.com/?p=1621</guid>
		<description><![CDATA["A browser’s user-agent string isn’t an identifier, it’s a reverse-chronological history of the web." - Jeremy Keith I have to perform evil browser-sniffing because Android Browser is ... special. A little slow and using SoundManager, a little different. Well, today I installed Ice Cream Sandwich (Android 4.0) on the Nexus today, much hat tips due [...]]]></description>
			<content:encoded><![CDATA[<p>"A browser’s user-agent string isn’t an identifier, it’s a reverse-chronological history of the web."
- <a href="http://adactio.com/journal/5289/">Jeremy Keith</a></p>

<p>I have to perform evil browser-sniffing because Android Browser is ... special. A little slow and using SoundManager, a little different.</p>

<p>Well, today I installed Ice Cream Sandwich (Android 4.0) on the Nexus today, much hat tips due to <a href="http://wiki.cyanogenmod.com/wiki/Nexus_S:_Full_Update_Guide">the Cyanogenmod wiki guide</a>. So I can finally try out Chrome on Android, and it's actually sweet. In fact, on first impressions, it has more in common with Chrome on Desktop than it has with the standard Android Browser. So I had to update the evil sniff code to <em>exclude</em> Chrome.</p>

<p>Both browsers present as "Android" and "Mobile". Chrome additionally presents as "CrMo". So my new CoffeeScript to detect Android Browser, but not Chrome, is this:</p>

<div class="igBar"><span id="lcode-2"><a href="#" onclick="javascript:showPlainTxt('code-2'); return false;">PLAIN TEXT</a></span></div>

<div class="syntax_hilite"><span class="langName">CODE:</span><br /><div id="code-2">
<div class="code"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">isAndroid = -&gt;</div></li>
<li style="font-weight: bold;color:#26536A;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="">ua</span> = navigator.<span style="">userAgent</span>.<span style="">toLowerCase</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span></div></li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; ua.<span style="">indexOf</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"android"</span><span style="color:#006600; font-weight:bold;">&#41;</span> != -<span style="color:#800000;color:#800000;">1</span></div></li>
<li style="font-weight: bold;color:#26536A;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; and ua.<span style="">indexOf</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"mobile"</span><span style="color:#006600; font-weight:bold;">&#41;</span> != -<span style="color:#800000;color:#800000;">1</span></div></li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; and ua.<span style="">indexOf</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"crmo"</span><span style="color:#006600; font-weight:bold;">&#41;</span>==-<span style="color:#800000;color:#800000;">1</span> </div></li></ol></div>
</div></div>

<p><br /></p>

<p>Update: And as Pornelski points out, there's also Firefox, Opera, et al. How I end up grouping them is still up in the air, so consider this a work in progress.</p>

<p>Originally adapted from <a href="http://davidwalsh.name/detect-android">here</a>.</p>
 <p><a href="http://softwareas.com/?flattrss_redirect&amp;id=1621&amp;md5=a08a02dca84b00dbd162b11952af0488" title="Flattr" target="_blank"><img src="http://softwareas.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://softwareas.com/detecting-android-browser-but-not-chrome/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=mahemoff&amp;popout=1&amp;url=http%3A%2F%2Fsoftwareas.com%2Fdetecting-android-browser-but-not-chrome&amp;language=en_GB&amp;category=text&amp;title=Detecting+Android+Browser%2C+But+Not+Chrome&amp;description=%22A+browser%E2%80%99s+user-agent+string+isn%E2%80%99t+an+identifier%2C+it%E2%80%99s+a+reverse-chronological+history+of+the+web.%22+-+Jeremy+Keith+I+have+to+perform+evil+browser-sniffing+because+Android+Browser+is+...+special.+A...&amp;tags=software%2Chtml5%2Cweb%2Cprogramming" type="text/html" />
	</item>
		<item>
		<title>Confirming User Wants to Leave the Page</title>
		<link>http://softwareas.com/confirming-user-wants-to-leave-the-page</link>
		<comments>http://softwareas.com/confirming-user-wants-to-leave-the-page#comments</comments>
		<pubDate>Tue, 03 Apr 2012 22:11:39 +0000</pubDate>
		<dc:creator>mahemoff</dc:creator>
				<category><![CDATA[SoftwareDev]]></category>

		<guid isPermaLink="false">http://softwareas.com/?p=1613</guid>
		<description><![CDATA[So you have a user at your site and they wants to close your site or go elsewhere. In the past, the most likely way this would happen is clicking a link. But these days, almost all links are "target=_blank" popup links, and it's become so standard that it's almost rude not to. So that's [...]]]></description>
			<content:encoded><![CDATA[<p>So you have a user at your site and they wants to close your site or go elsewhere. In the past, the most likely way this would happen is clicking a link. But these days, almost all links are "target=_blank" popup links, and it's become so standard that it's almost rude not to. So that's not a scenario to consider. The scenario is where the user has closed your tab, perhaps inadvertently as part of a mass "close all tabs" or "quit browser" operation. Or they've typed in a new URL.</p>

<p>Most websites should in all sanity just concede at this point. Let the user be in charge and just move on from your site.</p>

<p>Some websites do have a legitimate need to do some work though. In the simplest case, they may just want to upload analytics. In more complex cases, they may want to save unsaved work. You can generally do that silently with an <code>onbeforeunload</code> handler.</p>

<p>And a scarce few websites may have a legitimate reason to confirm the user's action. I'd argue for a video or audio app like the one I'm building, that's what the user wants. If they're explicitly subjecting themselves to the audio stream coming out of your website, it's probably the only audio they're listening to at the time and there's a fair chance they don't want to close it. In which case, do this:</p>

<div class="igBar"><span id="lcode-5"><a href="#" onclick="javascript:showPlainTxt('code-5'); return false;">PLAIN TEXT</a></span></div>

<div class="syntax_hilite"><span class="langName">CODE:</span><br /><div id="code-5">
<div class="code"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">window.<span style="">onbeforeunload</span> =</div></li>
<li style="font-weight: bold;color:#26536A;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; -&gt; <span style="color:#CC0000;">"You're currently playing. Are you sure you want to leave?"</span></div></li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; if playing<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span> </div></li></ol></div>
</div></div>

<p><br /></p>

<p>The point of interest here is it's "built-in". You just return a string. <a href="https://github.com/LeaVerou/dabblet/commit/a4124366cb6d6a372d9ee77adaaba3e59cb93c5a">You don't, and shouldn't, call <tt>confirm</tt>.</a></p>

<p>The other point is the <code>isplaying()</code> part! Breaking user expectations is not something to be done lightly.</p>
 <p><a href="http://softwareas.com/?flattrss_redirect&amp;id=1613&amp;md5=644622ee2a7ca055a6f1229bce9d5091" title="Flattr" target="_blank"><img src="http://softwareas.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://softwareas.com/confirming-user-wants-to-leave-the-page/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=mahemoff&amp;popout=1&amp;url=http%3A%2F%2Fsoftwareas.com%2Fconfirming-user-wants-to-leave-the-page&amp;language=en_GB&amp;category=text&amp;title=Confirming+User+Wants+to+Leave+the+Page&amp;description=So+you+have+a+user+at+your+site+and+they+wants+to+close+your+site+or+go+elsewhere.+In+the+past%2C+the+most+likely+way+this+would+happen+is+clicking...&amp;tags=software%2Chtml5%2Cweb%2Cprogramming" type="text/html" />
	</item>
		<item>
		<title>HTML5 Best Practices and Music Makes The World Go Round</title>
		<link>http://softwareas.com/html5-best-practices-and-music-makes-the-world-go-round</link>
		<comments>http://softwareas.com/html5-best-practices-and-music-makes-the-world-go-round#comments</comments>
		<pubDate>Fri, 30 Mar 2012 11:14:39 +0000</pubDate>
		<dc:creator>mahemoff</dc:creator>
				<category><![CDATA[SoftwareDev]]></category>

		<guid isPermaLink="false">http://softwareas.com/?p=1611</guid>
		<description><![CDATA[I recently made a guest post on the Intel AppUp blog about my involvement with AppUp at Mobile World Congress. There's a talk: Best Practices Every HTML5 Developer Should Know View more presentations from Michael Mahemoff And a new open-source Single-Page App showcasing various APIs and Backbone architecture: Music Makes The World Go Round]]></description>
			<content:encoded><![CDATA[<p>I recently <a href="http://appdeveloper.intel.com/en-us/blog/2012/03/21/html5-best-practices">made a guest post</a> on the Intel AppUp blog about my involvement with AppUp at Mobile World Congress.</p>

<p>There's a talk:</p>

<div style="width:425px" id="__ss_12093407"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/mahemoff/best-practices-every-html5-developer-should-know" title="Best Practices Every HTML5 Developer Should Know" target="_blank">Best Practices Every HTML5 Developer Should Know</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/12093407" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe> <div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/mahemoff" target="_blank">Michael Mahemoff</a> </div> </div>

<p>And a new open-source Single-Page App showcasing various APIs and Backbone architecture:</p>

<p><a href='http://musicmak.es'></a><a href="http://i.imgur.com/mV5cj">Music Makes The World Go Round</a></p>
 <p><a href="http://softwareas.com/?flattrss_redirect&amp;id=1611&amp;md5=dba5454bb83597d410d82b68427aa48a" title="Flattr" target="_blank"><img src="http://softwareas.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://softwareas.com/html5-best-practices-and-music-makes-the-world-go-round/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=mahemoff&amp;popout=1&amp;url=http%3A%2F%2Fsoftwareas.com%2Fhtml5-best-practices-and-music-makes-the-world-go-round&amp;language=en_GB&amp;category=text&amp;title=HTML5+Best+Practices+and+Music+Makes+The+World+Go+Round&amp;description=I+recently+made+a+guest+post+on+the+Intel+AppUp+blog+about+my+involvement+with+AppUp+at+Mobile+World+Congress.+There%27s+a+talk%3A+Best+Practices+Every+HTML5+Developer+Should+Know...&amp;tags=software%2Chtml5%2Cweb%2Cprogramming" type="text/html" />
	</item>
		<item>
		<title>Operation Zero-Shelf</title>
		<link>http://softwareas.com/operation-zero-shelf</link>
		<comments>http://softwareas.com/operation-zero-shelf#comments</comments>
		<pubDate>Thu, 29 Mar 2012 19:10:38 +0000</pubDate>
		<dc:creator>mahemoff</dc:creator>
				<category><![CDATA[HumansAndTech]]></category>

		<guid isPermaLink="false">http://softwareas.com/?p=1607</guid>
		<description><![CDATA["My shelves are empty. The half-dozen Billy Bookcases I bought from Ikea are now little more than scrap. I have burned my books. A bonfire of ideas and ideals." Terence Eden I've entertained the zero-shelf fantasy since I first read e-books and sync'd news on the trusty Handera 330. I stil have it: At the [...]]]></description>
			<content:encoded><![CDATA[<p><em>"My shelves are empty. The half-dozen Billy Bookcases I bought from Ikea are now little more than scrap. I have burned my books. A bonfire of ideas and ideals."</em>
<a href="shkspr.mobi/blog/index.php/2012/03/burning-all-my-books/">Terence Eden</a></p>

<p>I've entertained the zero-shelf fantasy since I first read e-books and <a href="http://en.wikipedia.org/wiki/Plucker">sync'd news</a> on the trusty Handera 330. I stil have it:</p>

<iframe class="imgur-album" width="100%" height="550" frameborder="0" src="http://imgur.com/a/PbVoU/embed"></iframe>

<p><br />
At the time, the content wasn't around and the screen was a bit small to be practical anyway. When the <a href="http://www.teleread.com/library/irex-ebook-reader/">iRex came around</a>, I thought this might be the time. But of course, content remained an issue. But now the time is here. iPad is fantastic for reading and Kindle has all the content. And just last night, Amazon popped up with an announcement that Kindle Touch is here in the UK. I've resisted Kindles up till now. For all their benefits, they look like a bad 1960s sci-fi imagining what life will be like in the year 1979. The keyboard in particular seems completely out-of-place for a device that is primarily about reading. And it's impossible at this point to hold a screen which you can't touch. So the Kindle Touch changes a lot of that and with its battery benefits and (especially after a week of glorious March weather here) working in the sun is a killer app tablets won't beat for some years.</p>

<p>So it's time to make it happen. This week, I'll scan all my books with Delicious Monster or Bookshelved to keep a perpetual record of what I once owned. I'll allow myself to keep 10 books of sentimental or long-lasting value and another 10 which I haven't (fully) read. These lucky 20 will be marked with post-it notes. The rest can stay on the shelf for three months and if I feel the need to keep one of them, I will swap those post-it notes around. And on July 1, 2012, those without post-it notes will be shown no mercy! Well, some mercy ... they can go to a suitable charity.</p>
 <p><a href="http://softwareas.com/?flattrss_redirect&amp;id=1607&amp;md5=e2f048d48a9781425ca82d394d8b99ad" title="Flattr" target="_blank"><img src="http://softwareas.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://softwareas.com/operation-zero-shelf/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=mahemoff&amp;popout=1&amp;url=http%3A%2F%2Fsoftwareas.com%2Foperation-zero-shelf&amp;language=en_GB&amp;category=text&amp;title=Operation+Zero-Shelf&amp;description=%22My+shelves+are+empty.+The+half-dozen+Billy+Bookcases+I+bought+from+Ikea+are+now+little+more+than+scrap.+I+have+burned+my+books.+A+bonfire+of+ideas+and+ideals.%22+Terence...&amp;tags=software%2Chtml5%2Cweb%2Cprogramming" type="text/html" />
	</item>
	</channel>
</rss>

