<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en-US">
  <title>Aslak Hellesøy - Home</title>
  <id>tag:blog.aslakhellesoy.com,2008:mephisto/</id>
  <generator uri="http://mephistoblog.com" version="0.7.3">Mephisto Noh-Varr</generator>
  
  <link href="http://blog.aslakhellesoy.com/" rel="alternate" type="text/html" />
  <updated>2008-03-30T20:29:30Z</updated>
  <link rel="self" href="http://feeds.feedburner.com/AslakHellesoy" type="application/atom+xml" /><entry xml:base="http://blog.aslakhellesoy.com/">
    <author>
      <name>aslak.hellesoy</name>
    </author>
    <id>tag:blog.aslakhellesoy.com,2008-03-30:11922</id>
    <published>2008-03-30T20:23:00Z</published>
    <updated>2008-03-30T20:29:30Z</updated>
    <category term="ruby usb gem betabrite" />
    <link href="http://feedproxy.google.com/~r/AslakHellesoy/~3/f_BYnYHaum8/ruby-usb-gems" rel="alternate" type="text/html" />
    <title>Ruby-usb gems</title>
<content type="html">
            &lt;p&gt;I’ve packaged ruby-usb as gems, available both for Windows an *nix/linux/os x&lt;/p&gt;


	&lt;p&gt;gem install ruby-usb # On *nix/linux/os x you must first install &lt;a href="http://libusb.wiki.sourceforge.net/"&gt;Lib-USB&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;At one of the projects in &lt;span class="caps"&gt;BEKK&lt;/span&gt; we bought a &lt;a href="http://www.touch-it.no/content/view/40/67/"&gt;Betabrite Prism&lt;/a&gt; sign to display the status of builds. Getting the &lt;a href="http://betabrite.rubyforge.org/"&gt;Betabrite Gem&lt;/a&gt; to work via &lt;span class="caps"&gt;USB&lt;/span&gt; on Windows was a bit of a challenge. I got around it, so I’d like to share it with others.&lt;/p&gt;


	&lt;p&gt;The first hurdle was to get &lt;a href="http://a-k-r.org/ruby-usb/"&gt;Ruby-usb&lt;/a&gt; to work on Windows. Ruby-usb is a Ruby library that uses the &lt;a href="http://libusb.wiki.sourceforge.net/"&gt;Lib-USB&lt;/a&gt; C library. Ruby-usb wasn’t available as a binary gem (with compiled C extensions), so I figured I had to make one myself. Luckily there is a &lt;a href="http://libusb-win32.sourceforge.net/"&gt;Windows port of Lib-USB&lt;/a&gt;, and I decided to try to build Ruby-usb’s C extensions against that library.&lt;/p&gt;


	&lt;p&gt;After a lot of reading and trial and error I finally realised I had to build Ruby-usb’s C extensions with &lt;a href="http://www.mingw.org/"&gt;MinGW&lt;/a&gt; and &lt;a href="http://www.mingw.org/msys.shtml"&gt;&lt;span class="caps"&gt;MSYS&lt;/span&gt;&lt;/a&gt;. I even had to build Ruby itself with MinGW/MSYS in order to get rbconfig to work. These tools are great alternatives to Cygwin, as they produce “pure” win32 binaries.&lt;/p&gt;


	&lt;p&gt;With a working Ruby-usb gem for Windows I tried out the Betabrite gem, and found a &lt;a href="http://rubyforge.org/frs/shownotes.php?release_id=20664"&gt;little bug&lt;/a&gt; that has now been fixed.&lt;/p&gt;


	&lt;p&gt;So I ended up having to fork Tanaka’s original Ruby-usb project. The code is on &lt;a href="http://gitorious.org/projects/ruby-usb"&gt;Gitorious&lt;/a&gt; and the Gem on &lt;a href="http://ruby-usb.rubyforge.org/"&gt;Rubyforge&lt;/a&gt;. Forking is something I hate to do, but I haven’t been able to get in touch with Tanaka, and it seemed like the only way to publish Ruby-usb as gems.&lt;/p&gt;
          </content>  <feedburner:origLink>http://blog.aslakhellesoy.com/2008/3/30/ruby-usb-gems</feedburner:origLink></entry>
  <entry xml:base="http://blog.aslakhellesoy.com/">
    <author>
      <name>aslak.hellesoy</name>
    </author>
    <id>tag:blog.aslakhellesoy.com,2008-03-04:11891</id>
    <published>2008-03-04T14:20:00Z</published>
    <updated>2008-03-04T14:30:03Z</updated>
    <category term="ruby oslo matz" />
    <link href="http://feedproxy.google.com/~r/AslakHellesoy/~3/YiR7A_jjcVA/matz-is-coming-to-oslo" rel="alternate" type="text/html" />
    <title>Matz is coming to Oslo!!</title>
<content type="html">
            &lt;p&gt;The creator of Ruby, &lt;a href="http://en.wikipedia.org/wiki/Yukihiro_Matsumoto"&gt;Yukihiro Matsumoto&lt;/a&gt; is coming to &lt;a href="http://jaoo.dk/ruby-oslo/conference/"&gt;RubyFools Oslo&lt;/a&gt; on April 3-4 2008. This is fantastic news – I’m reaqlly looking forward to that. If you haven’t signed up for the conference, hurry up! There are only 150 seats available. (The program will be updated soon with Matz’ talk).&lt;/p&gt;


	&lt;p&gt;I’m psyched!&lt;/p&gt;
          </content>  <feedburner:origLink>http://blog.aslakhellesoy.com/2008/3/4/matz-is-coming-to-oslo</feedburner:origLink></entry>
  <entry xml:base="http://blog.aslakhellesoy.com/">
    <author>
      <name>aslak.hellesoy</name>
    </author>
    <id>tag:blog.aslakhellesoy.com,2008-01-23:11869</id>
    <published>2008-01-23T19:08:00Z</published>
    <updated>2008-01-29T13:02:50Z</updated>
    <category term="rubyfools ruby conference" />
    <link href="http://feedproxy.google.com/~r/AslakHellesoy/~3/gCkGKs-Lvr4/rubyfools-oslo" rel="alternate" type="text/html" />
    <title>RubyFools Oslo</title>
<content type="html">
            &lt;p&gt;&lt;img src="http://jaoo.dk/ruby-oslo/file?path=/Ruby2008/ruby_fools_logo_oslo.gif" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Organising conferences is fun. I’m helping Trifork organise Norway’s first ever Ruby conference – &lt;a href="http://jaoo.dk/ruby-oslo/conference/"&gt;RubyFools Oslo&lt;/a&gt; and &lt;span class="caps"&gt;BEKK&lt;/span&gt; is the main sponsor.&lt;/p&gt;


	&lt;p&gt;We haven’t finished the agenda yet, but it will be similar to the &lt;a href="http://jaoo.dk/ruby-cph/conference/"&gt;RubyFools Copenhagen&lt;/a&gt; conference which takes place two days before the one in Oslo.&lt;/p&gt;


	&lt;p&gt;There is also a discussion going on over at &lt;a href="http://irb.no/-/bulletin/show/35485_mer-om-ruby-fools-3-4-april"&gt;irb.no&lt;/a&gt;. (That btw is Norway’s biggest Rails site – both in terms of users and features).&lt;/p&gt;


	&lt;p&gt;I hope to see you there!&lt;/p&gt;
          </content>  <feedburner:origLink>http://blog.aslakhellesoy.com/2008/1/23/rubyfools-oslo</feedburner:origLink></entry>
  <entry xml:base="http://blog.aslakhellesoy.com/">
    <author>
      <name>aslak.hellesoy</name>
    </author>
    <id>tag:blog.aslakhellesoy.com,2007-12-26:11846</id>
    <published>2007-12-26T16:40:00Z</published>
    <updated>2007-12-26T17:29:22Z</updated>
    <category term="conferences" />
    <link href="http://feedproxy.google.com/~r/AslakHellesoy/~3/6xEyIDjdJRc/upcoming-conferences" rel="alternate" type="text/html" />
    <title>Upcoming conferences</title>
<content type="html">
            &lt;p&gt;We’re soon done with 2007, and so far my conference agenda (where I will speak) looks like below. I have a couple more proposals in the pipe that haven’t been approved yet.&lt;/p&gt;


	&lt;h2&gt;February 12th – Software 2008 – Oslo&lt;/h2&gt;


	&lt;p&gt;I’ll be talking about &lt;a href="http://dataforeningen.no/-mwJnOYL.ips"&gt;what agile means in 2008&lt;/a&gt; – which really depends who you ask. I was asked, so this will be my story, and I’ll talk about what agile is not too.&lt;/p&gt;


	&lt;p&gt;Here in Norway the term for agile is “smidig” and one of my new year resolutions for 2008 is actually to stop using that word in conversations, because I cannot expect people to understand what I mean by it. Likewise, when I hear others using the word I feel more and more uncertain about what they mean (unless I know them well). I’m going to start asking people what they mean when I hear “agile” and “smidig”. How annoying :-)&lt;/p&gt;


	&lt;h2&gt;March 14th – QCon – London&lt;/h2&gt;


	&lt;p&gt;QCon is one of those “new” interesting conferences that I have yet to attend. I’ve been asked to do a Ruby tutorial in &lt;a href="http://qcon.infoq.com/london/presentation/The+Rise+of+Ruby%3A+TBA+%282%29"&gt;The Rise of Ruby&lt;/a&gt; track. I haven’t been to London for a couple of years, and I’m really looking forward to some pints of Pride with old friends and colleagues.&lt;/p&gt;


	&lt;h2&gt;April 2nd – RubyFools – Copenhagen&lt;/h2&gt;


	&lt;p&gt;This is Denmark’s first Ruby conference, and the agenda looks really impressive (except for &lt;a href="http://jaoo.dk/ruby-cph/presentation/RSpec"&gt;this talk&lt;/a&gt;). I’m also cooperating with the organisers to make this a road show where the 2nd stop is Oslo from April 3rd-4th. This is going to be fun!&lt;/p&gt;


	&lt;h2&gt;Early november – Smidig 2008 – Oslo&lt;/h2&gt;


	&lt;p&gt;The &lt;a href="http://smidig.no/smidig2007"&gt;Smidig 2007&lt;/a&gt; conference was a smashing success with about 250 participants. We got so great feedback that we’re definitely arranging this next year, and we’re aiming for over 500 people this time.&lt;/p&gt;
          </content>  <feedburner:origLink>http://blog.aslakhellesoy.com/2007/12/26/upcoming-conferences</feedburner:origLink></entry>
  <entry xml:base="http://blog.aslakhellesoy.com/">
    <author>
      <name>aslak.hellesoy</name>
    </author>
    <id>tag:blog.aslakhellesoy.com,2007-11-20:11827</id>
    <published>2007-11-20T23:24:00Z</published>
    <updated>2007-11-20T23:41:27Z</updated>
    <category term="timer planningpoker scriptaculous smidig conference" />
    <link href="http://feedproxy.google.com/~r/AslakHellesoy/~3/EDLA3A2TqQw/planning-poker-timer-with-configurable-colour-transitions" rel="alternate" type="text/html" />
    <title>Planning Poker timer with configurable colour transitions</title>
<content type="html">
            &lt;p&gt;I started out writing &lt;a href="http://aslakhellesoy.com/planning_poker_timer/index.html"&gt;Aslak Hellesøy’s Planning Poker Timer&lt;/a&gt; for (you guessed it): Planning Poker.&lt;/p&gt;


	&lt;p&gt;We’re going to use the same timer to make speakers stick to their alotted 10 minutes at a &lt;a href="http://smidig.no/smidig2007"&gt;lightning talk/open space conference&lt;/a&gt; I’m organising with other agile enthusiasts next week.&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://brodwall.com/johannes/blog/"&gt;Johannes Brodwall&lt;/a&gt; (who’s one of the other organisers) suggested that the timer should go red when there is three minutes left and black when time is up.&lt;/p&gt;


	&lt;p&gt;So &lt;a href="http://aslakhellesoy.com/planning_poker_timer/index.html?precision=1&amp;amp;#38;time=8&amp;amp;#38;initialColour=0000ff&amp;amp;#38;colours[4]=ff0000&amp;amp;#38;colours[0]=000000"&gt;here you go&lt;/a&gt; – it’s now a whole lot more tweakable, and it’s got nice &lt;a href="http://script.aculo.us/"&gt;Scriptaculous&lt;/a&gt; transitions too.&lt;/p&gt;
          </content>  <feedburner:origLink>http://blog.aslakhellesoy.com/2007/11/20/planning-poker-timer-with-configurable-colour-transitions</feedburner:origLink></entry>
  <entry xml:base="http://blog.aslakhellesoy.com/">
    <author>
      <name>aslak.hellesoy</name>
    </author>
    <id>tag:blog.aslakhellesoy.com,2007-11-01:11736</id>
    <published>2007-11-01T21:13:00Z</published>
    <updated>2007-11-01T21:18:28Z</updated>
    <category term="rspec .net" />
    <link href="http://feedproxy.google.com/~r/AslakHellesoy/~3/mI-ywUfspC8/netspec" rel="alternate" type="text/html" />
    <title>.NetSpec</title>
<content type="html">
            &lt;p&gt;RSpec is inspiring a lot of open source developers to write &lt;span class="caps"&gt;BDD&lt;/span&gt; frameworks. The last one on the scene is &lt;a href="http://erlend.oftedal.no/blog"&gt;Erlend Oftedal’s&lt;/a&gt; &lt;a href="http://boss.bekk.no/display/BOSS/.NetSpec"&gt;.NetSpec&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;It builds on Microsoft’s unit testing framework which is interesting from a tools perspective.&lt;/p&gt;
          </content>  <feedburner:origLink>http://blog.aslakhellesoy.com/2007/11/1/netspec</feedburner:origLink></entry>
  <entry xml:base="http://blog.aslakhellesoy.com/">
    <author>
      <name>aslak.hellesoy</name>
    </author>
    <id>tag:blog.aslakhellesoy.com,2007-10-24:11721</id>
    <published>2007-10-24T07:03:00Z</published>
    <updated>2007-10-24T07:21:34Z</updated>
    <category term="rspec stories fit" />
    <link href="http://feedproxy.google.com/~r/AslakHellesoy/~3/LZ3yH-51hqc/in-browser-editor-for-rspec-stories" rel="alternate" type="text/html" />
    <title>In-browser editor for RSpec stories</title>
<content type="html">
            &lt;p&gt;&lt;a href="http://aslakhellesoy.com/story_ui/stories.html"&gt;Try it out here&lt;/a&gt;, but please read on…&lt;/p&gt;


	&lt;p&gt;David (with the help from Pat Maddox and the RSpec list) has done some &lt;a href="http://blog.davidchelimsky.net/articles/2007/10/22/plain-text-stories-on-rails"&gt;absolutely phenomenal&lt;/a&gt; &lt;a href="http://blog.davidchelimsky.net/articles/2007/10/21/story-runner-in-plain-english"&gt;work&lt;/a&gt; on RSpec lately, allowing executable user stories to be expressed in plain text. The plain text format of user stories is so simple that it should be easy to train non-programmers to write them. This is what has made &lt;a href="http://fit.c2.com/"&gt;Fit&lt;/a&gt; and &lt;a href="http://fitnesse.org/"&gt;FitNesse&lt;/a&gt; such useful and popular tools.&lt;/p&gt;


	&lt;p&gt;RSpec user stories are built up by scenarios, which again are built up of “canned steps” – or Givens, Whens and Thens. When the number of canned steps grows, it can be hard to edit a text file, because it can be hard to remember the exact wording of a step (and if the wording isn’t exact, it won’t work).&lt;/p&gt;


	&lt;p&gt;I’ve created a prototype for a browser based story editor. It has autocompletion for adding of new steps and in-place editing of parameters to existing steps. Steps can also be reordered.&lt;/p&gt;


	&lt;p&gt;The idea is that domain experts can work with this tool to add more stories, scenarios and steps and save them. The same tool would also allow users to run the stories and get the results back. Very much like FitNesse does, but adapted to RSpec and with a (hopefully) better user interface.&lt;/p&gt;


	&lt;p&gt;So far I’ve only fiddled with the browser/Ajax side of things. You can’t actually use this thing yet – but it’s a start.&lt;/p&gt;
          </content>  <feedburner:origLink>http://blog.aslakhellesoy.com/2007/10/24/in-browser-editor-for-rspec-stories</feedburner:origLink></entry>
  <entry xml:base="http://blog.aslakhellesoy.com/">
    <author>
      <name>aslak.hellesoy</name>
    </author>
    <id>tag:blog.aslakhellesoy.com,2007-10-17:11716</id>
    <published>2007-10-17T16:21:00Z</published>
    <updated>2007-10-17T16:27:50Z</updated>
    <category term="smidig agile" />
    <link href="http://feedproxy.google.com/~r/AslakHellesoy/~3/I2mTjpZhSTg/my-first-conference-smidig-2007" rel="alternate" type="text/html" />
    <title>My first conference! Smidig 2007</title>
<content type="html">
            &lt;p&gt;I’ve attended and spoken at dozens of conferences, but never organised one myself.&lt;/p&gt;


	&lt;p&gt;So I got together with some folks from the agile movement in Oslo and set up &lt;a href="http://smidig.no/smidig2007"&gt;Smidig 2007&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;It’s a 2 day conference with a half day of Lightning Talks and a half day of Open Space each day. So far we have 170 people signed up and 20 sponsors. 
We’re aiming for a good mix of techies and non-techies, customer types or vendor types and the main topic is agile software development. This is going to be fun!&lt;/p&gt;
          </content>  <feedburner:origLink>http://blog.aslakhellesoy.com/2007/10/17/my-first-conference-smidig-2007</feedburner:origLink></entry>
  <entry xml:base="http://blog.aslakhellesoy.com/">
    <author>
      <name>aslak.hellesoy</name>
    </author>
    <id>tag:blog.aslakhellesoy.com,2007-10-17:11715</id>
    <published>2007-10-17T16:01:00Z</published>
    <updated>2007-10-17T16:30:13Z</updated>
    <category term="estimation planning poker" />
    <link href="http://feedproxy.google.com/~r/AslakHellesoy/~3/F-__ZUupqKo/planning-poker-timer" rel="alternate" type="text/html" />
    <title>Planning Poker Timer</title>
<content type="html">
            &lt;p&gt;A few months ago one of my colleagues, Christer Løvaas, brought a couple of old-fashioned hour glasses (minute glasses, really) to a release planning meeting. -A red one with one minute and a blue one with two minutes.&lt;/p&gt;


	&lt;p&gt;We used these to timebox the time spent on estimating each story. We had set a goal of spending maximum three minutes per story, including discussion and planning poker. We were estimating a huge backlog, so this was absolutely necessary in order to get through as much of it as possible in one day. (What a day).&lt;/p&gt;


	&lt;p&gt;A couple of weeks ago I was facilitating two all-day release planning/planning poker workshops, and I brought the hour glasses with me. This time we were facing exactly the same problem as the first time: It was so easy to forget turn the hour glasses or realise when the sand had run out! So we repeatedly spent more time on each story than we had decided.&lt;/p&gt;


	&lt;p&gt;So I sat down in the lunch and wrote &lt;a href="http://aslakhellesoy.com/planning_poker_timer/index.html"&gt;Aslak Hellesøy’s Planning Poker Timer&lt;/a&gt;. Props to &lt;a href="http://www.deercorn.org/"&gt;Kristoffer Dyrkorn&lt;/a&gt; for fixing some IE bugs.&lt;/p&gt;


	&lt;p&gt;It’s a big digital countdown clock that switches from green to red and plays a bell when time is up. Try it out and let me know how it goes.&lt;/p&gt;
          </content>  <feedburner:origLink>http://blog.aslakhellesoy.com/2007/10/17/planning-poker-timer</feedburner:origLink></entry>
  <entry xml:base="http://blog.aslakhellesoy.com/">
    <author>
      <name>aslak.hellesoy</name>
    </author>
    <id>tag:blog.aslakhellesoy.com,2007-08-21:11666</id>
    <published>2007-08-21T15:03:00Z</published>
    <updated>2007-08-21T16:17:15Z</updated>
    <category term="funfx ruby flex" />
    <link href="http://feedproxy.google.com/~r/AslakHellesoy/~3/UuGBX8cCOj0/funfx-functional-testing-for-flex" rel="alternate" type="text/html" />
    <title>FunFX: Functional testing for Flex</title>
<content type="html">
            &lt;p&gt;Here is something on the bright side…&lt;/p&gt;


	&lt;p&gt;Peter Motzfeldt, a &lt;span class="caps"&gt;BEKK&lt;/span&gt; colleague, has released &lt;a href="http://funfx.rubyforge.org/"&gt;FunFX&lt;/a&gt;, a functional testing framework similar to &lt;a href="http://wtr.rubyforge.org/"&gt;Watir&lt;/a&gt; and &lt;a href="http://www.openqa.org/selenium/"&gt;Selenium&lt;/a&gt;, but with &lt;a href="http://www.adobe.com/products/flex/"&gt;Adobe Flex&lt;/a&gt; applications as the target platform.&lt;/p&gt;


	&lt;p&gt;Flex is a very interesting platform (so interesting I’ll have a tutorial about Flex and Rails at &lt;a href="http://www.railsconfeurope.com/cs/railseurope2007/view/e_sess/14256"&gt;RailsConf Europe&lt;/a&gt; with Børre Wessel from Adobe). If you’re there we’ll try to give you a sneak peak of FunFX too.&lt;/p&gt;


	&lt;p&gt;Any application that is based on a UI technology that lacks an affordable, scriptable and easy to use functional testing tool represents a huge risk in terms of maintenance and evolution. So far FunFX seems like the only functional testing for Flex tool that fits the bill of “affordable, scriptable and easy to use”, so I encourage all you Flex/Ruby folks out there to try it out and help make it better.&lt;/p&gt;


	&lt;p&gt;FunFX is written in Ruby. It was Peter’s first ever experience with Ruby, so there is room for improvement, but the most important problem is solved, namely the Ruby-&amp;gt;Flex integration part.&lt;/p&gt;
          </content>  <feedburner:origLink>http://blog.aslakhellesoy.com/2007/8/21/funfx-functional-testing-for-flex</feedburner:origLink></entry>
  <entry xml:base="http://blog.aslakhellesoy.com/">
    <author>
      <name>aslak.hellesoy</name>
    </author>
    <id>tag:blog.aslakhellesoy.com,2007-06-13:11661</id>
    <published>2007-06-13T11:47:00Z</published>
    <updated>2007-08-29T12:30:30Z</updated>
    <category term="rails developers" />
    <link href="http://feedproxy.google.com/~r/AslakHellesoy/~3/C5Zj5M_X34o/rails-adoption-world-wide" rel="alternate" type="text/html" />
    <title>Rails adoption world wide</title>
<content type="html">
            &lt;p&gt;
If we look at the number of &lt;a href="http://www.workingwithrails.com/browse/people/country"&gt;rails developers&lt;/a&gt; per &lt;a href="http://en.wikipedia.org/wiki/List_of_countries_by_population"&gt;capita&lt;/a&gt; we get the following distribution:
&lt;/p&gt;

&lt;em&gt;Update Aug 29 2007: Raul Murciano told me Spain was missing, so I added that.&lt;/em&gt;

&lt;p&gt;
&lt;div&gt;&amp;lt;dl&gt;
      &lt;dt&gt;&lt;span&gt;Denmark (100.0% : 64/5.4 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;New Zealand (66.15% : 33/4.2 mill)&lt;/span&gt;&lt;/dt&gt;

      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;Sweden (63.02% : 68/9.1 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;Ireland (56.06% : 28/4.2 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;Australia (52.52% : 130/20.9 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;

      &lt;dt&gt;&lt;span&gt;Netherlands (49.67% : 96/16.3 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;Switzerland (48.72% : 43/7.4 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;Canada (47.12% : 183/32.9 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;United States (41.32% : 1474/302.5 mill)&lt;/span&gt;&lt;/dt&gt;

      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;Finland (38.32% : 24/5.3 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;United Kingdom (38.31% : 272/60.2 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;Belgium (37.3% : 46/10.4 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;

      &lt;dt&gt;&lt;span&gt;Norway (33.77% : 19/4.7 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;Israel (32.02% : 27/7.1 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;Portugal (27.94% : 35/10.6 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;Singapore (22.94% : 12/4.4 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;Spain (22.44% : 120/45.1 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;Austria (20.28% : 20/8.3 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;Germany (18.93% : 184/82.4 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;Czech Republic (17.31% : 21/10.2 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;

      &lt;dt&gt;&lt;span&gt;Poland (15.34% : 69/38.1 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;France (14.55% : 110/64.1 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;Hungary (12.68% : 15/10.0 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;Argentina (10.29% : 48/39.5 mill)&lt;/span&gt;&lt;/dt&gt;

      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;Ukraine (8.44% : 46/46.2 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;Romania (7.91% : 20/21.4 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;Brazil (7.85% : 173/186.8 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;

      &lt;dt&gt;&lt;span&gt;Italy (6.45% : 45/59.0 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;Malaysia (4.37% : 14/27.1 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;South Africa (3.49% : 20/48.5 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;Venezuela (3.06% : 10/27.6 mill)&lt;/span&gt;&lt;/dt&gt;

      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;Russia (3.03% : 51/142.4 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;Philippines (2.39% : 25/88.7 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;South Korea (2.11% : 12/48.2 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;

      &lt;dt&gt;&lt;span&gt;Japan (1.65% : 25/127.7 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;Turkey (1.58% : 14/74.8 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;Mexico (1.23% : 15/103.2 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;India (1.08% : 150/1169.0 mill)&lt;/span&gt;&lt;/dt&gt;

      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;Indonesia (0.43% : 12/231.6 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
      &lt;dt&gt;&lt;span&gt;People's Republic of China (0.31% : 49/1319.0 mill)&lt;/span&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/dd&gt;
&amp;lt;/dl&gt;
&lt;/div&gt;
&lt;/p&gt;
          </content>  <feedburner:origLink>http://blog.aslakhellesoy.com/2007/6/13/rails-adoption-world-wide</feedburner:origLink></entry>
  <entry xml:base="http://blog.aslakhellesoy.com/">
    <author>
      <name>aslak.hellesoy</name>
    </author>
    <id>tag:blog.aslakhellesoy.com,2007-06-05:8464</id>
    <published>2007-06-05T08:09:00Z</published>
    <updated>2007-06-05T08:19:06Z</updated>
    <category term="railsconf speaking flex rails bdd" />
    <link href="http://feedproxy.google.com/~r/AslakHellesoy/~3/12YdF6hhlO4/two-sessions-at-railsconf-europe" rel="alternate" type="text/html" />
    <title>Two sessions at RailsConf Europe</title>
<content type="html">
            &lt;p&gt;Both of my &lt;a href="http://www.railsconfeurope.com/"&gt;RailsConf Europe&lt;/a&gt; sessions were accepted.&lt;/p&gt;


	&lt;p&gt;I’ll be doing two 3-hour tutorials. One with Børre Wessel on “Using Adobe Flex with Rails” and another one with David Chelimsky – “A (1/2) Day of Behavior-driven Development on Rails”.&lt;/p&gt;


	&lt;p&gt;This should be fun!&lt;/p&gt;
          </content>  <feedburner:origLink>http://blog.aslakhellesoy.com/2007/6/5/two-sessions-at-railsconf-europe</feedburner:origLink></entry>
  <entry xml:base="http://blog.aslakhellesoy.com/">
    <author>
      <name>aslak.hellesoy</name>
    </author>
    <id>tag:blog.aslakhellesoy.com,2007-05-23:3044</id>
    <published>2007-05-23T22:48:00Z</published>
    <updated>2007-05-23T23:03:46Z</updated>
    <category term="rspec jruby java" />
    <link href="http://feedproxy.google.com/~r/AslakHellesoy/~3/ns1MYp3XIew/jruby-bundles-rspec" rel="alternate" type="text/html" />
    <title>JRuby &lt;&lt; RSpec</title>
<content type="html">
            &lt;p&gt;The JRuby team announced at RailsConf 2007 that they will bundle &lt;a href="http://rspec.rubyforge.org/"&gt;RSpec&lt;/a&gt; with &lt;a href="http://jruby.codehaus.org/"&gt;JRuby&lt;/a&gt; when it goes 1.0. JRuby will only ship with two gems (Rake and RSpec), so I’m extremely proud of being a developer of one of the lucky two, because JRuby is going to be big.&lt;/p&gt;


	&lt;p&gt;RSpec on JRuby means that the wonders of RSpec will soon be available for Java app developers (as well as JRuby/JRuby on Rails developers), so you can do things like this:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
describe Bowling do
  before(:each) do
    @bowling = Bowling.new
  end

  it "should score 0 for gutter game" do
    20.times { @bowling.hit(0) }
    @bowling.score.should == 0
  end
end
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;And continue implementing the production code in Java:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
public class Bowling {
    public void hit(int pins) {
    }

    public int score() {
        return 0;
    }
}
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;An important step for JRuby adoption, because this will let Java developers get their Ruby feet wet without having to deal with tons of red tape.&lt;/p&gt;
          </content>  <feedburner:origLink>http://blog.aslakhellesoy.com/2007/5/23/jruby-bundles-rspec</feedburner:origLink></entry>
  <entry xml:base="http://blog.aslakhellesoy.com/">
    <author>
      <name>aslak.hellesoy</name>
    </author>
    <id>tag:blog.aslakhellesoy.com,2007-02-27:44</id>
    <published>2007-02-27T23:03:00Z</published>
    <updated>2007-02-27T23:08:01Z</updated>
    <category term="typo mephisto mediatemple" />
    <link href="http://feedproxy.google.com/~r/AslakHellesoy/~3/WaZvhG1rWYA/switched-to-mephisto" rel="alternate" type="text/html" />
    <title>Switched to Mephisto</title>
<content type="html">
            &lt;p&gt;Typo suddenly started dying on me over at Mediatemple, so I finally upgraded to Mephisto. Actually, I tried Mephisto here a while ago, but it wasn’t compatible with Ruby 1.8.2, which is all you get at Mediatemple’s Grid Server. Luckily for me Mephisto now runs on Ruby 1.8.2 again!&lt;/p&gt;


	&lt;p&gt;Some of my articles won’t read well until I do some more tweaking, and the Atom feed at Feedburner needs to be updated. I’ll fix that in a couple of weeks.&lt;/p&gt;
          </content>  <feedburner:origLink>http://blog.aslakhellesoy.com/2007/2/27/switched-to-mephisto</feedburner:origLink></entry>
  <entry xml:base="http://blog.aslakhellesoy.com/">
    <author>
      <name>aslak.hellesoy</name>
    </author>
    <id>tag:blog.aslakhellesoy.com,2007-02-16:12</id>
    <published>2007-02-16T08:25:00Z</published>
    <updated>2007-05-18T19:36:01Z</updated>
    <category term="build" />
    <category term="buildpattern" />
    <category term="continuousintegration" />
    <category term="watir" />
    <link href="http://feedproxy.google.com/~r/AslakHellesoy/~3/OF9sSRYnfIU/build-pattern-immediate-test-failure-notification" rel="alternate" type="text/html" />
    <title>Build Pattern: Immediate test failure notification</title>
<content type="html">
            &lt;h1&gt;Context&lt;/h1&gt;


	&lt;p&gt;You have a continuous integration (CI) system with a long execution time – 10 minutes or more. It may be the 
“full build” in 
&lt;a href="http://jutopia.tirsen.com/articles/2005/10/01/build-pattern-fast-build-full-build"&gt;Fast build/full build&lt;/a&gt; or the only build – it doesn’t matter. 
Most of the CI cycle time is spent running automated tests, and the CI system is not sending notifications before all tests have run – regardless of intermediate failures.&lt;/p&gt;


	&lt;p&gt;The team wants to be notified about a test failure as soon as it happens. The team also wants to get enough 
information to be able to start fixing any failing tests without having to wait for the CI system to complete the current cycle.&lt;/p&gt;


	&lt;h1&gt;Solution&lt;/h1&gt;


	&lt;ol&gt;
	&lt;li&gt;Add failure notification capabilities into the test framework.&lt;/li&gt;
		&lt;li&gt;Make test results easily available before the full test cycle has completed.&lt;/li&gt;
	&lt;/ol&gt;


	&lt;p&gt;There are several ways to do this. I will present a couple of alternatives for each of these points:&lt;/p&gt;


	&lt;h2&gt;Failure notification in the test framework&lt;/h2&gt;


	&lt;p&gt;First of all – I recommend lamps and sounds as notification mechanisms.&lt;/p&gt;


	&lt;p&gt;You’ll have to understand the internals of your test framework (JUnit, Fitnesse, RSpec, 
what have you) and hook into the place where test failures are recorded. Once you find out how to write and
enable a “failure hook” in your test framework, write one that sends out notifications. You have at least two options
here.&lt;/p&gt;


	&lt;h3&gt;Reuse the CI system’s notification gear&lt;/h3&gt;


	&lt;p&gt;Most CI systems have several notification mechanisms built in. If the CI system is open enough you can either reuse some of its notification code, or you can talk to it over some protocol. If not, tell your CI tool vendor about this pattern
so they can implement it.&lt;/p&gt;


	&lt;h3&gt;Roll your own&lt;/h3&gt;


	&lt;p&gt;It’s not that hard really – this is what I did. 
For lamps I can recommend &lt;a href="http://heyu.tanj.com/"&gt;heyu&lt;/a&gt; or some other &lt;span class="caps"&gt;X11&lt;/span&gt; command line tool/api.
For sounds I recommend &lt;a href="http://raa.ruby-lang.org/project/win32-sound/"&gt;win32/sound&lt;/a&gt; or the &lt;a href="http://java.sun.com/products/java-media/sound/"&gt;Java Sound &lt;span class="caps"&gt;API&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;h3&gt;Example (using RSpec)&lt;/h3&gt;


	&lt;p&gt;(Usually Rspec is super fast, but on one of &lt;a href="http://bekk.no/"&gt;our&lt;/a&gt; current projects we’re using it to run a truckload of Watir).&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
require 'win32/sound'

class Spec::Runner::Reporter
  alias old_spec_finished spec_finished
  def spec_finished(name, error=nil, failure_location=nil)
    if(error &amp;&amp; !@notified)
      # This is a little wrapper around Net::SSH
      linux_box do |box|
        box.cmd "heyu on A2" # red
        box.cmd "heyu off A1" # green
      end
      Win32::Sound.play(File.dirname(__FILE__) + '/sounds/pacman_dies.wav')
      @notified = true
    end
    old_spec_finished(name, error, failure_location)
  end
end
&lt;/code&gt;&lt;/pre&gt;

	&lt;h2&gt;Make test results easily available before the full test cycle has completed&lt;/h2&gt;


	&lt;p&gt;When developers see the red lamp and hear pacman die they’re dying to fix the problem – and
they want to see the test results although the whole test suite is still running.&lt;/p&gt;


	&lt;p&gt;Most decent automated test tools write results to one or more text files on disk – little by little as tests progress. 
All you need is to serve these files with a web server. That’s easy with Ruby’s built-in WEBrick.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
require 'webrick'
s = WEBrick::HTTPServer.new(
  :Port =&gt; 80,
  :DocumentRoot =&gt; "path/to/where/test/results/are/written" 
)
trap("INT") { s.shutdown }
s.start
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Just make sure this server is running all the time.&lt;/p&gt;


	&lt;h1&gt;Motivation&lt;/h1&gt;


	&lt;p&gt;The same as the motivation in &lt;a href="http://jutopia.tirsen.com/articles/2005/10/01/build-pattern-fast-build-full-build"&gt;Fast build/full build&lt;/a&gt;&lt;/p&gt;
          </content>  <feedburner:origLink>http://blog.aslakhellesoy.com/2007/2/16/build-pattern-immediate-test-failure-notification</feedburner:origLink></entry>
</feed>
