<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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"
	>

<channel>
	<title>Robin Spainhour</title>
	<atom:link href="http://www.robinspainhour.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.robinspainhour.com</link>
	<description>Mostly on software development</description>
	<pubDate>Sun, 23 May 2010 18:16:00 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.3</generator>
	<language>en</language>
			<item>
		<title>It must fit in a single iteration!</title>
		<link>http://www.robinspainhour.com/2010/05/it-must-fit-in-an-iteration/</link>
		<comments>http://www.robinspainhour.com/2010/05/it-must-fit-in-an-iteration/#comments</comments>
		<pubDate>Sun, 23 May 2010 08:09:03 +0000</pubDate>
		<dc:creator>robin</dc:creator>
		
		<category><![CDATA[agile]]></category>

		<guid isPermaLink="false">http://www.robinspainhour.com/?p=227</guid>
		<description><![CDATA[I have just realized I&#8217;ve made a rookie mistake for the second time and thought I might post a note on it here in hope avoiding having it happen a third time.
A couple of years ago, a project I was on faced a fairly large change, an epic story, that would not possibly fit in [...]]]></description>
			<content:encoded><![CDATA[<p>I have just realized I&#8217;ve made a rookie mistake for the second time and thought I might post a note on it here in hope avoiding having it happen a third time.</p>
<p>A couple of years ago, a project I was on faced a fairly large change, an epic story, that would not possibly fit in an iteration. Breaking it up into smaller stories was agreed to be close to impossible, or at least a very inefficient. So we (the development team) didn&#8217;t attempt to split the epic, and decided to extend our normal iteration length and go for it all in one blow.</p>
<p>Naturally, it failed. Despite over time and feature cuts we didn&#8217;t make our (extended) iteration deadline. Our delivery contained lots of bugs and we had misunderstood some of the requirements resulting in some features that was far from what the client was expecting.</p>
<p>All though I know we had a few other flaws in our process back then, the biggest mistake in this case was to think the work couldn&#8217;t be split into smaller stories. When looking through what we actually delivered in the end, it was almost like the smaller stories that we should have looked from the beginning were just popping out of the feature list; each one small, independent and with a clear business value.</p>
<p>Just the other week I realized I have been taking part in letting a similar thing happen in my current project. A few properties of our epic story are different this time:</p>
<ul>
<li>technology is not fully understood by team</li>
<li>lots of R&amp;D-work required</li>
<li>more infrastructure work than 	actual user features</li>
<li>the team is not permitted to only work on this epic story</li>
</ul>
<p>But this time we haven&#8217;t tampered with the iteration length. Instead we have cheated by not defining what each sprint would <em>actually</em> deliver. And time boxed spikes for R&amp;D work has not been used effectively.</p>
<p>I have a lot of reasons for not spotting it this time.</p>
<p><em>Lame ones:</em></p>
<ul>
<li>I was out sick for a week and 	missed an iteration planning session</li>
<li>I was off-site attending a two-day conference</li>
<li>I was working on other sprint 	tasks, not belonging to the epic story</li>
</ul>
<p><em>More dignified ones:</em></p>
<ul>
<li>I was blinded by new cool technology that I was not the team&#8217;s authority on</li>
<li>I misinterpreted information and was convinced that technology that we didn&#8217;t know fully, would actually be of use to us</li>
<li>I didn&#8217;t completely understand the system I was working on</li>
</ul>
<p>I could of course go on, but I can not think of one single reason that would really give me an excuse to question my conviction that a story should be be <em>small</em>, <em>independent</em> and have a <em>clear value to the business</em>.</p>
<p><em>Real reason why I let this happen:</em></p>
<ul>
<li><strong>I was lazy</strong></li>
</ul>
<p>For the future I hope I will think twice, three times and even sleep on it before I decide to go ahead and go against a core principal of mine.</p>
<p>Now, I have to get back to work on one of my tasks of the epic story&#8230;.the epic story of which no part is in production. This task I&#8217;m working on is small, independent and has clear business value. That&#8217;s clear to me now. If we would have started on it a few sprints ago, it would have been in production for quite a while by now&#8230;.</p>
<p>You could argue how small “small” is, but the upper limit is definitely one iteration, if you are willing to take a risk like that.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.robinspainhour.com/2010/05/it-must-fit-in-an-iteration/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Code Kata: Back to the Checkout, part 1</title>
		<link>http://www.robinspainhour.com/2009/11/code-kata-back-to-the-checkout-part-1/</link>
		<comments>http://www.robinspainhour.com/2009/11/code-kata-back-to-the-checkout-part-1/#comments</comments>
		<pubDate>Fri, 27 Nov 2009 16:42:59 +0000</pubDate>
		<dc:creator>robin</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[code katas]]></category>

		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.robinspainhour.com/?p=219</guid>
		<description><![CDATA[I&#8217;ve seen a few recordings of developers performing code katas lately and decided to try recording one myself.
It was quite a different experience in several ways. Especially the feeling of stage fright that came upon me as soon I hit &#8220;Rec&#8221;.
Anyway, a few weeks ago I saw a recording by Chris Parsons, performing a nice [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve seen a few recordings of developers performing <a href="http://codekata.pragprog.com/2007/01/code_kata_backg.html" target="_blank">code katas</a> lately and decided to try recording one myself.<br />
It was quite a different experience in several ways. Especially the feeling of stage fright that came upon me as soon I hit &#8220;Rec&#8221;.</p>
<p>Anyway, a few weeks ago I saw a recording by <a href="http://katas.softwarecraftsmanship.org/?p=42" target="_blank">Chris Parsons, performing</a> a nice version of <a href="http://codekata.pragprog.com/2007/01/kata_nine_back_.html" target="_blank">&#8220;Back to the Checkout&#8221;</a> and wanted to try a slightly different approach, using separate objects for the Checkout and the PricingRules.</p>
<p>Here is the first part. Setting up the Checkout:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="300" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=7850525&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="400" height="300" src="http://vimeo.com/moogaloop.swf?clip_id=7850525&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p><a href="http://vimeo.com/7850525">Back to the Checkout, part 1</a> from <a href="http://vimeo.com/user2704348">Robin Spainhour</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.robinspainhour.com/2009/11/code-kata-back-to-the-checkout-part-1/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Git your configs backed up</title>
		<link>http://www.robinspainhour.com/2009/08/git-your-configs-backed-up/</link>
		<comments>http://www.robinspainhour.com/2009/08/git-your-configs-backed-up/#comments</comments>
		<pubDate>Sat, 01 Aug 2009 09:40:28 +0000</pubDate>
		<dc:creator>robin</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[Git]]></category>

		<guid isPermaLink="false">http://www.robinspainhour.com/?p=211</guid>
		<description><![CDATA[Configuration files of integration and test servers are often accessible by all team members. This is a good thing, as changes to configuration can be made quickly without holding up the test process while having to wait for a system administrator to make the necessary changes.
But what I have often found is that the same [...]]]></description>
			<content:encoded><![CDATA[<p>Configuration files of integration and test servers are often accessible by all team members. This is a good thing, as changes to configuration can be made quickly without holding up the test process while having to wait for a system administrator to make the necessary changes.</p>
<p>But what I have often found is that the same servers seldom have proper backups of the important configuration files. I remember getting a lot of resistance from team members a few years ago when I suggested to use RCS to version control these files. RCS was not widely known and many found the syntax awkward, or at least hard to remember. But when I on top of this suggested to copy the configuration file tree to a disk on another server using rsync (to avoid the hassle of setting up a tape backup),  I was sure to see my suggestion getting ignored.</p>
<p>Nowadays, <a href="http://git-scm.com" target="_blank">git</a> will easily perform both the version control task and the copy-to-remote-disk tasks. I use it for all my apache configuration files for example. One of the servers I administer acts as a proxy for several web applications that each are have very different virtual server configurations. With a version control for the entire tree in place it feels very relaxing making changes to individual applications when I know I can always roll back, should I mess up.</p>
<p>From my server with a real taped backup system in place I simply <code>git pull</code> my various git repositories using <code>cron</code>&#8230;and sleep well, knowing all my configuration changes are version controlled and backed up on tape.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.robinspainhour.com/2009/08/git-your-configs-backed-up/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Rails plugin/gem to sort nested set trees using drag-n-drop</title>
		<link>http://www.robinspainhour.com/2009/05/rails-plugin-to-drag-n-drop-sort-nested-sets/</link>
		<comments>http://www.robinspainhour.com/2009/05/rails-plugin-to-drag-n-drop-sort-nested-sets/#comments</comments>
		<pubDate>Mon, 11 May 2009 11:31:58 +0000</pubDate>
		<dc:creator>robin</dc:creator>
		
		<category><![CDATA[Rails]]></category>

		<category><![CDATA[nested set]]></category>

		<category><![CDATA[plugins]]></category>

		<guid isPermaLink="false">http://www.robinspainhour.com/?p=201</guid>
		<description><![CDATA[A Rails app I&#8217;m working on needs to handle a fairly big tree of active record models. For this I use a nested set implementation in the models.
Displaying parts of of the tree in my views was of course a piece of cake and fairly fast thanks to the way nested sets in the database [...]]]></description>
			<content:encoded><![CDATA[<p>A Rails app I&#8217;m working on needs to handle a fairly big tree of active record models. For this I use a nested set implementation in the models.</p>
<p>Displaying parts of of the tree in my views was of course a piece of cake and fairly fast thanks to the way nested sets in the database works.<br />
If you need a refresher on the db theory you can google on &#8220;nested set&#8221; or take a look at <a href="http://threebit.net/tutorials/nestedset/tutorial1.html" target="_blank">this article</a>. Or maybe <a href="http://www.dbmsmag.com/9603d06.html" target="_blank">this article</a> that believe was the first one from back in the nineties. The interesting stuff starts at the &#8220;Trees in SQL&#8221; section.</p>
<p>Anyway, trouble struck when I wanted to implement a drag-n-drop sort/rearrange feature using the sortable_element script.aculo.us helper that comes with Rails.</p>
<p>The default behavior of this helper is to send the the complete tree of id:s to the server when you &#8220;drop&#8221; your dragged item where you want it. This tree then reflects the how the new tree should look.<br />
Needless to say this is a bit more information than required when you want to update your nested set model. In your controller your only need is to find out <em>what</em> <em>was moved</em> and <em>where did it end up</em>.</p>
<p>Parsing the tree sent in the request parameter and comparing it to the database isn&#8217;t an option if you have a very large tree and worry about speed. So I created a plugin, <a href="http://github.com/robinsp/sortable_element_for_nested_set/tree/master" target="_blank">SortableElementForNestedSet</a>, that helps you find the answers the <em>what</em> and <em>where</em> questions and you&#8217;ll find the first version of it on <a href="http://github.com/robinsp/sortable_element_for_nested_set/tree/master" target="_blank">GitHub</a>.</p>
<p>Installation and simple usage instructions are found in the readme. Enjoy!</p>
<p><em>Nested set implementation for Rails:</em></p>
<ul>
<li><em><a href="http://github.com/rails/acts_as_nested_set/tree/master" target="_blank">ActsAsNestedSet</a></em></li>
<li><em><a href="http://agilewebdevelopment.com/plugins/betternestedset" target="_blank">BetterNestedSet</a></em></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.robinspainhour.com/2009/05/rails-plugin-to-drag-n-drop-sort-nested-sets/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Study Group book recommendations</title>
		<link>http://www.robinspainhour.com/2009/04/study-group-book-recommendations/</link>
		<comments>http://www.robinspainhour.com/2009/04/study-group-book-recommendations/#comments</comments>
		<pubDate>Wed, 22 Apr 2009 11:09:24 +0000</pubDate>
		<dc:creator>robin</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.robinspainhour.com/?p=186</guid>
		<description><![CDATA[I often recommend developers at my clients to form Book Study Groups. The efficiency of learning together can&#8217;t be valued enough.
Often I am asked to recommend a couple of books to read in this manner and all though there isn&#8217;t a one-size-fits-all answer to that, I have noticed that a few books are almost always [...]]]></description>
			<content:encoded><![CDATA[<p>I often recommend developers at my clients to form Book Study Groups. The efficiency of learning together can&#8217;t be valued enough.<br />
Often I am asked to recommend a couple of books to read in this manner and all though there isn&#8217;t a one-size-fits-all answer to that, I have noticed that a few books are almost always on my lists.<br />
I decided to post a list of recommendations on various topics at different skill levels. (Books specific to a particular programming language have been ignored and the list is sorted by book title.)</p>
<p><a href="http://www.amazon.com/Agile-Software-Development-Scrum/dp/0130676349/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1240396531&amp;sr=8-1" target="_blank">Agile Software Development with Scrum</a><br />
by Ken Schwaber and Mike Beedle</p>
<p><a href="http://www.amazon.com/Agile-Retrospectives-Making-Teams-Great/dp/0977616649/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1240396769&amp;sr=8-1" target="_blank">Agile Retrospectives: Making Good Teams Great</a><br />
by Esther Derby, Diana Larsen,  and Ken Schwaber</p>
<p><a href="http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1240396352&amp;sr=8-1" target="_blank">Clean Code: A Handbook of Agile Software Craftsmanship</a><br />
by Robert C. Martin</p>
<p><a href="http://www.amazon.com/Crystal-Clear-Human-Powered-Methodology-Development/dp/0201699478/ref=sr_1_4?ie=UTF8&amp;s=books&amp;qid=1240398078&amp;sr=8-4">Crystal Clear: A Human-Powered Methodology for Small Teams</a><br />
by Alistair Cockburn</p>
<p><a href="http://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional/dp/0201633612/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1240396660&amp;sr=8-1" target="_blank">Design Patterns: Elements of Reusable Object-Oriented Software</a><br />
by GoF</p>
<p><a href="http://www.amazon.com/Refactoring-Improving-Existing-Addison-Wesley-Technology/dp/0201485672/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1240396072&amp;sr=8-1" target="_blank">Refactoring: Improving the Design of Existing Code</a><br />
by Martin Fowler, Kent Beck, John Brant, and William Opdyke</p>
<p><a href="http://www.amazon.com/Implementation-Patterns-Addison-Wesley-Signature-Kent/dp/0321413091/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1240396483&amp;sr=8-1" target="_blank">Implementation Patterns</a><br />
by Kent Beck</p>
<p><a href="http://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1240396188&amp;sr=8-1" target="_blank">The Pragmatic Programmer: From Journeyman to Master</a><br />
by Andrew Hunt and David Thomas</p>
<p><a href="http://www.amazon.com/Practices-Agile-Developer-Pragmatic-Programmers/dp/097451408X/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1240396236&amp;sr=8-1" target="_blank">Practices of an Agile Developer: Working in the Real World</a><br />
by Venkat Subramaniam and Andy Hunt</p>
<p><a href="http://www.amazon.com/Enterprise-Application-Architecture-Addison-Wesley-Signature/dp/0321127420/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1240396318&amp;sr=8-1" target="_blank"> Patterns of Enterprise Application Architecture</a><br />
by Martin Fowler</p>
<p><a href="http://www.amazon.com/Scrum-Trenches-Enterprise-Software-Development/dp/1430322640/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1240396601&amp;sr=8-1" target="_blank">Scrum and XP from the Trenches</a><br />
by Henrik Kniberg</p>
<p><a href="http://www.amazon.com/Test-Driven-Development-Addison-Wesley-Signature/dp/0321146530/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1240396441&amp;sr=8-1" target="_blank">Test Driven Development: By Example</a><br />
by Kent Beck</p>
<p><a href="http://www.amazon.com/xUnit-Test-Patterns-Refactoring-Addison-Wesley/dp/0131495054/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1240396795&amp;sr=8-1" target="_blank">xUnit Test Patterns: Refactoring Test Code</a><br />
by Gerard Meszaros</p>
<p><em>Hope you&#8217;ll find something interesting!</em></p>
<p>(I should also hint that I will probably add <a href="http://www.amazon.com/Productive-Programmer-Theory-Practice-OReilly/dp/0596519788/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1240397491&amp;sr=8-1" target="_blank">The Productive Programmer</a> <span class="ptBrand">by Neal Ford to this list soon. I haven&#8217;t read the complete book yet but it seems promising. You can check out a </span><span class="ptBrand">QCon </span><span class="ptBrand">presentation held by the author from last year at <a href="http://www.infoq.com/presentations/10-Ways-to-Better-Code-Neal-Ford" target="_blank">InfoQ</a>.)<br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.robinspainhour.com/2009/04/study-group-book-recommendations/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Selenium on Rails DSL</title>
		<link>http://www.robinspainhour.com/2009/01/selenium-on-rails-dsl/</link>
		<comments>http://www.robinspainhour.com/2009/01/selenium-on-rails-dsl/#comments</comments>
		<pubDate>Sat, 03 Jan 2009 17:16:15 +0000</pubDate>
		<dc:creator>robin</dc:creator>
		
		<category><![CDATA[Rails]]></category>

		<category><![CDATA[DSL]]></category>

		<category><![CDATA[selenium]]></category>

		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://www.robinspainhour.com/?p=163</guid>
		<description><![CDATA[When upgrading Rails to version 2.2.2 on one of the applications I work on, it was clear that the SeleniumOnRails plugin was not compatible. This was easily fixed by upgrading the plugin with the non-official version available at here.
The test cases written in RSelanese use a DSL (Domain Specific Language) module to help keep the [...]]]></description>
			<content:encoded><![CDATA[<p>When upgrading Rails to version 2.2.2 on one of the applications I work on, it was clear that the <a href="http://seleniumhq.org/projects/on-rails/" target="_blank">SeleniumOnRails</a> plugin was not compatible. This was easily fixed by upgrading the plugin with the non-official version available at <a href="http://github.com/paytonrules/selenium-on-rails/tree/master" target="_blank">here</a>.</p>
<p>The test cases written in RSelanese use a DSL (Domain Specific Language) module to help keep the test code clean and easy to read.</p>
<p>At the time I set this up I was fairly new to Selenium and SeleniumOnRails, and followed some advice in this <a href="http://citechnology.blogspot.com/2007/09/getting-started-writing-dsls-using.html" target="_blank">article</a> that suggested to hack the the RSelenese class to include a custom module for your DSLs. As a Selenium newbie I was probably focusing on the tests, and forgot to fix the weird hack suggested. Needless to say this came back an bit me when I upgraded SeleniumOnRails and reminded me to fix it. This is how I did it.</p>
<h3>Why a DSL?</h3>
<p>Let me start with a short intro to what I wanna do.</p>
<p>The application I&#8217;m working on uses AJAX to login. To do this in my Selenium test cases I would run the following .rsel snippet:</p>
<p><script src="http://gist.github.com/42878.js"></script></p>
<p>As several test cases will need to log in before getting down to business, pasting that snippet into the test cases would produce enormous amount of duplication. One way to get rid of the duplicated code would be to put the login steps in a .rsel partial and execute the login that way. The tests would in that case include the partial using the following syntax:</p>
<p><script src="http://gist.github.com/42881.js"></script></p>
<p>I guess you would agree this is not a very tasteful syntax. I&#8217;d rather see a method call like <code>login("quentin", "test")</code>. If we define a <code>login</code> method in a module, we could include that in the RSelenese class and make it available to our test cases.</p>
<p><script src="http://gist.github.com/42884.js"></script></p>
<h3>Including the DSL module in RSelenese</h3>
<p>With the DSL module in place it still needs to be included in the class <code>SeleniumOnRails::RSelenese</code>. As this setup is only needed in the test environment, the  <code>class_eval</code> is done in the test environment config. It is put in an  <code>after_initialize</code> block to allow the SeleniumOnRails plugin to be loaded before the inclusion.</p>
<p><script src="http://gist.github.com/42890.js"></script></p>
<p>That&#8217;s it!<br />
Just remember that you need to restart your environment when you make any updates to your DSL module.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.robinspainhour.com/2009/01/selenium-on-rails-dsl/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Using rspec-rails during gem development</title>
		<link>http://www.robinspainhour.com/2008/12/using-rspec-rails-during-gem-development/</link>
		<comments>http://www.robinspainhour.com/2008/12/using-rspec-rails-during-gem-development/#comments</comments>
		<pubDate>Mon, 15 Dec 2008 11:24:31 +0000</pubDate>
		<dc:creator>robin</dc:creator>
		
		<category><![CDATA[Rails]]></category>

		<category><![CDATA[gem]]></category>

		<category><![CDATA[rspec]]></category>

		<category><![CDATA[rspec-rails]]></category>

		<guid isPermaLink="false">http://www.robinspainhour.com/?p=99</guid>
		<description><![CDATA[Update:
I been having all sorts of problems using this approach after updates in rspec and rspec-rails and no longer recommend using it!
The source code has been updated to use another approach in which I include a minimal Rails application in the gem, to run tests against. Until I get a chance to write a more [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Update:</strong></p>
<p><strong>I been having all sorts of problems using this approach after updates in rspec and rspec-rails and no longer recommend using it!</strong></p>
<p>The source code has been updated to use another approach in which I include a minimal Rails application in the gem, to run tests against. Until I get a chance to write a more complete post on this new approach take a look at the source, <a href="http://github.com/robinsp/robins_html_helpers/tree/master" target="_blank">available at GitHub</a>.</p>
<p><span style="text-decoration: line-through;">Not long ago I started using rspec and rspec-rails for testing in my Rails apps. I&#8217;ve quickly became hooked on Behaviour Driven Design (BDD) and feel it has boosted the quality (and readability) of my tests.</span></p>
<p><span style="text-decoration: line-through;">But when I wanted to move a view helper from one project into a gem for easy reuse in other apps it took me a while to figure out how to get the tests to run in isolation.</span></p>
<p><span style="text-decoration: line-through;">The main issue I had was the rspec-rails gem relying on there being a rails project present which of course isn&#8217;t the case with a stand-alone gem. Specifically, it wants to load the project&#8217;s ApplicationController which in turn will load a whole bunch of other stuff.</span></p>
<p><span style="text-decoration: line-through;">The second problem I ran into was how to write tests for helpers that output text with a non-output code block (i.e., &lt;% &#8230; %&gt;).</span></p>
<p><span style="text-decoration: line-through;">Let&#8217;s look at the stripped down version of the rspec for my boxed_content helper that wraps its containing block in a number of divs:<br />
<script src="http://gist.github.com/35970.js"></script><br />
When testing gems I don&#8217;t rely on the specs to follow the directory layout defined by rspec-rails. Instead I pass the <code>:helper</code> type on line 3 so the created example group is a <code>HelperExampleGroup</code>.</p>
<p><span style="text-decoration: line-through;">As the <code>boxed_content</code> helper will not output text on its own I use <code>eval_erb</code> to execute it. This done in the method on lines 17-19. Putting it in a method makes the test code easier to read.</span></p>
<p><span style="text-decoration: line-through;">Ok. On to the spec_helper.rb where rspec and rspec-rails are set up:<br />
<script src="http://gist.github.com/35998.js"></script><br />
The trick here is on line 5 where I create an ApplicationController class. This will load a bunch of stuff and allow us to continue with the rest of the require statements for rspec and rspec-rails. Lines 8-19 are copied from rspec-rails initialization.</p>
<p><span style="text-decoration: line-through;">Finally on line 21, my module containing the helpers i want to test, is loaded.</span></p>
<h3>Resources</h3>
<ul>
<li>Complete source code of the gem described above (including specs) is <a href="http://github.com/robinsp/robins_html_helpers/tree/master" target="_blank">available at GitHub</a>.</li>
<li>Home of <a href="http://rspec.info/" target="_blank">RSpec and RSpec-Rails</a></li>
<li>Railscast on <a href="http://railscasts.com/episodes/135-making-a-gem" target="_blank">Making a Gem</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.robinspainhour.com/2008/12/using-rspec-rails-during-gem-development/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Why not to prefix local variables, method arguments or fields</title>
		<link>http://www.robinspainhour.com/2008/11/why-not-to-prefix-local-variables-method-arguments-or-fields/</link>
		<comments>http://www.robinspainhour.com/2008/11/why-not-to-prefix-local-variables-method-arguments-or-fields/#comments</comments>
		<pubDate>Thu, 27 Nov 2008 11:56:25 +0000</pubDate>
		<dc:creator>robin</dc:creator>
		
		<category><![CDATA[Java]]></category>

		<category><![CDATA[refactoring]]></category>

		<guid isPermaLink="false">http://www.robinspainhour.com/?p=82</guid>
		<description><![CDATA[As I was reading the section &#8220;Local variables, method arguments, and fields: Which is which?&#8221; in Four harmful Java idioms, and how to fix them I thought I might try using a convention like the one proposed in the article to improve readability. (The convention was essentially to prefix the names of fields and method [...]]]></description>
			<content:encoded><![CDATA[<p>As I was reading the section <em>&#8220;Local variables, method arguments, and fields: Which is which?&#8221;</em> in <a href="http://www.javaworld.com/javaworld/jw-07-2008/jw-07-harmful-idioms.html" target="_blank">Four harmful Java idioms, and how to fix them</a> I thought I might try using a convention like the one proposed in the article to improve readability. (The convention was essentially to prefix the names of fields and method arguments.)</p>
<p>The article stated what at first looked like good arguments for improving readability by using prefixing. But after thinking about it some more and finally looking at some of my own code to see the effect, I found that the arguments were not applicable for me. Here&#8217;s why:</p>
<p>For refactoring reasons I&#8217;m a big fan of using getter and setter methods. Even within the class declaring the field. As such, prefixing a field would in my case be more or less useless as they are only referenced in the getter and setter methods.</p>
<p>The need to prefix method arguments to not confuse them with local variables arises, in my opinion,  when the method is too long or when the arguments are too many. Both are well defined <a href="http://c2.com/xp/CodeSmell.html" target="_blank">smells</a> and should be refactored.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.robinspainhour.com/2008/11/why-not-to-prefix-local-variables-method-arguments-or-fields/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Using ActiveRecord with forms but without a table</title>
		<link>http://www.robinspainhour.com/2008/11/using-activerecord-with-forms-but-without-a-table/</link>
		<comments>http://www.robinspainhour.com/2008/11/using-activerecord-with-forms-but-without-a-table/#comments</comments>
		<pubDate>Mon, 24 Nov 2008 01:33:40 +0000</pubDate>
		<dc:creator>robin</dc:creator>
		
		<category><![CDATA[Rails]]></category>

		<category><![CDATA[ActiveRecord]]></category>

		<category><![CDATA[plugins]]></category>

		<category><![CDATA[recipes]]></category>

		<guid isPermaLink="false">http://www.robinspainhour.com/?p=21</guid>
		<description><![CDATA[Introduction
From time to time I find myself implementing a story needing the nice validation features that
come with ActiveRecord and being able to display input errors in a simple way in the views.
I also want to implement the story in a RESTful way (even if this example should probably be
regarded as RESTlike).
But what I don&#8217;t want [...]]]></description>
			<content:encoded><![CDATA[<h1>Introduction</h1>
<p>From time to time I find myself implementing a story needing the nice validation features that<br />
come with ActiveRecord and being able to display input errors in a simple way in the views.<br />
I also want to implement the story in a RESTful way (even if this example should probably be<br />
regarded as REST<em>like</em>).</p>
<p>But what I <em>don&#8217;t want</em> is a table in the database.</p>
<p>Implementing a User-Changes-Password-story not long ago was such an occasion and I decided to clean out the domain specifics and post the way it was done and also publish the <a href="http://github.com/robinsp/active_record_tableless/tree/master" target="_blank">active_record_tableless</a> plugin I use.</p>
<p>There were a number of good reasons not to use the existing User model directly, but that&#8217;s long story. As this example is stripped of all the calls to legacy system it may seem like a strange way to do this but I hope you can follow along and understand how you can use <a href="http://github.com/robinsp/active_record_tableless/tree/master" target="_blank">active_record_tableless</a> plugin in your own projects.</p>
<blockquote><p><span style="text-decoration: underline;"><strong>User story</strong></span></p>
<p>User wanting to change password submits email address.</p>
<p>After email validation, the user enters passwords as listed below and submits to complete the change.</p>
<ul>
<li>old password</li>
<li>new password</li>
<li>confirmation of the new password.</li>
</ul>
</blockquote>
<h1>Implementation</h1>
<h2>Setup</h2>
<p>You can download the complete source code from here, but I basically created a new rails app and generated a scaffold for a PasswordUpdate like this:</p>

<div class="wp_syntax"><div class="code"><pre class="language" style="font-family:monospace;">script/generate scaffold --skip-migration PasswordUpdate email:string \
          password:string new_password:string new_password_confirmation:string</pre></div></div>

<p>To be able to use a model without backing it with a database table I use the <a href="http://github.com/robinsp/active_record_tableless/tree/master" target="_blank">active_record_tableless</a> plugin:</p>

<div class="wp_syntax"><div class="code"><pre class="language" style="font-family:monospace;">script/plugin install git://github.com/robinsp/active_record_tableless.git</pre></div></div>

<h2>Controller</h2>
<p>We wont need some of the actions created by the scaffold generator so <code>index</code> and <code>destroy</code> actions were deleted. The generated controller was also cleansed from code returning xml.</p>
<p>After implementing the things we need for the user story implementation the controller looks like this:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
</pre></td><td class="code"><pre class="ruby ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> PasswordUpdatesController <span style="color:#006600; font-weight:bold;">&lt;</span> ApplicationController
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> new
    <span style="color:#0066ff; font-weight:bold;">@password_update</span> = PasswordUpdate.<span style="color:#9900CC;">new</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> edit
    <span style="color:#0066ff; font-weight:bold;">@password_update</span> = PasswordUpdate.<span style="color:#9900CC;">find</span><span style="color:#006600; font-weight:bold;">&#40;</span> params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:id</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">&#41;</span> 
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> update
    <span style="color:#0066ff; font-weight:bold;">@password_update</span> = PasswordUpdate.<span style="color:#9900CC;">find</span><span style="color:#006600; font-weight:bold;">&#40;</span>params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:id</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> 
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#0066ff; font-weight:bold;">@password_update</span>.<span style="color:#9900CC;">update_attributes</span><span style="color:#006600; font-weight:bold;">&#40;</span> params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:password_update</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
      redirect_to <span style="color:#996600;">'/'</span>
    <span style="color:#9966CC; font-weight:bold;">else</span>
      render <span style="color:#ff3333; font-weight:bold;">:action</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;edit&quot;</span> 
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> create
    <span style="color:#0066ff; font-weight:bold;">@password_update</span> = PasswordUpdate.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>
        params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:password_update</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">merge</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:password_required</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">false</span> <span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#0066ff; font-weight:bold;">@password_update</span>.<span style="color:#9900CC;">save</span>
      <span style="color:#0066ff; font-weight:bold;">@password_update</span>.<span style="color:#9900CC;">exists</span>!<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#0066ff; font-weight:bold;">@password_update</span>.<span style="color:#9900CC;">email_as_id</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
      redirect_to edit_password_update_url<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#0066ff; font-weight:bold;">@password_update</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">else</span>
      render <span style="color:#ff3333; font-weight:bold;">:action</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;new&quot;</span> 
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>Fairly standard stuff going on in the <code>new</code>, <code>edit</code> and <code>update</code> actions (lines 3-19) but what&#8217;s going on in <code>create</code>?</p>
<p>Our user story states that a valid email address is entered into a form and submitted. Our <code>new</code> action renders this form with an single text_field and a button that submits to the  <code>create</code> action. As we don&#8217;t care about the passwords in this stage, their validations are disabled by setting the <code>:password_required</code> attribute to false (line 23). We&#8217;ll look closer at this when discussing the model.</p>
<p>If there was something wrong with the submitted email addres the <code>new</code> action is rendered and the errors are displayed to the user (using the standard <code>error_messages</code> form helper).<br />
However, if everything is ok and <code>@password_update.save</code> returns true (line 25) we want to behave well and redirect from the successful post.</p>
<p>As our model doesn&#8217;t have a persistent id (because it doesn&#8217;t have a database table) we fake this using the <code>exists!</code> method, provided by <a href="http://github.com/robinsp/active_record_tableless/tree" target="_blank">active_record_tableless</a> plugin (line 26) and as our model object now has and an id, the redirect using a url helper on line 27 will work fine.</p>
<h2>Model</h2>
<p>PasswordUpdate model is implemented like this:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
</pre></td><td class="code"><pre class="ruby ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> PasswordUpdate <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  tableless <span style="color:#ff3333; font-weight:bold;">:columns</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span>
      <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:email</span>, <span style="color:#ff3333; font-weight:bold;">:string</span><span style="color:#006600; font-weight:bold;">&#93;</span>,
      <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:password</span>, <span style="color:#ff3333; font-weight:bold;">:string</span><span style="color:#006600; font-weight:bold;">&#93;</span>,
      <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:new_password</span>, <span style="color:#ff3333; font-weight:bold;">:string</span><span style="color:#006600; font-weight:bold;">&#93;</span>
    <span style="color:#006600; font-weight:bold;">&#93;</span>
&nbsp;
  attr_accessor <span style="color:#ff3333; font-weight:bold;">:password_required</span>  
&nbsp;
  validates_presence_of     <span style="color:#ff3333; font-weight:bold;">:email</span>  
&nbsp;
  validates_presence_of     <span style="color:#ff3333; font-weight:bold;">:password</span>, 
                            <span style="color:#ff3333; font-weight:bold;">:new_password</span>, 
                            <span style="color:#ff3333; font-weight:bold;">:new_password_confirmation</span>, 
                              <span style="color:#ff3333; font-weight:bold;">:if</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:password_required</span>?
&nbsp;
  validates_confirmation_of <span style="color:#ff3333; font-weight:bold;">:new_password</span>,
                              <span style="color:#ff3333; font-weight:bold;">:if</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:password_required</span>?
&nbsp;
  <span style="color:#008000; font-style:italic;"># Defaults to true</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> password_required?
    <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">password_required</span>.<span style="color:#0000FF; font-weight:bold;">nil</span>? ? <span style="color:#0000FF; font-weight:bold;">true</span> : <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">password_required</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> email_as_id
    <span style="color:#CC0066; font-weight:bold;">raise</span> <span style="color:#996600;">&quot;No email set&quot;</span> <span style="color:#9966CC; font-weight:bold;">unless</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">email</span>
    PasswordUpdate.<span style="color:#9900CC;">encode</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">email</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#0000FF; font-weight:bold;">self</span> 
    <span style="color:#9966CC; font-weight:bold;">def</span> find_by_id<span style="color:#006600; font-weight:bold;">&#40;</span>id<span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#CC0066; font-weight:bold;">raise</span> <span style="color:#996600;">&quot;No id argument&quot;</span> <span style="color:#9966CC; font-weight:bold;">unless</span> id 
      <span style="color:#CC0066; font-weight:bold;">p</span> = PasswordUpdate.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:email</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> decode<span style="color:#006600; font-weight:bold;">&#40;</span>id<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#CC0066; font-weight:bold;">p</span>.<span style="color:#9900CC;">exists</span>!<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0066; font-weight:bold;">p</span>.<span style="color:#9900CC;">email_as_id</span><span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#CC0066; font-weight:bold;">p</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
    alias_method <span style="color:#ff3333; font-weight:bold;">:find</span>, <span style="color:#ff3333; font-weight:bold;">:find_by_id</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">def</span> encode<span style="color:#006600; font-weight:bold;">&#40;</span> str <span style="color:#006600; font-weight:bold;">&#41;</span>
      str.<span style="color:#CC0066; font-weight:bold;">sub</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;<span style="color:#000099;">\.</span>&quot;</span>, <span style="color:#996600;">&quot;-&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">def</span> decode<span style="color:#006600; font-weight:bold;">&#40;</span> str <span style="color:#006600; font-weight:bold;">&#41;</span>
      str.<span style="color:#CC0066; font-weight:bold;">sub</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;-&quot;</span>, <span style="color:#996600;">&quot;.&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>Line 2-6 set up the attributes we need. To control whether validation should be done on passwords we need an attribute for this (line 9). We saw this in the <code>create</code> action earlier.</p>
<p>The validations declared on lines 10-18 are fairly straight forward except that they don&#8217;t check the passwords if our <code>password_required</code> attribute is false. <em>(Rigorous validation of email format and such has been omitted in this example code.)</em></p>
<p>On lines 25-28 a util method is provided to convert the email address into a valid string to use in a url.</p>
<p>Lines 30-37 implements finders to fake that our model actually exists as a normal model would when returned from find. The bare minimum for an existing model is that it should have an <code>id</code> and that <code>new_record?</code> should return false. The <a href="http://github.com/robinsp/active_record_tableless/tree" target="_blank">active_record_tableless</a> plugin takes care of this for us when we call the <code>exists!</code> method (line 34).</p>
<h1>Resources</h1>
<p><a href="http://github.com/robinsp/active_record_tableless/tree" target="_blank">active_record_tableless</a> plugin on github</p>
<p>The complete Rails 2.1 project that the example above describes is <a href="http://github.com/robinsp/tableless_example/tree/master">here</a>.</p>
<p>About 2 years ago <a href="http://agilewebdevelopment.com/plugins/owner/11">Jonathan Viney</a> wrote <a href="http://agilewebdevelopment.com/plugins/activerecord_base_without_table">ActiveRecord::Base Without Table</a>. It doesn&#8217;t seem to be maintained and doesn&#8217;t support the exists! method described above. It also has a different way of integrating into the models.<br />
Also, if you want to use &#8220;ActiveRecord::Base Without Table&#8221; with Rails 2.x you need to install it from <a href="http://gitorious.org/projects/activerecord-basewithouttable-for-rails-2">activerecord-basewithouttable-for-rails-2</a> where <a href="http://gitorious.org/users/crnixon">Clinton R. Nixon</a> has graciously been hosting it for some time.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.robinspainhour.com/2008/11/using-activerecord-with-forms-but-without-a-table/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Starting a blog</title>
		<link>http://www.robinspainhour.com/2008/11/starting-a-blog/</link>
		<comments>http://www.robinspainhour.com/2008/11/starting-a-blog/#comments</comments>
		<pubDate>Thu, 20 Nov 2008 21:07:20 +0000</pubDate>
		<dc:creator>robin</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.robinspainhour.com/?p=16</guid>
		<description><![CDATA[Finally. I actually set this thing up.
I&#8217;d rather not make a big mission statement about what I&#8217;m gonna put here but it&#8217;s very likely it will be much more on professional topics than personal.
As I don&#8217;t really follow more than a handful of blogs I consider myself a newbie blogger. As such, years of procrastination [...]]]></description>
			<content:encoded><![CDATA[<p>Finally. I actually set this thing up.</p>
<p>I&#8217;d rather not make a big mission statement about what I&#8217;m gonna put here but it&#8217;s very likely it will be much more on professional topics than personal.</p>
<p>As I don&#8217;t really follow more than a handful of blogs I consider myself a newbie blogger. As such, years of procrastination preceded setting this thing up until I finally got to the point where I just chose a product, installed it and got going. (Not really the whole truth. I spent a fair amount of time looking at plugins for posting source code in blog entries.)</p>
<p>Anyway, the blogging software is installed and the blog is public.<br />
Better get started, instead of wasting valuable writing time figuring out the details of how this WordPress stuff <em>really</em> works and spending <em>way</em> to much time fiddling with the features.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.robinspainhour.com/2008/11/starting-a-blog/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
