<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>John Griffin</title>
 <link href="http://www.johng.co.uk/atom.xml" rel="self"/>
 <link href="http://www.johng.co.uk/"/>
 <updated>2012-01-11T14:17:54-08:00</updated>
 <id>http://www.johng.co.uk/</id>
 <author>
   <name>John Griffin</name>
   <email>john@griffin.io</email>
 </author>
 
 
 <entry>
   <title>Backbone.js vs Ember.js</title>
   <link href="http://www.johng.co.uk/2012/01/11/backbone.js-vs-ember.js/"/>
   <updated>2012-01-11T00:00:00-08:00</updated>
	<author>
    	<name>John Griffin</name>
        <uri>http://www.johng.co.uk/</uri>
    </author>
   <id>http://www.johng.co.uk/2012/01/11/backbone.js-vs-ember.js</id>
   <content type="html">&lt;p&gt;In the last few years a trend in web development has been gathering pace. It used to be the case that we could write all of our views and templates on the server side to rendered by a web framework. Now if you want to build a modern web app you need to be comfortable putting the bulk of that logic on the client side.&lt;/p&gt;

&lt;h3 id='backbone'&gt;Backbone&lt;/h3&gt;

&lt;p&gt;Up until very recently I had been using &lt;a href='http://documentcloud.github.com/backbone/'&gt;Backbone.js&lt;/a&gt; to do that. Backbone is a great way to provide structure to your client side Javascript and provides MVC tools including routing and data syncing. Due to it&amp;#8217;s stellar documentation and wealth of examples it was the obvious choice for many developers and gained a ton of traction.&lt;/p&gt;

&lt;p&gt;But there was always a key problem with Backbone. I felt like I was writing lots and lots of code just to do very standard interfaces. This is mainly because Backbone gives a lot of freedom in how you choose to render templates and handle events. As I got more familiar with it I realised there was scope for a meta framework that could sit on top of Backbone and perform a lot of the heavy lifting for the developer. Of course this never happened, but Ember.js did appear!&lt;/p&gt;

&lt;h3 id='ember'&gt;Ember&lt;/h3&gt;

&lt;p&gt;&lt;a href='http://emberjs.com/'&gt;Ember.js&lt;/a&gt; is a new framework that specifically addresses the problems I encountered with Backbone development. Instead of manually wiring everything together you can, for example, point a view at an array and it will automatically rerendered as the array is manipulated. This is because of Ember&amp;#8217;s brilliant binding system and tight integration with the &lt;a href='http://handlebarsjs.com/'&gt;Handlebars.js&lt;/a&gt; templating language.&lt;/p&gt;

&lt;p&gt;It was such a smart move for the Ember team to rebrand the framework (it used to be called SproutCore 2.0) as it grabbed my attention and I understood the angle they were coming from immediately.&lt;/p&gt;

&lt;p&gt;The biggest problem facing Ember right now is documentation. I found it very difficult to discover the best practices and techniques so that I wasn&amp;#8217;t fighting against the framework. I found the most success by reading through the Ember source, the unit tests and hanging out in the IRC channel. If more example applications were available to read through this problem could be solved.&lt;/p&gt;

&lt;p&gt;I have also found other areas of the framework slightly lacking - specifically routing and persistence where I feel Backbone is more mature. The good news is that since I started using Ember last month a ton of work has gone in to both areas resulting in &lt;a href='https://github.com/emberjs/ember.js/tree/master/packages/ember-states'&gt;ember-states&lt;/a&gt; and &lt;a href='https://github.com/emberjs/data'&gt;Ember Data&lt;/a&gt; which are great steps towards addressing these holes.&lt;/p&gt;

&lt;h3 id='am_i_sticking_with_ember'&gt;Am I Sticking With Ember?&lt;/h3&gt;

&lt;p&gt;Yes, although it&amp;#8217;s a little rough around the edges the core idea is solid and Ember is getting better on a daily basis. It&amp;#8217;s probably not a good fit if you need to both learn client side MVC and release an app pretty soon but it&amp;#8217;s just a matter of time before documentation and more example apps are released. If you are familiar with Backbone or another framework give it a try and see if it cuts down the amount of boilerplate you need.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Confident Code</title>
   <link href="http://www.johng.co.uk/2011/09/17/confident-code/"/>
   <updated>2011-09-17T00:00:00-07:00</updated>
	<author>
    	<name>John Griffin</name>
        <uri>http://www.johng.co.uk/</uri>
    </author>
   <id>http://www.johng.co.uk/2011/09/17/confident-code</id>
   <content type="html">&lt;p&gt;&lt;a href='http://confreaks.net/videos/614-cascadiaruby2011-confident-code'&gt;This talk&lt;/a&gt; from Avdi Grimm is essential viewing for Rubyists or just OO programmers in general. He has some very clever techniques for avoiding nil at all costs which can be easily added to your own development arsenal.&lt;/p&gt;

&lt;p&gt;Warning - if you watch this you will find it even more frustrating to read through &lt;a href='https://github.com/puppetlabs/marionette-collective'&gt;poorly written libraries&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Bored People Quit</title>
   <link href="http://www.johng.co.uk/2011/07/18/bored-people-quit/"/>
   <updated>2011-07-18T00:00:00-07:00</updated>
	<author>
    	<name>John Griffin</name>
        <uri>http://www.johng.co.uk/</uri>
    </author>
   <id>http://www.johng.co.uk/2011/07/18/bored-people-quit</id>
   <content type="html">&lt;p&gt;I was going to write a post on this topic but Rands summarised it so perfectly in &lt;a href='http://www.randsinrepose.com/archives/2011/07/12/bored_people_quit.html'&gt;this must read article&lt;/a&gt;. I&amp;#8217;ve picked out some quotes that really hit home to me.&lt;/p&gt;

&lt;p&gt;On the warning signs,&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A decrease in productivity is a great early sign that something’s up, but what you are looking for is any change in their routine. Increased snark? Unexpected vacations? Later arrivals? Earlier departures? Anything that strikes you as out of the ordinary for someone whose day you are familiar with is worth considering.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;On &amp;#8220;urgent&amp;#8221; tasks,&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Get this urgent, unplanned task done or make progress on the unmeasurable? The only thing this decision teaches your team is how little you value the cultivation of your people.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;On developer flow,&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;#8230;it’s your job to remember that productivity costs surrounding these micro-tasks aren’t just the 30 minutes necessary to get them done, it’s the context-switching tax involved in stopping their work, preparing for the task, doing the task, and then rebuilding the context regarding the work that floats their boat &amp;#8230; progress is not measured in interrupt-driven minutes, it’s blocks of delicious, uninterrupted hours.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Right on the money.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Splitstate 2.0 - MongoDB, DelayedJob Edition</title>
   <link href="http://www.johng.co.uk/2011/05/07/splitstate-2.0-mongodb-delayedjob-edition/"/>
   <updated>2011-05-07T00:00:00-07:00</updated>
	<author>
    	<name>John Griffin</name>
        <uri>http://www.johng.co.uk/</uri>
    </author>
   <id>http://www.johng.co.uk/2011/05/07/splitstate-2.0-mongodb-delayedjob-edition</id>
   <content type="html">&lt;p&gt;&lt;a href='http://www.splitstate.com'&gt;Splitstate.com&lt;/a&gt; is the gaming news service that I launched in 2009 and announced &lt;a href='http://www.johng.co.uk/2010/01/15/splitstate-com-latest-gaming-news/'&gt;here&lt;/a&gt; a few weeks later. By using a combination of Ruby and CouchDB I was able to provide a stable and reliable service for over a year with very few tweaks needed. Just looking back at the git log and the server uptime I can see there was a period last year where no work was done on the site for 8 months while I and others were happily using the service everyday.&lt;/p&gt;

&lt;p&gt;But all good things must come to an end - a few months ago requests started encountering long slow downs and the application would crash several time a day. It was due to a number of reasons but the main issue affecting performance was the database growing to 3GB and the app not being designed to handle such a large dataset. Partially my fault and partially a fault of the tools I was using I decided to rebuild splitstate once more - harder, better, faster, stronger!&lt;/p&gt;

&lt;h3 id='the_database'&gt;The Database&lt;/h3&gt;

&lt;p&gt;I love CouchDB, I think it&amp;#8217;s a fantastic database and it&amp;#8217;s a great way to build web services and self contained data driven applications. What hasn&amp;#8217;t been so great about using CouchDB is the driver and ODM support. The best way I found to work with it was to write map reduce functions right on the database - not the Rails way at all.&lt;/p&gt;

&lt;p&gt;In my day to day work and on other projects I have been using MongoDB a lot more where the ODM support is just stellar. You really can&amp;#8217;t go wrong with either &lt;a href='http://mongomapper.com/'&gt;MongoMapper&lt;/a&gt; or &lt;a href='http://mongoid.org/'&gt;Mongoid&lt;/a&gt; as they both have active communities around them and continue to be updated to work with the latest versions of MongoDB and Rails. I went with Mongoid because I&amp;#8217;m more familiar with it.&lt;/p&gt;

&lt;h3 id='background_processing'&gt;Background Processing&lt;/h3&gt;

&lt;p&gt;Last time I chose ruby daemons for processing all the feeds and links that need to be sifted through which has turned out to be a very primitive and non-scalable option. Luckily job queues and background processing options have come a long way since then! I chose &lt;a href='https://github.com/collectiveidea/delayed_job'&gt;DelayedJob&lt;/a&gt; because it integrates well with Mongoid and &lt;a href='http://www.heroku.com/'&gt;Heroku&lt;/a&gt; supports it with no configuration needed.&lt;/p&gt;

&lt;h3 id='the_code'&gt;The Code&lt;/h3&gt;

&lt;p&gt;I took a much more modular approach when writing the code this time and was able to learn from the mistakes I made last time. Lots of small methods and anything that needed to hit a remote server I encapsulated as a delayed job. Switching to Mongo allowed me to keep more of the story selection logic in Ruby where it should be so I could throughly test it. I&amp;#8217;m much happier with the code now - it&amp;#8217;s cleaner, leaner and more maintainable than before.&lt;/p&gt;

&lt;h3 id='hosting'&gt;Hosting&lt;/h3&gt;

&lt;p&gt;I did &lt;a href='http://www.johng.co.uk/2011/04/21/heroku-and-ec2/'&gt;rant about Heroku in my last post&lt;/a&gt; but it really is the easiest way to host a rails application. Splitstate 1.0 was running on &lt;a href='http://www.linode.com/'&gt;Linode&lt;/a&gt; who are an excellent VPS provider but these days I need something a little more managed so I can just focus on the code. I don&amp;#8217;t want to worry about installing packages on the server and heroku&amp;#8217;s git based deployment makes it hard to use anything else.&lt;/p&gt;

&lt;h3 id='this_is_not_the_end'&gt;This Is Not The End&lt;/h3&gt;

&lt;p&gt;The hard work is done, it&amp;#8217;s running on production and finding loads of interesting news stories. Of course I would like to do more with splitstate and now it&amp;#8217;s running nicely I can build on this a deliver new features and potentially even new sites!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Heroku, EC2 and The Cloud</title>
   <link href="http://www.johng.co.uk/2011/04/21/heroku-and-ec2/"/>
   <updated>2011-04-21T00:00:00-07:00</updated>
	<author>
    	<name>John Griffin</name>
        <uri>http://www.johng.co.uk/</uri>
    </author>
   <id>http://www.johng.co.uk/2011/04/21/heroku-and-ec2</id>
   <content type="html">&lt;p&gt;Today Amazon&amp;#8217;s US East Coast EC2 servers went down hard, taking with them &lt;a href='http://eu.techcrunch.com/2011/04/21/amazon-ec2-goes-down-taking-with-it-reddit-foursquare-and-quora/'&gt;many popular websites&lt;/a&gt;. Our internal application is hosted on &lt;a href='http://www.heroku.com/'&gt;Heroku&lt;/a&gt;, who provide a layer on top of &lt;a href='http://aws.amazon.com/ec2/'&gt;EC2&lt;/a&gt; for hosting Ruby rack applications, was one of the many effected. Heroku along with countless other hosting providers bill themselves as &amp;#8220;cloud hosts&amp;#8221; but that term is very lose and open to interpretation.&lt;/p&gt;

&lt;p&gt;Amazon can degrade instances when they feel like and provide no easy way to move instances between data centres. Heroku provide excellent features and add a ton of value to the cloud but are really no better when it comes to reliability. They only run instances in the US East Cost data centre and are essentially at the whim of Amazon when it comes to availability.&lt;/p&gt;

&lt;p&gt;A true cloud provider would spread instances across as many of Amazon&amp;#8217;s regions as possible and even onto other provider&amp;#8217;s clouds such as &lt;a href='http://www.rackspace.com/'&gt;Rackspace&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The promises of the cloud were that it didn&amp;#8217;t matter where your apps and data were located - they were just in the cloud! Turns out the current offerings are not even close.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>A Good Question To Ask Entry Level Developers</title>
   <link href="http://www.johng.co.uk/2011/03/05/a-good-question-to-ask-entry-level-developers/"/>
   <updated>2011-03-05T00:00:00-08:00</updated>
	<author>
    	<name>John Griffin</name>
        <uri>http://www.johng.co.uk/</uri>
    </author>
   <id>http://www.johng.co.uk/2011/03/05/a-good-question-to-ask-entry-level-developers</id>
   <content type="html">&lt;p&gt;We have been interviewing a fair number of junior/graduate/entry-level developers recently and it can be frustrating when someone with very poor fundamentals sneaks their way into a face to face interview. We came up with a stupidly simple question that we use to filter out these candidates.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Write a method that can add together (sum) all the elements in an array. Assume all the elements are integers. Use any programming language.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Seriously. I was shocked how many people just can&amp;#8217;t do this.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Maintaining Balance While Reducing Duplication</title>
   <link href="http://www.johng.co.uk/2011/01/23/maintaining-balance-while-reducing-duplication/"/>
   <updated>2011-01-23T00:00:00-08:00</updated>
	<author>
    	<name>John Griffin</name>
        <uri>http://www.johng.co.uk/</uri>
    </author>
   <id>http://www.johng.co.uk/2011/01/23/maintaining-balance-while-reducing-duplication</id>
   <content type="html">&lt;p&gt;If you haven&amp;#8217;t checked it out yet I highly recommend watching &lt;a href='http://confreaks.net/videos/434-rubyconf2010-maintaining-balance-while-reducing-duplication'&gt;David Chelimsky&amp;#8217;s talk at RubyConf&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href='http://confreaks.net/videos/434-rubyconf2010-maintaining-balance-while-reducing-duplication'&gt;&lt;img src='/images/dchrc.png' alt='Maintaining Balance While Reducing Duplication' /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using some great examples he shows exactly what DRY &lt;em&gt;actually&lt;/em&gt; means and shows how sometimes refactoring can go too far. A lot of the topics are addressed in the &lt;a href='http://www.amazon.com/Refactoring-Ruby-Jay-Fields/dp/0321603508'&gt;Refactoring Ruby book&lt;/a&gt; and you can search your code for the issues mentioned using &lt;a href='http://metric-fu.rubyforge.org/'&gt;metric fu&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>So You Want To Be A Developer?</title>
   <link href="http://www.johng.co.uk/2011/01/15/so_you_want_to_be_a_developer/"/>
   <updated>2011-01-15T00:00:00-08:00</updated>
	<author>
    	<name>John Griffin</name>
        <uri>http://www.johng.co.uk/</uri>
    </author>
   <id>http://www.johng.co.uk/2011/01/15/so_you_want_to_be_a_developer</id>
   <content type="html">&lt;p&gt;Dave Hoover writes &lt;a href='http://nuts.redsquirrel.com/post/2680658687/chicagos-ruby-developer-crisis'&gt;here&lt;/a&gt; about the current lack of Ruby developers available in Chicago. A quick skim through the comments and we can see people chiming in from other cities voicing the same concern. I can definitely relate but here in London it seems there are a lack of good, keen developers across all languages. At my last two companies (Java and Ruby) hiring good people was a major ongoing issue that was always in the back of our minds. The hiring process is not only a major time sync but very depressing when it gets drawn out for months on end.&lt;/p&gt;

&lt;p&gt;Here are some of the major stumbling blocks our (very few) candidates have run into. If you are hiring this is a good list of things to look out for and if you are job hunting you need to get this issues nailed down.&lt;/p&gt;

&lt;h3 id='concise_logical_cvresum'&gt;Concise Logical CV\Resumé&lt;/h3&gt;

&lt;p&gt;CVs that don&amp;#8217;t make sense, are poorly written or are just too long usually get discarded. If you haven&amp;#8217;t spent the time writing a concise, well thought out resumé tailored for the job you are applying for you don&amp;#8217;t stand much of a chance. Write it, rewrite it, cut it down and use the god damn spell checker. No Word DOCs - only send PDFs or URLs.&lt;/p&gt;

&lt;h3 id='social_skills'&gt;Social Skills&lt;/h3&gt;

&lt;p&gt;This is often overlooked. In large companies many developers can be easily hide away in their cubicles and just get on with coding without talking to anyone for days. In smaller companies this is not the case and you will need to be prepared for it. Having clear, reasonable, democratic discussions about architecture and code is something we do everyday and you will not get hired if there is the slightest chance that flow could be disrupted.&lt;/p&gt;

&lt;p&gt;The key thing here is to not be too opinionated, do not force your beliefs on others and allow the team to reach agreements naturally. You will not win every argument but it doesn&amp;#8217;t matter if you can form a consensus.&lt;/p&gt;

&lt;h3 id='keen_interest'&gt;Keen Interest&lt;/h3&gt;

&lt;p&gt;If you interview with me and you say you don&amp;#8217;t care if you work in PHP or Ruby then it&amp;#8217;s probably over at that point. Then again if you consider them both exciting languages with great communities and lots happening we can talk further. It&amp;#8217;s not about what area you find the most interesting, it&amp;#8217;s a question of you engaging and seeking out new technologies and techniques. Always have side projects, the best developers do and I find it odd when people don&amp;#8217;t. Being active outside of work is a sign of passion.&lt;/p&gt;

&lt;h3 id='computing_background'&gt;Computing Background&lt;/h3&gt;

&lt;p&gt;This is not a deal breaker but if you do not have a Computer Science degree (or equivalent) you will need to make up for it. That&amp;#8217;s either through experience or at more junior levels evidence of existing projects and a clear grasp of the fundamentals. Write code and ship it.&lt;/p&gt;

&lt;h3 id='the_silver_lining'&gt;The Silver Lining&lt;/h3&gt;

&lt;p&gt;Although we are having problems hiring this does present a major opportunity for young developers or people seeking a career change. Learn programming, get really good and deploy some applications. Also if you are looking for a good Ruby programming role in London please &lt;a href='http://twitter.com/johng'&gt;get in touch with me&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Run Capybara & Cucumber Features In Internet Explorer On Remote Windows</title>
   <link href="http://www.johng.co.uk/2010/10/13/run_capybara_and_cucumber_features_in_internet_explorer_on_remote_windows/"/>
   <updated>2010-10-13T00:00:00-07:00</updated>
	<author>
    	<name>John Griffin</name>
        <uri>http://www.johng.co.uk/</uri>
    </author>
   <id>http://www.johng.co.uk/2010/10/13/run_capybara_and_cucumber_features_in_internet_explorer_on_remote_windows</id>
   <content type="html">&lt;p&gt;&lt;a href='http://github.com/jnicklas/capybara'&gt;Capybara&lt;/a&gt; is a fantastic way to perform real integration tests on your Rails apps in actual browsers. Anyone can start writing tests (or features) after reading through a &lt;a href='http://cukes.info/'&gt;couple of examples&lt;/a&gt; using the super simple Cucumber tools.&lt;/p&gt;

&lt;p&gt;I thought a lot of people would be using Capybara to run their tests in Internet Explorer on remote Windows boxes. Most Rails developers are not running Windows making testing in IE a chore, so any automated way of doing so would be massively popular right? Not really! I couldn&amp;#8217;t find much in the way of end to end documentation so I dug through the Capybara\WebDriver source code and eventually got it all working. If you want to get it working in your Rails application it&amp;#8217;s actually pretty simple (now I&amp;#8217;ve done the research!).&lt;/p&gt;

&lt;h3 id='installing_cucumber_and_capybara'&gt;Installing Cucumber and Capybara&lt;/h3&gt;

&lt;p&gt;First thing is make sure you have the latest Cucumber and Capybara configured in your Rails app. If you have a Gemfile add these dependancies and then run bundle update:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='n'&gt;gem&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;cucumber-rails&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;0.3.2&amp;#39;&lt;/span&gt;
&lt;span class='n'&gt;gem&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;capybara&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;0.4.0.rc&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;If you&amp;#8217;re still adding gems in the environment.rb add these lines there instead:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='n'&gt;config&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;gem&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;cucumber-rails&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='ss'&gt;:version&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;0.3.2&amp;#39;&lt;/span&gt;
&lt;span class='n'&gt;config&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;gem&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;capybara&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='ss'&gt;:version&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;0.4.0.rc&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;These were the latest versions of the gems at the time of writing - use these or newer versions. Make sure these gems are installed and then run this is generate your cucumber config:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;script/generate cucumber --capybara --rspec --spork
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Feel free to omit the rspec and spork options if you don&amp;#8217;t use them.&lt;/p&gt;

&lt;h3 id='testing_it_out'&gt;Testing It Out&lt;/h3&gt;

&lt;p&gt;I highly recommend at this point you write a Cucumber feature and get it passing. We haven&amp;#8217;t configured Capybara for IE yet so this will run using Capybara&amp;#8217;s default driver (headless) so you can see if your feature works at all before we even try and get it working in a real browser.&lt;/p&gt;

&lt;p&gt;Pick a really simple part of your application (like a login screen) to start with and write a feature for it based on the &lt;a href='http://github.com/jnicklas/capybara'&gt;excellent documentation&lt;/a&gt; and then run:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;rake cucumber
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Once you have your feature passing we can move on with the configuration.&lt;/p&gt;

&lt;h3 id='windows_configuration'&gt;Windows Configuration&lt;/h3&gt;

&lt;p&gt;Pick a Windows box (XP, Server 2003 or newer) either on your local network, in the &lt;a href='http://aws.amazon.com/windows/'&gt;cloud&lt;/a&gt; or on a &lt;a href='http://www.virtualbox.org/'&gt;virtual machine&lt;/a&gt; on your desktop. So long as the box is accessible via the network it depends on your preference which one you go for.&lt;/p&gt;

&lt;p&gt;WebDriver\Selenium requires Java so if you don&amp;#8217;t have it download it &lt;a href='http://www.java.com/en/download/manual.jsp'&gt;here&lt;/a&gt;. You should be able to open up a new command prompt (Start..Run&amp;#8230;cmd) and run the java command to see it has installed successfully.&lt;/p&gt;

&lt;p&gt;Go to the Selenium downloads page and grab the file selenium-server-standalone-2.0a6.jar (or whatever the latest version is). From your command prompt you should be able to navigate to where the file is downloaded and run:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;java -jar selenium-server-standalone-2.0a6.jar
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;It should output some logs and let you know its running and awaiting connections.&lt;/p&gt;

&lt;h3 id='hooking_up_capybara_to_windows'&gt;Hooking Up Capybara to Windows&lt;/h3&gt;

&lt;p&gt;To get our features running on that box lets switch back to the Rails app, open up features/support/env.rb and after this line:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='no'&gt;Capybara&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;default_selector&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='ss'&gt;:css&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;insert this configuration:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='no'&gt;Capybara&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;app_host&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;http://192.168.1.37:3000&amp;quot;&lt;/span&gt;
&lt;span class='no'&gt;Capybara&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;default_driver&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='ss'&gt;:selenium&lt;/span&gt;
&lt;span class='no'&gt;Capybara&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;register_driver&lt;/span&gt; &lt;span class='ss'&gt;:selenium&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt; &lt;span class='o'&gt;|&lt;/span&gt;&lt;span class='n'&gt;app&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt;
  &lt;span class='no'&gt;Capybara&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='no'&gt;Driver&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='no'&gt;Selenium&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;new&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;app&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
    &lt;span class='ss'&gt;:browser&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='ss'&gt;:remote&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
    &lt;span class='ss'&gt;:url&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;http://192.168.1.127:4444/wd/hub&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
    &lt;span class='ss'&gt;:desired_capabilities&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='ss'&gt;:internet_explorer&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Replace the IPs of app_host and url to the IPs of your Rails app and Windows box respectively.&lt;/p&gt;

&lt;h3 id='watch_the_show'&gt;Watch The Show&lt;/h3&gt;

&lt;p&gt;Run it:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;rake cucumber
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Look at your Windows box and you should see the Capybara connect and start to run your tests through IE. With a little luck everything will pass!&lt;/p&gt;

&lt;p&gt;Now you can right outside-in tests for every new feature you add and be safe in the knowledge they work in IE. Let me know if you had any problems.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>The Crazy State of Cross Browser Integration Testing</title>
   <link href="http://www.johng.co.uk/2010/10/11/the-crazy-state-of-cross-browser-integration-testing/"/>
   <updated>2010-10-11T00:00:00-07:00</updated>
	<author>
    	<name>John Griffin</name>
        <uri>http://www.johng.co.uk/</uri>
    </author>
   <id>http://www.johng.co.uk/2010/10/11/the-crazy-state-of-cross-browser-integration-testing</id>
   <content type="html">&lt;p&gt;In researching modern ways to perform cross browser integration tests I came across this rather crazy diagram of how everything fits together in the Rails world.&lt;/p&gt;

&lt;p&gt;&lt;img src='http://img.skitch.com/20101011-nqapqj7mryy31iqcgyy1yf2ut3.png' alt='Cross Browser Integration Testing' /&gt;&lt;/p&gt;

&lt;p&gt;Believe it or not that&amp;#8217;s entirely accurate. At least I know we should be using &lt;a href='http://github.com/jnicklas/capybara'&gt;Capybara&lt;/a&gt; for maximum compatibility now!&lt;/p&gt;

&lt;p&gt;via &lt;a href='http://www.slideshare.net/martinkleppmann/crossbrowser-testing-in-the-real-world'&gt;Martin Kleppmann&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>`backend': no such file to load -- i18n/backend (MissingSourceFile)</title>
   <link href="http://www.johng.co.uk/2010/10/07/backend-no-such-file-to-load--i18n-backend-missingsourcefile/"/>
   <updated>2010-10-07T00:00:00-07:00</updated>
	<author>
    	<name>John Griffin</name>
        <uri>http://www.johng.co.uk/</uri>
    </author>
   <id>http://www.johng.co.uk/2010/10/07/backend-no-such-file-to-load--i18n-backend-missingsourcefile</id>
   <content type="html">&lt;p&gt;While upgrading an old Rails 2.3.5 app to Rails 2.3.9 I came across this error:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='sb'&gt;`backend&amp;#39;: no such file to load -- i18n/backend (MissingSourceFile)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;It&amp;#8217;s very simple to fix as Rails 2.3.9 is just missing the i18n dependancy. If you are requiring gems using the old school way just add it to your environment.rb:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='n'&gt;config&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;gem&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;i18n&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Or if you&amp;#8217;re running &lt;a href='http://gembundler.com/rails23.html'&gt;Bundler&lt;/a&gt;, like everyone should be, just add it to your Gemfile and run bundle update:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='n'&gt;gem&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;i18n&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</content>
 </entry>
 
 <entry>
   <title>HDR Photos on iPhone 4</title>
   <link href="http://www.johng.co.uk/2010/09/17/hdr-photos-on-iphone-4/"/>
   <updated>2010-09-17T00:00:00-07:00</updated>
	<author>
    	<name>John Griffin</name>
        <uri>http://www.johng.co.uk/</uri>
    </author>
   <id>http://www.johng.co.uk/2010/09/17/hdr-photos-on-iphone-4</id>
   <content type="html">&lt;p&gt;The recent &lt;a href='http://www.apple.com/iphone/software-update/'&gt;iOS 4.1 update&lt;/a&gt; added the ability to take HDR photos from the iPhone 4 camera app. Last weekend in London we had the &lt;a href='http://www.thamesfestival.org/'&gt;Thames Festival&lt;/a&gt; which made for a great opportunity to try out the new feature in a low light setting. Here are some of the photos below. You can see the iPhone stores both the regular version (left) and the HDR enhanced one (right).&lt;/p&gt;
&lt;a href='http://www.flickr.com/photos/jgriffin/4999099017/' title='IMG_0854 by John Griffin, on Flickr'&gt;&lt;img src='http://farm5.static.flickr.com/4151/4999099017_06b375cf21_m.jpg' height='179' alt='IMG_0854' width='240' /&gt;&lt;/a&gt;&lt;a href='http://www.flickr.com/photos/jgriffin/4999099407/' title='IMG_0855 by John Griffin, on Flickr'&gt;&lt;img src='http://farm5.static.flickr.com/4086/4999099407_cf7316a4ab_m.jpg' height='179' alt='IMG_0855' width='240' /&gt;&lt;/a&gt;&lt;a href='http://www.flickr.com/photos/jgriffin/4999099795/' title='IMG_0883 by John Griffin, on Flickr'&gt;&lt;img src='http://farm5.static.flickr.com/4092/4999099795_5065d672d3_m.jpg' height='179' alt='IMG_0883' width='240' /&gt;&lt;/a&gt;&lt;a href='http://www.flickr.com/photos/jgriffin/4999100169/' title='IMG_0884 by John Griffin, on Flickr'&gt;&lt;img src='http://farm5.static.flickr.com/4086/4999100169_553dfc32bb_m.jpg' height='179' alt='IMG_0884' width='240' /&gt;&lt;/a&gt;&lt;a href='http://www.flickr.com/photos/jgriffin/4999101201/' title='IMG_0897 by John Griffin, on Flickr'&gt;&lt;img src='http://farm5.static.flickr.com/4104/4999101201_d3f71d8860_m.jpg' height='179' alt='IMG_0897' width='240' /&gt;&lt;/a&gt;&lt;a href='http://www.flickr.com/photos/jgriffin/4999705260/' title='IMG_0898 by John Griffin, on Flickr'&gt;&lt;img src='http://farm5.static.flickr.com/4113/4999705260_52ffed057f_m.jpg' height='179' alt='IMG_0898' width='240' /&gt;&lt;/a&gt;
&lt;p&gt;The rest of the set is up on flickr &lt;a href='http://www.flickr.com/photos/jgriffin/sets/72157624977375288/'&gt;here&lt;/a&gt;. It still doesn&amp;#8217;t come close to a real camera. Even a cheap point a shoot would avoid this level of blurring and light streaks. In daylight the camera is great but anything else is a gamble.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>News Overload</title>
   <link href="http://www.johng.co.uk/2010/08/15/news-overload/"/>
   <updated>2010-08-15T00:00:00-07:00</updated>
	<author>
    	<name>John Griffin</name>
        <uri>http://www.johng.co.uk/</uri>
    </author>
   <id>http://www.johng.co.uk/2010/08/15/news-overload</id>
   <content type="html">&lt;p&gt;There is a &lt;a href='http://5by5.tv/conversation/29'&gt;great episode&lt;/a&gt; of The Conversation up at 5by5&lt;sup id='fnref:1'&gt;&lt;a href='#fn:1' rel='footnote'&gt;1&lt;/a&gt;&lt;/sup&gt; which starts to dig into a topic I have been thinking about for a few years, news overload. Dan and Mike discuss this problem and point to RSS and Twitter as major time sinks that could be overcome with clever filtering technology.&lt;/p&gt;

&lt;h3 id='history'&gt;History&lt;/h3&gt;

&lt;p&gt;I have used RSS aggregators since the &lt;a href='http://radio.userland.com/'&gt;Radio Userland&lt;/a&gt; days. I then moved onto &lt;a href='http://www.newsgator.com'&gt;Newsgator&lt;/a&gt; and have been using &lt;a href='http://www.google.com/reader'&gt;Google Reader&lt;/a&gt; since &lt;a href='http://www.johng.co.uk/2006/12/20/switched-to-google-reader/'&gt;2006&lt;/a&gt;, all the while increasing the number of feeds I read and receiving a greater volume of content from each feed. It got to a point &lt;a href='http://www.johng.co.uk/2009/07/22/are-feed-readers-dead/'&gt;last year&lt;/a&gt; that I had to go through a massive cull and rethink the way I was consuming news. Now I&amp;#8217;m in a middle ground where I actively add and remove feeds on a regular basis to keep control of the flow.&lt;/p&gt;

&lt;h3 id='whats_out_there'&gt;What&amp;#8217;s Out There&lt;/h3&gt;

&lt;p&gt;I have tried to use a number of different smart aggregators but they all fall short.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://feedafever.com/'&gt;Fever&lt;/a&gt; isn&amp;#8217;t smart enough and gives either a lot of duplicates or stories that I&amp;#8217;m not interested in.&lt;/li&gt;

&lt;li&gt;Dedicated sites like &lt;a href='http://www.techmeme.com'&gt;Techmeme&lt;/a&gt; only cover a single topics and there are very few of them around.&lt;/li&gt;

&lt;li&gt;Twitter, which is essentially a crowd sourced filter, misses a ton of interesting content out there.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href='http://www.splitstate.com'&gt;&lt;img src='http://www.splitstate.com/images/splitstate.png?1272632035' alt='splitstate right' /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I even developed my own dedicated site called &lt;a href='http://www.splitstate.com'&gt;Splitstate&lt;/a&gt; which serves as an auto aggregator/filter for gaming news in a similar fashion to Techmeme. It was a tough project with a ton of unexpected pitfalls during its development but it gave me some insight into the news filtering problem. Best of all it works and I use it everyday&lt;sup id='fnref:2'&gt;&lt;a href='#fn:2' rel='footnote'&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;

&lt;h3 id='taking_news_to_the_next_level'&gt;Taking News To The Next Level&lt;/h3&gt;

&lt;p&gt;The current news filters such as Techmeme and Splitstate do fundamentally basic things - analyse news feeds within a limited scope and try to find common threads between them, the more talked about a subject is the more prominence it&amp;#8217;s given on a page. To move things to the next level we will need to do a lot more than this.&lt;/p&gt;

&lt;p&gt;This software will need to analyse you - what you are interested in, talk about and do online. It will need to source data from Twitter, Facebook and other sites to give you a more personal news stream. It should also be capable of prioritising significant world news so that even topics outside of your normal reading habits are brought to the fore. It should also be able to learn and adapt as you skip over or read articles in detail. Likewise it should recognise changes in taste over time and adjust accordingly.&lt;/p&gt;

&lt;p&gt;To put it lightly, &lt;strong&gt;this is a massive undertaking&lt;/strong&gt;, but the first developer that can get a working product out will be greatly rewarded. It&amp;#8217;s going to take overcoming this massive engineering hurdle for people to fully turn of their feed readers.&lt;/p&gt;
&lt;div class='footnotes'&gt;&lt;hr /&gt;&lt;ol&gt;&lt;li id='fn:1'&gt;
&lt;p&gt;A brilliant podcast network put together by fellow rubyist &lt;a href='http://hivelogic.com/'&gt;Dan Benjamin&lt;/a&gt;.&lt;/p&gt;
&lt;a href='#fnref:1' rev='footnote'&gt;&amp;#8617;&lt;/a&gt;&lt;/li&gt;&lt;li id='fn:2'&gt;
&lt;p&gt;I find Splitstate is best consumed via the &lt;a href='http://twitter.com/splitstate'&gt;twitter account&lt;/a&gt; which gives you breaking news throughout the day.&lt;/p&gt;
&lt;a href='#fnref:2' rev='footnote'&gt;&amp;#8617;&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;</content>
 </entry>
 
 <entry>
   <title>Starcraft 2 Review</title>
   <link href="http://www.johng.co.uk/2010/08/13/starcraft-2-review/"/>
   <updated>2010-08-13T00:00:00-07:00</updated>
	<author>
    	<name>John Griffin</name>
        <uri>http://www.johng.co.uk/</uri>
    </author>
   <id>http://www.johng.co.uk/2010/08/13/starcraft-2-review</id>
   <content type="html">&lt;p&gt;Starcraft 2 is a funny old game in a lot of ways. It&amp;#8217;s old and new at the same time and we have been waiting for it for a long long time.&lt;/p&gt;

&lt;h3 id='ignoring_progress'&gt;Ignoring Progress&lt;/h3&gt;

&lt;p&gt;At the gameplay level Blizzard have completely ignored all progress made in the rest of the RTS genre, be it the low level simplified tactics and action of Company of Heroes or the large scale strategic battles of Supreme Commander. Regardless of the reasons (&lt;a href='http://eu.battle.net/sc2/en/blog/314194#blog'&gt;eSports&lt;/a&gt;, &lt;a href='http://rossignol.cream.org/?p=284'&gt;Korea&lt;/a&gt;, etc) the game plays exactly the same as the original Starcraft from 12 years ago.&lt;/p&gt;

&lt;p&gt;&lt;img src='http://img.skitch.com/20100813-rfpcw9uxhukhityuj7k5rie6tb.png' alt='sc2a' /&gt;&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s quite a ballsy move when you compare it to other franchises from the same year, Fallout 2 was released in 1998 and just look at how much Bethesda have evolved the series to keep it relevant. Oh and lets not forget Baldur&amp;#8217;s Gate - have you played Dragon Age?&lt;/p&gt;

&lt;h3 id='refining_a_legend'&gt;Refining a Legend&lt;/h3&gt;

&lt;p&gt;The real genius behind Starcraft 2 is that Blizzard realised they already had a fantastic, almost timeless, gameplay dynamic that they could build on, which is exactly what the single player campaign does. Each mission has been expertly crafted and finely tweaked so it&amp;#8217;s unique from all the others. You never get the feeling of mission repetition as you get in so many other RTSs. Rarely is it a case of destroy their base before they destroy yours and even when it is they provide an interesting twist.&lt;/p&gt;

&lt;p&gt;The fantastic missions are backed up by a killer story that really propels you through the game. Blizzard can finally tell the story the way they want without restriction. It&amp;#8217;s also good to see them favour in game cut scenes more so than in the past, however key moments in the story are punctuated by gorgeous and dramatic CG cut scenes.&lt;/p&gt;

&lt;p&gt;&lt;img src='http://img.skitch.com/20100813-cdqj6qcrghxg7wcy1xq8acxem8.png' alt='sc2b' /&gt;&lt;/p&gt;

&lt;p&gt;You are given a greater sense of choice between missions too. Money earned in missions can be used to purchase unit upgrades and mercenaries. If you discover Zerg and Protoss artefacts mid mission you get to research new units and crazy upgrades. And at some key points you can side with one faction or another to complete certain objectives.&lt;/p&gt;

&lt;h3 id='zergy'&gt;Zergy&lt;/h3&gt;

&lt;p&gt;So all in all despite the lack of gameplay innovation Blizzard have done so much with the top notch single player campaign that it alone is worth the price of entry. Of course there&amp;#8217;s multiplayer, skirmish mode and getting all those addictive achievements to keep you going in the long term. Even if you haven&amp;#8217;t played the original I highly recommend you give it a try.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m &lt;a href='http://eu.battle.net/sc2/en/profile/446102/1/johng/'&gt;johng on Battle.net&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>iTunes Podcast Alternative Finally Emerges</title>
   <link href="http://www.johng.co.uk/2010/07/26/itunes-podcast-alternative-finally-emerges/"/>
   <updated>2010-07-26T00:00:00-07:00</updated>
	<author>
    	<name>John Griffin</name>
        <uri>http://www.johng.co.uk/</uri>
    </author>
   <id>http://www.johng.co.uk/2010/07/26/itunes-podcast-alternative-finally-emerges</id>
   <content type="html">&lt;p&gt;I&amp;#8217;ve been using iTunes for downloading podcasts since iTunes 4.9 came out in 2005. It was a great moment that took podcasting from the obscure straight into the mainstream in one swoop. In the last five years there has been nothing that could take it&amp;#8217;s place - even as we all moved from basic iPods to app driven iPhone.&lt;/p&gt;

&lt;p&gt;&lt;img src='http://img.skitch.com/20100723-nnnytnt55mynunrgpq34j4b2de.png' alt='Podcaster right' /&gt;&lt;/p&gt;

&lt;p&gt;With the recent release of iOS 4 Apple enabled background audio playback which resulted in a race to see who could put out the best podcatcher first. Luckily Alex Sokirynsky had an almost fully featured client on the app store already that just needed iOS 4 support and a little polish.&lt;/p&gt;

&lt;p&gt;Despite a few buggy releases &lt;a href='http://podcaster.fm/'&gt;Podcaster&lt;/a&gt; has matured into the best way to consume podcasts. I&amp;#8217;m no longer tied to iTunes syncing and I can download fresh content wherever I am. I used to sync to my Mac multiple times per day and now I rarely need to. You can easily bring your OPML subscription file over from iTunes and it&amp;#8217;s only &lt;a href='http://itunes.apple.com/gb/app/podcaster-formerly-rss-player/id377195245?mt=8'&gt;59p/99c&lt;/a&gt;. Highly recommended!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>How Surreal</title>
   <link href="http://www.johng.co.uk/2010/07/22/how-surreal/"/>
   <updated>2010-07-22T00:00:00-07:00</updated>
	<author>
    	<name>John Griffin</name>
        <uri>http://www.johng.co.uk/</uri>
    </author>
   <id>http://www.johng.co.uk/2010/07/22/how-surreal</id>
   <content type="html">&lt;p&gt;&lt;img src='http://img.skitch.com/20100722-x5ifw6y2563u8c87dt5pifk3bp.png' alt='Starcraft 2 processing' /&gt;&lt;/p&gt;

&lt;p&gt;Only took 12 years!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Pair Programming Pros and Cons</title>
   <link href="http://www.johng.co.uk/2010/07/04/pair-programming-pros-and-cons/"/>
   <updated>2010-07-04T00:00:00-07:00</updated>
	<author>
    	<name>John Griffin</name>
        <uri>http://www.johng.co.uk/</uri>
    </author>
   <id>http://www.johng.co.uk/2010/07/04/pair-programming-pros-and-cons</id>
   <content type="html">&lt;p&gt;Pair programming is a bit of a marmite concept the development community - you either love it or hate it. Some developers swear by it while others can not believe it&amp;#8217;s practiced. I&amp;#8217;ve worked under both extremes and right now I do a little of both so I thought I&amp;#8217;d share my findings.&lt;/p&gt;

&lt;h3 id='pros'&gt;Pros&lt;/h3&gt;
&lt;a href='http://www.flickr.com/photos/mendhak/3229053685/' title='Pear Programming by Mendhak [민다ᄏ], on Flickr' style='float:right'&gt;&lt;img src='http://farm4.static.flickr.com/3387/3229053685_e3cb5fd68c_m.jpg' height='160' alt='Pear Programming' width='240' /&gt;&lt;/a&gt;
&lt;p&gt;You always have two people who know the inner working of a feature. So if one is not around or leaves then the knowledge is retained.&lt;/p&gt;

&lt;p&gt;New team members can be more quickly integrated as they can immediately work on new features with more experienced developers. Knowledge spreads fast.&lt;/p&gt;

&lt;p&gt;Want to introduce a new language or technology to the team? There is no better to get the ball rolling than to implement a new feature as a pair using it to get the rest of the team onboard.&lt;/p&gt;

&lt;p&gt;Having a couple of pairs programming and one individual who deals with incoming internal and external information/development requests can effectively eliminate all interruptions. It leaves the pair to continue being productive and alleviates the problem of multiple people chipping in on an issue and disrupting the whole team.&lt;/p&gt;

&lt;h3 id='cons'&gt;Cons&lt;/h3&gt;

&lt;p&gt;The simple fact is not everyone gets along. Be it personality or programming style - working on something and having a lot of disagreements is not much fun.&lt;/p&gt;

&lt;p&gt;You need to be especially careful when hiring new people. It&amp;#8217;s very hard to gage how someone will fare day to day in an interview and even harder to gage how they well they work with others. Hiring slightly the wrong person can ruin a team&amp;#8217;s flow.&lt;/p&gt;

&lt;p&gt;Sometimes we all need a little space and a little room to breath for whatever reason. It&amp;#8217;s hard to get any if you have to pair all day everyday.&lt;/p&gt;

&lt;p&gt;Sharing computers and desks is awful. What if everyone needs to use the computer at lunch time and there are not enough to go around?&lt;sup id='fnref:1'&gt;&lt;a href='#fn:1' rel='footnote'&gt;1&lt;/a&gt;&lt;/sup&gt; What if you have carefully configured some apps on one machine but someone else is using it today?&lt;/p&gt;

&lt;p&gt;Some people are not as hygienic as others and you will be using the same keyboard and mouse - be prepared to share coughs and colds. Some people are tidier than others, leaving food and other things on the desk is no problem if it&amp;#8217;s your desk but can be quite annoying for others.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s much slower. Talking through approaches and trying to agree on an implementation takes up a fair amount of time. Sometimes you just want to knuckle down get something done - not gonna happen. Obviously the two people could be programming in parallel on different problems.&lt;/p&gt;

&lt;p&gt;Design by committee is &lt;a href='http://en.wikipedia.org/wiki/Design_by_committee'&gt;known to be a bad practice&lt;/a&gt; and yet pairing is usually done on front end (user facing) interfaces too. This leads to messy and overcomplicated screens that should be clear and well thought out.&lt;/p&gt;

&lt;h3 id='the_verdict'&gt;The Verdict&lt;/h3&gt;

&lt;p&gt;I&amp;#8217;m going to cop out at this point and say it depends on personal preference. It&amp;#8217;s important to stress that which ever system you choose - stick to your process and go through regular reviews with the team to iron out any kinks.&lt;/p&gt;
&lt;div class='footnotes'&gt;&lt;hr /&gt;&lt;ol&gt;&lt;li id='fn:1'&gt;
&lt;p&gt;Of course the best way to solve this is for each developer to have a personal laptop. This can be off to the side for looking up documentation and personal use while the main computer remains in the centre for programming.&lt;/p&gt;
&lt;a href='#fnref:1' rev='footnote'&gt;&amp;#8617;&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;</content>
 </entry>
 
 <entry>
   <title>Buy Iron Man Annual via Marvel iOS App</title>
   <link href="http://www.johng.co.uk/2010/07/02/buy-iron-man-annual-via-marvel-ios-app/"/>
   <updated>2010-07-02T00:00:00-07:00</updated>
	<author>
    	<name>John Griffin</name>
        <uri>http://www.johng.co.uk/</uri>
    </author>
   <id>http://www.johng.co.uk/2010/07/02/buy-iron-man-annual-via-marvel-ios-app</id>
   <content type="html">&lt;p&gt;I really encourage you to go buy &lt;a href='http://www.bleedingcool.com/2010/07/02/numbercrunching-iron-man-annual-1/'&gt;Invincible Iron Man Annual #1&lt;/a&gt; via the Marvel Comics iOS app this week. It has been released on the same day as the print version and is really quite good. If we can tell publishers how we wish to consume their content with our wallets they will respond.&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/ironmanannual.png' alt='Invincible Iron Man Annual #1' /&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Why Everyone Should Use Compass Instead of Pure CSS</title>
   <link href="http://www.johng.co.uk/2010/05/06/why-everyone-should-use-compass-instead-of-pure-css/"/>
   <updated>2010-05-06T00:00:00-07:00</updated>
	<author>
    	<name>John Griffin</name>
        <uri>http://www.johng.co.uk/</uri>
    </author>
   <id>http://www.johng.co.uk/2010/05/06/why-everyone-should-use-compass-instead-of-pure-css</id>
   <content type="html">&lt;p&gt;&lt;a href='http://compass-style.org/'&gt;Compass&lt;/a&gt; is a framework for creating CSS. You write stylesheets in SASS and they are compiled to CSS. In my view it is the best tool to come along in front end web development in a &lt;em&gt;long&lt;/em&gt; time. This is why you should start using it right now:&lt;/p&gt;

&lt;h3 id='your_stylesheets_will_more_closely_resemble_your_markup'&gt;Your Stylesheets Will More Closely Resemble Your Markup&lt;/h3&gt;

&lt;p&gt;SASS is whitespace aware so it forces you to think hierarchically. HTML is a hierarchy of nodes so why shouldn&amp;#8217;t your stylesheets be scoped in a similar way. This makes stylesheets more closely resemble markup and reduces common problems of style overlapping and elements taking on styles unexpectedly.&lt;/p&gt;

&lt;h3 id='your_stylesheets_will_be_smaller'&gt;Your Stylesheets Will Be Smaller&lt;/h3&gt;

&lt;p&gt;Working on a complex design with many pages can lead to fairly colossal CSS bloat. With reusable style blocks (mixins), variables, basic functions and inheritance you cut this down significantly. I am currently working on a project with 182 SASS properties defined. After compilation this gives 795 CSS properties. I&amp;#8217;m so glad I didn&amp;#8217;t have to type out all that CSS.&lt;/p&gt;

&lt;h3 id='css_framework_support'&gt;CSS Framework Support&lt;/h3&gt;

&lt;p&gt;Compass has built in support for &lt;a href='http://blueprintcss.org/'&gt;Blueprint&lt;/a&gt;, &lt;a href='http://developer.yahoo.com/yui/grids/'&gt;YUI&lt;/a&gt;, &lt;a href='http://960.gs/'&gt;360 Grid&lt;/a&gt;, &lt;a href='http://www.oddbird.net/susy/'&gt;Susy&lt;/a&gt; and others through plugins. They provide tried and tested layouts and styles that have been tested cross browser. Compass defaults to Blueprint and I highly recommend you use it. No more floating and guessing widths - just set your column size and it works.&lt;/p&gt;

&lt;h3 id='fantastic_plugins_utilities_and_mixins'&gt;Fantastic Plugins, Utilities and Mixins&lt;/h3&gt;

&lt;p&gt;I had a problem with CSS ellipsis support under Firefox recently but Compass had me covered with a &lt;a href='http://compass-style.org/docs/reference/compass/utilities/text/ellipsis/'&gt;plugin&lt;/a&gt;. I just did a compass install compass/ellipsis and gave the broken link a class of ellipsis. Done. No hacking, no worrying. There are tons of helpers like this that cover everything from link colouring to border radius.&lt;/p&gt;

&lt;h3 id='keep_your_css_modern'&gt;Keep Your CSS Modern&lt;/h3&gt;

&lt;p&gt;If I do +border-radius in the latest version of Compass it applies the necessary properties to get rounded corners working on webkit, mozilla, opera and IE (when support comes). In the future as new versions of Compass are released to support new browsers the CSS properties behind might change but I don&amp;#8217;t need to know about it, I just need to call it and it works everywhere.&lt;/p&gt;

&lt;h3 id='you_dont_have_to_write_sass'&gt;You Don&amp;#8217;t Have To Write SASS&lt;/h3&gt;

&lt;p&gt;I think SASS is brilliant but many people don&amp;#8217;t have the time to learn it or just dislike it. Compass 0.10 introduces support for SCSS which is a superset of CSS. If you know CSS you can immediately write Compass compatible style sheets.&lt;/p&gt;

&lt;h3 id='it_will_run_anywhere'&gt;It Will Run Anywhere&lt;/h3&gt;

&lt;p&gt;Although it&amp;#8217;s a Ruby project I have used it with Java in production. It&amp;#8217;s a command line tool so you can either leave it watching your style directory and compiling automatically or just hook it into your normal build process by calling the compile command. Of course it work best in Rails but there is no excuse for not using it on other projects.&lt;/p&gt;

&lt;p&gt;Give it a try today! Compass even includes convertors to get your old styles ported over to SASS or SCSS so there&amp;#8217;s no excuse.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Thoughts on Flash</title>
   <link href="http://www.johng.co.uk/2010/04/29/thoughts-on-flash/"/>
   <updated>2010-04-29T00:00:00-07:00</updated>
	<author>
    	<name>John Griffin</name>
        <uri>http://www.johng.co.uk/</uri>
    </author>
   <id>http://www.johng.co.uk/2010/04/29/thoughts-on-flash</id>
   <content type="html">&lt;p&gt;&lt;a href='http://www.apple.com/hotnews/thoughts-on-flash/'&gt;Jobs lays it out&lt;/a&gt;,&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Our motivation is simple – we want to provide the most advanced and innovative platform to our developers, and we want them to stand directly on the shoulders of this platform and create the best apps the world has ever seen. We want to continually enhance the platform so developers can create even more amazing, powerful, fun and useful applications. Everyone wins – we sell more devices because we have the best apps, developers reach a wider and wider audience and customer base, and users are continually delighted by the best and broadest selection of apps on any platform.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you want flash don&amp;#8217;t bother with iPhone OS devices. If you do want flash my question to you would be why? Key sites are already compatible or have apps and games/UI won&amp;#8217;t work correctly due to the touch interface.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m glad Apple are pushing this hard against Adobe. Someone needed to and Apple are in a position where they can. I also hope Adobe come out with a top notch HTML5 package targeted at designers, something that can produce content that works on any platform without the need for bloated plugins.&lt;/p&gt;</content>
 </entry>
 
 
</feed>
