<?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>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=&quot;caps&quot;&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=&quot;http://elliottkember.com/uploads/ferris_bueller_maitre-d-chez-jonathan-schmock.JPG.jpeg-20100131-171125.png&quot; title=&quot;I'm suggesting that you leave before I have to get snooty.&quot; /&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=&quot;caps&quot;&gt;VPS&lt;/span&gt; providers around &amp;#8211; &lt;span class=&quot;caps&quot;&gt;VPS&lt;/span&gt;.&lt;span class=&quot;caps&quot;&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=&quot;http://www.whattofix.com/blog/archives/2010/01/you-will-fail.php&quot;&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. I&amp;#8217;m annoyed&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=&quot;/login&quot;&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=&quot;http://www.flickr.com/photos/keithbelfast/4078592710/in/set-72157622613762217/&quot;&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=&quot;http://www.flickr.com/photos/paddydonnelly/4080606091/&quot;&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=&quot;http://www.flickr.com/photos/keithbelfast/4077858071/&quot;&gt;Eric Meyer.&lt;/a&gt;&lt;/li&gt;&amp;#x000A;	&lt;li&gt;Tim Van Damme is &lt;a href=&quot;http://www.youtube.com/watch?v=B6j3mY-qCXU&quot;&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=&quot;https://twitter.com/elliottkember/status/5465959933&quot;&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=&quot;http://www.flickr.com/photos/designbyfront/4081096046/&quot;&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=&quot;http://www.flickr.com/photos/designbyfront/4080339045/&quot;&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=&quot;http://www.flickr.com/photos/keithbelfast/4078605698/sizes/l/&quot;&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=&quot;http://search.twitter.com/search?q=buildconf&quot;&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=&quot;http://farm3.static.flickr.com/2650/3980591632_4116a852d4_m.jpg&quot; alt=&quot;&quot; /&gt;As you all may have noticed, I&amp;#8217;ve been playing around with some cool live-action stuff. At &lt;span class=&quot;caps&quot;&gt;FOWA&lt;/span&gt; London, I built a &lt;a href=&quot;http://www.flickr.com/photos/chegs/3978563242/&quot;&gt;live Twitter feed&lt;/a&gt;. The original idea was to build an app to complement &lt;a href=&quot;http://hello.carsonified.com&quot;&gt;HelloApp&lt;/a&gt;, a .&lt;span class=&quot;caps&quot;&gt;NET&lt;/span&gt; site built by Carsonified for the &lt;span class=&quot;caps&quot;&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=&quot;caps&quot;&gt;FOWA&lt;/span&gt; tweets. Along the way, I discovered two things; One: the Twitter Streaming &lt;span class=&quot;caps&quot;&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=&quot;http://farm3.static.flickr.com/2654/3977805905_16b03fe258_m.jpg&quot; alt=&quot;&quot; /&gt; The secret behind all this is a great Rails plugin called &lt;a href=&quot;http://juggernaut.rubyforge.org/&quot;&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=&quot;http://twitter.com/maccman&quot;&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=&quot;http://elliottkember.com/uploads/Chatrbox-20091031-125933.png&quot; alt=&quot;&quot; /&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=&quot;http://chatrboxapp.com&quot;&gt;Chatrbox&lt;/a&gt;. Featuring the stunning design work of &lt;a href=&quot;http://twitter.com/dizzyup&quot;&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=&quot;caps&quot;&gt;JSON&lt;/span&gt; &lt;span class=&quot;caps&quot;&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=&quot;caps&quot;&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=&quot;http://jquery.com&quot;&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=&quot;http://elliottkember.com/uploads/Chatrbox-20091031-130148.png&quot; alt=&quot;&quot; /&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=&quot;caps&quot;&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=&quot;http://elliottkember.com/uploads/Chatrbox-20091031-134350.png&quot; alt=&quot;&quot; /&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=&quot;caps&quot;&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=&quot;caps&quot;&gt;HTML&lt;/span&gt;.&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img src=&quot;http://elliottkember.com/uploads/Chatrbox-20091031-132926.png&quot; alt=&quot;&quot; /&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=&quot;caps&quot;&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=&quot;http://elliottkember.com/uploads/Chatrbox-20091031-130623.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;cite&gt;Photos by &lt;a href=&quot;http://www.flickr.com/photos/yaili&quot;&gt;Yaili&lt;/a&gt; and &lt;a href=&quot;http://www.flickr.com/photos/chegs&quot;&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=&quot;http://powazek.com/posts/1655&quot;&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=&quot;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&quot;&gt;your brain&amp;#8217;s beta frequencies increase&lt;/a&gt;. The funny thing about beta waves? From &lt;a href=&quot;http://en.wikipedia.org/wiki/Beta_wave&quot;&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=&quot;http://www.brainwavesblog.com/beta-brain-waves-information/&quot;&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=&quot;http://en.wikipedia.org/wiki/Why_the_lucky_stiff&quot;&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=&quot;Go there. Employ me. Win internets.&quot; href=&quot;http://www.elliottkember.com/&quot;&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=&quot;Greg is the man&quot; href=&quot;http://twitter.com/greg_a&quot;&gt;Greg Annandale&lt;/a&gt; when a thought occurred to me:&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img alt=&quot;17th December, 6pm. Not dinnertime yet.&quot; src=&quot;http://img.skitch.com/20090208-bn73xpu91g5qgxbenaiwde77fq.png&quot; /&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=&quot;Coooooool.&quot; src=&quot;http://img.skitch.com/20090208-48hxtc1gq54y4hmanh5wm898p.png&quot; /&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=&quot;Success soon thereafter!&quot; src=&quot;http://img.skitch.com/20090208-8arw1qfakds97awn8ntdsttw8e.png&quot; /&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=&quot;Page curl in action!&quot; href=&quot;http://www.elliottkember.com/&quot;&gt;my site&lt;/a&gt;.&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img alt=&quot;Woo!&quot; src=&quot;http://img.skitch.com/20090208-kwxgqjkfbwtaqrs7mskmng9f6b.png&quot; /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;Even Ryan was impressed:&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img alt=&quot;Impressed Ryan is impressed.&quot; src=&quot;http://img.skitch.com/20090208-xu26k52rtqiir46ga4ueaiaefa.png&quot; /&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=&quot;Analytics exhibit a)&quot; src=&quot;http://img.skitch.com/20090208-dy3kpcnmqt3ki5nww8381pcqfi.png&quot; /&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=&quot;Rey Bango, Captain jQuery&quot; src=&quot;http://img.skitch.com/20090208-ea1fhqmwu3jdjibsiha12nps1e.png&quot; /&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=&quot;Another page curl plugin!&quot; href=&quot;http://www.smple.com/pagePeel/&quot;&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=&quot;I was wrong - he made his before I made mine.&quot; src=&quot;http://img.skitch.com/20090208-jni22xqyxurheyfqwjt52jja4d.png&quot; /&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=&quot;caps&quot;&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=&quot;527 results.&quot; href=&quot;http://www.google.co.uk/search?q=&quot;&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=&quot;Rock you like a hurricane!&quot; href=&quot;http://www.youtube.com/watch?v=rB8HudfbaTE&amp;amp;fmt=22&quot;&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=&quot;Adam Cooke on Twitter&quot; href=&quot;http://twitter.com/adamcooke&quot;&gt;Adam Cooke&lt;/a&gt; and I pondered the issue:&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img alt=&quot;First attempts at naming&quot; src=&quot;http://img.skitch.com/20090208-eg7jdby4tjnm9ghjy6qdxp9r34.png&quot; /&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=&quot;Much more awesome.&quot; src=&quot;http://img.skitch.com/20090208-xysn6aappd6y81kmc3i2513epa.png&quot; /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;And with a GitHub repository, the &lt;a title=&quot;GitHub copy of Sexy Curls!&quot; href=&quot;http://github.com/elliottkember/the-sexy-curls-jquery-plugin/tree/master&quot;&gt;Sexy Curls jQuery Plugin&lt;/a&gt; was born.&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img alt=&quot;Rey says tweet tweet!&quot; src=&quot;http://img.skitch.com/20090208-eip42ifwj7ufs165dmxaram3dh.png&quot; /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;I spewed some of my trademark absurdity into &lt;a title=&quot;Sexy Curls!&quot; href=&quot;http://www.elliottkember.com/sexy_curls.html&quot;&gt;&lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; form&lt;/a&gt;:&lt;/p&gt;&amp;#x000A;&lt;p&gt;&lt;img alt=&quot;As yet, no recorded instances of my code being used as a hat.&quot; src=&quot;http://img.skitch.com/20090208-crs5j9j28deucna9qf5ddjpbuw.png&quot; /&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=&quot;Tweet!&quot; src=&quot;http://img.skitch.com/20090208-xu4wwsetsrjaum7wxcm8q8sa25.png&quot; /&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=&quot;as tweeted by jQuery!&quot; src=&quot;http://img.skitch.com/20090208-ca4e1scnk4xajr4w18dweybwmu.png&quot; /&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=&quot;caps&quot;&gt;FWD&lt;/span&gt; &amp;gt;&amp;gt; &lt;span class=&quot;caps&quot;&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=&quot;Search for tweets about my plugin.&quot; href=&quot;http://search.twitter.com/search?q=+jquery+sexy+curls&quot;&gt;it&amp;#8217;s still going&lt;/a&gt;. I graced the front pages of &lt;a title=&quot;Look Ma, I'm on Ajaxian!&quot; href=&quot;http://ajaxian.com/archives/sexy-page-curls&quot;&gt;Ajaxian&lt;/a&gt;, &lt;a title=&quot;yCombinator News - like reddit, but smaller.&quot; href=&quot;http://news.ycombinator.com/&quot;&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=&quot;Cheeaun on GitHub&quot; href=&quot;http://github.com/cheeaun&quot;&gt;Cheeaun&lt;/a&gt; was nice enough to give me a hand.&lt;br /&gt;&lt;br /&gt;&amp;#x000A;I also surreptitiously included a link to my &lt;a title=&quot;Yay 1,000 followers!&quot; href=&quot;http://twitter.com/elliottkember&quot;&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=&quot;Twitter history over 3 months.&quot; src=&quot;http://img.skitch.com/20090208-b7r5u92m9bjhj13w59fk3gtpf6.png&quot; /&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=&quot;Zone of massive exposure!&quot; src=&quot;http://img.skitch.com/20090208-xq2n8pd23agrfxgifiaryqh92k.png&quot; /&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=&quot;Content pageview summary&quot; src=&quot;http://img.skitch.com/20090208-p5kerxj8qd49ssriedwm2df87j.png&quot; /&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=&quot;My statistics for sexy_curls.html&quot; src=&quot;http://img.skitch.com/20090208-khp9n4mtqbrsqhj4dr7ewkmakm.png&quot; /&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=&quot;Browser stats&quot; src=&quot;http://img.skitch.com/20090208-crxih82dpkmmtukft1gfhhjg5b.png&quot; /&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=&quot;Hi, PS3 user&quot; src=&quot;http://img.skitch.com/20090208-jqu7h73264ffqs57q18tr5id1g.png&quot; /&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=&quot;Hello, Googlebot!&quot; src=&quot;http://img.skitch.com/20090208-1fmnaaknxqfi6p7cq7uq5jgjjm.png&quot; /&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=&quot;caps&quot;&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;&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=&quot;caps&quot;&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=&quot;The upwards view from my seat&quot; src=&quot;http://img.skitch.com/20090309-fi2cug6eetr63cb368j9xy7rb2.jpg&quot; /&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=&quot;P-51 Mustang! Caddilac of the sky!&quot; src=&quot;http://farm2.static.flickr.com/1377/758494121_9336102502.jpg?v=0&quot; /&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=&quot;Hello, I'm a Spitfire. And I'm a Mustang.&quot; src=&quot;http://img.skitch.com/20090309-e2rbcqyshppbgiq8b9ibat3273.jpg&quot; /&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=&quot;Create software mockups in minutes&quot; href=&quot;http://www.balsamiq.com/&quot;&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=&quot;Balsamiq on Twitter&quot; href=&quot;http://twitter.com/balsamiq&quot;&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=&quot;caps&quot;&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=&quot;A picture of a kid drawing with crayons. It's a bit of a low blow.&quot; src=&quot;http://img.skitch.com/20090309-m92y18nye518utxm4yb6rbjxh2.jpg&quot; /&gt;&lt;/p&gt;&amp;#x000A;&lt;p&gt;Thankfully, you&#8217;re reading this &lt;span class=&quot;caps&quot;&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=&quot;caps&quot;&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=&quot;@balsamiq on Twitter&quot; href=&quot;http://twitter.com/balsamiq&quot;&gt;balsamiq&lt;/a&gt; is a very clever, and &lt;a title=&quot;My conversation with @balsamiq&quot; href=&quot;http://search.twitter.com/search?q=elliottkember+balsamiq&quot;&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=&quot;Woo!&quot; href=&quot;http://whobuilt.it&quot;&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=&quot;The spitfire image came from here&quot; href=&quot;http://usabilitylabrental.com/uncategorized/usability-from-wwii-to-the-present-the-historical-origins-of-usability-testing&quot;&gt;Usabilitylabrental.com&lt;/a&gt; for the cockpit photo, &lt;a title=&quot;Why this guy takes photos of upside-down planes is beyond me&quot; href=&quot;http://carsonified.com/www.flickr.com/photos/farmerdoodah/758494121/in/set-72157602054&quot;&gt;farmerdoodah&lt;/a&gt; on Flickr for the upside-down Mustang, and @&lt;a title=&quot;I credit everybody - especially myself.&quot; href=&quot;http://twitter.com/elliottkember&quot;&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=&quot;caps&quot;&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=&quot;caps&quot;&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=&quot;http://wiki.rubyonrails.org/howtos/background-processes&quot;&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>
