<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns="http://purl.org/rss/1.0/">
  <channel rdf:about="http://times.usefulinc.com/tagrails">
    <title>Edd Dumbill's Weblog: 'rails' articles</title>
    <description>Articles tagged as 'rails' from Edd Dumbill, technology writer and free software hacker.</description>
    <link>http://times.usefulinc.com/tagrails</link>
    <dc:date>2008-06-02T12:41:36Z</dc:date>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://times.usefulinc.com/2008/06/02-railsconf"/>
        <rdf:li rdf:resource="http://times.usefulinc.com/2008/01/12-rspec-stories"/>
        <rdf:li rdf:resource="http://times.usefulinc.com/2007/11/14-latest"/>
        <rdf:li rdf:resource="http://times.usefulinc.com/2007/06/22-disclosure"/>
        <rdf:li rdf:resource="http://times.usefulinc.com/2007/06/21-jeni"/>
        <rdf:li rdf:resource="http://times.usefulinc.com/2007/06/20-bzr"/>
        <rdf:li rdf:resource="http://times.usefulinc.com/2006/11/23-test-or-die"/>
        <rdf:li rdf:resource="http://times.usefulinc.com/2006/09/29-rails-bzr"/>
        <rdf:li rdf:resource="http://times.usefulinc.com/2006/09/15-rails-debian-apache"/>
        <rdf:li rdf:resource="http://times.usefulinc.com/2006/09/13-mongrel-apache20"/>
        <rdf:li rdf:resource="http://times.usefulinc.com/2006/06/23-railsconf"/>
        <rdf:li rdf:resource="http://times.usefulinc.com/2006/06/19-railsconf"/>
        <rdf:li rdf:resource="http://times.usefulinc.com/2006/05/22-books-now-please"/>
        <rdf:li rdf:resource="http://times.usefulinc.com/2006/04/10-catchup"/>
        <rdf:li rdf:resource="http://times.usefulinc.com/2006/02/15-xtech"/>
        <rdf:li rdf:resource="http://times.usefulinc.com/2006/02/06-conferences"/>
        <rdf:li rdf:resource="http://times.usefulinc.com/2006/01/21-rails-zope"/>
        <rdf:li rdf:resource="http://times.usefulinc.com/2006/01/19-switchtower-baz"/>
        <rdf:li rdf:resource="http://times.usefulinc.com/2006/01/15-redesign"/>
        <rdf:li rdf:resource="http://times.usefulinc.com/2005/08/21-roundup"/>
      </rdf:Seq>
    </items>
  </channel>
  <item rdf:about="http://times.usefulinc.com/2008/06/02-railsconf">
    <title>RailsConf, remotely</title>
    <link>http://times.usefulinc.com/2008/06/02-railsconf</link>
    <description>I couldn't make it to RailsConf this year, but have been playing my part from afar.</description>
    <dc:subject>rails</dc:subject>
    <dc:subject>railsconf</dc:subject>
    <dc:subject>expectnation</dc:subject>
    <dc:subject>conferences</dc:subject>
    <dc:creator>Edd Dumbill</dc:creator>
    <dc:date>2008-06-02T12:01:03Z</dc:date>
    <foaf:maker>
      <foaf:Person>
        <foaf:mbox rdf:resource="mailto:edd@usefulinc.com"/>
      </foaf:Person>
    </foaf:maker>
    <content:encoded>&lt;p&gt;I couldn't make it to &lt;a href="http://en.oreilly.com/rails2008/"&gt;RailsConf&lt;/a&gt; this year, but have been playing my part from afar. It gives me a small kick of pride to note that now RailsConf is run entirely out of &lt;a href="http://www.expectnation.com/"&gt;Expectnation&lt;/a&gt;, which is of course Rails-based.&lt;/p&gt;
&lt;p&gt;Here's a badge I clipped for my virtual scrapbook.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://times.usefulinc.com/asset/name/43/dhh.png" alt="DHH's badge" width="504" height="166" /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://times.usefulinc.com/2008/06/02-railsconf#disqus_thread"&gt;Join the conversation about this post&lt;/a&gt;&lt;/p&gt;</content:encoded>
  </item>
  <item rdf:about="http://times.usefulinc.com/2008/01/12-rspec-stories">
    <title>Telling stories with RSpec</title>
    <link>http://times.usefulinc.com/2008/01/12-rspec-stories</link>
    <description>Using RSpec's Story runner to describe integration testing for Rails applications.</description>
    <dc:subject>software</dc:subject>
    <dc:subject>rails</dc:subject>
    <dc:subject>ruby</dc:subject>
    <dc:subject>agile</dc:subject>
    <dc:creator>Edd Dumbill</dc:creator>
    <dc:date>2008-01-12T13:14:43Z</dc:date>
    <foaf:maker>
      <foaf:Person>
        <foaf:mbox rdf:resource="mailto:edd@usefulinc.com"/>
      </foaf:Person>
    </foaf:maker>
    <content:encoded>         &lt;p&gt;For a while now I've been writing &lt;a href="http://rspec.info/"&gt;RSpec&lt;/a&gt; specifications to test &lt;a href="http://expectnation.com/"&gt;Expectnation&lt;/a&gt;, rather than &amp;quot;traditional&amp;quot; Rails unit tests. Although I don't completely get the Behaviour Driven Development hype around RSpec, I do find that it helps in writing more literate and maintainable test suites.&lt;/p&gt;                 &lt;p&gt;Until very recently, however, &lt;a href="http://rspec.info/documentation/rails/index.html"&gt;RSpec for Rails&lt;/a&gt; had no decent answer to Rails' &lt;a href="http://www.oreillynet.com/pub/a/ruby/2008/01/02/cookin-with-ruby-on-rails---integration-tests.html"&gt;integration tests&lt;/a&gt;. Integration tests enable the testing of compete scenarios, as opposed to the specific testing of methods or single HTTP operations that unit and functional testing provide.&lt;/p&gt;  &lt;p&gt;For instance, our integration test suite for Expectnation tests things such as &amp;quot;a user tries to submit a proposal, is redirected to the account sign up page, signs up, and then is redirected to the proposal submission page&amp;quot;. This involves multiple steps, and the whole suite of tests necessitates a lot of reuse.&lt;/p&gt;                 &lt;p&gt;The need for reuse resulted in trying to construct a &lt;a href="http://en.wikipedia.org/wiki/Domain-specific_programming_language"&gt;DSL&lt;/a&gt;-like set of methods for each step, such as &amp;quot;user logs in with email X and password Y&amp;quot;. It has gotten a bit tangled, especially when looking at test failures to see what's really gone wrong.&lt;/p&gt;      &lt;div style="text-align: center"&gt;&lt;img width="160" height="240" src="/asset/name/41/2098453701_9a8d1e9f19_m.jpg" alt="Tangled wires" /&gt;&lt;br /&gt;    &lt;br /&gt;   &lt;em&gt;After a while, unravelling the test suite starts to feel like unpacking Christmas lights.  (Photo: &lt;a href="http://flickr.com/photos/leecullivan/2098453701/"&gt;shoothead&lt;/a&gt;)&lt;/em&gt; &lt;/div&gt;                        &lt;h3&gt;RSpec Story Framework&lt;/h3&gt;           &lt;p&gt;My problems with integration tests made the Story Framework, newly available in RSpec 1.1, look very interesting. Based around plain text descriptions of application behaviour, it lets you write integration tests with good reuse and good diagnostic reporting.&lt;/p&gt;                 &lt;p&gt;For example, here's a story I wrote to check the login process.&lt;/p&gt;             &lt;p&gt;Story: login as an existing user&lt;br /&gt;       &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; As an unauthenticated user&lt;br /&gt;       &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; I want to log in to Expectnation&lt;br /&gt;       &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; So I can see my account details&lt;br /&gt;       &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;       &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Scenario: login details are correct&lt;br /&gt;       &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Given an event provider&lt;br /&gt;       &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; And my test@example.org account&lt;br /&gt;       &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; When I log in with email test@example.org and password foofoo&lt;br /&gt;       &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Then I will be logged in&lt;br /&gt;       &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; And I will be shown the account page&lt;/p&gt;            &lt;p&gt;The words such as &amp;quot;Given&amp;quot;, &amp;quot;When&amp;quot; and &amp;quot;Then&amp;quot; are cues to the story runner to execute some code. Behind the story sits a collection of steps. Here's a couple of steps from this test:&lt;/p&gt;           &lt;p&gt;&amp;nbsp; Given &amp;quot;my $email account&amp;quot; do |email|&lt;br /&gt;      &amp;nbsp;&amp;nbsp;&amp;nbsp; @user = find_or_create_user_by_email({:email =&amp;gt; email,&lt;br /&gt;      &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :password =&amp;gt; 'foofoo',&lt;br /&gt;      &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :password_confirmation =&amp;gt; 'foofoo'})&lt;br /&gt;      &amp;nbsp; end&lt;/p&gt;          &lt;p&gt;&amp;nbsp; When &amp;quot;I log in with email $email and&lt;br /&gt;      &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; password $password&amp;quot; do |email, password|&lt;br /&gt;      &amp;nbsp;&amp;nbsp;&amp;nbsp; post '/user/account/authenticate',&lt;br /&gt;      &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :user =&amp;gt; {:email =&amp;gt; email, :password =&amp;gt; password}&lt;br /&gt;      &amp;nbsp; end&lt;/p&gt;          &lt;p&gt;Notice how a clever bit of string matching allows you to pass parameters from the story prose. &lt;br /&gt;      &lt;/p&gt;           &lt;p&gt;With a small bit of bolting together, the prose stories are then run as code and the tests executed. One nice touch is that if you write a story which doesn't yet have code behind it, it is marked not as a pass or fail, but as pending, which means you can sit down and write all your stories and then get to coding the steps later. This beats writing empty tests which transparently pass.&lt;/p&gt;           &lt;p&gt;To conclude, the RSpec Story Framework offers these advantages over Rails' integration tests:&lt;/p&gt;           &lt;ul&gt;      &lt;li&gt;Text-only stories makes it very easy to write and understand tests&lt;/li&gt;           &lt;li&gt;The construction of steps for each line makes it easy and maintainable to construct reusable components for the tests&lt;/li&gt;      &lt;/ul&gt;      &lt;h3&gt;Further reading&lt;/h3&gt;      &lt;ul&gt;      &lt;li&gt;&lt;a href="http://rspec.info/"&gt;RSpec&lt;/a&gt; web site&lt;/li&gt;           &lt;li&gt;&lt;a href="http://jbehave.org/"&gt;JBehave&lt;/a&gt; for Java, of which RSpec's Story Framework is a port&lt;/li&gt;           &lt;li&gt;&lt;a href="http://behaviour-driven.org/"&gt;Behaviour-Driven Development&lt;/a&gt;&lt;/li&gt;      &lt;/ul&gt;      &lt;p&gt;&lt;a href="http://times.usefulinc.com/2008/01/12-rspec-stories#disqus_thread"&gt;Join the conversation about this post&lt;/a&gt;&lt;/p&gt;</content:encoded>
  </item>
  <item rdf:about="http://times.usefulinc.com/2007/11/14-latest">
    <title>Edd 10.5 release notes</title>
    <link>http://times.usefulinc.com/2007/11/14-latest</link>
    <description>The guilty catch-up obligatory before continuing to blog further.</description>
    <dc:subject>rails</dc:subject>
    <dc:subject>railsconf</dc:subject>
    <dc:subject>expectnation</dc:subject>
    <dc:subject>family</dc:subject>
    <dc:subject>conferences</dc:subject>
    <dc:creator>Edd Dumbill</dc:creator>
    <dc:date>2007-11-14T16:03:04Z</dc:date>
    <foaf:maker>
      <foaf:Person>
        <foaf:mbox rdf:resource="mailto:edd@usefulinc.com"/>
      </foaf:Person>
    </foaf:maker>
    <content:encoded> 	 &lt;p&gt;I&amp;rsquo;ve had my head down with lots of hard work and exciting developments, and alas too little time to blog here. However, I wanted to post a few updates as to what&amp;rsquo;s been going on.&lt;/p&gt;    	&lt;h3&gt;Expectnation&lt;/h3&gt;   	 &lt;p&gt;Most of my time&amp;rsquo;s been spent working on &lt;a href="http://expectnation.com/"&gt;Expectnation&lt;/a&gt;, the conference and event management application my company works on.&lt;/p&gt;    	 &lt;p&gt;The highlight of this quarter is that we launched &lt;a href="http://expectnation.com/public/content/registration"&gt;registration facilities&lt;/a&gt;, so now in addition to planning content, creating your event web site and managing speakers, you can take money and register folk for your conference.&lt;/p&gt;    	 &lt;p&gt;We&amp;rsquo;re very excited about adding this, and it makes Expectnation the ideal &amp;ldquo;conference in a box&amp;rdquo; system.&lt;/p&gt;    	 &lt;p&gt;It&amp;rsquo;s a complete buzz to see submissions coming in for &lt;a href="http://en.oreilly.com/rails2008/public/content/home"&gt;RailsConf&lt;/a&gt; using our software&amp;mdash;Rails-based, of course!&lt;/p&gt;    	&lt;h3&gt;Conferences&lt;/h3&gt;   	 &lt;p&gt;I&amp;rsquo;m currently gearing up to open the call for participation for XTech 2008. We&amp;rsquo;ll be in Dublin, Ireland, in early May 2008. More soon on this front.&lt;/p&gt;    	 &lt;p&gt;Additionally, I&amp;rsquo;m going to be co-chair with Allison Randal for O&amp;rsquo;Reilly&amp;rsquo;s &lt;span class="caps"&gt;OSCON 2008&lt;/span&gt;. I can&amp;rsquo;t really say I&amp;rsquo;m filling Nat Torkington&amp;rsquo;s shoes (more like ironing &lt;a href="http://www.flickr.com/photos/x180/898259595/in/set-72157600967110580/"&gt;his shirts&lt;/a&gt;) but needless to say it&amp;rsquo;s a great privilege about which I&amp;rsquo;m thoroughly excited.&lt;/p&gt;    	 &lt;div style="margin: 2em; float: right"&gt;&lt;img width="350" height="263" src="/asset/name/40/k-read.jpg" alt="Katherine reading" /&gt;&lt;/div&gt;  &lt;p&gt;With being so busy, I&amp;rsquo;ve not had the time to travel as nearly as much as I&amp;rsquo;d like this year (the small matter of the baby twins has some bearing on this, too). I&amp;rsquo;m very sad to be missing &lt;a href="http://2007.xmlconference.org"&gt;&lt;span class="caps"&gt;XML 2007&lt;/span&gt;&lt;/a&gt;, as the &lt;span class="caps"&gt;XML&lt;/span&gt; crowd remains the most erudite, eclectic and friendly bunch of people I&amp;rsquo;ve ever had the pleasure to work with.&lt;/p&gt;    	&lt;h3&gt;Writing&lt;/h3&gt;   	 &lt;p&gt;My sporadic attempts to attain literary posterity will again come to the fore over the next few months, as a new project starts with my old friend and co-conspirator &lt;a href="http://www.simonstl.com/"&gt;Simon St.Laurent&lt;/a&gt;. All hush-hush for now, but I look forward to sharing the news and maybe some early-access content here.&lt;/p&gt; &lt;p&gt;&lt;a href="http://times.usefulinc.com/2007/11/14-latest#disqus_thread"&gt;Join the conversation about this post&lt;/a&gt;&lt;/p&gt;</content:encoded>
  </item>
  <item rdf:about="http://times.usefulinc.com/2007/06/22-disclosure">
    <title>Collecting minimal user information</title>
    <link>http://times.usefulinc.com/2007/06/22-disclosure</link>
    <description>Asking for too much information from users is a barrier to participation. So, we invented a way to make sure that users only get asked for as much as we need to know.</description>
    <dc:subject>programming</dc:subject>
    <dc:subject>rails</dc:subject>
    <dc:subject>expectnation</dc:subject>
    <dc:subject>community</dc:subject>
    <dc:creator>Edd Dumbill</dc:creator>
    <dc:date>2007-06-22T15:37:46Z</dc:date>
    <foaf:maker>
      <foaf:Person>
        <foaf:mbox rdf:resource="mailto:edd@usefulinc.com"/>
      </foaf:Person>
    </foaf:maker>
    <content:encoded> &lt;p&gt;Web applications are in constant competition for a user's attention. Unlike shrink-wrap software, there's often no captive audience, and web apps must gently guide and woo users to help them to the best experience of the software.&lt;/p&gt; &lt;p&gt;This is particularly true when considering the problem of collecting personal details from a user. Collect too little information, and your app might not be able to function effectively. Collect too much information, and you raise the barrier for participation with your application. Users may either not be bothered, be alarmed at the apparent intrusion into their privacy, or fill out bogus information.&amp;nbsp;&lt;/p&gt; &lt;h3&gt;One size doesn't fit all&lt;br /&gt; &lt;/h3&gt; &lt;p&gt;I originally stumbled on the issue in the development of &lt;a href="http://expectnation.com/"&gt;Expectnation&lt;/a&gt;. The amount of information a conference speaker needs to give the organizers is significantly more than that of, say, a reviewer. An organizer will often want postal and phone details for a speaker, which are largely irrelevant to the review process. All conferences and events rely on the willingess of participants, so the path to participation needs to be as frictionless as possible.&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Thus, a one-size-fits-all personal details form didn't make sense for us. At best, we could have simply made more fields optional, but that would result in missing information that we really did need.&lt;/p&gt; &lt;p&gt;Another solution would be to provide a dedicated personal details form per user type, e.g. different forms for speakers and reviewers. This is a non-starter, however, as users can take on many roles within a conference.&lt;/p&gt; &lt;p&gt;So, we had a problem on our hands: different levels of interaction with our application requires different levels of personal information.&lt;/p&gt; &lt;p&gt;We also had a second problem, which is that not all events and organizers want the same level of information. For example, a user group event is unlikely to need the same amount of information from speakers as an academic conference.&lt;/p&gt; &lt;p&gt;Thus we have two axes on which the amount of information required varies: by role, and by event.&amp;nbsp;&lt;/p&gt; &lt;h3&gt;Our solution: progressive disclosure&lt;/h3&gt; &lt;p&gt;We concluded that we wanted to adhere to two principles in the collection of user information for Expectnation:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;collect as little information from users as possible, and&lt;br /&gt; &lt;/li&gt; &lt;li&gt;allow organizers to determine the level of information they wish to collect.&lt;/li&gt; &lt;/ul&gt; The first objective was achieved by constructing a matrix of information items against user role, with the possible values of {required, optional, unused} for each item. We then achieved the second objective by allowing this matrix to be varied over each event. &lt;p&gt;We've named this concept &amp;quot;&lt;a href="http://expectnation.com/public/content/2007/06/21-tip-user-disclosure"&gt;progressive disclosure&lt;/a&gt;.&amp;quot;&lt;/p&gt; &lt;p&gt;What this means in practice is that a user is only ever asked for the information required to fulfil the roles they have within Expectnation. If they take on another role, they are asked for the additional information at that point, and not before.&lt;/p&gt; &lt;h3&gt;Implementation concerns&lt;/h3&gt; &lt;p style="float: right; margin-left: 10px; text-align: center"&gt;&lt;img width="341" height="229" src="http://times.usefulinc.com/asset/name/39/small-disc.jpg" alt="Expectnation user disclosure editing" /&gt;&lt;br /&gt;Extract from disclosure level editing UI&lt;/p&gt; &lt;p&gt;It would be untrue to say that progressive disclosure is simple to implement.&lt;/p&gt; &lt;p&gt;A user in our system will have disclosure requirements that are the union of all of their roles in all of the events they attend. Within Ruby on Rails, this means the conventional validation logic is useless to us, as it only deals with static requirements. Secondly, disclosure requirements are expensive to compute, so we need to cache them, with the inevitable addition of issues such as cache invalidation.&lt;/p&gt; &lt;p&gt;Beyond the data model issues, the user interface issues are, if anything, more troublesome. From an end-user's point of view, the difficulty arises when we need extra information from them, and presenting this in a way that makes sense.&lt;/p&gt; &lt;p&gt;From the event organizer's point of view, we have the challenge of presenting a controlling user interface for rather a complex concept. Organizers must be able to change the level of required information either globally, or per-event.&lt;/p&gt; &lt;p&gt;We opted for a grid presentation, an extract from which is shown in the screenshot in this article. Over time we'll be able to see how effective this interface is, and what we can do to improve it.&lt;/p&gt; &lt;p&gt;Finally, we have chosen sensible defaults for all disclosure levels, as the best result would be that organizers have little need to reconfigure the settings in the first place.&lt;/p&gt; &lt;h3&gt;Making it look easy&lt;/h3&gt; &lt;p&gt;Because Expectnation is a general application for organizing events, rather than targetting one specific one, we've had to construct a framework for minimizing user information collection, as opposed to simple implementation of known scenarios.&lt;/p&gt; &lt;p&gt;At the end of the day we have added a fairly complicated subsystem and an extra degree of complexity to our codebase. However, the result from the user's point of view is increased simplicity and a streamlined experience.&lt;/p&gt; &lt;p&gt;Every time you embark on something that wide-reaching and complex, you have to ask yourself whether the feature is really worth it. In this case, though, the answer is a resounding &amp;quot;yes&amp;quot;. The user is the most important factor in our software, and making their life easier in an unobtrusive manner is a priority.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Expectnation blog: &lt;a href="http://expectnation.com/public/content/2007/06/21-tip-user-disclosure"&gt;Only ask users for the information you need&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt; &lt;br /&gt; &lt;p&gt;&lt;a href="http://times.usefulinc.com/2007/06/22-disclosure#disqus_thread"&gt;Join the conversation about this post&lt;/a&gt;&lt;/p&gt;</content:encoded>
  </item>
  <item rdf:about="http://times.usefulinc.com/2007/06/21-jeni">
    <title>Jeni Tennison on women in computing</title>
    <link>http://times.usefulinc.com/2007/06/21-jeni</link>
    <description>A thoughtful and interesting piece on the gender gap in computing.</description>
    <dc:subject>rails</dc:subject>
    <dc:subject>community</dc:subject>
    <dc:subject>gender</dc:subject>
    <dc:creator>Edd Dumbill</dc:creator>
    <dc:date>2007-06-21T12:08:12Z</dc:date>
    <foaf:maker>
      <foaf:Person>
        <foaf:mbox rdf:resource="mailto:edd@usefulinc.com"/>
      </foaf:Person>
    </foaf:maker>
    <content:encoded> &lt;p&gt;For a long time I've been vexed by the gender bias of computing towards men. It's clear that computing has multiple issues, ranging from its perception to the nature of its society. As organizer of computing conferences, I care about ensuring that participation is meritocratic and inclusive.&lt;br /&gt; &lt;/p&gt; &lt;p&gt;As various debates have taken place over blogs in the past on women in computing, I have stayed silent. Not because I don't care, but because I really didn't know what to say. I try to understand, but at the end of the day I'm a man, I tend to misunderstand important points, and I suspect my contributions would come across as at best na&amp;iuml;ve, and more likely, patronising. So many conversations between men and women on this topic end up in mutual uncomprehension. Better to stay silent than be a fool.&lt;br /&gt;&lt;/p&gt; &lt;p&gt;This is why I'm very grateful for &lt;a href="http://www.jenitennison.com/blog/node/30"&gt;Jeni Tennison's analysis of women in computing&lt;/a&gt;. It is the most helpful blog post I have read recently on the topic. Perhaps it's because Jeni's British, and we share some of the same cultural assumptions and constraints. But more importantly, it's because her article builds bridges to my experience and understanding.&lt;br /&gt; &lt;/p&gt; &lt;h3&gt;An argument of femininity&lt;/h3&gt; &lt;p&gt;Rather than simply appealing to tribes of men and women, Jeni places the discussion in terms of feminine and masculine traits. Like many men, I identify with certain attitudes and preferences more closely allied to my feminine side. By not excluding me, her wording helped me view the points she unfolded in terms that my own experience, however poor, could identify with.&lt;/p&gt; &lt;p&gt;I've often found contemporary computing communities to be suffocatingly macho. There's a strong pressure to succeed in terms of attention from the chattering bloggers, privileged inner circles and the capacity for vicious excoriation of those who fall from grace.&lt;/p&gt;&lt;p&gt;As I grew up through school and university, I held these sorts of social forms in contempt, as well as occasionally suffering at their hands. Yet now, bafflingly, I find myself under the impression I need to belong and compete in these spheres.&lt;/p&gt;&lt;h3&gt;Self-efficacy&amp;nbsp;&lt;/h3&gt;&lt;p&gt;One of Jeni's central points is concern about one's own self-efficacy. This was the real revelation to me. I tend to assume most capable people I meet are aware of their own capability. Jeni turned this on its head for me when she wrote&lt;br /&gt; &lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;... look at how Ruby on Rails is marketed. A big play is made of how &lt;em&gt;easy&lt;/em&gt; it is. But if a language or framework is &lt;strong&gt;easy&lt;/strong&gt; then people with low self-efficacy can&amp;rsquo;t win: if they manage to do something with it then they haven&amp;rsquo;t really achieved very much because anyone can do it; if they &lt;em&gt;don&amp;rsquo;t&lt;/em&gt; manage to do something with it then they&amp;rsquo;re complete idiots. I&amp;rsquo;m not saying that we should advertise languages or frameworks as being &lt;strong&gt;hard&lt;/strong&gt;, because obviously that can put people off as well, but a recognition of the barriers that people might face may, in a strange way, make them more approachable.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;As Jeni brings her article to a close, it's with some shock and shame that I get the punchline loud and clear: &amp;quot;this isn't about you.&amp;quot;&lt;/p&gt;&lt;p&gt;It's about empathy, inclusivity and selflessness. Human qualities that are unrestricted to either gender.&lt;/p&gt;&lt;p&gt;&lt;a href="http://times.usefulinc.com/2007/06/21-jeni#disqus_thread"&gt;Join the conversation about this post&lt;/a&gt;&lt;/p&gt;</content:encoded>
  </item>
  <item rdf:about="http://times.usefulinc.com/2007/06/20-bzr">
    <title>Why Bazaar rocks, and the highs and lows of its use with Rails</title>
    <link>http://times.usefulinc.com/2007/06/20-bzr</link>
    <description>Mark Shuttleworth writes about the importance of merging in version control systems.</description>
    <dc:subject>programming</dc:subject>
    <dc:subject>rails</dc:subject>
    <dc:subject>agile</dc:subject>
    <dc:subject>bzr</dc:subject>
    <dc:creator>Edd Dumbill</dc:creator>
    <dc:date>2007-06-20T11:04:52Z</dc:date>
    <foaf:maker>
      <foaf:Person>
        <foaf:mbox rdf:resource="mailto:edd@usefulinc.com"/>
      </foaf:Person>
    </foaf:maker>
    <content:encoded>&lt;p&gt;While &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; is for many the source code revision system of choice, I've never stopped long with it myself. Why? Because it's mostly a fixed-up &lt;a href="http://www.nongnu.org/cvs/"&gt;CVS&lt;/a&gt;, and doesn't fix the really gnarly problem with revision control: merging.&lt;/p&gt;&lt;p&gt;Mark Shuttleworth has written an &lt;a href="http://www.markshuttleworth.com/archives/126"&gt;insightful little article&lt;/a&gt; on the key aspects of merging source code. Some of the points he makes underpin my choice of revision control system.&lt;/p&gt;&lt;p&gt;For several years now I've been a very contented user of &lt;a href="http://bazaar-vcs.org/"&gt;Bazaar&lt;/a&gt;, in its &lt;a href="http://bazaar-vcs.org/Baz1x"&gt;first arch-based incarnation&lt;/a&gt;, and now in its latter form. The key reason has been ease of merging.&lt;/p&gt;&lt;p&gt;While most articles praising Bazaar are reports of open source development, I've also found it very handy for small in-house teams working on web applications.&lt;/p&gt;&lt;p&gt;There are very often multiple arcs of development going on at once, and the ease of merging makes it easy to ensure that long-running development arcs don't get ridiculously far from the main trunk of development. Bazaar's merging also makes it easier for lead developers to police the merging of the code base.&lt;/p&gt;&lt;h3&gt;Using Bazaar with Rails and other tools&lt;/h3&gt;&lt;p&gt;Working mostly with Rails, one repeatedly runs up against the assumption that Subversion is the golden path for revision control. This is perhaps a little telling about the level of participation most Rails-based projects have reached.&lt;/p&gt;&lt;p&gt;The tools story for a Bazaar user is both good and bad.&lt;/p&gt;&lt;h4&gt;The good&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Deployment&lt;/strong&gt;: the &lt;a href="http://www.capify.org/"&gt;Capistrano&lt;/a&gt; deployment system has support for Bazaar. I've written previously about &lt;a href="http://times.usefulinc.com/2006/09/29-rails-bzr"&gt;the technique I use to deploy my Rails apps&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Collaboration&lt;/strong&gt;: &lt;a href="http://trac.edgewall.org/"&gt;Trac&lt;/a&gt; is a wonderful integrated bug database, wiki and source code browser. Although it's a little hard to find, the &lt;a href="http://bazaar-vcs.org/TracBzr"&gt;trac-bzr integration&lt;/a&gt; works very well, and happily moves Trac out of the Subversion-based assumption that you can only have one repository root per project.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;The bad&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Continuous integration&lt;/strong&gt;: with &lt;a href="http://www.expectnation.com/"&gt;Expectnation&lt;/a&gt;, we've had to roll our own continuous integration system ('system' being rather a grand word for a shell script on a cronjob...) Most of the CI systems currently popular seem to assume Subversion.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Editor/IDE integration&lt;/strong&gt;: &lt;a href="http://bazaar-vcs.org/3rdPartyTools"&gt;some early work exists&lt;/a&gt;, but it's early days. I've not yet found anything making me want to leave the command line.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href="http://times.usefulinc.com/2007/06/20-bzr#disqus_thread"&gt;Join the conversation about this post&lt;/a&gt;&lt;/p&gt;</content:encoded>
  </item>
  <item rdf:about="http://times.usefulinc.com/2006/11/23-test-or-die">
    <title>Really really getting the testing religion</title>
    <link>http://times.usefulinc.com/2006/11/23-test-or-die</link>
    <description>A short explanation of how I can't live without tests any longer.</description>
    <dc:subject>programming</dc:subject>
    <dc:subject>rails</dc:subject>
    <dc:subject>agile</dc:subject>
    <dc:creator>Edd Dumbill</dc:creator>
    <dc:date>2006-11-23T11:21:38Z</dc:date>
    <foaf:maker>
      <foaf:Person>
        <foaf:mbox rdf:resource="mailto:edd@usefulinc.com"/>
      </foaf:Person>
    </foaf:maker>
    <content:encoded>  &lt;p&gt;&lt;a href="http://www.agiledata.org/essays/tdd.html"&gt;Writing tests&lt;/a&gt; is virtuous. It's the wholemeal bread of programming. Do it, and you'll be so much fitter. Except it tastes like cardboard and gets in the way of consuming the yummy treacle sponge of programming.&lt;/p&gt;   &lt;p&gt;But now I've got the testing religion. I view the lack of tests with the disapprobation of a reformed smoker tutting and huffing at the merest suggestion of a Marlboro Light.&lt;/p&gt;   &lt;p&gt;How did this happen and how can I be sure I won't backslide?&lt;/p&gt;   &lt;p&gt;The moment of transition was the first time that a test saved me from releasing software with a bad bug in it. The theoretical knowledge of virtue was translated into the palpitating relief of not disgracing myself in public.&lt;/p&gt;   &lt;p&gt;After that happened a few more times, I found myself desperately uncomfortable with the idea of releasing anything that didn't have decent test coverage. And so a virtuous habit is formed.&lt;/p&gt;   &lt;p&gt;It's not just driven by fear. With the right tools to hand, writing tests can be a lot of fun. You don't always need to be &amp;quot;in the zone&amp;quot;. If you've got a spare half hour here and there, you can use it to increase the coverage of your tests.&lt;/p&gt;   &lt;p&gt;Getting better at testing is one of the ways I've become a much more proficient Rails developer over the last year of work on &lt;a href="http://www.expectnation.com/"&gt;Expectnation&lt;/a&gt;. In case it helps anybody else, I thought I'd share some of the tools and techniques that are part of making Rails testing fun and effective.&lt;/p&gt;  &lt;h4&gt;Continuous testing&lt;/h4&gt;  &lt;p&gt;Whenever a checkin is made to our source repository, tests are run and the results emailed to everybody working on the project. As with the &amp;quot;&lt;a href="http://www.youbrokethebuild.com/"&gt;you broke the build&lt;/a&gt;&amp;quot; disincentive, you need to be kept honest by frequent running of the tests.&lt;/p&gt;   &lt;p&gt;There are a variety of tools around to help you do continuous integration with Rails, most of which have some dependence on you using Subversion for source control. In the event, I just created my own script to do what we required.&lt;/p&gt;  &lt;h4&gt;Coverage reports&lt;/h4&gt;  &lt;p&gt;&lt;img width="313" vspace="8" hspace="8" height="110" align="right" src="http://times.usefulinc.com/asset/name/15/rcov_bars.png" alt="rcov coverage bars" title="rcov coverage bars" /&gt;One of the big mental hurdles with testing is knowing how many tests you should aim for.&amp;nbsp; You can't prove a negative: even if your tests are all passing it still doesn't tell you much about the tests you haven't written that might fail!&lt;/p&gt;   &lt;p&gt;We use &lt;a href="http://eigenclass.org/hiki.rb?rcov"&gt;rcov&lt;/a&gt; as part of the continuous integration process, and post the results to our project web site. The pretty red and green bars give you some idea of when you're starting to get adequate test coverage, and the line-by-line breakdown is invaluable.&lt;/p&gt;  &lt;h4&gt;Tainting strings&lt;/h4&gt;  &lt;p&gt;One of the easiest errors to make in Rails templates is to miss the call to &lt;em&gt;h()&lt;/em&gt;, to escape any HTML in an output string. The only real way to catch these errors is through automation. The wonderful &lt;a href="http://www.agilewebdevelopment.com/plugins/safe_erb"&gt;safe_erb&lt;/a&gt; plugin helps you do just that. By using Ruby's tainting mechanism for strings, it throws an exception if you render any external data unescaped.&lt;/p&gt;   &lt;p&gt;One of the beneficial side effects of safe_erb is that you then become very particular about ensuring your functional tests properly cover every action in your application.&amp;nbsp; Tests such as &lt;em&gt;get 'index'&lt;/em&gt;, which before seemed mundane and redundant, are now essential, as you want to test for tainted strings.&lt;/p&gt;   &lt;p&gt;In addition to the above techniques, there are a lot of fun shiny gadgets to help you write tests, such as &lt;a href="http://www.zenspider.com/ZSS/Products/ZenTest/"&gt;ZenTest&lt;/a&gt;, but the three things above are the ones I've found to be of significant value.&lt;/p&gt;   &lt;p&gt;I ought to conclude with words of praise for Rails. It goes out of its way to make testing an important part of the development lifecycle, and the availability of the of unit, functional and integration test functionality makes it easy to get started. Every time I teach somebody about Rails' testing features, they end up finding it very enjoyable.&lt;br /&gt;  &lt;/p&gt;   &lt;p&gt;Don't forget, testing can be fun!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://times.usefulinc.com/2006/11/23-test-or-die#disqus_thread"&gt;Join the conversation about this post&lt;/a&gt;&lt;/p&gt;</content:encoded>
  </item>
  <item rdf:about="http://times.usefulinc.com/2006/09/29-rails-bzr">
    <title>A deployment pattern for Rails and bzr</title>
    <link>http://times.usefulinc.com/2006/09/29-rails-bzr</link>
    <description>An explanation of the way I use Rails and bzr for efficient deployment.</description>
    <dc:subject>rails</dc:subject>
    <dc:subject>bzr</dc:subject>
    <dc:creator>Edd Dumbill</dc:creator>
    <dc:date>2006-09-29T13:50:19Z</dc:date>
    <foaf:maker>
      <foaf:Person>
        <foaf:mbox rdf:resource="mailto:edd@usefulinc.com"/>
      </foaf:Person>
    </foaf:maker>
    <content:encoded>  &lt;p&gt;I can't get enough of the &lt;a href="http://bazaar-vcs.org/"&gt;bzr&lt;/a&gt; revision control system, and I'm quite fond of Rails too. So, I thought I'd share my deployment setup for Rails applications using &lt;a href="http://manuals.rubyonrails.com/read/book/17"&gt;Capistrano&lt;/a&gt; and bzr. &lt;/p&gt;     &lt;p&gt; Capistrano works on the assumption that you're deploying from a revision control system. Secondly, it requires that your deployment server is aware of how to access this system. This leaves you with various options, the most obvious of which are: &lt;/p&gt;     &lt;ol&gt;    &lt;li&gt;Host your source repository on your deployment server&lt;/li&gt;      &lt;li&gt;Have your deployment server equipped with remote access to your source repository&lt;/li&gt;      &lt;li&gt;Mirror your repository to your deployment server&lt;/li&gt;    &lt;/ol&gt;    &lt;p&gt; Of these, option 1 is out for all but somewhat casual projects, option 2 either opens up your source repository more than I like, or needs fiddly tunnelling of SSH which I don't think Capistrano is up to yet (I only like to use key-based access with SSH, rather than password based access, which seems at the moment complicate life where Capistrano is concerned.) &lt;/p&gt;     &lt;p&gt; I've opted for option 3. The pattern I use is this. On setting up the deployment server, I push a copy of the bzr repository to a private directory. Then, on deployment I first update that repository securely from the master repository inside my network, then export the new release locally on the server. &lt;/p&gt;     &lt;p&gt; Here are the relevant bits of my Capistrano configuration: &lt;/p&gt;     &lt;pre&gt;set :repository, &amp;quot;/opt/repo_mirror/#{application}&amp;quot;&lt;br /&gt;&lt;br /&gt;&amp;hellip;&lt;br /&gt;&lt;br /&gt;set :scm, :bzr&lt;br /&gt;set :checkout, &amp;quot;branch&amp;quot;&lt;br /&gt;&lt;br /&gt;&amp;hellip;&lt;br /&gt;&lt;br /&gt;task :before_update_code do&lt;br /&gt;  `bzr push sftp://deploy.example.org/opt/repo_mirror/#{application}`&lt;br /&gt;end&lt;/pre&gt;    &lt;p&gt;One big advantage of this over option 2, a remote source repository, is that only the changes are sent up to the server, and the bandwidth-intensive application checkout happens locally on the deployment machine.&lt;/p&gt;      &lt;p&gt;The final bit of improvement this could stand is to have the bzr checkout use export and not branch, but I think I'll have to alter the Capistrano's bzr plugin in order to do this.&lt;/p&gt;   &lt;p&gt;&lt;a href="http://times.usefulinc.com/2006/09/29-rails-bzr#disqus_thread"&gt;Join the conversation about this post&lt;/a&gt;&lt;/p&gt;</content:encoded>
  </item>
  <item rdf:about="http://times.usefulinc.com/2006/09/15-rails-debian-apache">
    <title>Rails deployment tip for Debian systems and Apache</title>
    <link>http://times.usefulinc.com/2006/09/15-rails-debian-apache</link>
    <description>A little Capistrano rule that helps keep all your configuration in one place when using Rails with Apache and Ubuntu or Debian.</description>
    <dc:subject>rails</dc:subject>
    <dc:subject>ubuntu</dc:subject>
    <dc:subject>debian</dc:subject>
    <dc:creator>Edd Dumbill</dc:creator>
    <dc:date>2006-09-15T22:26:07Z</dc:date>
    <foaf:maker>
      <foaf:Person>
        <foaf:mbox rdf:resource="mailto:edd@usefulinc.com"/>
      </foaf:Person>
    </foaf:maker>
    <content:encoded>&lt;p&gt;I deploy my Rails applications with Capistrano to an Ubuntu machine, which uses the excellent Debian style layout of Apache 2 configuration files.&lt;/p&gt;
&lt;p&gt;To keep things tidy, I like to place the Apache configuration file inside the &lt;i&gt;config&lt;/i&gt; directory of the Rails project, along with the rest of the configuration for the Rails application and Mongrel.&lt;/p&gt;
&lt;p&gt;With the help of a couple of Capistrano rules I can then ensure that, on deployment, the latest Apache configuration file is also sent to the server:&lt;/p&gt;

&lt;pre&gt;
# after setup, do a one-time link in
task :after_setup do
  sudo "ln -nfs #{current_path}/config/#{application}        
     /etc/apache2/sites-available/"
end

# cause apache2 to re-read. you probably have this rule anyway
task :restart do
  # if you're running mongrel_cluster, uncomment the following line
  # restart_mongrel_cluster
  sudo "/usr/sbin/apache2ctl graceful"
end
&lt;/pre&gt;

&lt;p&gt;The first time round you'll probably want to do &lt;tt&gt;a2ensite &lt;i&gt;yourapp&lt;/i&gt;&lt;/tt&gt; manually, but this could easily be added into the &lt;tt&gt;after_setup&lt;/tt&gt; rule.&lt;/p&gt;

&lt;p&gt;Not rocket science, but a pleasing bit of configuration that keeps things tidy.&lt;/p&gt;&lt;p&gt;&lt;a href="http://times.usefulinc.com/2006/09/15-rails-debian-apache#disqus_thread"&gt;Join the conversation about this post&lt;/a&gt;&lt;/p&gt;</content:encoded>
  </item>
  <item rdf:about="http://times.usefulinc.com/2006/09/13-mongrel-apache20">
    <title>Load-balancing Mongrel with Apache 2.0</title>
    <link>http://times.usefulinc.com/2006/09/13-mongrel-apache20</link>
    <description>If you're not ready to run Apache 2.2, you can still load balance Rails Mongrel servers using Apache 2.0's mod_rewrite module.</description>
    <dc:subject>linux</dc:subject>
    <dc:subject>rails</dc:subject>
    <dc:creator>Edd Dumbill</dc:creator>
    <dc:date>2006-09-13T18:40:37Z</dc:date>
    <foaf:maker>
      <foaf:Person>
        <foaf:mbox rdf:resource="mailto:edd@usefulinc.com"/>
      </foaf:Person>
    </foaf:maker>
    <content:encoded>&lt;p&gt;You would be forgiven for thinking that using &lt;a href="http://mongrel.rubyforge.org/docs/mongrel_cluster.html"&gt;Mongrel clusters&lt;/a&gt; to serve Rails applications was only a good idea if you have Apache 2.2 installed, as this is what most of the instructions on the web advise.&lt;/p&gt;  &lt;p&gt;However, there are good reasons for still running Apache 2.0, one of them being that it's the most up to date version packaged in Debian and Ubuntu Linux. So, without &lt;em&gt;mod_proxy_balancer&lt;/em&gt;, what can you do?&lt;/p&gt;  &lt;p&gt;A simple solution is to use the randomizing feature in &lt;em&gt;mod_apache&lt;/em&gt;'s rewrite map feature. Say for instance you had 3 Mongrel servers, running on ports 4000 to 4002 on &lt;em&gt;localhost&lt;/em&gt;. First create a file &lt;em&gt;map.txt&lt;/em&gt; containing these numbers:&lt;/p&gt;  &lt;pre&gt;ports  4000|4001|4002 &lt;/pre&gt;  &lt;p&gt;Then ensure the following directives are present in your virtual host configuration:&lt;/p&gt;  &lt;pre&gt;ProxyRequests Off&lt;br /&gt;ProxyPassReverse / http://localhost:4000/&lt;br /&gt;ProxyPassReverse / http://localhost:4001/&lt;br /&gt;ProxyPassReverse / http://localhost:4002/&lt;br /&gt;ProxyPreserveHost On&lt;br /&gt;RewriteEngine On&lt;br /&gt;RewriteMap  servers rnd:/path/to/your/map.txt&lt;br /&gt;RewriteRule ^/(images|stylesheets|javascripts)/?(.*) $0 [L]&lt;br /&gt;RewriteRule ^/(.*)$ http://localhost:${servers:ports}/$1 [P,L]&lt;br /&gt;&lt;/pre&gt;  &lt;p&gt;Of course, Apache config is complex and I advise you to test this properly &amp;mdash; it's possible if  you are not careful to leave your web server as an open proxy.&lt;/p&gt;  &lt;p&gt;Thanks to &lt;a href="http://www.hackdiary.com/"&gt;Matt Biddulph&lt;/a&gt; for pointing out this method to me. I've written it up as nobody else seemed to have done so thus far.&lt;/p&gt;&lt;p&gt;&lt;a href="http://times.usefulinc.com/2006/09/13-mongrel-apache20#disqus_thread"&gt;Join the conversation about this post&lt;/a&gt;&lt;/p&gt;</content:encoded>
  </item>
  <item rdf:about="http://times.usefulinc.com/2006/06/23-railsconf">
    <title>Illustrated Rails, smart folks and publication</title>
    <link>http://times.usefulinc.com/2006/06/23-railsconf</link>
    <description>Snippets from the RailsConf pre-conference day. Smart people and some half-baked ideas.</description>
    <dc:subject>rails</dc:subject>
    <dc:subject>railsconf</dc:subject>
    <dc:creator>Edd Dumbill</dc:creator>
    <dc:date>2006-06-23T01:15:03Z</dc:date>
    <foaf:maker>
      <foaf:Person>
        <foaf:mbox rdf:resource="mailto:edd@usefulinc.com"/>
      </foaf:Person>
    </foaf:maker>
    <content:encoded>&lt;p&gt;It's been a fun day today, the pre-conference warm up day for &lt;a href="http://railsconf.org/"&gt;RailsConf&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Over breakfast with &lt;a href="http://www.surjpatel.com/"&gt;Surj Patel&lt;/a&gt; and &lt;a href="http://www.hackdiary.com/"&gt;Matt Biddulph&lt;/a&gt;, we got to talking about debuggers and poking around inside Rails applications. With Rails being so new, I was intrigued in what happens when you hand a Rails application over to somebody. Does all the Rails magic help or hinder their ability to understand what's going on?&lt;/p&gt;&lt;p&gt;What kind of ways are there, beyond documentation (which nobody writes), to communicate the workings of a Rails app? We thought that what might help would be some kind of graphical illustration of the flow of control, linked to a source viewer, that showed requests being processed. Rails is built in a convenient way for instrumentation and introspection, by virtue of the aggressive use of DSLs and Ruby's language features. Based on these, are there tools we can write to help people understand what a Rails application is doing?&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I've not yet had enough experience of either handing off, or being handed, mature Rails apps to say for sure what's needed. But it's going to be a problem we all face when Rails sneaks further into the system. Java's redeeming quality in the enterprise is that it's damn hard to write anything one might consider idiomatic. As a consequence, there are predictable ways in which one can approach code written by somebody else, all other factors being equal. Will Rails idioms cause trouble for long-term maintainability?&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Lunchtime included an interesting exchange with &lt;a href="http://richkilmer.blogs.com/"&gt;Rich Kilmer&lt;/a&gt;. Rich used to work for DARPA on RDF and OWL stuff, and has apparently written all manner of interesting Ruby code that processes RDF. It's a crime I'd not come across his work before, but it's all open sourced in the &lt;a href="http://semitar.projects.semwebcentral.org/"&gt;Semitar&lt;/a&gt; project. The project web page looks modest, but if Rich's description is anything to go by, it sounds a wonderfully appropriate way to approach programming for the semantic web.&lt;/p&gt;&lt;p&gt;Finally, I notice that, as the day finishes, IBM developerWorks have published my &lt;a href="http://www-128.ibm.com/developerworks/db2/library/techarticle/dm-0606dumbill/"&gt;Introduction to Rails for DB2 developers&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;RailsConf proper starts tomorrow.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href="http://times.usefulinc.com/2006/06/23-railsconf#disqus_thread"&gt;Join the conversation about this post&lt;/a&gt;&lt;/p&gt;</content:encoded>
  </item>
  <item rdf:about="http://times.usefulinc.com/2006/06/19-railsconf">
    <title>Edd on Rails</title>
    <link>http://times.usefulinc.com/2006/06/19-railsconf</link>
    <description>I'm headed out to RailsConf this Wednesday.</description>
    <dc:subject>rails</dc:subject>
    <dc:creator>Edd Dumbill</dc:creator>
    <dc:date>2006-06-20T00:28:16Z</dc:date>
    <foaf:maker>
      <foaf:Person>
        <foaf:mbox rdf:resource="mailto:edd@usefulinc.com"/>
      </foaf:Person>
    </foaf:maker>
    <content:encoded>&lt;p&gt;This Wednesday I'm heading out to Chicago to visit &lt;a href="http://railsconf.org/"&gt;RailsConf&lt;/a&gt;. The full schedule has now been posted, and it looks like &lt;a href="http://railsconf.org/pages/schedule"&gt;a pretty absorbing affair&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;It amuses me that US-based conferences often have evening sessions timetabled. In Europe, I've always preferred to leave evenings empty so people can eat, drink and socialise. But in big city hotel-land, I can understand the appeal of timetabling more of the day.&lt;/p&gt;&lt;p&gt;Here's a selection of the talks I'm most interested in hearing: &lt;a href="http://railsconf.org/talks/selected/show/166"&gt;Internationalizing Rails&lt;/a&gt; (almost the number one question we got asked about Rails when we taught our tutorial at XTech), anything related to testing, &lt;a href="http://railsconf.org/talks/selected/show/166"&gt;Rails Application Optimization Techniques and Tools&lt;/a&gt;, &lt;a href="http://railsconf.org/talks/selected/show/155"&gt;Rails Deployment&lt;/a&gt;. Oh, and &lt;a href="http://railsconf.org/talks/selected/show/122"&gt;some guy's&lt;/a&gt; talking about his work at the BBC.&lt;/p&gt;&lt;p&gt;I've just finished writing an article for IBM developerWorks introducing Rails to DB2 users. (I had surprisingly little problem getting DB2 up and running in a matter of minutes on my Ubuntu box.) IBM's DB2 integration for Rails is a great development, and it's nice to see them pushing forward with Rails as a platform. I'm hoping they'll post the article up before RailsConf starts.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Given a bit more hacking time, I'll be intrigued to see how DB2's XML support can play with Rails.&lt;/p&gt;&lt;p&gt;I'll be staying at the conference hotel, and am very interested in meeting up with anyone building Rails apps of a decent scale, or looking for a project to work on. Do drop me &lt;a href="mailto:edd-web@usefulinc.com?subject=Meet%20up%20at%20RailsConf"&gt;an email&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://times.usefulinc.com/2006/06/19-railsconf#disqus_thread"&gt;Join the conversation about this post&lt;/a&gt;&lt;/p&gt;</content:encoded>
  </item>
  <item rdf:about="http://times.usefulinc.com/2006/05/22-books-now-please">
    <title>Give me books, twice</title>
    <link>http://times.usefulinc.com/2006/05/22-books-now-please</link>
    <description>The point of PDF books isn't to throw away the paper ones, it's to get them delivered faster.</description>
    <dc:subject>rails</dc:subject>
    <dc:subject>books</dc:subject>
    <dc:creator>Edd Dumbill</dc:creator>
    <dc:date>2006-05-22T18:47:50Z</dc:date>
    <foaf:maker>
      <foaf:Person>
        <foaf:mbox rdf:resource="mailto:edd@usefulinc.com"/>
      </foaf:Person>
    </foaf:maker>
    <content:encoded>&lt;p&gt;Two books have recently been published that I want to read.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://pragmaticprogrammer.com/titles/fr_rr/index.html"&gt;Rails Recipes&lt;/a&gt; (Chad Fowler)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.oreilly.com/catalog/web2apps/index.html"&gt;Building a Scalable Web Application&lt;/a&gt; (Cal Henderson)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The first of these I took delivery of instantly in PDF form, and a paper copy will make its way to me in due course so I have it as a handy reference.&lt;/p&gt;&lt;p&gt;The second of these is going to take 12-14 days from Amazon (5-7 days if ordered through O'Reilly's UK distributor Wiley).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;There's been a &lt;a href="http://www.loudthinking.com/arc/000580.html#comments"&gt;lot of talk&lt;/a&gt; on David Heinemeier Hansson's blog about PDF publishing, but to me it's simply a way of getting me the information I need quickly. Normally, I want the paper copy too.&lt;/p&gt;&lt;p&gt;Another small but significant benefit is that PDFs weigh very little! Having just taught a &lt;a href="http://xtech06.usefulinc.com/schedule/detail/188"&gt;Rails tutorial&lt;/a&gt; at XTech, I can vouch that there was no way we wanted to carry around 30+ copies of the Rails book on the offchance attendees wanted to buy it.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Whereas some publishers have experimented with certain product lines available only as PDFs, I can't quite shake the feeling they're offering an inferior product in which they are not confident enough to commit to paper.&lt;/p&gt;&lt;p&gt;My suggestion is that PDF and print is not an &amp;quot;either/or&amp;quot; choice, but an &amp;quot;and/or&amp;quot;.&lt;/p&gt;&lt;p&gt;&lt;a href="http://times.usefulinc.com/2006/05/22-books-now-please#disqus_thread"&gt;Join the conversation about this post&lt;/a&gt;&lt;/p&gt;</content:encoded>
  </item>
  <item rdf:about="http://times.usefulinc.com/2006/04/10-catchup">
    <title>Catching up</title>
    <link>http://times.usefulinc.com/2006/04/10-catchup</link>
    <description>I've been on blogging hiatus for a long time, but here's some updates as to what I've been doing. XTech, MacBook, Debian, Rails.</description>
    <dc:subject>xtech</dc:subject>
    <dc:subject>linux</dc:subject>
    <dc:subject>rails</dc:subject>
    <dc:subject>apple</dc:subject>
    <dc:creator>Edd Dumbill</dc:creator>
    <dc:date>2006-04-10T22:56:32Z</dc:date>
    <foaf:maker>
      <foaf:Person>
        <foaf:mbox rdf:resource="mailto:edd@usefulinc.com"/>
      </foaf:Person>
    </foaf:maker>
    <content:encoded> &lt;p&gt;Most of my energy recently has been devoted to organising things for &lt;a href="http://xtech06.usefulinc.com/"&gt;XTech 2006&lt;/a&gt;, now just over a month away.&lt;/p&gt; &lt;p&gt;Here are some XTech-related snippets:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://www.mozilla.com/"&gt;Mozilla Corporation&lt;/a&gt; has joined as a co-host. We'll have six Mozilla related presentations, plus a keynote about JavaScript 2 from Mozilla CTO Brendan Eich.&lt;/li&gt; &lt;li&gt;The &lt;a href="http://xtech06.usefulinc.com/content/ajax"&gt;Ajax Developers' Day&lt;/a&gt; continues to take shape. We're looking to add a &lt;em&gt;Ajax toolkit lightning demo&lt;/em&gt; session at the end of the day. &lt;a href="mailto:edd-web@usefulinc.com"&gt;Contact me&lt;/a&gt; if you or your company wants to take part in this.&lt;br /&gt; &lt;/li&gt; &lt;li&gt;&lt;a href="http://xtech06.usefulinc.com/2006/04/05-barcamp"&gt;BarCamp Amsterdam II will be taking place directly after XTech&lt;/a&gt;. This will be a free-form participant-led conference, held over the weekend. Many XTech speakers and attendees are likely to hang around to take part.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;MacBook&lt;/strong&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;My new computer has arrived, an Apple MacBook Pro. I know I wrote some time ago about how disappointing it was for free software advocates to be using a non-free OS, and I am rather sad about this in some ways. I'll be writing in the near future about my impressions of the platform, and reasons for buying this machine.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Writing&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;My latest piece on Debian has been published over at O'Reilly, &lt;a href="http://www.linuxdevcenter.com/pub/a/linux/2006/04/06/aptitude_and_apt_get.html"&gt;Installing Software on Debian&lt;/a&gt;. We've been a little slow getting through the publication of these, so I'll try and hurry the next few along.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Rails&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Rails continues to impress. I wish I had more time than I do to use it, as it feels so &lt;em&gt;right&lt;/em&gt; to work with. With &lt;a href="http://hackdiary.com/"&gt;Matt Biddulph&lt;/a&gt; I'll be &lt;a href="http://xtech06.usefulinc.com/schedule/detail/188"&gt;teaching a day on Rails&lt;/a&gt; at XTech 2006. In the meantime, I highly recommend Chad Fowler's &lt;a href="http://pragmaticprogrammer.com/titles/fr_rr/index.html"&gt;Rails Recipes&lt;/a&gt;, it covers the most common requirements from real-world web applications.&lt;/p&gt; &lt;p&gt;Oh, and I'm scheduled to attend &lt;a href="http://railsconf.org/"&gt;RailsConf&lt;/a&gt; this June. My paper was (not too surprisingly) declined for the conference, but &lt;a href="http://railsconf.org/talks/selected/show/122"&gt;Matt's was accepted&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;&lt;a href="http://times.usefulinc.com/2006/04/10-catchup#disqus_thread"&gt;Join the conversation about this post&lt;/a&gt;&lt;/p&gt;</content:encoded>
  </item>
  <item rdf:about="http://times.usefulinc.com/2006/02/15-xtech">
    <title>XTech schedule coming soon</title>
    <link>http://times.usefulinc.com/2006/02/15-xtech</link>
    <description>I've just finished the initial selection of talks for XTech, we'll be publishing the full schedule in about a week's time.</description>
    <dc:subject>xtech</dc:subject>
    <dc:subject>rails</dc:subject>
    <dc:subject>xml</dc:subject>
    <dc:creator>Edd Dumbill</dc:creator>
    <dc:date>2006-02-15T21:24:05Z</dc:date>
    <foaf:maker>
      <foaf:Person>
        <foaf:mbox rdf:resource="mailto:edd@usefulinc.com"/>
      </foaf:Person>
    </foaf:maker>
    <content:encoded>  &lt;p&gt;The selections for &lt;a href="http://xtech.org/"&gt;XTech&lt;/a&gt; are now almost complete. Over the weekend I drafted the schedule, which is under review right now by the programme committee.&lt;/p&gt;   &lt;p&gt;Every year I say how hard a job this is because of the high standard of the submissions, and every year it seems to get harder. This year I found it almost heartbreaking to have to exclude some talks.&lt;/p&gt;  &lt;h4&gt;Number crunching&lt;/h4&gt; &lt;p&gt;To illustrate, here are some statistics about the proposals and their selection. We received 177 submissions. Each of these abstracts were peer reviewed by at least 4 or 5 reviewers, from a panel of nearly 90 reviewers. From the graded results I shortlisted 105 proposals.&lt;/p&gt;   &lt;p&gt;From that 105 I have had to fill 68 schedule slots, which meant about a third of the shortlisted proposals had to be excluded. Almost every single one of these would have been a great talk. They were so good, in fact, that I'm working on some ideas for adding to the schedule.&lt;/p&gt;   &lt;p&gt;Notifications to accepted speakers will be sent at the beginning of next week. Rejection notices will follow a little while later. We don't want to send these out until we're sure we've done everything we can to accommodate as many quality presentations as possible.&lt;/p&gt;   &lt;p&gt;I am enormously grateful to everyone who submitted a proposal. I can't wait to get the acceptance notices sent out so we can publish the schedule.&lt;/p&gt;   &lt;p&gt; I can however reveal some early news about pre-conference tutorials. We'll have day-long tutorials on: Ruby on Rails; XSLT 2.0, XPath 2.0 &amp;amp; XQuery; and a Web 2.0 tech bootcamp. Also there'll be half-day tutorials on microformats, and XForms &amp;amp; XHTML 2.0.&lt;/p&gt;   &lt;p&gt;Finally, it's worth noting that &lt;a href="http://www.xtech-conference.org/2006/registration.asp"&gt;registration is now open&lt;/a&gt;. Also, if you work for somebody who would be interested in &lt;a href="http://www.xtech-conference.org/2006/exhibits.asp"&gt;sponsoring the conference&lt;/a&gt;, do get in touch. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://times.usefulinc.com/2006/02/15-xtech#disqus_thread"&gt;Join the conversation about this post&lt;/a&gt;&lt;/p&gt;</content:encoded>
  </item>
  <item rdf:about="http://times.usefulinc.com/2006/02/06-conferences">
    <title>Places I'll be: Carson Summit, XTech, RailsConf</title>
    <link>http://times.usefulinc.com/2006/02/06-conferences</link>
    <description>Pointers to some tech conferences I'll be attending in the near future.</description>
    <dc:subject>xtech</dc:subject>
    <dc:subject>rails</dc:subject>
    <dc:subject>web</dc:subject>
    <dc:creator>Edd Dumbill</dc:creator>
    <dc:date>2006-02-06T20:20:51Z</dc:date>
    <foaf:maker>
      <foaf:Person>
        <foaf:mbox rdf:resource="mailto:edd@usefulinc.com"/>
      </foaf:Person>
    </foaf:maker>
    <content:encoded>  &lt;p&gt;The conference season starts again. Here are a few pointers to places where I'll be over the next few months.&lt;/p&gt;   &lt;p&gt;&lt;strong&gt;&lt;a href="http://carsonworkshops.com/summit/"&gt;Carson Summit on the Future of Web Apps&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;   &lt;p&gt;I'm really impressed with the group of folks that Ryan Carson's got together for this event. The emphasis on &amp;quot;lessons learned&amp;quot; is important to me, so I look forward to hearing more.&lt;/p&gt;   &lt;p&gt;There's also a great connection in the topic with an article I wrote in October 1999, &lt;a href="http://www.xml.com/pub/a/1999/10/open/"&gt;XML Inter-Application Protocols&lt;/a&gt;, in which I rave about applications moving to the web, the need for open standards, and the important role of XML in that through RSS and web services. All the stuff we're still just figuring out how to use! &lt;strong&gt;7 February 2006, London&lt;/strong&gt;.&lt;/p&gt;   &lt;p&gt;&lt;strong&gt;&lt;a href="http://xtech.org/"&gt;XTech 2006&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;   &lt;p&gt;Being the conference chair I'm biased on this one, but it's safe to say that it's going to be an amazing event. Keynotes from Paul Graham, Amazon's Jeff Barr and Yahoo's Jeffrey McManus. Paper reviewing has just ended so next week we hope to publish a provisional conference schedule. &lt;strong&gt;16-19 May 2006, Amsterdam.&lt;/strong&gt;&lt;/p&gt;   &lt;p&gt;&lt;strong&gt;&lt;a href="http://railsconf.com/"&gt;RailsConf&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;   &lt;p&gt;Very excited to be going to the first ever Rails conference. I submitted a proposal, about which I've not yet heard. Being one of 80 such proposals, it looks like the competition's tough, but I'll be there whether speaking or not.&lt;/p&gt;   &lt;p&gt;Though I'm arriving on June 21, I'm not booked in for the &lt;a href="http://www.railsconf.org/pages/guidebook"&gt;Rails Guidebook&lt;/a&gt; day, so I'm open to suggestions as to activities for June 22. &lt;strong&gt;22-25 June 2006, Chicago.&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://times.usefulinc.com/2006/02/06-conferences#disqus_thread"&gt;Join the conversation about this post&lt;/a&gt;&lt;/p&gt;</content:encoded>
  </item>
  <item rdf:about="http://times.usefulinc.com/2006/01/21-rails-zope">
    <title>Why Rails?</title>
    <link>http://times.usefulinc.com/2006/01/21-rails-zope</link>
    <description>When I moved my blog to Rails from Zope, I was asked why. This is a brief explanation.</description>
    <dc:subject>programming</dc:subject>
    <dc:subject>rails</dc:subject>
    <dc:subject>ruby</dc:subject>
    <dc:creator>Edd Dumbill</dc:creator>
    <dc:date>2006-01-21T11:43:56Z</dc:date>
    <foaf:maker>
      <foaf:Person>
        <foaf:mbox rdf:resource="mailto:edd@usefulinc.com"/>
      </foaf:Person>
    </foaf:maker>
    <content:encoded>&lt;p&gt;When &lt;a href="http://times.usefulinc.com/2006/01/15-redesign"&gt;I moved this blog&lt;/a&gt; from being Zope-backed to using Rails several people got in touch to ask why. This is a brief explanation of why I've moved.&lt;/p&gt;&lt;p&gt;Firstly I should point out I've had a long and mostly happy experience with Zope. I got into Zope originally because I'd spent some time in constructing web frameworks from scratch (we're talking 1995-1999 here) and found that not only does a framework need good templating, it needs reusable components within that.&lt;/p&gt;&lt;p&gt;Zope seemed like a good fit, so I spent some time getting up to speed and was happy there. However, there were some things that didn't make me feel completely comfortable. Zope offered a very stark choice between developing through the web based interface (DTML methods, etc.) and writing raw Python. To do really useful stuff, you had to get into the Python side of things, but also learn a lot about Zope guts that wasn't really well documented.&lt;/p&gt;&lt;p&gt;I spent more time than I probably should have had to reading Zope's own source code in order to figure out how things worked. Fine, for my own silly little projects, but not practical in general. It was hard to get the overall view of a project, and hard to test. The learning curve was a little too steep, I suppose.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;So, once I'd got to a certain point I stopped, and looked around for a platform that gave me more code visibility and testability. Loyal readers will know I've looked at &lt;a href="http://times.usefulinc.com/2005/03/06-queetah"&gt;ASP.NET and Python, Quixote and Cheetah&lt;/a&gt;. ASP.NET I rejected because I didn't view Mono's web application server as mature enough at the time, and I also had reservations about ASP.NET's non-free baggage. Python, Quixote and Cheetah looked a lot more friendly.&lt;/p&gt;&lt;p&gt;What I wrote about Quixote and Cheetah at the time was &amp;quot;this combination isn't adequately presented and described anywhere.&amp;quot; These were good technologies, but not integrated as a framework. I started work on integrating them, and made some interesting progress. I was correct that Python lacked a solid modern framework, and the time was certainly right for it, as we can now see by the emergence of &lt;a href="http://www.djangoproject.com/"&gt;Django&lt;/a&gt; and &lt;a href="http://www.turbogears.org/"&gt;TurboGears&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;However, at the same time I started looking at Rails and found out that it did pretty much what I wanted. To be honest, I'd avoided it for a while as a friend once did me the disservice of calling Ruby a cross between Python and Perl. &amp;quot;Why ruin Python?&amp;quot;, I thought. And it takes me a while to get over the hype barrier before I conclude that there's a &amp;quot;there&amp;quot; there.&lt;br /&gt; &lt;/p&gt;&lt;p&gt;Now I've been using Rails for a while, I find its attractions have changed for me. The thrill of not having to write basic functionality over and over again has given way to more select pleasures. Writing in Ruby itself is a rewarding experience, as its idioms become plainer over time.&lt;/p&gt;&lt;p&gt;Sure, you can write Java or Perl in any language, and that's where I started off. But the subtle elegance of the Ruby idiom is a slowly appreciated and highly satisfying flavour. For developers who consider themselves as poets and artists too, I can't think of a better language.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://times.usefulinc.com/2006/01/21-rails-zope#disqus_thread"&gt;Join the conversation about this post&lt;/a&gt;&lt;/p&gt;</content:encoded>
  </item>
  <item rdf:about="http://times.usefulinc.com/2006/01/19-switchtower-baz">
    <title>Rails, Bazaar and SwitchTower</title>
    <link>http://times.usefulinc.com/2006/01/19-switchtower-baz</link>
    <description>A module for SwitchTower so you can deploy your Rails applications using Bazaar.</description>
    <dc:subject>programming</dc:subject>
    <dc:subject>rails</dc:subject>
    <dc:creator>Edd Dumbill</dc:creator>
    <dc:date>2006-01-19T12:00:18Z</dc:date>
    <foaf:maker>
      <foaf:Person>
        <foaf:mbox rdf:resource="mailto:edd@usefulinc.com"/>
      </foaf:Person>
    </foaf:maker>
    <content:encoded>    &lt;p&gt;I have just submitted &lt;a href="http://dev.rubyonrails.org/ticket/3533"&gt;an enhancement&lt;/a&gt; to &lt;a href="http://manuals.rubyonrails.com/read/book/17"&gt;SwitchTower&lt;/a&gt; to let you use &lt;a href="http://bazaar.canonical.com/"&gt;Bazaar&lt;/a&gt; as a source control system.&lt;/p&gt;       &lt;p&gt;SwitchTower is a deployment framework for Ruby on Rails applications, allowing fine-grained control over deployment of Rails applications to one or many servers.&amp;nbsp;&lt;/p&gt;     &lt;p&gt;My &lt;a href="http://dev.rubyonrails.org/ticket/3533"&gt;contributed module&lt;/a&gt; lets people who use Bazaar join in the fun. Until such time as my patch is approved, save it in the &lt;em&gt;app/switchtower/scm&lt;/em&gt; directory of your Rails app. The module assumes that the Rails application is in the root of your tree.&lt;/p&gt;   &lt;p&gt;In your SwitchTower &lt;em&gt;deploy.rb&lt;/em&gt; file, add:&lt;/p&gt;   &lt;pre&gt;set :repository, &amp;quot;you@example.com--archive/whatever--trunk--1.0&amp;quot;&lt;br /&gt;set :scm, :baz&lt;br /&gt;set :checkout, &amp;quot;export&amp;quot;&lt;/pre&gt;  &lt;p&gt;The &amp;quot;export&amp;quot; setting can be omitted if you really want baz to check out all the &lt;em&gt;{arch}&lt;/em&gt; directories full of version control junk onto your live servers.&lt;/p&gt;   &lt;p&gt;Note that the repository follows a specific version. If you branch your deployed version, you'll need to change the repository to the new version.&lt;/p&gt; &lt;p&gt;&lt;a href="http://times.usefulinc.com/2006/01/19-switchtower-baz#disqus_thread"&gt;Join the conversation about this post&lt;/a&gt;&lt;/p&gt;</content:encoded>
  </item>
  <item rdf:about="http://times.usefulinc.com/2006/01/15-redesign">
    <title>A clean sweep</title>
    <link>http://times.usefulinc.com/2006/01/15-redesign</link>
    <description>A new weblog engine, a new design and a few new locations for things.</description>
    <dc:subject>weblogs</dc:subject>
    <dc:subject>colophon</dc:subject>
    <dc:subject>rails</dc:subject>
    <dc:creator>Edd Dumbill</dc:creator>
    <dc:date>2006-01-15T13:33:57Z</dc:date>
    <foaf:maker>
      <foaf:Person>
        <foaf:mbox rdf:resource="mailto:edd@usefulinc.com"/>
      </foaf:Person>
    </foaf:maker>
    <content:encoded>   &lt;p&gt;Firstly, if you haven't the faintest interest in the software I use to write this weblog, please feel free to go and do something more interesting right now.&lt;/p&gt;       &lt;p&gt;Now I'm in the company of dedicated readers of colophons, I will proceed.&lt;/p&gt;       &lt;p&gt;&lt;strong&gt;Redesign and reimplementation&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;       &lt;p&gt;This weblog, which has now been running for over two and a half years, originally ran on some custom software I'd hacked up in Zope: at that time my web development platform of choice.&lt;/p&gt;       &lt;p&gt;Today, I've relaunched with another custom content management engine, this time written using &lt;a title="Ruby on Rails web site" href="http://www.rubyonrails.org/"&gt;Rails&lt;/a&gt;. It's been a lot of fun to write, and a good excuse to sharpen my Rails skills further.&lt;/p&gt;       &lt;p&gt;The design has also been fun. It's a little basic right now, but I hope easy to read. Of course, the font is Lucida Grande, which ensures that I am fully Web 2.0 compliant.&lt;br /&gt;&lt;/p&gt;       &lt;p&gt;The main new feature is that the tags I give articles are now made public. I used to tag posts for my RSS feed, but not publish them on the site. Now they are public--what few tags I currently have--and it's possible to find RSS and Atom feeds just for certain subsections of my writing.&lt;/p&gt;       &lt;p&gt;I worry sometimes about spamming the various Planet aggregator sites my blog features in, so this gives me a way to direct content specifically at them. That said, at least for Planet XML I like hearing about everything the community members have to say, not just their on-topic posts.    &lt;/p&gt;       &lt;p&gt;&lt;strong&gt;New URLs&lt;/strong&gt;&lt;/p&gt;       &lt;p&gt;My blog now has a new location, &lt;a href="http://times.usefulinc.com/" title="Front page"&gt;http://times.usefulinc.com/&lt;/a&gt;, and new places for&amp;nbsp; RSS and Atom feeds:&lt;/p&gt;       &lt;ul&gt;    &lt;li&gt;&lt;a title="RSS 1.0 feed" href="http://times.usefulinc.com/rss"&gt;RSS 1.0&lt;/a&gt; &lt;br /&gt;    &lt;/li&gt;       &lt;li&gt;&lt;a title="Atom 1.0 feed" href="http://times.usefulinc.com/atom"&gt;Atom 1.0&lt;/a&gt;&lt;/li&gt;    &lt;/ul&gt;       &lt;p&gt;&lt;strong&gt;Tools used&lt;/strong&gt;&lt;/p&gt;       &lt;ul&gt;    &lt;li&gt;Emacs&lt;/li&gt;       &lt;li&gt;Ruby on Rails&lt;/li&gt;       &lt;li&gt;Firefox&lt;/li&gt;       &lt;li&gt;GIMP&lt;/li&gt;       &lt;li&gt;Bazaar&lt;/li&gt; &lt;li&gt;TinyMCE&lt;/li&gt;    &lt;/ul&gt; &lt;p&gt;&lt;a href="http://times.usefulinc.com/2006/01/15-redesign#disqus_thread"&gt;Join the conversation about this post&lt;/a&gt;&lt;/p&gt;</content:encoded>
  </item>
  <item rdf:about="http://times.usefulinc.com/2005/08/21-roundup">
    <title>On Rails, conferences and execution</title>
    <link>http://times.usefulinc.com/2005/08/21-roundup</link>
    <description>A roundup comment on open source tech matters from this month.</description>
    <dc:subject>rails</dc:subject>
    <dc:creator>Edd Dumbill</dc:creator>
    <dc:date>2005-08-21T12:32:29Z</dc:date>
    <foaf:maker>
      <foaf:Person>
        <foaf:mbox rdf:resource="mailto:edd@usefulinc.com"/>
      </foaf:Person>
    </foaf:maker>
    <content:encoded>&lt;div&gt;
&lt;p&gt;Another collection of bits from this month.&lt;/p&gt;
&lt;p&gt;Like everybody and their aunt, I've been working with &lt;strong&gt;Ruby on Rails&lt;/strong&gt; for the
last few months.  It's been fun, and there's lots to learn.  One snippet
learned along the way was to &lt;a href="http://wiki.rubyonrails.com/rails/show/HowtoUseSetAndEnumColumns"&gt;avoid MySQL
ENUMs&lt;/a&gt;, which
meant some re-engineering of a legacy table.  There's also trouble where
tables &lt;a href="http://dev.rubyonrails.com/ticket/1335"&gt;don't have integer primary keys&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A new deployment toolkit for Rails has been released,
&lt;a href="http://manuals.rubyonrails.com/read/book/17"&gt;SwitchTower&lt;/a&gt;, which I intend to
test out soon.  One of the impressive things about Rails compared to my
previous PHP or Zope based solutions is the recognition of the different
production and development needs.&lt;/p&gt;
&lt;p&gt;I've been doing more work on &lt;a href="http://www.bluez.org/"&gt;BlueZ&lt;/a&gt; in Debian. The 
latest 2.19 release of the bluetooth tools is now available.  Meanwhile,
&lt;a href="http://hadess.net/"&gt;Bastien Nocera&lt;/a&gt; has pushed another release of 
&lt;strong&gt;GNOME Bluetooth&lt;/strong&gt;--his help and involvement in the project has really
rescued it from my lack of free time.  We hope to push the web site and
releases all over onto gnome.org soon.  I plan to finally come through
on my promise to get GNOME Bluetooth into Debian.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;conference carousel&lt;/strong&gt; continues to whirl.  OSCON was good, but I'm
exhausted with west coast US travel right now.  In addition to being
photographed and finger-printed on the way in to the US, I had to be
photographed and finger-printed on the way out as well.  Add to that a
special TSA scan, and it made the 24-hour door-to-door journey even more weary.
I've many friends in the US, and always enjoy my time there, but each time I go
it gets a little more inconvenient.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://conferences.oreillynet.com/eurooscon/"&gt;EuroOSCON&lt;/a&gt;, this October in
Amsterdam, is a lot nearer.  I'm a bit last-minute on this (despite being part
of the program committee), but I'm attempting to get a repeat of the Mono
tutorial from OSCON going here.&lt;/p&gt;
&lt;p&gt;Transatlantic travel woes nonwithstanding, I'm planning on heading to  &lt;strong&gt;XML
2005&lt;/strong&gt;, for which the
&lt;a href="http://2005.xmlconference.org/participation/lbn"&gt;schedule&lt;/a&gt; has just been
published.  I'm also looking at the &lt;a href="http://conferences.oreillynet.com/cs/et2006/create/e_sess/"&gt;ETech
2006&lt;/a&gt; call for
participation.  I know I've got things of interest to talk about at &lt;strong&gt;ETech&lt;/strong&gt;,
I'm just struggling to sort them out into a coherent proposal.  I &lt;em&gt;really&lt;/em&gt; want
to talk somehow about desktop Linux, linked in to all the other current topics
in the call for proposal (productivity, web 2.0, user interfaces).  Especially
within the corporation and the developing world, desktop Linux has the
potential to act as a huge magnifier on new ideas of productivity and UI.&lt;/p&gt;
&lt;p&gt;Talking of magnifiers, I loved this &lt;a href="http://www.oreillynet.com/pub/wlg/7614"&gt;succinct
explanation&lt;/a&gt; on the relationship between
ideas and &lt;strong&gt;execution&lt;/strong&gt; in a successful enterprise.  Execution is worth millions.
That's why alpha geeks rarely make it rich: we're always moving on to the next
big idea.  Right now I'm in an "execution" phase, working at a company I
co-founded in 1998.  Part of the reason for making the move was a recognition
that as a writer I never got to do the execution phase.  Now I can tell you,
execution is the difficult bit.&lt;/p&gt;
&lt;p&gt;I'm hearing an increasing amount about &lt;strong&gt;identity&lt;/strong&gt;, always a topic that's
burbled on in the background ever since Microsoft's Passport program (ah, what
cruel overtones the name carries in the light of today's current travel
security woes).   Now I see that Mozilla's Mike Shaver is &lt;a href="http://off.net/~shaver/diary/archives/003693.html"&gt;working on identity&lt;/a&gt;.  I'll have to start following
the debate a little more closely now, after dabbling around the edges of it
with FOAF and PGP.&lt;/p&gt;
&lt;p&gt;Finally, some &lt;strong&gt;Ubuntu&lt;/strong&gt; notes.  I've installed Breezy, the current
unstable release, onto my main development PC and it's playing pretty nicely so
far.  Highlights include &lt;a href="http://www.gnome.org/projects/evolution/"&gt;Evolution&lt;/a&gt;
running faster with my IMAP, and the &lt;a href="http://beaglewiki.org/"&gt;Beagle&lt;/a&gt; search
tool.  Annoyingly, the Rails-related &lt;a href="https://bugzilla.ubuntu.com/show_bug.cgi?id=12613"&gt;Ruby in
Ubuntu&lt;/a&gt; bug is still an
issue--I suspect the news that people run scripting languages other than Python
is still a shock to some folk.  While Breezy will fix this, it's a shame that
no backport is yet available for Hoary.&lt;/p&gt;
&lt;p&gt;It would be good for Linux in general to get this sorted: Ubuntu is starting
to have an OS X-like role in moving people over to Unix-like systems, and to
have it run hot ticket packages like Rails flawlessly is a good way to get
people into Linux.&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="http://times.usefulinc.com/2005/08/21-roundup#disqus_thread"&gt;Join the conversation about this post&lt;/a&gt;&lt;/p&gt;</content:encoded>
  </item>
</rdf:RDF>
