<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>think pink</title>
    <link>http://blog.elliottkember.com/</link>
    <description>a weblog by Elliott Kember</description>
    <language>en-us</language>
    <item>
      <title>$PATH</title>
      <description>&lt;p&gt;A few weeks ago I had the great pleasure of speaking at &lt;span class="caps"&gt;WDC&lt;/span&gt; 2011. &lt;span class="caps"&gt;WDC&lt;/span&gt; is a great little conference in Bristol, and I have had the pleasure of speaking a few times now. One of the things I advised in my eclectic, meandering talk was to ask people what frameworks they used, and find out why they chose them. A few people have since asked me to elaborate on how I ended up using Rails, so I thought I&amp;#8217;d write up a few thoughts on the frameworks I&amp;#8217;ve used in the past, and what I&#8217;ve learned.&lt;/p&gt;&amp;#x000A;&lt;p&gt;Way back in the day I was an &lt;span class="caps"&gt;HTML&lt;/span&gt;/&lt;span class="caps"&gt;CSS&lt;/span&gt; developer &amp;#8211; cutting and slicing PSDs into workable &lt;span class="caps"&gt;HTML&lt;/span&gt;. I started playing around with &lt;span class="caps"&gt;PHP&lt;/span&gt; when a couple of my friends introduced me to it. include() was the weapon of choice &amp;#8211; imagine how much time I could save by including the same tiny templates everywhere! This was a revelation, and like most of the decisions I&amp;#8217;ve made, closely linked to being lazy.&lt;/p&gt;&amp;#x000A;&lt;p&gt;I think being lazy is a positive attribute for a developer. The lazier you are, the more likely you are to do work to avoid later work. If you find you have to do the same tasks every time you start a new project, for example, you might automate those tasks into a script, saving you loads of time in the long run.&lt;/p&gt;&amp;#x000A;&lt;p&gt;That was why I moved to CodeIgniter when I discovered it. Here was a small framework, without many dependencies, that was easy to get into and fairly straightforward. And it was great. For simple apps, I knew everything that was going on. CodeIgniter saved me loads of time and frustration doing the boring bits.&lt;/p&gt;&amp;#x000A;&lt;p&gt;One day soon after, I saw a friend using Symfony properly, and the sheer power available blew my mind. When I started working with James Mcglinn at &lt;a href="http://eventfinder.co.nz"&gt;Eventfinder&lt;/a&gt;, I discovered that learning Symfony was nothing like learning CodeIgniter. It was hard.&lt;/p&gt;&amp;#x000A;&lt;p&gt;Wherever there&amp;#8217;s magic, there&amp;#8217;s a lot of work involved in learning the rules. A lot of people have told me that they don&amp;#8217;t like the amount of magic that goes on with Rails &amp;#8211; and that&amp;#8217;s fine. But I think it&amp;#8217;s a bit of a silly argument. It&amp;#8217;s like saying there&amp;#8217;s too much magic involved in using cars, and that&amp;#8217;s why you ride a horse. It&amp;#8217;s called magic because it&amp;#8217;s like a magic trick &amp;#8211; it makes something complicated and difficult seem effortless. But a lot of work goes into every magic trick &amp;#8211; and you&amp;#8217;re bound to get it wrong a few times.&lt;/p&gt;&amp;#x000A;&lt;p&gt;When I moved to the UK, I worked for a company with a Rails application. I&amp;#8217;d heard how good Rails was, and how it was swiftly becoming the next big thing, so I wanted to learn it &amp;#8211; and here was a great opportunity. For future reference, never try and learn a language and framework when building on a brand-new application that supports an entire company. That was a bit hair-raising.&lt;/p&gt;&amp;#x000A;&lt;p&gt;Learning Rails was a bit like learning Symfony. All the concepts were still valid, but the implementation was different. Everything that should&amp;#8217;ve been in a certain place was somewhere else. Ruby is a much nicer language than &lt;span class="caps"&gt;PHP&lt;/span&gt;, though, and that makes quite a difference. &lt;span class="caps"&gt;PHP&lt;/span&gt; is a bit slap-dash and inconsistent, and it continues to soldier on in a haphazard fashion. Ruby and Rails, though, are both built with a final product in mind. This was the key difference for me &amp;#8211; Rails seemed to be striving towards a really nice way of doing things, and Ruby provided a really nice language for it. In contrast, Symfony seemed to wrap a framework around the most available language. Both are great, don&amp;#8217;t get me wrong &amp;#8211; but that&amp;#8217;s one thing I prefer about Rails.&lt;/p&gt;&amp;#x000A;&lt;p&gt;The important thing to remember along the way is that &lt;strong&gt;you can do it&lt;/strong&gt;. Other people have learned to do these things, and while they be very smart people they&amp;#8217;re certainly not orders-of-magnitude smarter than you. You&amp;#8217;re perfectly capable of doing it, but you&amp;#8217;re afraid of the unknown. A new language, a new syntax, funny brackets where they shouldn&amp;#8217;t be&amp;#8230; it&amp;#8217;s frightening. You just have to remember that good things take time. You&amp;#8217;re not going to be great overnight, but if you work at it for long enough, it&#8217;s worth the slog in the end.&lt;/p&gt;</description>
      <author>Elliott Kember</author>
      <pubDate>Fri, 11 Nov 2011 15:26:48 +0000</pubDate>
      <link>/posts/17-PATH</link>
      <guid>/posts/17-PATH</guid>
    </item>
    <item>
      <title>Riot and Riot Hack Nights</title>
      <description>&lt;p&gt;@dizzyup and I are very pleased to be able to announce our new co-operative: &lt;a href="http://riothq.com"&gt;Riot&lt;/a&gt;. It&amp;#8217;s been a long time coming, mostly because we&amp;#8217;re equal parts lazy and busy, but we&amp;#8217;ve finally put the site live.&lt;/p&gt;&amp;#x000A;&lt;p&gt;Hector&amp;#8217;s the designer, and I&amp;#8217;m the developer &amp;#8211; and together we&amp;#8217;ll be building lots of cool stuff in the months to come. Stay tuned!&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img src="http://cl.ly/3wSW/Screen_shot_2011-01-09_at_18.43.12.png" style="display: block; margin: 0 auto;"&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;We&amp;#8217;ve also announced the Riot Hack Nights &amp;#8211; a monthly meetup of like-minded geeks in the Bath area. If you&amp;#8217;d like to come along, &lt;span class="caps"&gt;RSVP&lt;/span&gt; to me &lt;a href="http://twitter.com/elliottkember"&gt;on Twitter&lt;/a&gt;. There&amp;#8217;s going to be beer, pizza, and lots of code. Hot, nasty code. Fun times!&lt;/p&gt;</description>
      <author>Elliott Kember</author>
      <pubDate>Sun, 09 Jan 2011 18:42:17 +0000</pubDate>
      <link>/posts/16-RiotandRiotHackNights</link>
      <guid>/posts/16-RiotandRiotHackNights</guid>
    </item>
    <item>
      <title>Fun times with RMagick</title>
      <description>&lt;p&gt;I was bored the other night, so &lt;a href="http://twitter.com/iamdanw"&gt;Dan W&lt;/a&gt; and &lt;a href="http://twitter.com/juliancheal"&gt;Julian&lt;/a&gt; and I had a bit of a hack-night session. Dan was working on &lt;a href="http://doppmaxion.iamdanw.com/"&gt;Doppmaxion&lt;/a&gt;, which looks awesome, and Julian and I took the opportunity to do a little bit of Ruby hacking. What did we get up to, you ask?&lt;/p&gt;&amp;#x000A;&lt;p&gt;Well, if you&amp;#8217;re in a decent browser such as Safari or Chrome, and using a fairly powerful computer, check out &lt;a href="http://elliottkember.com/awesome/bath.html"&gt;this&lt;/a&gt;. It&amp;#8217;s an &lt;span class="caps"&gt;HTML&lt;/span&gt; representation of an image, where by &amp;#8220;&lt;span class="caps"&gt;HTML&lt;/span&gt; representation&amp;#8221; I mean &lt;span class="caps"&gt;HTML&lt;/span&gt;-as-pixels, and by &amp;#8220;an image&amp;#8221;, I mean &amp;#8220;this is such a bad idea it&amp;#8217;s not even funny.&amp;#8221;&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img src="http://cl.ly/153A3x3u3w2p382L0k45/content" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;For a long time, I&amp;#8217;ve toyed with the idea of representing image data using &lt;span class="caps"&gt;HTML&lt;/span&gt; elements, so it was great to really unwind and see what Ruby can do with something like this. RMagick, it so happens, has an each_pixel method &amp;#8211; which you can use to iterate through the pixels of an image. Although we&amp;#8217;re not used to doing this sort of thing in Ruby, it&amp;#8217;s actually not that slow &amp;#8211; I guess it&amp;#8217;s using some ImageMagick cleverness behind the scenes. So I iterated through these pixels and threw them in an array &amp;#8211; then iterated through the array and spat out some &lt;span class="caps"&gt;HTML&lt;/span&gt;, one div per pixel. The result? &lt;em&gt;Pandemonium.&lt;/em&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;Your average browser isn&amp;#8217;t really designed handle this kind of abuse. So I had to make things more efficient somehow. In reality, nothing could make this efficient, but I had to try. So if you run through each pixel, you eventually find that a lot of images have runs of pixels that are all the same colour. For those, we could do a &amp;lt;div style=&amp;#8220;width: Xpx&amp;#8221;&amp;gt; and have one element where we&amp;#8217;d otherwise have X! This is called &lt;a href="http://en.wikipedia.org/wiki/Run-length_encoding"&gt;Run-length encoding&lt;/a&gt;. If I wanted to be extra-smart, I&amp;#8217;d make big square areas of colour into single elements, but that&amp;#8217;s a bit complicated for a one-night hack.&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img src="http://cl.ly/1A0U3c1S3W3I2L0Y193f/content" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;The original idea was actually to represent a whole website like this &amp;#8211; and if you visit &lt;a href="http://elliottkember.com/awesome"&gt;elliottkember.com/awesome&lt;/a&gt; you&amp;#8217;ll see that I was, in fact, successful. This has the advantage of being pixel-perfect in every browser (although I hear Opera doesn&amp;#8217;t do it properly, surprise surprise) &amp;#8211; but the disadvantage of murdering every browser known to man. I was going to put this as my actual site, but thought better of it.&lt;/p&gt;&amp;#x000A;&lt;p&gt;The source &lt;a href="https://github.com/elliottkember/img2html.rb"&gt;is available on GitHub&lt;/a&gt;, on the off-chance that you can think of something useful for this idiocy. Side note: appending to a file every cycle turned out to be much faster than throwing around 11MB strings in Ruby. Take from that what you will.&lt;/p&gt;&amp;#x000A;&lt;p&gt;Anyway, it just goes to show that just because you can do it, and you think it&amp;#8217;s a good idea, sometimes you shouldn&amp;#8217;t &amp;#8211; and sometimes it isn&amp;#8217;t.&lt;/p&gt;</description>
      <author>Elliott Kember</author>
      <pubDate>Tue, 04 Jan 2011 10:11:51 +0000</pubDate>
      <link>/posts/15-FuntimeswithRMagick</link>
      <guid>/posts/15-FuntimeswithRMagick</guid>
    </item>
    <item>
      <title>Your passwords are STILL showing.</title>
      <description>&lt;p&gt;&lt;i&gt;This article was originally &lt;a href="http://thinkvitamin.com/code/firefox-passwords/"&gt;posted&lt;/a&gt; on the Carsonified blog on the 6th of August, 2008, by me. However, it&amp;#8217;s been two years and this is still a problem.&lt;/i&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;A lot of geeks and developers out there are using Mozilla Firefox. It&amp;#8217;s a fantastic browser, and I highly recommend it. Firefox has been a huge factor in the progress of web development. Where would we be without the Web Developer Toolbar and Firebug?&lt;/p&gt;&amp;#x000A;&lt;p&gt;However, there&amp;#8217;s one place you have to be careful using Firefox &amp;#8211; password management. You know the little &amp;#8220;Remember Password&amp;#8221; button you click when you log in? Turns out Firefox doesn&amp;#8217;t mind showing you the passwords you&amp;#8217;ve saved, in plain text. It&amp;#8217;s no secret &amp;#8211; others have previously blogged about it &amp;#8211; but it does bear repeating. This is the default behaviour, so if you haven&amp;#8217;t already spotted this, then chances are it applies to you right now. That means someone unscrupulous can come along and read your passwords. Like this:&lt;/p&gt;&amp;#x000A;&lt;p&gt;First, go into &amp;quot;Preferences in Firefox (on a mac, hit Cmd-,) and head to the Security tab. Then click the Saved Passwords button as shown here:&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img title="Security window in Firefox" alt="Security window in Firefox" src="http://uploads.elliottkember.com//Security-20101220-185003.png" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;This will bring up a Passwords window. I&amp;#8217;m not showing you mine. But look for this button at the bottom right:&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img title="Show Saved Passwords button" alt="Show Saved Passwords button" src="http://carsonified.com/wp-content/uploads/2008/08/saved-passwords.jpg" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;Press this button. Voila! All your passwords are shown, in plain text, on-screen. Please note, my password is &lt;em&gt;not&lt;/em&gt; &lt;a title="Bash.org quote" href="http://t.co/DXWAyTd"&gt;hunter2&lt;/a&gt;.&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img src="http://carsonified.com/wp-content/uploads/2008/08/passwords.png" /&gt;&lt;br /&gt;&amp;#x000A;This means that someone can open up Firefox on your computer, and view all your saved passwords. The way to change this is to set a master password for Firefox. Close that passwords window, and go back to the Security preferences pane. There, you&amp;#8217;ll see an option for &amp;#8220;Use a master password&amp;#8221;.&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img src="http://carsonified.com/wp-content/uploads/2008/08/master_password.png" /&gt;&lt;br /&gt;&amp;#x000A;This means that Firefox protects all your saved passwords with a master password which is never shown. However, get used to seeing this prompt&amp;#8230;&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img title="Master Password prompt" alt="Master Password prompt" src="http://carsonified.com/wp-content/uploads/2008/08/firefox.jpg" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;because it comes up &lt;span class="caps"&gt;ALL&lt;/span&gt; the time when you&amp;#8217;re using password-authenticated sites. Personally, I use &lt;a title="Webkit Nightly Builds" href="http://nightly.webkit.org/"&gt;Webkit nightly builds&lt;/a&gt; for everyday browsing: they`re extremely fast and stable.&lt;/p&gt;&amp;#x000A;&lt;p&gt;This has been a part of Firefox since forever. Maybe one day they&amp;#8217;ll fix it. For now, it&amp;#8217;s still just a &lt;strong&gt;giant security nightmare&lt;/strong&gt;.&lt;/p&gt;</description>
      <author>Elliott Kember</author>
      <pubDate>Sat, 18 Dec 2010 23:41:47 +0000</pubDate>
      <link>/posts/14-YourpasswordsareSTILLshowing</link>
      <guid>/posts/14-YourpasswordsareSTILLshowing</guid>
    </item>
    <item>
      <title>Hot Potato!</title>
      <description>&lt;p&gt;&lt;a href="http://twitter.com/dizzyup"&gt;Hector&lt;/a&gt; and I have been busy &amp;#8211; check out what we made the other day: it&amp;#8217;s a game of &lt;a href="http://hotpotato.heroku.com"&gt;Hot Potato!&lt;/a&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img style="width: 100%; max-width: 618px" src="http://uploads.elliottkember.com/%40dizzyup_has_the_potato%21-20101014-134612.png" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;It&amp;#8217;s a quick and dirty, one-day fun app.&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img style="width: 100%; max-width: 648px;" src="http://uploads.elliottkember.com/%40elliottkember_has_the_potato%21-20101014-134524.png" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;This uses the refresh code featured in the previous post, &lt;a href="http://blog.elliottkember.com/posts/12-Checkthisout"&gt;Check This Out.&lt;/a&gt; It&amp;#8217;s very simple, and very crude &amp;#8211; but it only took 12 hours to make.&lt;/p&gt;&amp;#x000A;&lt;p&gt;Of course, there are more efficient ways to write interactive, low-latency web apps than by refreshing the whole page every four seconds. But the problem is, efficiency takes more time. The more bandwidth you want to save, the more work you have to do. I&amp;#8217;ve got Node.js and socket.io, you&amp;#8217;ve got Juggernaut or Socky, I could even just return a &lt;span class="caps"&gt;JSON&lt;/span&gt; feed that only returns the necessary data, and render that. Now that the app&amp;#8217;s built, I can use whichever technology I like &amp;#8211; &lt;em&gt;when&lt;/em&gt; I feel like making it faster.&lt;/p&gt;&amp;#x000A;&lt;p&gt;The app runs on Heroku, though &amp;#8211; so an hour&amp;#8217;s good performance is only a couple of clicks and a couple of dollars away. For such a trivial app, what&amp;#8217;s the point in adding sockets? I&amp;#8217;m not paying for traffic, or setting up more servers, or anything. I just want it to be as quick to build as possible.&lt;/p&gt;&amp;#x000A;&lt;p&gt;It&amp;#8217;s premature optimisation all over again &amp;#8211; if it works the ugly way, go from there. Recently, I built a mobile drawing application for an art installation. For technical reasons, we had to draw into a canvas element, on a Nokia N900 phone. This meant installing browsers, trying plugins, trying javascript, trying sockets, xhr-multipart, polling&amp;#8230; the lot. It all worked fine in the office, and it all worked fine in Soho &amp;#8211; but none of that shit worked over 3G. What worked? Doing a big poll every 4 seconds. That was robust enough to either make the request properly, or fail and try again later. Sometimes that&amp;#8217;s all you need.&lt;/p&gt;&amp;#x000A;&lt;p&gt;I wouldn&amp;#8217;t recommend this approach if you expected to get any traffic, or if you had a budget or a timeframe &amp;#8211; but sometimes it&amp;#8217;s great to just make it work. When it comes down to it, the end-user can&amp;#8217;t tell the difference. At an early stage, or with a small product, you&amp;#8217;ve got much more important things to think about than performance.&lt;/p&gt;</description>
      <author>Elliott Kember</author>
      <pubDate>Thu, 14 Oct 2010 12:58:13 +0000</pubDate>
      <link>/posts/13-HotPotato</link>
      <guid>/posts/13-HotPotato</guid>
    </item>
    <item>
      <title>Check this out!</title>
      <description>&lt;p&gt;Here&amp;#8217;s some code I posted on Forrst a while back.&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img style="max-width: 525px; width: 100%" src="http://uploads.elliottkember.com/Refresh_elements_on_a_page%2C_really_easily._-_Some_code_by_elliottkember_-_Forrst-20101014-130224.png" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;There&amp;#8217;s an error with this code. Where it says&lt;/p&gt;&amp;#x000A;&lt;pre&gt;    $(this).html()&amp;#x000A;&lt;/pre&gt;&amp;#x000A;&lt;p&gt;&lt;br /&gt;&amp;#x000A;I meant to write&lt;/p&gt;&amp;#x000A;&lt;pre&gt;    $(this).html(html)&amp;#x000A;&lt;/pre&gt;&amp;#x000A;&lt;p&gt;&lt;br /&gt;&amp;#x000A;Four little characters &amp;#8211; but they make the difference between this snippet working, and failing miserably. It was an honest mistake, and it&amp;#8217;s fixed now &amp;#8211; but nobody picked up on it. That code sat there for weeks. There&amp;#8217;s a worse aspect to this, though. Check &lt;a href="http://www.beenasked.com/q/SEJtCd7p/Refactoring-jQuery-Function.html"&gt;this&lt;/a&gt; out. Here&amp;#8217;s a screenshot, in case that disappears:&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img src="http://uploads.elliottkember.com/Refactoring_jQuery_Function_-_BeenAsked.com-20101014-125832.png" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;Someone has taken my code, pasted it into a forum, and asked people to refactor it. This is actually the second version of this that I&amp;#8217;ve found &amp;#8211; unfortunately the other one was deleted from the original site, and unfortunately the Google Cache too. The original question was worded exactly the same, posted on a different forum, and had an answer that said &amp;#8220;The line $(this).html() seems unnecessary.&amp;#8221; &amp;#8211; which, I guess, is technically correct. Sure enough, someone posted a comment on the original Forrst page shortly after, omitting that line:&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img style="width: 100%; max-width: 728px" src="http://uploads.elliottkember.com/Refresh_elements_on_a_page%2C_really_easily._-_Some_code_by_elliottkember_-_Forrst-20101014-130119.png"&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;That doesn&amp;#8217;t work &amp;#8211; that&amp;#8217;s even worse than my original code! This guy has taken my code, copied it into a forum, asked whether it can be refactored, and then come back with his &amp;#8220;refactored&amp;#8221; code. That&amp;#8217;s awful. I bet this happens all over the show. Have any of you seen this?&lt;/p&gt;&amp;#x000A;&lt;p&gt;However &amp;#8211; none of this actually matters. As it turns out, I didn&amp;#8217;t look closely enough. There&amp;#8217;s another error.&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img style="width: 100%; max-width: 684px" src="http://uploads.elliottkember.com/Posts_from_you_-_Forrst-20101014-125655.png" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;This is one of my problems with sharing code online &amp;#8211; you can publish any old shit and people will love it. In this case, the premise is there &amp;#8211; but it&amp;#8217;s still wrong. If you&amp;#8217;re sharing code online, turns out you don&amp;#8217;t have to make it work to get a whole bunch of likes. Is that bad? I would certainly make the case that the concept of how this code works is really important &amp;#8211; looking at the way it loops. In a sense, reading it as pseudocode is probably a pretty good idea.&lt;/p&gt;</description>
      <author>Elliott Kember</author>
      <pubDate>Thu, 14 Oct 2010 12:44:13 +0000</pubDate>
      <link>/posts/12-Checkthisout</link>
      <guid>/posts/12-Checkthisout</guid>
    </item>
    <item>
      <title>Infinitely customizable</title>
      <description>&lt;p&gt;As far as I can tell, one of the Apple standpoints is minimizing configuration. Having a single way of doing things is baked-in &amp;#8211; you can only resize from one corner, you can only close a window from the red X button, and you can&amp;#8217;t customize your system and make it totally different from all the others.&lt;/p&gt;&amp;#x000A;&lt;p&gt;I love this simplicity. Removing the ability to mess with things forces me to get on with the things I should be doing. It takes a lot more work to perfect, but there&amp;#8217;s huge value in selling a workflow rather than a workflow platform.&lt;/p&gt;&amp;#x000A;&lt;p&gt;As long as we&amp;#8217;re concentrating on details, we might as well be removing unnecessary options. One option that struck me as unnecessary today was in Tweetdeck on the iPad. Perhaps it&amp;#8217;s a petty criticism of an otherwise excellent app &amp;#8211; but I really don&amp;#8217;t feel the need to be able to customize my refresh times down to the second.&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img src="http://uploads.elliottkember.com/photo.PNG-20100530-124321.png"&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;What unnecessary options have you seen lately?&lt;/p&gt;</description>
      <author>Elliott Kember</author>
      <pubDate>Sun, 30 May 2010 11:51:44 +0000</pubDate>
      <link>/posts/11-Infinitelycustomizable</link>
      <guid>/posts/11-Infinitelycustomizable</guid>
    </item>
    <item>
      <title>Lucida Grande and the Web Inspector</title>
      <description>&lt;p&gt;I love the &lt;a href="http://webkit.org/blog/1091/more-web-inspector-updates/"&gt;new functionality&lt;/a&gt; in the &lt;a href="http://nightly.webkit.org/"&gt;WebKit Nightly builds&lt;/a&gt;. The nightlies are a great platform &amp;#8211; very fast, usually pretty reliable, and super-CSS3-compatible.&lt;/p&gt;&amp;#x000A;&lt;p&gt;However, recently the typeface used in the nightly web inspector has changed from Lucida Grande to Menlo. I understand the change, and that Menlo is a monospace font &amp;#8211; but I just can&amp;#8217;t help thinking Menlo&amp;#8217;s kinda ugly for this.&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img style="margin-left: -30px; width: 100%; max-width: 816px;" src="http://uploads.elliottkember.com/Web_Inspector_%E2%80%94_http__elliottkember.com_-20100415-174041.png" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;However, I&amp;#8217;ve figured out how to change it back. Now my web inspector looks like this:&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img  style="margin-left: -30px; width: 100%;  max-width: 816px" src="http://uploads.elliottkember.com/Web_Inspector_%E2%80%94_http__elliottkember.com_-20100415-173953.png" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;Much nicer! If you want to do the same, here&amp;#8217;s what you have to do.&lt;/p&gt;&amp;#x000A;&lt;p&gt;Open up the file &lt;em&gt;/Applications/WebKit.app/Contents/Frameworks/10.6/WebCore.framework/Versions/A/Resources/inspector/inspector.css&lt;/em&gt; as an administrator, and add this to the end of the file:&lt;/p&gt;&amp;#x000A;&lt;script src="http://gist.github.com/367329.js?file=gistfile1.css"&gt;&lt;/script&gt;&lt;p&gt;Yay!&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;strong&gt;Edit: Now that Safari 5 has launched, the file to append to is /System/Library/Frameworks/WebKit.framework/Versions/A/Frameworks/WebCore.framework/Versions/A/Resources/inspector/inspector.css&lt;/strong&gt;&lt;/p&gt;</description>
      <author>Elliott Kember</author>
      <pubDate>Thu, 15 Apr 2010 16:46:43 +0000</pubDate>
      <link>/posts/10-LucidaGrandeandtheWebInspector</link>
      <guid>/posts/10-LucidaGrandeandtheWebInspector</guid>
    </item>
    <item>
      <title>I love the approval process.</title>
      <description>&lt;p&gt;There&amp;#8217;s been a lot of hate for the App store approval process over the past&amp;#8230; well, ever since the App Store surfaced. It seems like anybody who has ever touched the &lt;span class="caps"&gt;SDK&lt;/span&gt; has a bad word to say about the draconian Apple iron curtain. The iPad&amp;#8217;s recent release has incited similar levels vitriol &amp;#8211; it&amp;#8217;s closed, Apple is taking over the world, blah blah.&lt;/p&gt;&amp;#x000A;&lt;p&gt;Apple seems to be blocking applications that duplicate native iPhone apps, applications that use Apple imagery, logos or trademarks, and apps that are offensive. I can see how some of this might be frustrating &lt;i&gt;for someone who hasn&amp;#8217;t read the documentation properly before they start working&lt;/i&gt;. I kid, I kid! I&amp;#8217;m sure it comes as a nasty surprise.&lt;/p&gt;&amp;#x000A;&lt;p&gt;This isn&amp;#8217;t the only reason behind the approval process. In fact, I don&amp;#8217;t think it&amp;#8217;s even the main reason behind the approval process. One reason is to protect Apple&amp;#8217;s &lt;s&gt;patents&lt;/s&gt; trademarks. You can bitch and moan about this one if you want, but it&amp;#8217;s fairly standard. If people have your image on their stuff, your brand is vulnerable. You don&amp;#8217;t want to go down this route; Apple has a big legal team, and you are not a lawyer.&lt;/p&gt;&amp;#x000A;&lt;p&gt;But I digress; the other reason is that Apple checks every application to make sure it works. By &amp;#8220;works&amp;#8221;, I mean: it opens, runs, and doesn&amp;#8217;t crash too badly. If it&amp;#8217;s a game, it doesn&amp;#8217;t have to actually be any good &amp;#8211; but at least it works and is playable by anybody who owns an iPhone or iPod Touch.&lt;/p&gt;&amp;#x000A;&lt;p&gt;Remember that we are not the average user. Just like the iPad, the iPhone is also targeted at end-users. The end user doesn&amp;#8217;t understand bugs, or approval processes. They understand works, and doesn&amp;#8217;t-work. If something doesn&amp;#8217;t-work, it instantly tarnishes the device. The shine is gone, the thin veneer of novelty wears away, and the dirty, buggy reality is revealed. You can watch it happen. In effect, they&amp;#8217;re screening applications for suckiness.&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img src="http://elliottkember.com/uploads/ferris_bueller_maitre-d-chez-jonathan-schmock.JPG.jpeg-20100131-171125.png" title="I'm suggesting that you leave before I have to get snooty." /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;So why do I love the approval process? Because it means that every application is tested and approved by Apple before I can buy it. I like to think of it as though Apple is the &lt;i&gt;Ma&#238;tre d&amp;#8217;&lt;/i&gt; of a fancy, expensive restaurant, tasting every dish before allowing it to be sold to his customers. The more picky he is, the better the food will have to be.&lt;/p&gt;&amp;#x000A;&lt;p&gt;Before I spend my hard-earned bling on a game, or an app, I want to know that it works properly. I want to know that somebody at Apple has tried the damn thing. Apple is actually making itself responsible for the user&amp;#8217;s experience on the phone, whether on third-, second- or first-party applications. Can you imagine the kind of shit you&amp;#8217;d be able to buy if they opened the floodgates and let any old developer release any old crap onto the App Store? There&amp;#8217;s a store icon on the homepage of the phone, for heaven&amp;#8217;s sake.&lt;/p&gt;&amp;#x000A;&lt;p&gt;I guess the bottom line is that the people who benefit from the process are the ones who know nothing about it &amp;#8211; the end-user &amp;#8211; and so they never say anything about it.  That means that all we hear about are the developers&amp;#8217; stories &amp;#8211; and at that, only the negative ones. This selection bias is why the approval process has such a bad reputation. The poor thing needs a friend. Look, I&amp;#8217;m sure you&amp;#8217;ve had a bad experience with the App Store&amp;#8217;s approval process, but try and remember us, the end-users. We love your apps, and we love our iPhones. The process isn&amp;#8217;t perfect, I&amp;#8217;m sure, but it&amp;#8217;s there for a reason.&lt;/p&gt;&amp;#x000A;&lt;p&gt;I am an iPhone end-user, and I love the approval process.&lt;/p&gt;&amp;#x000A;&lt;p&gt;(I was going to write an article about the iPad, but there are way too many already.)&lt;/p&gt;</description>
      <author>Elliott Kember</author>
      <pubDate>Sun, 31 Jan 2010 17:42:48 +0000</pubDate>
      <link>/posts/9-Ilovetheapprovalprocess</link>
      <guid>/posts/9-Ilovetheapprovalprocess</guid>
    </item>
    <item>
      <title>On Failure</title>
      <description>&lt;p&gt;I&amp;#8217;ve recently been playing around with monetizing one of my applications: Filetweet. It&amp;#8217;s a fairly simple application, designed to allow you to send files over Twitter. You may have seen it; some of you may have even used it.&lt;/p&gt;&amp;#x000A;&lt;p&gt;It&amp;#8217;s the first application I&amp;#8217;ve built that I&amp;#8217;ve tried to charge for &amp;#8211; as an experiment. Using the excellent Spreedly service, and the not-quite-so-excellent PayPal merchant gateway service, it&amp;#8217;s really easy to start taking money on a monthly basis. The only problem is, nobody is paying. I don&amp;#8217;t think anybody will ever pay. It&amp;#8217;s just not that viable a system for people to spend &#163;5 / month on. There are probably even other services that fill the same gap.&lt;/p&gt;&amp;#x000A;&lt;p&gt;But you know what? That&amp;#8217;s okay. I don&amp;#8217;t really mind if I don&amp;#8217;t make any money on Filetweet. It&amp;#8217;s supposed to be an experiment, which means that it will most probably fail.&lt;/p&gt;&amp;#x000A;&lt;p&gt;One problem with this ultimatum is that I&amp;#8217;ve used the wrong terminology. To &amp;#8220;fail&amp;#8221; is generally to experience no growth &amp;#8211; failing to establish a user base, generating no profit, and not really fixing a problem are good general indicators of failure, and reasonably apt descriptions of Filetweet.&lt;/p&gt;&amp;#x000A;&lt;p&gt;However, I think this terminology is wrong. It&amp;#8217;s very depressing to fail, even when you&amp;#8217;re expecting it. Every application I build, I secretly hope that it will be the next Basecamp. Can this repeated &amp;#8220;failure&amp;#8221; be any good for morale? I don&amp;#8217;t think so &amp;#8211; and I think my own point of view is to blame.&lt;/p&gt;&amp;#x000A;&lt;p&gt;Perhaps on paper the project is a loss &amp;#8211; but intangibly it&amp;#8217;s a victory. It&amp;#8217;s like, the opposite of a Pyrrhic victory, if there&amp;#8217;s a name for that. The problem is, everybody tries to get things right the first time. There&amp;#8217;s no margin for error. Every time you do something new, you&amp;#8217;re trying to do it right &amp;#8211; which is absurd.&lt;/p&gt;&amp;#x000A;&lt;p&gt;As developers, in code, we prototype all the time: create a small, off-master experiment branch and try something out. Sometimes it works, but very often it doesn&amp;#8217;t, and usually it&amp;#8217;s never folded into the main branch, at least without some refactoring.&lt;/p&gt;&amp;#x000A;&lt;p&gt;Why is it, then, that we place so much stigma on &amp;#8220;failure&amp;#8221; and &amp;#8220;success&amp;#8221; with individual business ventures, when so little is placed on the success or failure of individual parts of our code? I think the only way to fail from a project is to come away with nothing. If you learn anything, improve at anything, or streamline your development process, you&amp;#8217;ve achieved something.&lt;/p&gt;&amp;#x000A;&lt;p&gt;%h3 The Juice and the Squeeze&lt;/p&gt;&amp;#x000A;&lt;p&gt;If the project were to succeed, would the payoff be worth the cost of failure? In ruby:&lt;/p&gt;&amp;#x000A;&lt;pre&gt;&amp;#x000A;  def valid?&amp;#x000A;    return (failure.cost * failure.probability) &amp;gt; (reward - costs)&amp;#x000A;  end&amp;#x000A;  &amp;#x000A;&lt;/pre&gt;&amp;#x000A;&lt;p&gt;Of course, it&amp;#8217;s not that simple. Knowing the true cost of failure, and the true probability of failure, is a very difficult art. There are, however, several things you can take into consideration:&lt;/p&gt;&amp;#x000A;&lt;p&gt;&#8226; Amount of maintenance required&lt;br /&gt;&amp;#x000A;&#8226; Any ongoing costs (hosting)&lt;br /&gt;&amp;#x000A;&#8226; Possibility of future feature requirements&lt;br /&gt;&amp;#x000A;&#8226;&#160;Complexity of the application&lt;/p&gt;&amp;#x000A;&lt;p&gt;- all of which will add to the cost of either success or failure.&lt;/p&gt;&amp;#x000A;&lt;p&gt;In Filetweet&amp;#8217;s case, the answers are easy: not much maintenance, S3 means very little ongoing cost, feature requests are unlikely, and the application is not very complex at all. In actual fact, if this rings true &amp;#8211; if the hard work involved is not very high, you might just be wasting your time trying to achieve success. Why?&lt;/p&gt;&amp;#x000A;&lt;h3&gt;Risk == reward&lt;/h3&gt;&amp;#x000A;&lt;p&gt;This is where it gets difficult. The more you put into something, and the more you stand to lose, the more you generally stand to gain. Conversely, it&amp;#8217;s harder to risk nothing and hope to achieve everything.&lt;/p&gt;&amp;#x000A;&lt;p&gt;But we&amp;#8217;ve strayed from the original point of this article &amp;#8211; the flawed concept of success. If we&amp;#8217;re redefining success, we have to look at that formula again.&lt;/p&gt;&amp;#x000A;&lt;pre&gt;&amp;#x000A;  def valid?&amp;#x000A;    failure = (failure.cost * failure.probability) &amp;#x000A;    tangible_success = reward.tangibles - costs.tangibles&amp;#x000A;    intangible_success = reward.intangibles - costs.intangibles&amp;#x000A;    success = reward.intangibles + reward.tangibles - costs.tangibles - costs.intangibles&amp;#x000A;    return success &amp;gt; failure&amp;#x000A;  end&amp;#x000A;  &amp;#x000A;&lt;/pre&gt;&amp;#x000A;&lt;p&gt;Even harder &amp;#8211; since the intangible rewards are completely subjective. Intangible costs are generally your time, your sanity, and your hard work. The only way to really make this equation easier for ourselves is to do one of two things:&lt;/p&gt;&amp;#x000A;&lt;p&gt;&#8226; Reduce the probability of failure, or&lt;br /&gt;&amp;#x000A;&#8226; Reduce the cost of failure, or&lt;br /&gt;&amp;#x000A;&#8226;&#160;Reduce the amount of time and effort you expend&lt;/p&gt;&amp;#x000A;&lt;p&gt;Or,&lt;/p&gt;&amp;#x000A;&lt;p&gt;&#8226; Don&amp;#8217;t fail, or&lt;br /&gt;&amp;#x000A;&#8226; Fail cheaply, or&lt;br /&gt;&amp;#x000A;&#8226; Fail quickly&lt;/p&gt;&amp;#x000A;&lt;h3&gt;Fail cheaply and quickly&lt;/h3&gt;&amp;#x000A;&lt;p&gt;This point is the crux of this article. With today&amp;#8217;s range of scalable hosting services &amp;#8211; like EC2, and Heroku &amp;#8211; and the number of &lt;span class="caps"&gt;VPS&lt;/span&gt; providers around &amp;#8211; &lt;span class="caps"&gt;VPS&lt;/span&gt;.&lt;span class="caps"&gt;NET&lt;/span&gt;, Linode &amp;#8211; you can really afford to fail cheaply. &amp;#8220;Failure&amp;#8221; in the commercial sense is immensely valuable &amp;#8211; as far as I&amp;#8217;m concerned, it&amp;#8217;s the real shortcut to success. Any developer will tell you that learning from your mistakes is immensely valuable.&lt;/p&gt;&amp;#x000A;&lt;p&gt;After I finished writing this article, I came across &lt;a href="http://www.whattofix.com/blog/archives/2010/01/you-will-fail.php"&gt;this&lt;/a&gt;, entitled &amp;#8220;You will fail&amp;#8221;. It&amp;#8217;s a great article, and I think it expresses what I want to say. I guess what I&amp;#8217;m doing is just pre-empting the inevitable.&lt;/p&gt;&amp;#x000A;&lt;p&gt;Prototype rapidly, and fail cheaply and quickly, so when you&amp;#8217;re ready to risk everything, you know what &lt;i&gt;not&lt;/i&gt; to do.&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;em&gt;If you have a good story about any of the failures you&amp;#8217;ve been a part of, I&amp;#8217;d love to read about them in the comments. You&amp;#8217;ll have to &lt;a href="/login"&gt;log in with Twitter&lt;/a&gt;.&lt;/p&gt;</description>
      <author>Elliott Kember</author>
      <pubDate>Sun, 03 Jan 2010 10:50:51 +0000</pubDate>
      <link>/posts/8-OnFailure</link>
      <guid>/posts/8-OnFailure</guid>
    </item>
    <item>
      <title>You'll never get what you want. </title>
      <description>&lt;p&gt;People sometimes ask me &amp;#8220;How can I get good at programming?&amp;#8221; &amp;#8220;How can I get really good at Javascript?&amp;#8221; The sad thing is, I don&amp;#8217;t bother answering these questions any more. What inevitably happens is, I give people a list of things to read and try out, then come back 6 months later to find them in exactly the same spot. So what&amp;#8217;s going wrong here? I think they&amp;#8217;re after the wrong thing.&lt;/p&gt;&amp;#x000A;&lt;p&gt;The problem here is that they know what they want to &lt;strong&gt;be&lt;/strong&gt;, not what they want to &lt;strong&gt;do&lt;/strong&gt;. The reason this is important is because there&amp;#8217;s only one answer to these kinds of questions. Work hard at it. Do lots and lots of it. Do it every day. Do so much of it that it starts to affect you. The funny part is, by really enjoying what you&amp;#8217;re doing, you inevitably get good at it. As they say, &lt;em&gt;practice makes perfect&lt;/em&gt;. If you want to be a famous guitarist, you have to play and play and play guitar until your fingers bleed. Like Mr Olympia Ronnie Coleman says, &amp;#8220;Everybody wanna be a bodybuilder; ain&amp;#8217;t nobody wanna lift this heavy-ass weight!&amp;#8221; You can&amp;#8217;t really disagree with someone who uses 200-pound dumbbells.&lt;/p&gt;&amp;#x000A;&lt;p&gt;At student conferences, people ask what they should do once they&amp;#8217;ve finished University. Unfortunately, the best answers I can give are:&lt;/p&gt;&amp;#x000A;&lt;h3&gt;Don&amp;#8217;t ask for too much money&lt;/h3&gt;&amp;#x000A;&lt;p&gt;There are loads of people coming out of Uni expecting a &#163;38k salary. You can get it, but it won&amp;#8217;t do you any favours. Either you&amp;#8217;ll be unqualified for the job, or you won&amp;#8217;t have anyone to learn from. Seriously, take a pay cut, for a year, and work hard under someone who&amp;#8217;s way, way better than you. It&amp;#8217;s kinda like an internship &amp;#8211; you won&amp;#8217;t get rich, but you&amp;#8217;ll be better off for it. Plus, money is useful, but ultimately it&amp;#8217;s bullshit. I&amp;#8217;ve been wealthy and miserable, and I&amp;#8217;ve been broke and happy. Key words here: &amp;#8220;Shared accommodation.&amp;#8221;&lt;/p&gt;&amp;#x000A;&lt;h3&gt;Take your time&lt;/h3&gt;&amp;#x000A;&lt;p&gt;Even when you&amp;#8217;re blasting through a prototype, and you can get it done in a day, there&amp;#8217;s still time to sit back and just think about it. In a way, rapid prototyping tools fail us here, because they encourage diving straight into development too early &amp;#8211; especially when the whole team consists of one developer. Unfortunately, our brains don&amp;#8217;t work that way, and you&amp;#8217;re destined to forget something. I built a project recently which I nearly put live before I realised it didn&amp;#8217;t actually have any navigation. Everything worked, but there were no links to get from place to place. I was rushing. Not only that &amp;#8211; you never know where and when your ideas are going to come from. If you proceed slowly, I&amp;#8217;ll bet you anything you have more ideas during development that you can then integrate, which is far better than tearing your whole application apart later on. Key words here: &amp;#8220;Make haste slowly.&amp;#8221;&lt;/p&gt;&amp;#x000A;&lt;h3&gt;Your code sucks.&lt;/h3&gt;&amp;#x000A;&lt;p&gt;If you think you&amp;#8217;re a genius, that&amp;#8217;s great. But you&amp;#8217;re not. Even if you are, realise that you aren&amp;#8217;t. Even if you actually are, keep it to yourself. Key words here: &amp;#8220;Show, don&amp;#8217;t tell.&amp;#8221;&lt;/p&gt;&amp;#x000A;&lt;h3&gt;All code sucks.&lt;/h3&gt;&amp;#x000A;&lt;p&gt;The corollary to the previous point, this idea is meant to remind you that opening your source code is not the same as showing off your faults. The cool thing about the open-source community is that it&amp;#8217;s helpful, not critical. If your code has some bits you don&amp;#8217;t get, politely ask for help.&lt;/p&gt;&amp;#x000A;&lt;h3&gt;Enjoy it. &lt;/h3&gt;&amp;#x000A;&lt;p&gt;There&amp;#8217;s no substitute for really enjoying what you do. You&amp;#8217;ll be more productive, and people will want to work with you. Don&amp;#8217;t complain about what other people are doing wrong, fix it. Try not to be negative about people, or code. If there&amp;#8217;s one thing that&amp;#8217;s certain in this industry, it&amp;#8217;s that you&amp;#8217;ll have to fix stuff you don&amp;#8217;t like. So get used to it, and learn to enjoy it. Key words here: None. You&amp;#8217;re getting paid to fuck around with computers. It&amp;#8217;s awesome, and if you don&amp;#8217;t like that, then you should do something else for a living.&lt;/p&gt;&amp;#x000A;&lt;h3&gt;Fix other people&amp;#8217;s problems.&lt;/h3&gt;&amp;#x000A;&lt;p&gt;This is a business model in itself. Learn to enjoy solving other people&amp;#8217;s problems. Notice how they react when you solve something, or when you give them something they can enjoy using &amp;#8211; it&amp;#8217;s really, really rewarding. Don&amp;#8217;t get into tech support, though. Key words here: I&amp;#8217;m trying to spin programming as altruistic.&lt;/p&gt;&amp;#x000A;&lt;p&gt;Like I said, there&amp;#8217;s no easy route. If you&amp;#8217;re looking for the quick way to be well-known, or to be really good, or whatever &amp;#8211; you&amp;#8217;re looking for the wrong thing. Look for whatever makes you happy today, and tomorrow &lt;i&gt;und so weiter&lt;/i&gt;. That&amp;#8217;s what you should do.&lt;/p&gt;&amp;#x000A;&lt;p&gt;Long story short, do what you enjoy. Do it lots and lots. You&amp;#8217;ll get better at it. There&amp;#8217;s no easy way to success.&lt;/p&gt;</description>
      <author>Elliott Kember</author>
      <pubDate>Sun, 29 Nov 2009 14:22:14 +0000</pubDate>
      <link>/posts/7-Youllnevergetwhatyouwant</link>
      <guid>/posts/7-Youllnevergetwhatyouwant</guid>
    </item>
    <item>
      <title>Highlights of Buildconf</title>
      <description>&lt;p&gt;I&amp;#8217;ve been at Buildconf for the last two days. It was one of the best conferences I&amp;#8217;ve been to. So instead of writing a whole bunch of tweets, which would be annoying, I&amp;#8217;ve decided to write a blog post with a list. To make it interesting, count up the number of points you can identify with and leave your score in the comments.&lt;/p&gt;&amp;#x000A;&lt;ul&gt;&amp;#x000A;	&lt;li&gt;Finding out &lt;a href="http://www.flickr.com/photos/keithbelfast/4078592710/in/set-72157622613762217/"&gt;how to open bananas&lt;/a&gt;&lt;/li&gt;&amp;#x000A;	&lt;li&gt;Andy Budd getting his kit off to the Flight of the Conchords.&lt;/li&gt;&amp;#x000A;	&lt;li&gt;Wilson Miner showing us what Keynote can really do&lt;/li&gt;&amp;#x000A;	&lt;li&gt;Tim Van Damme dragging us to the waterfront to collect a Gowalla badge.&lt;/li&gt;&amp;#x000A;	&lt;li&gt;On that note, Gowalla. Seriously, I had to delete this shit before it got the better of me.&lt;/li&gt;&amp;#x000A;	&lt;li&gt;For the first time in history, the bar closed before the tab ran out&lt;/li&gt;&amp;#x000A;	&lt;li&gt;&lt;a href="http://www.flickr.com/photos/paddydonnelly/4080606091/"&gt;An Ulster Fry&lt;/a&gt;&lt;/li&gt;&amp;#x000A;	&lt;li&gt;@itsdavidhughes didn&amp;#8217;t get kicked out this time&lt;/li&gt;&amp;#x000A;	&lt;li&gt;&lt;a href="http://www.flickr.com/photos/keithbelfast/4077858071/"&gt;Eric Meyer.&lt;/a&gt;&lt;/li&gt;&amp;#x000A;	&lt;li&gt;Tim Van Damme is &lt;a href="http://www.youtube.com/watch?v=B6j3mY-qCXU"&gt;Ballmer insane&lt;/a&gt;&lt;/li&gt;&amp;#x000A;	&lt;li&gt;&amp;#8220;There were some cute girls here, and then we told them what we do for a living.&amp;#8221; #webconference #afterparty &amp;#8211; &lt;a href="https://twitter.com/elliottkember/status/5465959933"&gt;#&lt;/a&gt;&lt;/li&gt;&amp;#x000A;	&lt;li&gt;Belfast museum&amp;#8217;s giant deer.&lt;/li&gt;&amp;#x000A;	&lt;li&gt;Interesting and in-depth conversations with people who have no idea who you are&lt;/li&gt;&amp;#x000A;	&lt;li&gt;Guinness in Ireland is the best&lt;/li&gt;&amp;#x000A;	&lt;li&gt;The amazing, gravity-defying, impact-resistant laptop.&lt;/li&gt;&amp;#x000A;	&lt;li&gt;Late-night birthday Jager-bombs with @Fehler&lt;/li&gt;&amp;#x000A;	&lt;li&gt;A rough sketch of Tim Van Damme&lt;/li&gt;&amp;#x000A;	&lt;li&gt;There&amp;#8217;s a reason Harp beer is free.&lt;/li&gt;&amp;#x000A;	&lt;li&gt;&lt;a href="http://www.flickr.com/photos/designbyfront/4081096046/"&gt;Nicklas&amp;#8217; Moustache&lt;/a&gt; Bonus points: Niklas&amp;#8217;s Wild Man Moustache Wax.&lt;/li&gt;&amp;#x000A;	&lt;li&gt;&lt;a href="http://www.flickr.com/photos/designbyfront/4080339045/"&gt;You need a silly hat&lt;/a&gt;&lt;/li&gt;&amp;#x000A;	&lt;li&gt;Wanting, and yet not getting, a Build t-shirt.&lt;/li&gt;&amp;#x000A;	&lt;li&gt;&lt;a href="http://www.flickr.com/photos/keithbelfast/4078605698/sizes/l/"&gt;Politics in the Speakers&amp;#8217; Club&lt;/a&gt;&lt;/li&gt;&amp;#x000A;&lt;/ul&gt;&amp;#x000A;&lt;p&gt;All in all, &lt;a href="http://search.twitter.com/search?q=buildconf"&gt;#buildconf&lt;/a&gt; was pretty much the most rewarding conference I&amp;#8217;ve been to in a while &amp;#8211; buy your ticket for 2010. What other ones were there? 5 extra bonus points if yours gets on the list.&lt;/p&gt;</description>
      <author>Elliott Kember</author>
      <pubDate>Sat, 07 Nov 2009 14:30:02 +0000</pubDate>
      <link>/posts/6-HighlightsofBuildconf</link>
      <guid>/posts/6-HighlightsofBuildconf</guid>
    </item>
    <item>
      <title>Announcing Chatrbox</title>
      <description>&lt;p&gt;&lt;img src="http://farm3.static.flickr.com/2650/3980591632_4116a852d4_m.jpg" alt="" /&gt;As you all may have noticed, I&amp;#8217;ve been playing around with some cool live-action stuff. At &lt;span class="caps"&gt;FOWA&lt;/span&gt; London, I built a &lt;a href="http://www.flickr.com/photos/chegs/3978563242/"&gt;live Twitter feed&lt;/a&gt;. The original idea was to build an app to complement &lt;a href="http://hello.carsonified.com"&gt;HelloApp&lt;/a&gt;, a .&lt;span class="caps"&gt;NET&lt;/span&gt; site built by Carsonified for the &lt;span class="caps"&gt;FOWA&lt;/span&gt; conference. I was planning on using standard every-day Twitter polling to get the tweets from attendees, to get a &amp;#8220;real-time feed&amp;#8221; of the &lt;span class="caps"&gt;FOWA&lt;/span&gt; tweets. Along the way, I discovered two things; One: the Twitter Streaming &lt;span class="caps"&gt;API&lt;/span&gt;, which allows users to pull tweets straight off the Twitter &amp;#8220;firehose&amp;#8221; live-as-you-can-be, and Two: a way to stream content to the browser.&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img src="http://farm3.static.flickr.com/2654/3977805905_16b03fe258_m.jpg" alt="" /&gt; The secret behind all this is a great Rails plugin called &lt;a href="http://juggernaut.rubyforge.org/"&gt;Juggernaut&lt;/a&gt; &amp;#8211; a push server that sends Javascript to the page using a Flash bridge. Built by &lt;a href="http://twitter.com/maccman"&gt;Alex MacCaw&lt;/a&gt;, it&amp;#8217;s a clever way of doing Comet-style long polling, but without the hackiness of long-polling requests. As much as I hate Flash, it&amp;#8217;s great for opening sockets and streaming data &amp;#8211; something I&amp;#8217;m looking forward to with Websockets in HTML5. Long story short, tweets went from your phone to the big screen instantly. No polling, no waiting, just pure Twitter streaming fun.  It was absolute madness &amp;#8211; turns out it&amp;#8217;s crazy to watch 700 people start posting their thoughts onto a massive projector screen. I even got dragged on-stage.&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img src="http://elliottkember.com/uploads/Chatrbox-20091031-125933.png" alt="" /&gt;So why this belated post? As you may or may not know, I&amp;#8217;ve just launched a new app: &lt;a href="http://chatrboxapp.com"&gt;Chatrbox&lt;/a&gt;. Featuring the stunning design work of &lt;a href="http://twitter.com/dizzyup"&gt;@dizzyup&lt;/a&gt;, it&amp;#8217;s a live-action IM chatroom, featuring Twitter authentication and login. You can create rooms, invite your friends via DM, and talk to people like it&amp;#8217;s 1999 and you&amp;#8217;re hanging out in a Yahoo! chat room.&lt;/p&gt;&amp;#x000A;&lt;p&gt;On the technical side, there isn&amp;#8217;t much to the back-end. Messages are passed in and out using a very simple &lt;span class="caps"&gt;JSON&lt;/span&gt; &lt;span class="caps"&gt;API&lt;/span&gt;, and saved in a DB along with rooms. Messages are passed to the user using Juggernaut, and then rendered into &lt;span class="caps"&gt;HTML&lt;/span&gt; using jQuery. There&amp;#8217;s a backup polling system for the iPhone, or browsers without Flash. Twitter is only for authentication, and for inviting others to join in.&lt;/p&gt;&amp;#x000A;&lt;p&gt;The cool part, I think, is the front-end. I&amp;#8217;ve been taking advantage of &lt;a href="http://jquery.com"&gt;jQuery&lt;/a&gt; as usual, and it&amp;#8217;s been seriously fun. Before now, most of the Javascript i&amp;#8217;ve hacked together has been fairly procedural &amp;#8211; except for my Snake plugin, which I rewrote in OO code (I should definitely release that as a plugin some day).  This, though, was a lot of fun.  &lt;img src="http://elliottkember.com/uploads/Chatrbox-20091031-130148.png" alt="" /&gt;Safari and Firefox both have ridiculously fast Javascript engines, which means that you&amp;#8217;re free to pretty much do what you want in Javascript. The code behind the app is all-Rails, the code in front is all-Javascript. &lt;em&gt;We don&amp;#8217;t need no steenking templates!&lt;/em&gt; In fact, there are no &lt;span class="caps"&gt;HTML&lt;/span&gt; templates for messages whatsoever. Everything&amp;#8217;s handled by Javascript.&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img src="http://elliottkember.com/uploads/Chatrbox-20091031-134350.png" alt="" /&gt;Javascript as a templating language is great for post-render updates. I don&amp;#8217;t have to tell the UI where a message should go &amp;#8211; it looks at the message&amp;#8217;s room_id and inserts it accordingly &amp;#8211; which means I can have &amp;#8220;unread messages&amp;#8221; notifications pop up. Instead of using the &lt;span class="caps"&gt;HTML&lt;/span&gt; as a database, and jQuery as a query system, pulling stuff out by class and ID, I can do it backwards &amp;#8211; maintain my data in Javascript objects, and render to &lt;span class="caps"&gt;HTML&lt;/span&gt;.&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img src="http://elliottkember.com/uploads/Chatrbox-20091031-132926.png" alt="" /&gt; Unfortunately, this means that the app doesn&amp;#8217;t degrade. If you&amp;#8217;re not using Javascript, it just plain won&amp;#8217;t work. I can&amp;#8217;t see myself ever making it degrade, either &amp;#8211; it&amp;#8217;s not that kind of site. Short of an all-Flash UI, there&amp;#8217;s just no feasible way to do chat without it. If you want to disable Javascript, that&amp;#8217;s fine &amp;#8211; but you&amp;#8217;re going to re-enable it if you want my stuff to work. Javascript is just as necessary as &lt;span class="caps"&gt;CSS&lt;/span&gt;.&lt;/p&gt;&amp;#x000A;&lt;p&gt;So there you have it &amp;#8211; a fun, interesting, Twitter-based chat room. I&amp;#8217;m planning on adding file-uploading, private rooms, and a few other cool features that may or may not be paid-for. For now, though, I&amp;#8217;ll be happy if everyone gives it a go. Also, don&amp;#8217;t forget to leave a comment below; it makes me happy when people comment :)&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img src="http://elliottkember.com/uploads/Chatrbox-20091031-130623.png" alt="" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;cite&gt;Photos by &lt;a href="http://www.flickr.com/photos/yaili"&gt;Yaili&lt;/a&gt; and &lt;a href="http://www.flickr.com/photos/chegs"&gt;Chegs&lt;/a&gt; on Flickr, screenshots by Yours Truly.&lt;/cite&gt;&lt;/p&gt;</description>
      <author>Elliott Kember</author>
      <pubDate>Sat, 31 Oct 2009 14:04:06 +0000</pubDate>
      <link>/posts/5-AnnouncingChatrbox</link>
      <guid>/posts/5-AnnouncingChatrbox</guid>
    </item>
    <item>
      <title>I forgot to eat lunch yesterday.</title>
      <description>&lt;p&gt;Writing code for a living can be a bit depressing at times. It has a lot to do with the fact that it&amp;#8217;s a sedentary, and often lonely occupation &amp;#8211; especially if you work by yourself, for yourself. Lonely hours at a computer screen does wonders for the soul. However, I think it&amp;#8217;s important to remember something:&lt;/p&gt;&amp;#x000A;&lt;h3&gt;Programming is fucking awesome.&lt;/h3&gt;&amp;#x000A;&lt;p&gt;There are a lot of reasons why this is a popular belief. You&amp;#8217;re in charge of a system, and you have to make it work. There are elements of problem-solving, challenges, difficult bits, and best of all, new stuff comes out all the time that makes your job easier. What other craft can enjoy those benefits? Not only that: we&amp;#8217;re important. We&amp;#8217;re put in charge of critical applications. We do things other people can&amp;#8217;t. I&amp;#8217;ve heard programmers described as &lt;a href="http://powazek.com/posts/1655"&gt;tiny gods&lt;/a&gt;, which I think is a pretty apt description.&lt;/p&gt;&amp;#x000A;&lt;p&gt;However, to exempt this post from being just another lousy &amp;#8220;isn&amp;#8217;t programming awesome?&amp;#8221; post, I figured I&amp;#8217;d explain exactly &lt;strong&gt;why&lt;/strong&gt; I think it&amp;#8217;s fun. And when I say why, I mean &lt;em&gt;physiologically&lt;/em&gt;. For science!&lt;/p&gt;&amp;#x000A;&lt;p&gt;The best analogy I can give for programming is flying a plane. When you&amp;#8217;re flying, you have to concentrate &amp;#8211; or else the plane will crash. This means you have to forget about other things, and focus all your attention on keeping the damn thing aloft. You become a part of the process &amp;#8211; a symbiosis of man and machine. You have a purpose, and a goal &amp;#8211; and everything else is momentarily put aside.&lt;/p&gt;&amp;#x000A;&lt;p&gt;Better yet, playing a musical instrument. If you lose focus, you&amp;#8217;ll get something wrong and ruin the performance. It&amp;#8217;s very hard to regain your composure after a mistake. I think the same thing happens when you&amp;#8217;re building something. If you lose concentration, you&amp;#8217;ll lose your train of thought, forget where you are, and have to start all over again. It&amp;#8217;s &amp;#8220;being in the zone&amp;#8221;.&lt;/p&gt;&amp;#x000A;&lt;p&gt;As any Neuropsychology student will tell you, when you concentrate on something, your breathing becomes rhythmic, and &lt;a href="http://www.google.com/search?hl=en&amp;amp;safe=off&amp;amp;client=safari&amp;amp;rls=en&amp;amp;q=beta+waves+and+concentration&amp;amp;aq=f&amp;amp;oq=&amp;amp;aqi"&gt;your brain&amp;#8217;s beta frequencies increase&lt;/a&gt;. The funny thing about beta waves? From &lt;a href="http://en.wikipedia.org/wiki/Beta_wave"&gt;Wikipedia&lt;/a&gt;: &amp;#8220;Rhythmic beta with a dominant set of frequencies is associated with various pathologies and drug effects. For instance, beta activity can be accentuated by sedative-hypnotic drugs such as benzodiazepines or barbiturates&amp;#8221;. Concentration = hypnosis!&lt;/p&gt;&amp;#x000A;&lt;p&gt;Personally, I think the breathing is behind all of this. Any time you alter your breathing, you mess with your feelings. That&amp;#8217;s why you take ten deep breaths when you&amp;#8217;re angry. Religion does this; many religions have some form of breath control, be it singing, dancing, chanting, meditation&amp;#8230; you name it. Could the entire idea of a &amp;#8220;higher power&amp;#8221; be caused by misinterpreting the feelings your brain&amp;#8217;s activity gives you during measured, controlled breathing? It sounds possible. Funnily enough, the word &amp;#8220;spiritual&amp;#8221; derives from the latin &lt;em&gt;spiro&lt;/em&gt;, which means &amp;#8211; you guessed it &amp;#8211; &lt;em&gt;to breathe&lt;/em&gt;. It&amp;#8217;s my favourite theory.&lt;/p&gt;&amp;#x000A;&lt;p&gt;Some evidence suggests that beta waves are good for you, too. &lt;a href="http://www.brainwavesblog.com/beta-brain-waves-information/"&gt;This page&lt;/a&gt; says &amp;#8220;People who have increased their beta Waves have been known to increase their I.Q. and productivity.  beta Brain Waves have also been associated as being a natural antidepressant&amp;#8221;. Remember, you get paid for this.&lt;/p&gt;&amp;#x000A;&lt;p&gt;The best thing about the trade, as far as I can tell, is that it&amp;#8217;s one of the few professions where you get to be &amp;#8220;in the zone&amp;#8221; for extended periods of time. So much so that we forget to eat, or become oblivious to our surroundings. It&amp;#8217;s a little like being in love.&lt;/p&gt;&amp;#x000A;&lt;p&gt;Programming a fairly left-brain exercise &amp;#8211; logical and rational, perhaps even robotic. It&amp;#8217;s very rare to see creativity and art in programming. &lt;a href="http://en.wikipedia.org/wiki/Why_the_lucky_stiff"&gt;_why&lt;/a&gt; was an exception, and I miss him dearly. But, in my experience, there&amp;#8217;s a real similarity in the feelings between writing some particularly elegant code, and playing a complicated piece of music. Hell, if I didn&amp;#8217;t get paid to write code, I&amp;#8217;d do it anyway.&lt;/p&gt;&amp;#x000A;&lt;p&gt;When you feel down about what you do for a living, consider this: musicians only get to be &amp;#8220;in the zone&amp;#8221; for the length of a piece of music. Even pilots don&amp;#8217;t get to be &amp;#8220;in the zone&amp;#8221; every day. I&amp;#8217;d be very surprised if business people really get to feel this kind of &amp;#8220;in the zone&amp;#8221; at all &amp;#8211; no matter what they say.&lt;/p&gt;</description>
      <author>Elliott Kember</author>
      <pubDate>Fri, 09 Oct 2009 12:03:02 +0000</pubDate>
      <link>/posts/4-Iforgottoeatlunchyesterday</link>
      <guid>/posts/4-Iforgottoeatlunchyesterday</guid>
    </item>
    <item>
      <title>Release open, release awesome.</title>
      <description>&lt;p&gt;In December last year, I built my own personal site to advertise my new-found employability &amp;#8211; &lt;a title="Go there. Employ me. Win internets." href="http://www.elliottkember.com/"&gt;www.elliottkember.com&lt;/a&gt;. Then, looking at my twitter background, I figured it&amp;#8217;d be cool to have a similar image on my own site &amp;#8211; a bit of continuity. Then, I was talking to &lt;a title="Greg is the man" href="http://twitter.com/greg_a"&gt;Greg Annandale&lt;/a&gt; when a thought occurred to me:&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img alt="17th December, 6pm. Not dinnertime yet." src="http://img.skitch.com/20090208-bn73xpu91g5qgxbenaiwde77fq.png" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;Why not turn that sexy curl into an adjustable feature?&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img alt="Coooooool." src="http://img.skitch.com/20090208-48hxtc1gq54y4hmanh5wm898p.png" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;Well, about 20 minutes later I had it working, pending a few tricky bits:&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img alt="Success soon thereafter!" src="http://img.skitch.com/20090208-8arw1qfakds97awn8ntdsttw8e.png" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;But nonetheless, I had a working curl. You can check it out on &lt;a title="Page curl in action!" href="http://www.elliottkember.com/"&gt;my site&lt;/a&gt;.&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img alt="Woo!" src="http://img.skitch.com/20090208-kwxgqjkfbwtaqrs7mskmng9f6b.png" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;Even Ryan was impressed:&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img alt="Impressed Ryan is impressed." src="http://img.skitch.com/20090208-xu26k52rtqiir46ga4ueaiaefa.png" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;The code wasn&amp;#8217;t very elegant, or configurable, and I hadn&amp;#8217;t made it very easy to implement, but the thing worked. I went ahead and linked it to everyone I could find to get them to check it out, and I got a little bit of traffic:&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img alt="Analytics exhibit a)" src="http://img.skitch.com/20090208-dy3kpcnmqt3ki5nww8381pcqfi.png" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;At the time, the wonders of relative scale told me that this was a good thing. But as it turns out, it was nothing to write home about. Yet.&lt;/p&gt;&amp;#x000A;&lt;p&gt;My good friend Rey Bango had an idea:&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img alt="Rey Bango, Captain jQuery" src="http://img.skitch.com/20090208-ea1fhqmwu3jdjibsiha12nps1e.png" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;Why not make my fold into a plugin? I sat on the idea for a while, but decided that I didn&amp;#8217;t want anyone else having my cool effect. I wanted it all to myself. On one hand, I use many open-source products day-to-day. My job wouldn&amp;#8217;t be nearly as fun or as easy as it would if everything were closed-source. The shared contributions of many contribute directly to my own personal gain. On the other hand, I reasoned, why should I let everybody else profit from my hard work, and share my effect?&lt;/p&gt;&amp;#x000A;&lt;p&gt;I agreed with open-source, I decided, but only when other people were releasing things &amp;#8211; in other words, I only agreed with open source &lt;em&gt;when I was the one profiting from it.&lt;/em&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;A bit later, I was cruising around the internets when I found, in a list of javascript effects, a link to &lt;a title="Another page curl plugin!" href="http://www.smple.com/pagePeel/"&gt;this&lt;/a&gt;: a page curl jQuery plugin! After checking the source, and discovering that it wasn&amp;#8217;t a copy of mine at all, I pondered how he&amp;#8217;d made it onto this list. After all, lists are the backbone of the internet. Get on a list, and you&amp;#8217;re set for life. #naivet&#233;.&lt;/p&gt;&amp;#x000A;&lt;p&gt;The answer was simple: This dude release the script as a plugin.&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img alt="I was wrong - he made his before I made mine." src="http://img.skitch.com/20090208-jni22xqyxurheyfqwjt52jja4d.png" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;Yes, that says 2AM. That&amp;#8217;s the last timestamp I&amp;#8217;m going to show. Incidentally, I was wrong when I said &amp;#8220;copycat&amp;#8221; &amp;#8211; that &lt;span class="caps"&gt;URL&lt;/span&gt; clearly shows a date of the 15th of December &amp;#8211; two days before I made my page curl. Great minds, etc. I reconsidered my stance on a jQuery plugin.&lt;/p&gt;&amp;#x000A;&lt;p&gt;Should I do it, I asked myself? Should I release this into the wild, destined to be my glory or my shame? Am I releasing the next useless gimmicky, showy, tacky Javascript effect for people to complain about?&lt;/p&gt;&amp;#x000A;&lt;p&gt;Hell yes. Let&amp;#8217;s do it. First off, though, I had to refactor my code. I wasn&amp;#8217;t having my sloppy mess of javascript sitting around cluttering up the web. So I cleaned up my code, and with the help of a few articles, I turned it into a plugin. This is not a difficult task: I can&amp;#8217;t remember which I used, but there are 527 Google results for &amp;#8220;&lt;a title="527 results." href="http://www.google.co.uk/search?q="&gt;your first jQuery plugin&lt;/a&gt;&amp;#8220;. Pick one &amp;#8211; it doesn&amp;#8217;t matter which. If it sucks, pick another one. Welcome to Google. If you&amp;#8217;re actually reading this article, leave a comment with the code words: &amp;#8220;&lt;a title="Rock you like a hurricane!" href="http://www.youtube.com/watch?v=rB8HudfbaTE&amp;amp;fmt=22"&gt;rock you like a hurricane&lt;/a&gt;&amp;#8220;. That way I&amp;#8217;ll know.&lt;/p&gt;&amp;#x000A;&lt;p&gt;Now for the important bit: what should I call it? &lt;a title="Adam Cooke on Twitter" href="http://twitter.com/adamcooke"&gt;Adam Cooke&lt;/a&gt; and I pondered the issue:&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img alt="First attempts at naming" src="http://img.skitch.com/20090208-eg7jdby4tjnm9ghjy6qdxp9r34.png" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;Clearly, this name wasn&amp;#8217;t awesome enough.&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img alt="Much more awesome." src="http://img.skitch.com/20090208-xysn6aappd6y81kmc3i2513epa.png" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;And with a GitHub repository, the &lt;a title="GitHub copy of Sexy Curls!" href="http://github.com/elliottkember/the-sexy-curls-jquery-plugin/tree/master"&gt;Sexy Curls jQuery Plugin&lt;/a&gt; was born.&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img alt="Rey says tweet tweet!" src="http://img.skitch.com/20090208-eip42ifwj7ufs165dmxaram3dh.png" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;I spewed some of my trademark absurdity into &lt;a title="Sexy Curls!" href="http://www.elliottkember.com/sexy_curls.html"&gt;&lt;span class="caps"&gt;HTML&lt;/span&gt; form&lt;/a&gt;:&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img alt="As yet, no recorded instances of my code being used as a hat." src="http://img.skitch.com/20090208-crs5j9j28deucna9qf5ddjpbuw.png" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;And I passed it on:&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img alt="Tweet!" src="http://img.skitch.com/20090208-xu4wwsetsrjaum7wxcm8q8sa25.png" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;Now, Rey tweeted it from @jquery &amp;#8211; and here&amp;#8217;s that tweet preserved for posterity:&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img alt="as tweeted by jQuery!" src="http://img.skitch.com/20090208-ca4e1scnk4xajr4w18dweybwmu.png" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;Instantly, some 3,000 hard core jQuery nerds heard the word about my plugin. RT after RT, &lt;span class="caps"&gt;FWD&lt;/span&gt; &amp;gt;&amp;gt; &lt;span class="caps"&gt;FWD&lt;/span&gt;, and so on. Quietly, my plugin propagated around the internets like W32.Blaster. You can watch the tweet stream &amp;#8211; &lt;a title="Search for tweets about my plugin." href="http://search.twitter.com/search?q=+jquery+sexy+curls"&gt;it&amp;#8217;s still going&lt;/a&gt;. I graced the front pages of &lt;a title="Look Ma, I'm on Ajaxian!" href="http://ajaxian.com/archives/sexy-page-curls"&gt;Ajaxian&lt;/a&gt;, &lt;a title="yCombinator News - like reddit, but smaller." href="http://news.ycombinator.com/"&gt;YCombinator News&lt;/a&gt;, hit #9 on Del.icio.us, and countless other aggregators. Help even came from other GitHub users &amp;#8211; &lt;a title="Cheeaun on GitHub" href="http://github.com/cheeaun"&gt;Cheeaun&lt;/a&gt; was nice enough to give me a hand.&lt;br /&gt;&amp;#x000A;I also surreptitiously included a link to my &lt;a title="Yay 1,000 followers!" href="http://twitter.com/elliottkember"&gt;Twitter page&lt;/a&gt; in the first line of the page. As usual, the internet is just my big race for followers.&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img alt="Twitter history over 3 months." src="http://img.skitch.com/20090208-b7r5u92m9bjhj13w59fk3gtpf6.png" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;What did that do to my analytics?&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img alt="Zone of massive exposure!" src="http://img.skitch.com/20090208-xq2n8pd23agrfxgifiaryqh92k.png" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;That&amp;#8217;s insane. My pageviews were up by about 2,000%. That&amp;#8217;s not all Sexy Curls traffic, either &amp;#8211; although it pretty much mostly is.&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img alt="Content pageview summary" src="http://img.skitch.com/20090208-p5kerxj8qd49ssriedwm2df87j.png" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;That&amp;#8217;s wa-hay above normal &amp;#8211; which means people are clicking through. &lt;em&gt;My name is getting out there.&lt;/em&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img alt="My statistics for sexy_curls.html" src="http://img.skitch.com/20090208-khp9n4mtqbrsqhj4dr7ewkmakm.png" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;That&amp;#8217;s the content for sexy_curls.html &amp;#8211; loads of pageviews, a strangely high time-on-page, and &lt;em&gt;somehow I have made 8 cents.&lt;/em&gt; I look forward to receiving it.&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img alt="Browser stats" src="http://img.skitch.com/20090208-crxih82dpkmmtukft1gfhhjg5b.png" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;As usual, a high Firefox/Safari split. I&amp;#8217;m proud of my visitors! Somebody also tried to use their PlayStation:&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img alt="Hi, PS3 user" src="http://img.skitch.com/20090208-jqu7h73264ffqs57q18tr5id1g.png" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;But I haven&amp;#8217;t heard back on whether the curl worked. Even the Googlebot is rendering Javascript these days:&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img alt="Hello, Googlebot!" src="http://img.skitch.com/20090208-1fmnaaknxqfi6p7cq7uq5jgjjm.png" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;So I guess it&amp;#8217;s been checking out my curl, too. Hope it liked it.&lt;/p&gt;&amp;#x000A;&lt;p&gt;What did I learn? Open Source isn&amp;#8217;t just kernel-hackers in their parents&amp;#8217; basements. Open Source is everywhere. Anything you do can be open-source. So, if you aren&amp;#8217;t already, release stuff. Release good code, release bad code, it doesn&amp;#8217;t matter. It&amp;#8217;ll end up being better than you could ever have intended. Use other people&amp;#8217;s code &amp;#8211; &lt;span class="caps"&gt;FIX&lt;/span&gt; other peoples&amp;#8217;s code.&lt;/p&gt;&amp;#x000A;&lt;p&gt;So far, there haven&amp;#8217;t been many reports of sites using the Sexy Curls plugin. But that&amp;#8217;s okay &amp;#8211; it did what I intended it to do. It sparked ideas, made a few gaze in wonder, touched the corners of the internet far and wide, and maybe &amp;#8211; &lt;em&gt;just maybe&lt;/em&gt; &amp;#8211; it inspired someone to start writing code.&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;em&gt;Code is like a magic penny &amp;#8211; write it once and you don&amp;#8217;t get any. Lend it, send it, give it away, and it comes right back to you.&lt;/em&gt;&lt;/p&gt;</description>
      <author>Elliott Kember</author>
      <pubDate>Sun, 06 Sep 2009 10:35:32 +0000</pubDate>
      <link>/posts/3-Releaseopenreleaseawesome</link>
      <guid>/posts/3-Releaseopenreleaseawesome</guid>
    </item>
    <item>
      <title>On Usability</title>
      <description>&lt;p&gt;&lt;em&gt;I&#8217;d appreciate it if you read this entire article before commenting.&lt;br /&gt;&amp;#x000A;&lt;/em&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;So there I was, in a RyanAir Boeing 737-800 coming back from &lt;span class="caps"&gt;FOWA&lt;/span&gt; Dublin. Having just spent three days partying it up I was a little under the weather. It was late, it was raining, and I wanted to sit &lt;strike&gt;back&lt;/strike&gt; bolt upright, read my Jeremy Clarkson book and drink my &#8364;5 Coke.&lt;/p&gt;&amp;#x000A;&lt;p&gt;During take-off, the crew turn off all the lights in the cabin. I like to imagine this is because the pilots think it&#8217;s more fun taking off in darkness. I was surprised, though, to hear the sound of chimes from all around me, as passengers pressed the &#8220;I need a napkin&#8221; stewardess button. Were they so frightened of the dark that they wanted a hug and a &#8364;3 cookie? I shrugged it off, and reached for the light-switch so I could continue reading.&lt;/p&gt;&amp;#x000A;&lt;p&gt;I was confronted with this:&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img alt="The upwards view from my seat" src="http://img.skitch.com/20090309-fi2cug6eetr63cb368j9xy7rb2.jpg" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;That&#8217;s right &#8211; the buttons have no lights on them. So, when the cabin lights are out, you can&#8217;t see which button does what.&lt;/p&gt;&amp;#x000A;&lt;p&gt;Now, the 737 is a good plane, built by clever engineers, and even when bought by the lowest bidder and covered with advertisements, it&#8217;s still an engineering miracle. It weighs 80,000kg and is capable of carrying 189 people 5,600km at Mach 0.8, which is no mean feat. Clearly the people who made this machine know what they&#8217;re doing. So why couldn&#8217;t they, at a cost of about &#8364;5 per seat, light up the buttons on the ceiling? I don&#8217;t know, but I have my own theory:&lt;/p&gt;&amp;#x000A;&lt;p&gt;Usability is difficult.&lt;/p&gt;&amp;#x000A;&lt;p&gt;As with many things, usability comes from a military background. The concept was invented during the course of World War 2, when the Americans realised they were blowing themselves up with grenades a bit too often to be statistically viable. So they streamlined the product, gave their chaps instructions like &#8220;throw it toward the enemy&#8221;, and then, as far as the film industry would have it, proceeded to stomp all over Europe smoking cigars and shouting at one another. The P-51 Mustang was a miracle of simplicity too &#8211; by reducing the number of switches and dials and buttons, they let the pilot concentrate on what he was doing &#8211; which is vitally important when you&#8217;re whizzing about over France upside-down at 700 miles per hour.&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img alt="P-51 Mustang! Caddilac of the sky!" src="http://farm2.static.flickr.com/1377/758494121_9336102502.jpg?v=0" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;So clearly, removing things is the shortcut to usability. Everybody&#8217;s heroes, Apple, Google, and 37Signals do this to great effect. The fewer buttons I have on my page, the more I start to feel like that Mustang pilot. My Macbook Pro is the Cadillac of the Sky.&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img alt="Hello, I'm a Spitfire. And I'm a Mustang." src="http://img.skitch.com/20090309-e2rbcqyshppbgiq8b9ibat3273.jpg" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;The problem is, though, sometimes just removing things isn&#8217;t the whole answer &#8211; as with the 737 and its buttons. Usability is something that you need to study, and practice, and think about. It doesn&#8217;t just happen.&lt;/p&gt;&amp;#x000A;&lt;p&gt;This brings me to &lt;a title="Create software mockups in minutes" href="http://www.balsamiq.com/"&gt;Balsamiq&lt;/a&gt;. Sure, it&#8217;s a great tool, if you like post-it notes and Comic Sans. Okay, it lets you build mockups of your websites that look like drawings. But let&#8217;s remember one thing: it doesn&#8217;t necessarily mean you know what you&#8217;re doing.&lt;/p&gt;&amp;#x000A;&lt;p&gt;I understand what the tool is for, and @&lt;a title="Balsamiq on Twitter" href="http://twitter.com/balsamiq"&gt;balsamiq&lt;/a&gt; verified this for me: creating 5-minute mock-ups that can be thrown away. But that&#8217;s &lt;span class="caps"&gt;ALL&lt;/span&gt; it&#8217;s for. It&#8217;s really, really not for full-scale wireframes. If you think about this, it&#8217;s obvious. You don&#8217;t get to re-use components, there&#8217;s no layout grid to speak of, and you can&#8217;t save files together in a folder-type-arrangement. The tool simply wasn&#8217;t designed to do these things, because it&#8217;s not meant to.&lt;/p&gt;&amp;#x000A;&lt;p&gt;But the problem is, it&#8217;s available to the masses. And that means people are going to start using it. It gives people the illusion that they know what they&#8217;re doing. Being a child of the internets, I couldn&#8217;t resist but make a funny image of this, complete with Impact writing. Now, if I were really mean, I&#8217;d use it. But I won&#8217;t. Well, I&#8217;ll use it satirically and then apologize, because that seems to be the way of the bloggers these days:&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img alt="A picture of a kid drawing with crayons. It's a bit of a low blow." src="http://img.skitch.com/20090309-m92y18nye518utxm4yb6rbjxh2.jpg" /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;Thankfully, you&#8217;re reading this &lt;span class="caps"&gt;ENTIRE&lt;/span&gt; article instead of just looking at the pretty pictures. Right? Good. You won&#8217;t be offended, then, because that image is just for satire purposes &#8211; a cheap laugh, and a cheap shot. I&#8217;m sorry! I should write for TechCrunch.&lt;/p&gt;&amp;#x000A;&lt;p&gt;The problem is, as I was saying, that your clients are about to start doing usability. They&#8217;re going to start doing your job. I&#8217;m not concerned about the money involved here: FrontPage, Dreamweaver and .&lt;span class="caps"&gt;NET&lt;/span&gt; have been around for years and I&#8217;m still making internets. I&#8217;m really more concerned about the quality of what you&#8217;ll end up producing, in the same way I love finding MM_* functions in websites that I pick apart. When you lower the barrier to entry, people start using simple products for complicated things &#8211; and then you end up with crap.&lt;/p&gt;&amp;#x000A;&lt;p&gt;You can&#8217;t tell the client that, either, because they&#8217;re proud of what they&#8217;ve done. They hand you their stack of .bmml files with a big smile, like a 5 year old who&#8217;s finished a drawing. The only difference is that instead of just sticking the drawing to the fridge and giving them a chocolate bar from the Treat Drawer, you&#8217;re supposed to publish the drawing, put your name next to it, and then accept the criticism. You don&#8217;t want to tell them that what they&#8217;ve done won&#8217;t work, because you&#8217;ll break their hearts with the sad truth, and they&#8217;ll go off and find some other poor sap who&#8217;ll knuckle down and produce it.&lt;/p&gt;&amp;#x000A;&lt;p&gt;If a client comes to you with a mock-up of their website, that&#8217;s fine &#8211; they&#8217;ve thought ahead and given it a shot. Now, when you apply yourself to it, you have something to work from &#8211; and even if you go the other way, you still know what you&#8217;re avoiding. But if a client comes to you with their own full set of wireframes, what on earth are you supposed to do?&lt;/p&gt;&amp;#x000A;&lt;p&gt; @ &lt;a title="@balsamiq on Twitter" href="http://twitter.com/balsamiq"&gt;balsamiq&lt;/a&gt; is a very clever, and &lt;a title="My conversation with @balsamiq" href="http://search.twitter.com/search?q=elliottkember+balsamiq"&gt;friendly&lt;/a&gt; chap, and his product is cool. I like where he&#8217;s going with it. What I&#8217;m trying to say is that the problem doesn&#8217;t lie with the tool &#8211; it lies with the way it&#8217;s used. The bottom line is: be careful. Just because you can do something, doesn&#8217;t mean you can do it right.&lt;/p&gt;&amp;#x000A;&lt;p&gt;In fact, there&#8217;s a whole talk I&#8217;ve got planned based on that very concept &#8211; and I&#8217;m trying hard to get to speak at a Future of Web Apps event. Shameless plug? Me? &lt;a title="Woo!" href="http://whobuilt.it"&gt;Never&lt;/a&gt;. Anyway, it doesn&#8217;t matter, because you&#8217;ll have stopped reading at the last image and proceeded straight to the comment form to rant at me for being nasty. That&#8217;s the beauty of the web &#8211; everyone can have their say.&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;em&gt;Image credits: &lt;a title="The spitfire image came from here" href="http://usabilitylabrental.com/uncategorized/usability-from-wwii-to-the-present-the-historical-origins-of-usability-testing"&gt;Usabilitylabrental.com&lt;/a&gt; for the cockpit photo, &lt;a title="Why this guy takes photos of upside-down planes is beyond me" href="http://carsonified.com/www.flickr.com/photos/farmerdoodah/758494121/in/set-72157602054"&gt;farmerdoodah&lt;/a&gt; on Flickr for the upside-down Mustang, and @&lt;a title="I credit everybody - especially myself." href="http://twitter.com/elliottkember"&gt;elliottkember&lt;/a&gt; for the satirical internet image. &lt;/em&gt;&lt;/p&gt;</description>
      <author>Elliott Kember</author>
      <pubDate>Sun, 06 Sep 2009 05:55:53 +0000</pubDate>
      <link>/posts/2-OnUsability</link>
      <guid>/posts/2-OnUsability</guid>
    </item>
    <item>
      <title>Speed: The Secret Code of the Baristi</title>
      <description>&lt;p&gt;The other day I was in the local coffee shop dealing to my addiction. I couldn&#8217;t help but notice that the guys behind the counter were speaking in a foreign language. We&#8217;ve all heard this language: &#8220;Double cap out, no foam&#8221;, &#8220;Chai mocha skinny half with space&#8221;, &#8220;Moon unit alpha, tennis elbow&#8221;. It sounds like some kind of indecipherable language &#8211; the secret code of the Illumilatt&#233;, if you will.&lt;/p&gt;&amp;#x000A;&lt;p&gt;I realise, of course, that these contractions are inevitable when you&#8217;re performing a task over and over again. To bring it a bit closer to home, they&#8217;re like keyboard shortcuts. But really, I&#8217;ve never seen any barista actually save any time by leaving off the &#8220;-puccino&#8221;. So what&#8217;s happening here?&lt;/p&gt;&amp;#x000A;&lt;p&gt;The answer, of course, is perceived speed. It doesn&#8217;t actually have to save any time, as long as it gives the impression of saved time.&lt;/p&gt;&amp;#x000A;&lt;p&gt;A good example is this: setting your microwave for one minute and eleven seconds actually takes less time than setting it for a minute flat &#8211; because you don&#8217;t have to move your finger from the 1 button. 1-1-1 is much easier to type than 1-0-0. Of course, the microwave will be running for a good eleven seconds more, but you aren&#8217;t sitting there watching it for eleven seconds &#8211; you&#8217;re off dicing and slicing, or whatever people do when they cook. I cook by phone.&lt;/p&gt;&amp;#x000A;&lt;p&gt;A lot of this stuff has to do with efficiency of data structures. If you keep all your receipts, you put them in chronological order when you store them, right? Each one has to go into its alotted position. Would you design a data structure like that? A lot of expensive writes? You only ever pull all your receipts out of the box once a year, so that read action can afford to be slow compared with the hundreds of writes you might do. You should throw them into specific boxes (heh, sharding) and sort them in one go later on, or once a week or whatever. It&#8217;s like a cron job.(00 18 * * sun ./tidy_room.sh).&lt;/p&gt;&amp;#x000A;&lt;p&gt;I was reading a great article the other day at Assert True which says that twice-as-fast isn&#8217;t good enough. A speed-up factor of 10 is what&#8217;s required to really make any difference. That really only applies to foreground actions &#8211; which are high in cognitive interaction. If something locks up my computer, then a 20-second lockup and a 40-second lockup are pretty similar. They both interrupt my computing experience, and generally tempt me to wander over to the coffee machine.&lt;/p&gt;&amp;#x000A;&lt;p&gt;What I&#8217;m effectively doing here is backgrounding the process. It&#8217;s still happening, it still takes time, but it requires none of my cognitive space. I only notice something&#8217;s happening when I&#8217;m actively waiting for it &#8211; and in this instance, I&#8217;m not. So if the application backgrounds the process for me, it&#8217;s doing exactly the same thing. If I can use the rest of the computer while it does its thing, then my workflow is pretty much uninterrupted.&lt;/p&gt;&amp;#x000A;&lt;p&gt;This is why background processing is such an awesome tool. If you have to do 10 non-urgent things when an action takes place, put them all in a queue and report back straight away. This is for more than just server-client requests, too. For example, when I was building Twiggy last week, I found that the jQuery &lt;code&gt;remove()&lt;/code&gt; function was really slow at removing all the tweets from the results page. That meant that when a new search took place, the whole application would lock up while jQuery cleared the list. &lt;code&gt;Empty()&lt;/code&gt; and &lt;code&gt;.html(&#8221;)&lt;/code&gt; weren&#8217;t fast either. Nothing would make this bit of my application run more quickly.&lt;/p&gt;&amp;#x000A;&lt;p&gt;What was fast, though, was adding a &#8216;hidden&#8217; class to the tweets and hiding them. That was instant. So, the trick was to hide the old tweets and conduct the search. Now, when a search is conducted, the delay is huge. There&#8217;s at least a 3-second gap between clicking search and having the results available. The difference is, this dead time is expected. So I told jQuery to remove all old tweets during this searching process. It locked up the phone for the same amount of time, and probably added to the total search time. But when you&#8217;re waiting for the results to come back, you know you&#8217;re going to be waiting anyway. The really important thing is that hitting the &#8220;search&#8221; button has an immediate effect. The old results disappear, and the &#8220;searching&#8221; text comes up. Things are happening. Happy user!&lt;/p&gt;&amp;#x000A;&lt;p&gt;In interaction science, we&#8217;re told that the human brain needs less than 50ms response time between an action and its perceived reaction. Any longer, and it feels as though the system is lagging behind. Symbian, buddy &#8211; that&#8217;s you. That&#8217;s why the ubiquitous &lt;span class="caps"&gt;AJAX&lt;/span&gt; loading gif was invented &#8211; it doesn&#8217;t actually tell you anything. There&#8217;s no indication of how long the action might take, but the main communication is there &#8211; something is happening. And that&#8217;s important. You&#8217;ve acknowledged my request straight away, and told me you&#8217;re working on it.&lt;/p&gt;&amp;#x000A;&lt;p&gt;In truth, the difference between the tweet-clearing and the asynchronous searching can be huge. On a cellphone, where latency is really high, the searching might take 10 times as long as clearing out all the tweets. But that&#8217;s fine &#8211; the user knows this. What I can do, therefore, is hide all the other slow interactions inside this searching query, where they pale into insignificance. Better yet, I can spread the invisible functions out during the course of the application&#8217;s usage. If I remove a hidden result every half a second, it takes almost no time at all. It&#8217;s effectively a process queue.&lt;/p&gt;&amp;#x000A;&lt;p&gt;So if your app does loads of stuff on a request, like emailing 10 people, or processing credit card stuff, or generally doing &lt;span class="caps"&gt;ANYTHING&lt;/span&gt; with the filesystem, run this process in the background. I use BackgroundJob in Rails for its simplicity, but there are others like BackgroundFu and Starling that have other feature-sets. Some can use multiple processes to run the jobs, and some are kept in memory. Pick the one that suits your jobs best. &lt;a href="http://wiki.rubyonrails.org/howtos/background-processes"&gt;http://wiki.rubyonrails.org/howtos/background-p...&lt;/a&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;Either way, remember to keep stuff as snappy as you can. This is an optimization, and premature optimization is the root of all evil &#8211; so remember to do this reactively once people are using your application. It&#8217;s really just intelligent optimization &#8211; instead of spending hours speeding up your code, just leave the stuff that doesn&#8217;t need to be done straight away until later, when it can be done in the background. Uploading to S3, rotating and cropping images &#8211; there&#8217;s loads of stuff. If you have a process that generates big ugly graphs, make it run once every six hours, and memcache the result &#8211; because there&#8217;s nothing worse than a 15-second page load.&lt;/p&gt;&amp;#x000A;&lt;p&gt;All you need to remember is this: perceived speed is the only test of speed.&lt;/p&gt;&amp;#x000A;&lt;p&gt;Photo: Burt Munro (Anthony Hopkins) on an Indian Scout from here&lt;/p&gt;</description>
      <author>Elliott Kember</author>
      <pubDate>Sun, 06 Sep 2009 05:55:35 +0000</pubDate>
      <link>/posts/1-SpeedTheSecretCodeoftheBaristi</link>
      <guid>/posts/1-SpeedTheSecretCodeoftheBaristi</guid>
    </item>
  </channel>
</rss>
