<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Nuclear-Powered Nutcracker</title>
	
	<link>http://danlucraft.com/blog</link>
	<description>daniel lucraft</description>
	<pubDate>Mon, 19 Oct 2009 19:49:22 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/Nuclear-poweredNutcracker" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>Untethered Webapps</title>
		<link>http://feedproxy.google.com/~r/Nuclear-poweredNutcracker/~3/GCKHh40aSPE/</link>
		<comments>http://danlucraft.com/blog/2009/10/untethered-webapps/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 19:31:49 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[Untethered Webapps]]></category>

		<guid isPermaLink="false">http://danlucraft.com/blog/?p=276</guid>
		<description><![CDATA[For a few days now I&#8217;ve been tossing around some ideas about how to write a web application that doesn&#8217;t need a server. As a developer, I&#8217;d like to have the same freedom from dependencies that users&#8217; have when they install a webapp by just visiting a URL.
So here&#8217;s the deal: write a todo list [...]]]></description>
			<content:encoded><![CDATA[<p>For a few days now I&#8217;ve been tossing around some ideas about how to write a web application that doesn&#8217;t need a server. As a developer, I&#8217;d like to have the same freedom from dependencies that users&#8217; have when they install a webapp by just visiting a URL.</p>
<p>So here&#8217;s the deal: write a todo list application and a blogging application (the two Hello Worlds of the web) that don&#8217;t require me, as the developer, to maintain servers to support the users.</p>
<p>But I want to keep the stuff that makes users love webapps:</p>
<ul>
<li>Easy to install</li>
<li>Seamless updates</li>
<li>Available from any web accessible computer</li>
</ul>
<p>We&#8217;re going to need some infrastructure to exist if this is going to work. But it&#8217;s only necessary to imagine two online services:</p>
<ul>
<li>OpenDB. This is a REST accessible database service, with authorization that restricts access with a username and password. It has a user friendly registration system.</li>
<li>OpenServer. This is a REST accessible file system service, that serves the contents of a specified directory up to the web. It supports domain names and has a user-friendly management panel.</li>
</ul>
<p>And that&#8217;s it. Here&#8217;s how the webapps work:</p>
<h2>The Server-free Todo List Application</h2>
<p><a href="http://danlucraft.com/blog/wp-content/uploads/2009/10/screen-shot-2009-10-19-at-202022.png"><img src="http://danlucraft.com/blog/wp-content/uploads/2009/10/screen-shot-2009-10-19-at-202022.png" alt="screen-shot-2009-10-19-at-202022" title="screen-shot-2009-10-19-at-202022" width="331" height="444" class="alignright size-full wp-image-288" /></a></p>
<p>I write my application: The Untethered Todo. It&#8217;s just JavaScript and HTML. I deploy it by making those static files available on my web server.</p>
<p>My user arrives, and loads up the application from my server. The application is now running in the user&#8217;s browser. The app hasn&#8217;t got any persistance configuration, so the first thing it does is ask the user for the details of a database provider. The user - who is an early adopter, and quite tech savvy - types in the url and password of his OpenDB account.</p>
<p>The very first thing the application does is offer the user a single url, that he can bookmark and use to load the application up with the same database in future. The OpenDB url is encoded in the query string parameters, so next time the user will only need to type their password.</p>
<p>Then the app sets up the schema and any other initial database configuration. In this case it creates an example project and todo item. Now the app is &#8216;installed&#8217; and ready to go.</p>
<p>Whenever the user loads the app from now on, the app will connect to the OpenDB database from the connection information in the query string and work from there.
</p>
<p>From now on the application stores all its information in the OpenDB instance. If the user creates a new todo, the app (which is running solely inside the user&#8217;s browser) will post the required information to the database. Lists of projects are loaded up over that connection too, through a JavaScript ORM layer wrapping the HTTP calls.</p>
<p>At no point will the application need to talk to the developer&#8217;s servers. So I won&#8217;t need any. But since the user is loading up the app every day from my domain, I get to release updates straight to the user.</p>
<p>And that&#8217;s how I&#8217;m going to write a todo list web application that doesn&#8217;t require any hosting.</p>
<h2>The Server-free Blogging Software</h2>
<p><a href="http://danlucraft.com/blog/wp-content/uploads/2009/10/screen-shot-2009-10-19-at-201631.png"><img src="http://danlucraft.com/blog/wp-content/uploads/2009/10/screen-shot-2009-10-19-at-201631.png" alt="screen-shot-2009-10-19-at-201631" title="screen-shot-2009-10-19-at-201631" width="364" height="426" class="alignright size-full wp-image-286" /></a></p>
<p>It&#8217;s a little bit more complicated to imagine blogging software that doesn&#8217;t need the developer or the user to run a server, because there are third parties involved now too. There&#8217;s me, the developer, there&#8217;s the blog author, and there are the blog visitors.</p>
<p>So in this case, when the application loads, it asks for OpenServer information. It then creates the blog as static files in a directory on OpenServer. Whenever the author writes a new post, the app creates the necessary files on OpenServer.</p>
<p>The author goes to OpenServer and specifies that she wants <em>this</em> domain attached to <em>that</em> directory, and any visitor to the domain name will see the blog served from OpenServer.</p>
<p>I imagine that the blog software wants to set up an OpenDB database as well. If the OpenDB provider supports &#8216;users&#8217; (perhaps they are running MySQL), then there is a &#8216;commenter&#8217; user that has insert-only access to the &#8216;unmoderated-comments&#8217; table. Then when the author logs back in, the application - still running from her browser - loads the unmoderated comments and let&#8217;s her approve or delete them, before they are written to OpenServer as part of the blog.</p>
<h2>Random Thoughts</h2>
<ul>
<li>Server costs are zero.</li>
<li>There&#8217;s no such thing as downtime - from my point of view.</li>
<li>I don&#8217;t have control over the user&#8217;s database - so schema migration must be done <em>very</em> carefully.</li>
<li>I don&#8217;t get to see usage information about my software.</li>
<li>Every web application written in this fashion has an automatic data API.</li>
<li>If there are going to be multiple OpenDB and OpenServer services, what do the common API standardS look like?</li>
<li>Does anything like OpenDB or OpenServer exist already?</li>
<li>Why does the MySQL multiple user access model suddenly seem so attractive again?</li>
<li>When do I get to write these apps? :)</li>
</ul>
<img src="http://feeds.feedburner.com/~r/Nuclear-poweredNutcracker/~4/GCKHh40aSPE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://danlucraft.com/blog/2009/10/untethered-webapps/feed/</wfw:commentRss>
		<feedburner:origLink>http://danlucraft.com/blog/2009/10/untethered-webapps/</feedburner:origLink></item>
		<item>
		<title>Learning about Redis through writing a Twitter clone</title>
		<link>http://feedproxy.google.com/~r/Nuclear-poweredNutcracker/~3/X2KUr81rmTo/</link>
		<comments>http://danlucraft.com/blog/2009/05/learning-about-redis-through-writing-a-twitter-clone/#comments</comments>
		<pubDate>Sun, 24 May 2009 15:30:46 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[redis]]></category>

		<category><![CDATA[retwis-rb]]></category>

		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[sinatra]]></category>

		<guid isPermaLink="false">http://danlucraft.com/blog/?p=253</guid>
		<description><![CDATA[
Redis is a fast key-value database by Salvatore Sanfilippo with some new ideas. Sometimes it&#8217;s called a &#8216;data-structures database&#8217; because it supports sets and lists. I spent a few hours this morning writing a Twitter clone that uses Redis as its datastore, which is now online at http://retwisrb.danlucraft.com. The code is available on Github.
The lists [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://danlucraft.com/blog/wp-content/uploads/2009/05/logo.png" alt="redis-logo" title="redis-logo" width="74" height="55" class="alignright size-full wp-image-265" /><br />
<a href="http://code.google.com/p/redis/">Redis</a> is a fast key-value database by <a href="http://twitter.com/antirez">Salvatore Sanfilippo</a> with some new ideas. Sometimes it&#8217;s called a &#8216;data-structures database&#8217; because it supports sets and lists. I spent a few hours this morning writing a Twitter clone that uses Redis as its datastore, which is now online at <a href="http://retwisrb.danlucraft.com">http://retwisrb.danlucraft.com</a>. The code is available on <a href="http://github.com/danlucraft/retwis-rb/tree/master">Github</a>.</p>
<p>The lists feature of Redis meant that it was not necessary anywhere in the application to serialize a datastructure into a stored value. This is a tremendous win. I don&#8217;t have much experience of writing applications against key-value databases, but I worry that serialization would cause headaches.</p>
<p>I didn&#8217;t find a use for the Set structure, simply because I couldn&#8217;t see a set of data that I wouldn&#8217;t at some point want to page over. The list of a user&#8217;s followers was the closest I came. The downside of using a set is that in order to paginate the followers the entire set would have to be sorted first. The downside of using a list is that membership checking (is User A following User B?) requires list traversal by Redis. </p>
<p>There is a SORT command, so sorting sets can be done in the database layer, but I have no desire to sort this data (which could be massive) just to iterate over it in a consistent order. I went with a list for now, but you could use a set and a list to support both types of usage, at the cost of maybe twice the memory usage. I&#8217;d like to have an ordered Set structure available, if it could be done in a fast way.</p>
<p>I wonder if a Set and List is all we&#8217;ll get, or if Salvatore is planning more structures. Could you implement Trees in any kind of sensible way? Arrays? Would they be useful?</p>
<p>Anyway, I encourage you to try Redis out soon.</p>
<img src="http://feeds.feedburner.com/~r/Nuclear-poweredNutcracker/~4/X2KUr81rmTo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://danlucraft.com/blog/2009/05/learning-about-redis-through-writing-a-twitter-clone/feed/</wfw:commentRss>
		<feedburner:origLink>http://danlucraft.com/blog/2009/05/learning-about-redis-through-writing-a-twitter-clone/</feedburner:origLink></item>
		<item>
		<title>New project: Gutkumber - Integration testing for Ruby-GNOME2</title>
		<link>http://feedproxy.google.com/~r/Nuclear-poweredNutcracker/~3/sbGJmsS9R_g/</link>
		<comments>http://danlucraft.com/blog/2009/05/new-project-gutkumber-integration-testing-for-ruby-gnome2/#comments</comments>
		<pubDate>Sun, 10 May 2009 08:31:50 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[gutkumber]]></category>

		<category><![CDATA[Redcar]]></category>

		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[ruby-gnome2]]></category>

		<guid isPermaLink="false">http://danlucraft.com/blog/?p=244</guid>
		<description><![CDATA[ Gutkumber is a small set of Ruby-GNOME2 automation helpers. It comes with Cucumber formatters and some steps for writing features. This allows you to test the full application stack, driving the real Gtk GUI with simulated keyboard events, and using assertions that can refer to contents of Gtk widgets.
http://github.com/danlucraft/gutkumber/tree/master
I&#8217;ve been using Gutkumber on the [...]]]></description>
			<content:encoded><![CDATA[<p> Gutkumber is a small set of Ruby-GNOME2 automation helpers. It comes with Cucumber formatters and some steps for writing features. This allows you to test the full application stack, driving the real Gtk GUI with simulated keyboard events, and using assertions that can refer to contents of Gtk widgets.</p>
<p><a href="http://github.com/danlucraft/gutkumber/tree/master">http://github.com/danlucraft/gutkumber/tree/master</a></p>
<p>I&#8217;ve been using Gutkumber on the Redcar editor project for a while now, and it seems to work well. Here is an example of the kind of features you can write with Gutkumber:</p>
<pre><code>
  Scenario: Kill line
    When I type "def foo"
    And I press "Left" then "Left"
    And I press "Ctrl+K"
    ... some Redcar specific assertions

  Scenario: Open a file
    When I press "Ctrl+O"
    And I set the "Open" dialog's filename to "plugins/edit_tab/features/fixtures/file1.rb"
    And I click the button "Open" in the dialog "Open"
    ... some Redcar specific assertions
</code>
</pre>
<p>This is still in early development (it&#8217;s probably the most rough and ready software I&#8217;ve ever released!). But I&#8217;m finding it useful and I thought it would be good to demonstrate that it is possible to thoroughly integration test your Ruby-GNOME2 applications. </p>
<p>I&#8217;m writing new steps and helpers as I go along, but they are quite specific to my application, so you will probably find you need to write more. It&#8217;d be great if we could build the set of helpers and steps to the point where it contains everything needed to test new Ruby-GNOME2 apps.</p>
<img src="http://feeds.feedburner.com/~r/Nuclear-poweredNutcracker/~4/sbGJmsS9R_g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://danlucraft.com/blog/2009/05/new-project-gutkumber-integration-testing-for-ruby-gnome2/feed/</wfw:commentRss>
		<feedburner:origLink>http://danlucraft.com/blog/2009/05/new-project-gutkumber-integration-testing-for-ruby-gnome2/</feedburner:origLink></item>
		<item>
		<title>Songkick 2.0 in private beta!</title>
		<link>http://feedproxy.google.com/~r/Nuclear-poweredNutcracker/~3/O__Sw-D93X8/</link>
		<comments>http://danlucraft.com/blog/2009/03/songkick-20-in-private-beta/#comments</comments>
		<pubDate>Sat, 14 Mar 2009 15:05:21 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[Songkick]]></category>

		<guid isPermaLink="false">http://www.daniellucraft.com/blog/?p=231</guid>
		<description><![CDATA[You may have noticed that www.songkick.com hasn&#8217;t changed a bit in six months. But we&#8217;ve not been idle. Friends: email me for an invite code.

]]></description>
			<content:encoded><![CDATA[<p>You may have noticed that <a href="http://www.songkick.com">www.songkick.com</a> hasn&#8217;t changed a bit in six months. But we&#8217;ve not been idle. Friends: email me for an invite code.</p>
<p><a href="http://www.daniellucraft.com/blog/wp-content/uploads/2009/03/songkick_1237042919296.png"><img src="http://www.daniellucraft.com/blog/wp-content/uploads/2009/03/songkick_1237042919296.png" alt="songkick_1237042919296" title="songkick_1237042919296" width="630" height="45" class="aligncenter size-full wp-image-232" /></a></p>
<img src="http://feeds.feedburner.com/~r/Nuclear-poweredNutcracker/~4/O__Sw-D93X8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://danlucraft.com/blog/2009/03/songkick-20-in-private-beta/feed/</wfw:commentRss>
		<feedburner:origLink>http://danlucraft.com/blog/2009/03/songkick-20-in-private-beta/</feedburner:origLink></item>
		<item>
		<title>Testing Ruby-GNOME2 applications with Cucumber</title>
		<link>http://feedproxy.google.com/~r/Nuclear-poweredNutcracker/~3/elHwpmyPJFE/</link>
		<comments>http://danlucraft.com/blog/2009/03/testing-ruby-gnome2-with-cucumber/#comments</comments>
		<pubDate>Sun, 08 Mar 2009 08:30:38 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[Cucumber]]></category>

		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[ruby-gnome2]]></category>

		<guid isPermaLink="false">http://www.daniellucraft.com/blog/?p=215</guid>
		<description><![CDATA[Testing Ruby-GNOME2 can be a tricky thing to get right. There have been all sorts of annoying issues regarding getting Test::Unit to work, and I know my own efforts with RSpec have not been entirely pain-free.
But getting Cucumber up and running to test Ruby-GNOME2 has been a joy. I think this is because unlike the [...]]]></description>
			<content:encoded><![CDATA[<p>Testing <a href="http://ruby-gnome2.sourceforge.jp">Ruby-GNOME2</a> can be a tricky thing to get right. There have been all sorts of annoying issues regarding getting Test::Unit to work, and I know my own efforts with RSpec have not been entirely pain-free.</p>
<p>But getting <a href="http://cukes.info">Cucumber</a> up and running to test Ruby-GNOME2 has been a joy. I think this is because unlike the other two, Cucumber doesn&#8217;t use Ruby&#8217;s <a href="http://apidock.com/ruby/Kernel/at_exit">at_exit</a> to determine when to run its tests, giving you more control over the environment.</p>
<p>So here&#8217;s how. The problem with testing Ruby-GNOME2 - and indeed any gui - is that they are event based. Once you decide to use Ruby-GNOME2, you hand over control of your application to the gui main-loop. But test frameworks rely on keeping that control so they can dispatch tests.</p>
<p>For instance, you could decide to have a button in your application that reads &#8220;Run Tests&#8221;. And that button, when pressed, would fire a gui event that sends off to Test::Unit or whatever to say &#8216;run all tests&#8217;, and Test::Unit would march through its test suite, and then the original event would return control to the gui.</p>
<p>But all your tests have been processed within the same gui event handler. So by definition, no other events can have been processed during that time. That means no keypresses or menu clicks or TreeView updates will work in your tests.</p>
<p>What we want is for the gui to process events as needed, but still keep the control with our tests. We do that by replacing the GTK main-loop with a loop that we control.</p>
<p>First you have to write your application to not start the main-loop if features are running, as we will process our events manually. So your code will need to contain a guard like:</p>
<pre><code class="ruby">
  unless $running_features
    Gtk.main
  end

</code></pre>
<p>Now in a Test::Unit testcase, you would need to write code like:</p>
<pre><code class="ruby">
  def test_click
    click_button
    process_all_gui_events
    check_dialog_visible
  end

</code></pre>
<p>But in Cucumber, we can write something more natural. Our feature will look like this:</p>
<pre><code>
Feature: User clicks on something

Scenario: Single click
  When I click on the button
  Then the dialog should be visible

</code></pre>
<p>Run this feature using this Gtk Cucumber formatter (requires Cucumber 0.2):</p>
<pre><code class="ruby">
module Cucumber
  module Formatter
    class GtkFormatter < Pretty

      def visit_step(step)
        super
        while Gtk.events_pending?
          Gtk.main_iteration
        end
      end
    end
  end
end

</code></pre>
<p>And gui events will automatically be processed between each Cucumber step. Of course this means steps can&#8217;t rely upon events being processed within the body of the step, but steps are supposed to be short and atomic anyway, so it should not be a problem.</p>
<p>I have just started using this technique in <a href="http://www.redcaride.com">Redcar</a>, and it has been working very well (<a href="http://github.com/danlucraft/redcar/blob/8858a414ed0a216a2f15666c90263dab7e1e9b12/plugins/project/features/project_tab.feature">example</a>). It&#8217;s much more comfortable than the RSpec version that I was using before. I&#8217;ll now use RSpec for unit testing in my application, with no gui interaction at all. This seems right because a test that requires the gui like this is an integration test, and Cucumber is our integration test framework!</p>
<img src="http://feeds.feedburner.com/~r/Nuclear-poweredNutcracker/~4/elHwpmyPJFE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://danlucraft.com/blog/2009/03/testing-ruby-gnome2-with-cucumber/feed/</wfw:commentRss>
		<feedburner:origLink>http://danlucraft.com/blog/2009/03/testing-ruby-gnome2-with-cucumber/</feedburner:origLink></item>
		<item>
		<title>Sounds of the Server Room</title>
		<link>http://feedproxy.google.com/~r/Nuclear-poweredNutcracker/~3/SRsk6f3wSXo/</link>
		<comments>http://danlucraft.com/blog/2009/02/sounds-of-the-server-room/#comments</comments>
		<pubDate>Wed, 11 Feb 2009 17:09:07 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.daniellucraft.com/blog/?p=209</guid>
		<description><![CDATA[Our CEO&#8217;s headphones sounded just like an old 56k modem dialing to the rest of us, so we wondered what he could possibly be listening to&#8230;..

(Picture: Gideon Bullock)
]]></description>
			<content:encoded><![CDATA[<p>Our <a href="http://twitter.com/soundboy">CEO</a>&#8217;s headphones sounded just like an old 56k modem dialing to the rest of us, so we wondered what he could possibly be listening to&#8230;..</p>
<p><a href="http://www.daniellucraft.com/blog/wp-content/uploads/2009/02/picture-4.png"><img src="http://www.daniellucraft.com/blog/wp-content/uploads/2009/02/picture-4.png" alt="picture-4" title="picture-4" width="343" height="350" class="aligncenter size-full wp-image-210" /></a><br />
(Picture: <a href="http://gid.tumblr.com/">Gideon Bullock</a>)</p>
<img src="http://feeds.feedburner.com/~r/Nuclear-poweredNutcracker/~4/SRsk6f3wSXo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://danlucraft.com/blog/2009/02/sounds-of-the-server-room/feed/</wfw:commentRss>
		<feedburner:origLink>http://danlucraft.com/blog/2009/02/sounds-of-the-server-room/</feedburner:origLink></item>
		<item>
		<title>features_report</title>
		<link>http://feedproxy.google.com/~r/Nuclear-poweredNutcracker/~3/0d2_RzeaMD4/</link>
		<comments>http://danlucraft.com/blog/2009/01/features_report/#comments</comments>
		<pubDate>Mon, 12 Jan 2009 10:18:22 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[Cucumber]]></category>

		<category><![CDATA[features_report]]></category>

		<category><![CDATA[Grit]]></category>

		<category><![CDATA[Prawn]]></category>

		<guid isPermaLink="false">http://www.daniellucraft.com/blog/?p=192</guid>
		<description><![CDATA[SO your team has diligently been writing Cucumber Features in natural language English, so that non-devs can read and understand them. And you now have a large corpus of readable specs. But guess what, the features are locked in your version control system, and the non-devs either don&#8217;t know how to use it or just [...]]]></description>
			<content:encoded><![CDATA[<p>SO your team has diligently been writing <a href="http://cukes.info/">Cucumber</a> Features in natural language English, so that non-devs can read and understand them. And you now have a large corpus of readable specs. But guess what, the features are locked in your version control system, and the non-devs either don&#8217;t know how to use it or just don&#8217;t need to. So this fantastic resource, an always up-to-date executable spec of your website, is actually pretty useless.</p>
<p>So use <em>features_report</em> to unlock those specs and turn them into a lovely PDF. Here&#8217;s a <a href='http://www.daniellucraft.com/blog/wp-content/uploads/2009/01/features.pdf'>sample</a> of the output. Install and use like this:</p>
<pre><code class="ruby">
sudo gem install features_report
features_report features/*.feature

</code></pre>
<p>Features:</p>
<ul>
<li>Uses <a href="http://prawn.majesticseacreature.com/">Prawn</a> to generate the PDF.</li>
<li>Has a table of contents of all your features</li>
<li>Option to add a logo to the front page.</li>
<li>If you use git, it can add a &#8216;last changed date&#8217; to the table of contents, along with the name of the committer that last touched it. (Requires the gem &#8216;<a href="http://grit.rubyforge.org/">mojombo-grit</a>&#8216; to be installed from Github).</li>
</ul>
<p>Issues:</p>
<ul>
<li>The contents page is at the back. I don&#8217;t think Prawn has the capability to go back and add the contents page after the document has been generated, if I&#8217;m wrong please enlighten me.</li>
<li>FIT tables are not handled correctly. The Cucumber project is rewriting the parser at the moment, and it looks like adding this will be lots easier afterwards so we decided to wait.</li>
</ul>
<p>The source is available at <a href="http://github.com/danlucraft/features_reports/tree/master">Github</a> and features_report was written by Daniel Lucraft and Niko Felger. Features_report was sponsored by Songkick.com. Thanks to Bryan Helmkamp for some cribbed Cucumber parsing code from <a href="http://github.com/brynary/features2cards/tree/master">features2cards</a>.</p>
<img src="http://feeds.feedburner.com/~r/Nuclear-poweredNutcracker/~4/0d2_RzeaMD4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://danlucraft.com/blog/2009/01/features_report/feed/</wfw:commentRss>
		<feedburner:origLink>http://danlucraft.com/blog/2009/01/features_report/</feedburner:origLink></item>
		<item>
		<title>RubyConf2008 Videos for your Ipod</title>
		<link>http://feedproxy.google.com/~r/Nuclear-poweredNutcracker/~3/jt6txTeLjtY/</link>
		<comments>http://danlucraft.com/blog/2008/12/rubyconf2008-videos-for-your-ipod/#comments</comments>
		<pubDate>Fri, 19 Dec 2008 12:13:16 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[ffmpeg]]></category>

		<category><![CDATA[ipod]]></category>

		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://www.daniellucraft.com/blog/?p=176</guid>
		<description><![CDATA[Despite the recent love I gave it, Handbrake has let me down. The latest version segfaults on every job I give it. So I&#8217;ve had to find a different way to get RubyConf2008 onto my Ipod. I decided to take another look at ffmpeg&#8217;s terrifying command line options. 
Confreaks have put the RubyConf 2008 videos [...]]]></description>
			<content:encoded><![CDATA[<p>Despite the <a href="http://www.daniellucraft.com/blog/2008/10/handbrake-love/">recent love</a> I gave it, <a href="http://handbrake.fr/">Handbrake</a> has let me down. The latest version segfaults on every job I give it. So I&#8217;ve had to find a different way to get RubyConf2008 onto my Ipod. I decided to take another look at <a href="http://ffmpeg.mplayerhq.hu/">ffmpeg</a>&#8217;s terrifying command line options. </p>
<p>Confreaks have put the RubyConf 2008 videos online <a href="http://rubyconf2008.confreaks.com/">here</a>. To convert the larger 960&#215;468 videos to a format playable on your Ipod using ffmpeg:</p>
<pre><code>
ffmpeg -i ruby-19-what-to-expect-large.mp4 -cropleft 480  \
-vcodec h264 -b 150k -bufsize 244 -maxrate 768k \
-s 480x368 -bf 0 -level 13 -f mp4 -acodec aac -ar 48000 \
-ab 64 ruby19.mp4 

</code></pre>
<p>Confreaks videos have two halves: the slides and the presenter. The cropleft option removes the left hand half of the video, in this case the presenter, leaving just the slides.</p>
<p>If you want to test out your options you can tell ffmpeg to only process a few frames:</p>
<pre><code>
-vframes 2000

</code></pre>
<img src="http://feeds.feedburner.com/~r/Nuclear-poweredNutcracker/~4/jt6txTeLjtY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://danlucraft.com/blog/2008/12/rubyconf2008-videos-for-your-ipod/feed/</wfw:commentRss>
		<feedburner:origLink>http://danlucraft.com/blog/2008/12/rubyconf2008-videos-for-your-ipod/</feedburner:origLink></item>
		<item>
		<title>How to run an IRC channel for your free software project</title>
		<link>http://feedproxy.google.com/~r/Nuclear-poweredNutcracker/~3/F3F00Ge8t9Y/</link>
		<comments>http://danlucraft.com/blog/2008/12/how-to-run-an-irc-channel-for-your-free-software-project/#comments</comments>
		<pubDate>Mon, 15 Dec 2008 14:12:41 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[irc]]></category>

		<guid isPermaLink="false">http://www.daniellucraft.com/blog/?p=159</guid>
		<description><![CDATA[I recently needed to set up an IRC channel for Redcar (#redcar at freenode.net), and the tutorials I found online were next to useless. I created my channel on freenode.net. Freenode provides free IRC servers for open source projects. Lots of projects I follow (#rubinius, #rspec) are on Freenode, and Freenode has all the services [...]]]></description>
			<content:encoded><![CDATA[<p>I recently needed to set up an IRC channel for Redcar (#redcar at freenode.net), and the tutorials I found online were next to useless. I created my channel on freenode.net. Freenode provides free IRC servers for open source projects. Lots of projects I follow (#rubinius, #rspec) are on Freenode, and Freenode has all the services you need to run your channel easily. You don&#8217;t have to worry about channel wars or any of that nonsense if you register your channel with them.</p>
<p><strong>Connection</strong></p>
<p>Choose your IRC chat client. I used to use <a href="http://www.pidgin.im/home.php">Pidgin</a>, but now I use <a href="http://www.irssi.org/">Irssi</a>. A terminal based client was my choice because it means I can leave it open on my server and connect to it from wherever I am, work or home. That means the client is never closed, so logging can happen continuously and I do not need to disconnect and reconnect periodically. Disconnecting and reconnecting is accomplished using <a href="http://www.gnu.org/software/screen/">GNU Screen</a>. This is a good <a href="http://quadpoint.org/articles/irssi">tutorial</a> on using Screen and Irssi together.</p>
<p>You do not need to use Irssi, or to have a permanently open connection to run an IRC chat. Having said that, ChanServ has some impenetrable help text about channel successors or somesuch, so may want to test this stuff out.</p>
<p><strong>Register your nickname</strong></p>
<p>Before you can register a channel, you have to have a registered nickname. Send a message to the NickServ bot to register the nickname you are currently using. You can send the message from any channel (though be careful with your typing otherwise you will be broadcasting your password).</p>
<pre><code>
/msg nickserv identify mypassword

</code></pre>
<p><strong>Create your channel</strong></p>
<p>You create a channel by joining it. So type:</p>
<pre><code>
/join #mychannel

</code></pre>
<p><strong>Register your channel</strong></p>
<p>Registering a channel secures it from being taken over by unscrupulous types. Freenode runs the ChanServ bot for this purpose. To register your channel send a message to ChanServ</p>
<pre><code>
/msg chanserv register #mychannel

</code></pre>
<p>You can now use ChanServ to grant yourself admin privileges when you need them, and to make sure that no one else has admin rights. To give yourself admin rights to your channel (called &#8216;ops&#8217;) type:</p>
<pre><code>
/msg chanserv op #mychannel

</code></pre>
<p>To remove admin rights type this:</p>
<pre><code>
/msg chanserv deop #mychannel

</code></pre>
<p>According to my sources, admin rights are like <em>sudo</em>, you should grant them to yourself when you need them but otherwise have them turned off.</p>
<p>You can get help about all of ChanServ&#8217;s commands:</p>
<pre><code>
/msg chanserv help

</code></pre>
<img src="http://feeds.feedburner.com/~r/Nuclear-poweredNutcracker/~4/F3F00Ge8t9Y" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://danlucraft.com/blog/2008/12/how-to-run-an-irc-channel-for-your-free-software-project/feed/</wfw:commentRss>
		<feedburner:origLink>http://danlucraft.com/blog/2008/12/how-to-run-an-irc-channel-for-your-free-software-project/</feedburner:origLink></item>
		<item>
		<title>Maximum Awesome</title>
		<link>http://feedproxy.google.com/~r/Nuclear-poweredNutcracker/~3/W7bx21lOJlM/</link>
		<comments>http://danlucraft.com/blog/2008/12/maximum-awesome/#comments</comments>
		<pubDate>Fri, 12 Dec 2008 11:29:22 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[Songkick]]></category>

		<category><![CDATA[Web2.0]]></category>

		<guid isPermaLink="false">http://www.daniellucraft.com/blog/?p=135</guid>
		<description><![CDATA[I just took a look at our website, and I thought I would check off all the aspects of the design that are at all web2.0:

Stripes: check.
Reflection: check.
Beta: check.
Rounded corners: check.
Gradients: check.


Gosh. If only there was a new design in the pipeline I could look forward to.
]]></description>
			<content:encoded><![CDATA[<p>I just took a look at our <a href="http://www.songkick.com">website</a>, and I thought I would check off all the aspects of the design that are at all web2.0:</p>
<ul>
<li>Stripes: check.</li>
<li>Reflection: check.</li>
<li>Beta: check.</li>
<li>Rounded corners: check.</li>
<li>Gradients: check.</li>
</ul>
<p><img src="http://www.daniellucraft.com/blog/wp-content/uploads/2008/12/web2-max.png" alt="web2-max" title="web2-max" width="251" height="141" class="alignnone size-full wp-image-136" /></p>
<p>Gosh. If only there was a new design in the pipeline I could look forward to.</p>
<img src="http://feeds.feedburner.com/~r/Nuclear-poweredNutcracker/~4/W7bx21lOJlM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://danlucraft.com/blog/2008/12/maximum-awesome/feed/</wfw:commentRss>
		<feedburner:origLink>http://danlucraft.com/blog/2008/12/maximum-awesome/</feedburner:origLink></item>
	</channel>
</rss>
