<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Pete On Rails { render :partial =&gt; "braindump" }</title>
	
	<link>http://blog.peteonrails.com</link>
	<description>{ render :partial =&gt; "braindump" }</description>
	<lastBuildDate>Tue, 02 Aug 2011 21:23:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/PeteOnRails" /><feedburner:info uri="peteonrails" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>My Review of Metolius Porta-Cord Rope Bag</title>
		<link>http://feedproxy.google.com/~r/PeteOnRails/~3/XOXes8FrCgA/</link>
		<comments>http://blog.peteonrails.com/2011/08/my-review-of-metolius-porta-cord-rope-bag/#comments</comments>
		<pubDate>Tue, 02 Aug 2011 21:23:31 +0000</pubDate>
		<dc:creator>pete</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.peteonrails.com/?p=256</guid>
		<description><![CDATA[Originally submitted at REI Metolius Porta-Cord™ rope bag can also be used as a lightweight pack or a rope bucket during long multipitch routes and big-wall climbs. Metolius Porta-Cord Rope Bag Better than a rope bag. Not a crag pack. By Pete Jackson from Rumney, NH on 8/2/2011 &#160; 3out of 5 Pros: Wear Resistant [...]]]></description>
			<content:encoded><![CDATA[<div class="hreview">
<div class="item">
<p><a href="http://www.rei.com/mp/rc/product/767279">Originally submitted at REI</a></p>
<div><img src="http://images.powerreviews.com/images_products/09/41/1700774_100.jpg" class="photo" align="left" style="margin: 0 0.5em 0 0">
<p style="margin-top:0">Metolius Porta-Cord™ rope bag can also be used as a lightweight pack or a rope bucket during long multipitch routes and big-wall climbs.</p>
</div>
<p><a href="http://www.rei.com/mp/rc/product/767279" style="display: none;" class="url fn"><span class="fn">Metolius Porta-Cord Rope Bag</span></a></div>
<p><br clear="left">
<p><strong class="summary">Better than a rope bag. Not a crag pack.</strong></p>
<div>By <strong>Pete Jackson</strong> from <strong>Rumney, NH</strong> on <strong><abbr title="201182T1200-0800" class="dtreviewed" style="border: none; text-decoration: none;">8/2/2011</abbr></strong></div>
<p>
<div style="margin: 0.5em 0; height: 15px; width: 83px; background-image: url(http://images.powerreviews.com/images/stars_small.gif); background-position: 0px -108px;" class="prStars prStarsSmall">&nbsp;</div>
</p>
<div style="display: none"><span class="rating">3</span>out of 5</div>
<p><strong>Pros: </strong>Wear Resistant</p>
<p><strong>Cons: </strong>Small Compartments</p>
<p><strong>Best Uses: </strong>Sport Climbing, Cragging</p>
<p><strong>Describe Yourself: </strong>Avid Climber</p>
<p><strong>Was this a gift?: </strong>No</p>
<p style="margin-top:1em" class="description">I really wanted to love this pack. To that end, I used it for a full season before returning it to try a better pack. <br xmlns:pr="xalan://com.pufferfish.core.beans.xmlbuilders.xsl.Functions"><br />This pack is, hands-down, better than any rope bag available. If you&#8217;re replacing a rope bag, or avoiding buying one, this is a great way to go. </p>
<p>That said, it&#8217;s a pretty bad pack. I found the straps uncomfortable, the lid hard to close when overstuffed, and the side pockets useless for holding anything when carrying a rope longer than 50M. </p>
<p>Unless you&#8217;re carrying a super-skinny rope or a 50M sub-10mm rope, you&#8217;re going to have trouble closing the pack, taking other gear with you, getting anything into those side pockets, and difficulty getting the load to ride correctly. </p>
<p>Also, I find those gear lashing daisy chains overrated. If you clip your shoes, harness, helmet, or water bottle to the outside of this pack, you&#8217;ll suffer from an unstable load that snags on trail obstacles. Not ideal. </p>
<p>I live in Rumney NH, exactly 3/4 mile from the crags, and I&#8217;d avoid taking this pack to the cliffs. Instead, I found myself favoring my hiking pack: so I knew something was wrong. </p>
<p>If you have short approaches, a short rope, not a lot of personal gear, and don&#8217;t mind the minimal padding on the straps, then this is an excellent pack. </p>
<p>If you are looking for a rope bag and can have your partner carry the rack, food, and water, then this is the pack for you. </p>
<p>Otherwise, it may not be.</p>
<p style="margin-top:0.5em">(<a href="http://www.powerreviews.com/legal/terms_of_use.html" rel="license">legalese</a>)</p>
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=XOXes8FrCgA:DUGuPdSSKVU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=XOXes8FrCgA:DUGuPdSSKVU:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=XOXes8FrCgA:DUGuPdSSKVU:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=XOXes8FrCgA:DUGuPdSSKVU:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=XOXes8FrCgA:DUGuPdSSKVU:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=XOXes8FrCgA:DUGuPdSSKVU:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=XOXes8FrCgA:DUGuPdSSKVU:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=XOXes8FrCgA:DUGuPdSSKVU:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PeteOnRails/~4/XOXes8FrCgA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.peteonrails.com/2011/08/my-review-of-metolius-porta-cord-rope-bag/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.peteonrails.com/2011/08/my-review-of-metolius-porta-cord-rope-bag/</feedburner:origLink></item>
		<item>
		<title>Intro to Spatial Programming</title>
		<link>http://feedproxy.google.com/~r/PeteOnRails/~3/ClA9jJ3IcgU/</link>
		<comments>http://blog.peteonrails.com/2010/07/intro-to-spatial-programming/#comments</comments>
		<pubDate>Fri, 09 Jul 2010 22:54:27 +0000</pubDate>
		<dc:creator>pete</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.peteonrails.com/?p=253</guid>
		<description><![CDATA[My slides from the presentation &#8220;Intro to Spatial Programming&#8221; are now available. You can download them as: A 20MB Keynote &#8216;o9 file A 10MB PDF file (transitions and animations will not work) A 52MB Quicktime Movie ar 1024&#215;768 A 9.1MB Quicktime Movie formatted for the iPod and iPad (640&#215;480) I hope you enjoy the slides. [...]]]></description>
			<content:encoded><![CDATA[<p>My slides from the presentation &#8220;Intro to Spatial Programming&#8221; are now available. You can download them as:</p>
<ul>
<li>A 20MB <a href="http://blog.peteonrails.com/wp-content/uploads/2010/07/Intro%20to%20Spatial%20Programming.key">Keynote &#8216;o9 file</a></li>
<li>A 10MB <a href="http://blog.peteonrails.com/wp-content/uploads/2010/07/Intro%20to%20Spatial%20Programming.pdf">PDF file</a> (transitions and animations will not work)</li>
<li>A 52MB <a href="http://blog.peteonrails.com/wp-content/uploads/2010/07/Intro%20to%20Spatial%20Programming%20-%20Full.mov">Quicktime Movie ar 1024&#215;768 </a></li>
<li>A 9.1MB <a href="http://blog.peteonrails.com/wp-content/uploads/2010/07/Intro%20to%20Spatial%20Programming.mov">Quicktime Movie formatted for the iPod and iPad </a>(640&#215;480)</li>
</ul>
<p>I hope you enjoy the slides. If you missed my talk and want me to present the material at your Ruby User Group, contact me.</p>
<p>All presentation material is Copyright 2010 Peter Jackson, licensed under CC 3.0 Attribution. You can reused, redistribute, and remix the content. Just make sure you attribute it with a link.</p>
<p>Enjoy!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=ClA9jJ3IcgU:q8VnziSiUoY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=ClA9jJ3IcgU:q8VnziSiUoY:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=ClA9jJ3IcgU:q8VnziSiUoY:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=ClA9jJ3IcgU:q8VnziSiUoY:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=ClA9jJ3IcgU:q8VnziSiUoY:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=ClA9jJ3IcgU:q8VnziSiUoY:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=ClA9jJ3IcgU:q8VnziSiUoY:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=ClA9jJ3IcgU:q8VnziSiUoY:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PeteOnRails/~4/ClA9jJ3IcgU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.peteonrails.com/2010/07/intro-to-spatial-programming/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
<enclosure url="http://blog.peteonrails.com/wp-content/uploads/2010/07/Intro%20to%20Spatial%20Programming%20-%20Full.mov" length="54311854" type="video/quicktime" />
<enclosure url="http://blog.peteonrails.com/wp-content/uploads/2010/07/Intro%20to%20Spatial%20Programming.mov" length="9516172" type="video/quicktime" />
		<feedburner:origLink>http://blog.peteonrails.com/2010/07/intro-to-spatial-programming/</feedburner:origLink></item>
		<item>
		<title>The Revenge of Inigo Montoya</title>
		<link>http://feedproxy.google.com/~r/PeteOnRails/~3/8RSjvB__aEE/</link>
		<comments>http://blog.peteonrails.com/2010/05/the-revenge-of-inigo-montoya/#comments</comments>
		<pubDate>Tue, 25 May 2010 16:51:29 +0000</pubDate>
		<dc:creator>pete</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.peteonrails.com/?p=238</guid>
		<description><![CDATA[:false You keep using that symbol. I do not think it means what you think it means. Today, I&#8217;d like to describe something I like to call: The Inigo Montoya Attack. It is the implementation in code &#8212; often with good intentions, but sometimes simply because of ignorance &#8212; of an algorithm which masks one [...]]]></description>
			<content:encoded><![CDATA[
<div class="wp_syntax"><div class="code"><pre class="ruby"><span style="color:#ff3333; font-weight:bold;">:false</span></pre></div></div>

<p>You keep using that symbol. I do not think it means what you think it means. </p>
<p>Today, I&#8217;d like to describe something I like to call: <strong>The Inigo Montoya Attack</strong>. It is the implementation in code &#8212; often with good intentions, but sometimes simply because of ignorance &#8212; of an algorithm which masks one clear, well-known paradigm inside of another that completely obfuscates your actual intent.  Unless you have six-fingers on your right hand (I&#8217;m talking to YOU, <a href="http://en.wikipedia.org/wiki/Count_Rugen">Count Rugen</a>) you are forbidden from this practice. </p>
<p>Here&#8217;s some code I came across in a codebase I was maintaining.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby"> <span style="color:#9966CC; font-weight:bold;">def</span> logged_in_from_token?
    current_user = token_exists? ? log_in_from_token : <span style="color:#ff3333; font-weight:bold;">:false</span>
 <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>It looks strange. It OUGHT to look strange. What is that :false symbol all about? </p>
<p>I&#8217;ll tell you what it is. It&#8217;s a very misleading piece of code. Because when you do not log the user in from a token, current_user is NOT set to false, in the boolean sense. It is, in fact, a boolean &#8220;true&#8221; value in Ruby. </p>
<p>Try this in IRB:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby"> <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#ff3333; font-weight:bold;">:false</span>  
   <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;You keep using that word. I do not think it means what you think it means.&quot;</span> 
<span style="color:#9966CC; font-weight:bold;">else</span> 
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Have fun storming the castle!&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>If <em><strong>:false</strong></em> evaluated to a <em>boolean false</em> value, then you&#8217;d see &#8220;Have fun storming the castle!&#8221;. But instead, you get &#8220;You keep using that word. I do not think it means what you think it means.&#8221; If you&#8217;re trying to make readable code, using the symbol <em><strong>:false</strong></em> is dangerous and misleading. </p>
<p>To make matters worse, this code assigns <em><strong>:false</strong></em> to the value <strong>current_user</strong>, which is a well-known and established name used in a number of Rails patterns. RESTFul Authentication and Authlogic BOTH support the notion of <strong>current_user</strong>, and when nobody is logged in, THAT METHOD RETURNS FALSE. Not the doppleganger wannabe <em><strong>:false</strong></em>, but a real, honest to goodness, <em>boolean false</em>. (OK: it&#8217;s actually returning nil, but nil is false). </p>
<p>So imagine my bewilderment when this basic test no longer worked:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby">  <span style="color:#006600; font-weight:bold;">&lt;%-</span> <span style="color:#9966CC; font-weight:bold;">if</span> current_user <span style="color:#006600; font-weight:bold;">%&gt;</span>
    <span style="color:#006600; font-weight:bold;">&lt;%</span>= display_logged_in_stuff<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>  <span style="color:#006600; font-weight:bold;">%&gt;</span>
  <span style="color:#006600; font-weight:bold;">&lt;%</span> <span style="color:#9966CC; font-weight:bold;">else</span> <span style="color:#006600; font-weight:bold;">%&gt;</span>
      You are <span style="color:#9966CC; font-weight:bold;">not</span> logged <span style="color:#9966CC; font-weight:bold;">in</span>
   <span style="color:#006600; font-weight:bold;">&lt;%</span> <span style="color:#9966CC; font-weight:bold;">end</span> <span style="color:#006600; font-weight:bold;">%&gt;</span></pre></div></div>

<p>So a couple hours of debugging later, I found myself using &#8216;ack in project&#8217; to remove all references to the silly symbol <em><strong>:false</strong></em>. </p>
<p>Lessons for Rubyists: </p>
<ol>
<li>Be clear. :false is never actually false. Don&#8217;t use it. </li>
<li>Follow established conventions. The method <strong>some_test?</strong> should always return a boolean value. If it doesn&#8217;t, leave off the question mark!</li>
<li>Don&#8217;t reinvent the wheel! The implementor of the code above could have simply used RESTful Authentication or Authlogic and have avoided the whole mess. </li>
<li>Unit tests are still important! Remember that someone has to maintain your stuff someday. A simple unit test would have caught the bug introduced by using the symbol <strong>:false</strong> in place of a <em><strong>boolean false</strong></em>.</li>
</ol>
<p>Have fun storming the castle!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=8RSjvB__aEE:KL1QbP3KlHE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=8RSjvB__aEE:KL1QbP3KlHE:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=8RSjvB__aEE:KL1QbP3KlHE:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=8RSjvB__aEE:KL1QbP3KlHE:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=8RSjvB__aEE:KL1QbP3KlHE:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=8RSjvB__aEE:KL1QbP3KlHE:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=8RSjvB__aEE:KL1QbP3KlHE:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=8RSjvB__aEE:KL1QbP3KlHE:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PeteOnRails/~4/8RSjvB__aEE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.peteonrails.com/2010/05/the-revenge-of-inigo-montoya/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://blog.peteonrails.com/2010/05/the-revenge-of-inigo-montoya/</feedburner:origLink></item>
		<item>
		<title>Oracle Spatial support in spatial_adapter for ActiveRecord</title>
		<link>http://feedproxy.google.com/~r/PeteOnRails/~3/yw64qtjtb0w/</link>
		<comments>http://blog.peteonrails.com/2010/04/oracle-spatial-support-in-spatial_adapter-for-activerecord/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 20:56:12 +0000</pubDate>
		<dc:creator>pete</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.peteonrails.com/?p=230</guid>
		<description><![CDATA[I&#8217;ve recently made public the first cut of functionality for Oracle Spatial support in Fragility&#8217;s Spatial Adapter for ActiveRecord. It&#8217;s not ready for prime time, but it&#8217;s useful enough to open up to collaboration. As soon as I finish up complete spec tests and a couple of refactorings, I plan to issue a pull request [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve recently made public the first cut of functionality for Oracle Spatial support in Fragility&#8217;s <a href="http://github.com/peteonrails/spatial_adapter" target="_blank">Spatial Adapter for ActiveRecord</a>. It&#8217;s not ready for prime time, but it&#8217;s useful enough to open up to collaboration. As soon as I finish up complete spec tests and a couple of refactorings, I plan to issue a pull request and get the functionality included in the main fork of spatial_adapter on Github.</p>
<p>I won&#8217;t go too far into how to use the adapter until it&#8217;s ready for prime time. This message is intended to encourage collaboration among anyone else who is in the unfortunate boat of having to use Oracle Spatial and Rails without built in driver support (which is not fun).</p>
<p>To use the functionality, <a href="http://blog.rayapps.com/2009/09/14/how-to-install-oracle-database-10g-on-mac-os-x-snow-leopard/">install Oracle</a>, <a href="http://rubyforge.org/projects/georuby/">Install GeoRuby </a>, then install <a href="http://github.com/peteonrails/spatial_adapter">my fork of the spatial_adapter</a>.</p>
<p>Then you can do this:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby">   create_table <span style="color:#ff3333; font-weight:bold;">:points_of_interest</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>t<span style="color:#006600; font-weight:bold;">|</span>
      t.<span style="color:#9900CC;">geometry</span> <span style="color:#ff3333; font-weight:bold;">:location</span>
      t.<span style="color:#CC0066; font-weight:bold;">string</span> <span style="color:#ff3333; font-weight:bold;">:venue_name</span> 
      t.<span style="color:#9900CC;">timestamps</span>
   <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
   add_index <span style="color:#ff3333; font-weight:bold;">:points_of_interest</span>, <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:location</span><span style="color:#006600; font-weight:bold;">&#93;</span>, <span style="color:#ff3333; font-weight:bold;">:spatial</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span></pre></div></div>

<p>Then all of the relevant rows will be set up for you in SDO_GEOM_METADATA, SDO_INDEX_METADATA, and SDO_INDEX_METADATA_TABLE. </p>
<p>Currently, there is only support for geometry types. Explicit point, polygon, line, and multipolygon types will come later. </p>
<p>Feedback is encouraged.</p>
<p><em>P.S. To everyone wondering what happened to the VoteFu major upgrade, it&#8217;s imminent. Thanks to everyone who has submitted patches in the past few months. It&#8217;ll be released *real soon now*</em></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=yw64qtjtb0w:kxaHbLCN1V4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=yw64qtjtb0w:kxaHbLCN1V4:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=yw64qtjtb0w:kxaHbLCN1V4:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=yw64qtjtb0w:kxaHbLCN1V4:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=yw64qtjtb0w:kxaHbLCN1V4:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=yw64qtjtb0w:kxaHbLCN1V4:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=yw64qtjtb0w:kxaHbLCN1V4:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=yw64qtjtb0w:kxaHbLCN1V4:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PeteOnRails/~4/yw64qtjtb0w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.peteonrails.com/2010/04/oracle-spatial-support-in-spatial_adapter-for-activerecord/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.peteonrails.com/2010/04/oracle-spatial-support-in-spatial_adapter-for-activerecord/</feedburner:origLink></item>
		<item>
		<title>Goodbye TextMate</title>
		<link>http://feedproxy.google.com/~r/PeteOnRails/~3/HsAzWAPjMqw/</link>
		<comments>http://blog.peteonrails.com/2010/03/goodbye-textmate/#comments</comments>
		<pubDate>Fri, 26 Mar 2010 05:10:45 +0000</pubDate>
		<dc:creator>pete</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.peteonrails.com/?p=217</guid>
		<description><![CDATA[I've been using TextMate to develop Ruby on Rails applications for a very long time. But as of today, I'm abandoning TextMate.

After making the decision that I couldn't continue to work in a professional setting with an editor that contains so many productivity-sapping limitations for me, I decided to switch. 

Find out what I tried, and what I ended up using. 


]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been using TextMate to develop Ruby on Rails applications for a very long time. But as of today, I&#8217;m abandoning TextMate. And <a href="http://pivotallabs.com/users/alex/blog/articles/1201-textmate-the-last-straw">I&#8217;m not the only one.</a></p>
<p>For me, the last straw with TextMate was the issue illustrated<a href="http://blog.peteonrails.com/wp-content/uploads/2010/03/iShowU-Capture2.mov"> in this video</a>. When you have all of your methods folded up, and you delete a line of whitespace that follows a folded up block of code, the editor will in fact delete the entire folded up code block. This might be working as expected, but I expect better.</p>
<p>Some other annoyances I&#8217;ve had with TextMate include:</p>
<ul>
<li>Random Pinwheeling (lockups that take unspecified amounts of time to clear)</li>
<li>Sluggish performance</li>
<li>Drawer behavior: When I want it on the left, I want it on the left. Even if my window is too close to the left side of my monitor. STOP OPENING ON THE RIGHT! DO YOU HEAR ME! (excerpt from an actual conversation with TextMate).</li>
<li>No significant updates in over two years. Not even the kind you pay for.  I guess the upside of this is that any Bundles you find are pretty well guaranteed to work with your version of TextMate, because there&#8217;s really only one version.</li>
</ul>
<p>After making the decision that I couldn&#8217;t continue to work in a professional setting with an editor that contains so many productivity-sapping limitations for me, I decided to switch.</p>
<p>I found that in making my list of requirements for a replacement editor, the beginning of it was an enumeration of what sucks about TextMate. I needed:</p>
<ol>
<li> Fast Search in Project</li>
<li> Fast &#8220;Find Usages&#8221;</li>
<li> A lack of code-munching bugs.</li>
</ol>
<p>But  there are a lot of things that I like about TextMate. I wanted to keep those features too:</p>
<ol>
<li>Autosave</li>
<li>Fuzzy Match</li>
<li>Strong Ruby Language Support</li>
<li>HAML and SASS support</li>
<li>Modules / Plugins / Bundles</li>
<li>No Crashing</li>
<li>Themes and control over colorization</li>
</ol>
<p>First, I checked out <a href="http://www.jetbrains.com/ruby/index.html">RubyMine</a>, but found that it crashed and froze on me a lot. I can&#8217;t have a code editor that crashes or freezes a lot. Alex Chaffee of Pivotal Labs likes RubyMate, however, so your mileage may vary. It&#8217;s worth checking out. <a href="http://www.jetbrains.com/ruby/download/index.html">And you can check it out for free</a>.</p>
<p>Next I investigated <a href="http://www.panic.com/coda/">Coda</a>: it&#8217;s pretty, but doesn&#8217;t have a made-for-ruby feel to it. It&#8217;s got a very extensible plugin framework, and a lot of plugins made for it, but a couple of key plugins were missing, and I can&#8217;t afford to take the time to write the plugins right now.</p>
<p>Then I tried BBEdit: nice, but again: not enough support through plugins for the kinds of ruby development I do.</p>
<p>Then MacVim: which is awesome but I HATE &#8216;vi&#8217; (if I&#8217;m going to use a UNIX editor for programming, it&#8217;s going to be emacs).</p>
<p>Finally, I decided to try <a href="http://netbeans.org/">NetBeans</a>, and found everything I needed, and some stuff I didn&#8217;t even KNOW I needed. I was genuinely surprised that I liked NetBeans, given its background as a Java IDE. But the Ruby modules for Netbeans are very nice. Here&#8217;s what I liked the most, in no particular order:</p>
<ul>
<li>Autotest, running right in the IDE: I don&#8217;t have to remember to start it in a terminal. It just runs in my IDE.</li>
<li>Search. It&#8217;s Fast. And I didn&#8217;t have to install Ack In Project to make it so.</li>
<li>When my continuous integration build fails, my IDE is notified, and it tells me so.</li>
<li>It integrates with bug trackers.</li>
</ul>
<p>Aside from the &#8220;search&#8221; item, I didn&#8217;t even know I needed half of that stuff. But now that I have it, I can&#8217;t go back.</p>
<p>I still use TextMate for a basic editor, and still love the column-wise cut-and-paste feature. But I won&#8217;t use it for development anymore.</p>
<p>So long, TextMate. It&#8217;s been a ride.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=HsAzWAPjMqw:HdCgOOxvtFg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=HsAzWAPjMqw:HdCgOOxvtFg:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=HsAzWAPjMqw:HdCgOOxvtFg:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=HsAzWAPjMqw:HdCgOOxvtFg:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=HsAzWAPjMqw:HdCgOOxvtFg:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=HsAzWAPjMqw:HdCgOOxvtFg:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=HsAzWAPjMqw:HdCgOOxvtFg:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=HsAzWAPjMqw:HdCgOOxvtFg:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PeteOnRails/~4/HsAzWAPjMqw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.peteonrails.com/2010/03/goodbye-textmate/feed/</wfw:commentRss>
		<slash:comments>30</slash:comments>
<enclosure url="http://blog.peteonrails.com/wp-content/uploads/2010/03/iShowU-Capture2.mov" length="1377823" type="video/quicktime" />
		<feedburner:origLink>http://blog.peteonrails.com/2010/03/goodbye-textmate/</feedburner:origLink></item>
		<item>
		<title>New Rails Plugin Available: YAML Twitter OAuth</title>
		<link>http://feedproxy.google.com/~r/PeteOnRails/~3/tDAsi8PYjIY/</link>
		<comments>http://blog.peteonrails.com/2009/11/new-rails-plugin-available-yaml-twitter-oauth/#comments</comments>
		<pubDate>Wed, 18 Nov 2009 01:19:06 +0000</pubDate>
		<dc:creator>pete</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.peteonrails.com/?p=200</guid>
		<description><![CDATA[When I build Twitter OAuth apps, I usually register three apps. One for development purposes, one for staging and user-acceptance testing, and the production application. Each of these registered apps will have a different Twitter OAuth Consumer Token and Secret. Instead of writing procedural code to set the right tokens up for each environment, or [...]]]></description>
			<content:encoded><![CDATA[<p>When I build Twitter OAuth apps, I usually register three apps. One for development purposes, one for staging and user-acceptance testing, and the production application. Each of these registered apps will have a different Twitter OAuth Consumer Token and Secret. Instead of writing procedural code to set the right tokens up for each environment, or setting them in the various environment/*.rb files, I prefer to set them up declaratively like you do in database.yml.</p>
<p>I&#8217;ve extracted the basic code i use to do this and published it as a simple plugin called <a title="yaml_twitter_oauth" href="http://github.com/peteonrails/yaml_twitter_oauth">yaml_twitter_oauth</a>.</p>
<p>It allows you to set up your consumer tokens like this:</p>

<div class="wp_syntax"><div class="code"><pre>defaults: &amp;defaults
  request_token_url: http://twitter.com/oauth/request_token
  access_token_url: http://twitter.com/oauth/access_token
  authorize_url: http://twitter.com/oauth/authorize
&nbsp;
development:
  &lt;&lt;: *defaults
  consumer_key: 12345678
  consumer_secret: this-is-your-application-secret
&nbsp;
staging:
  &lt;&lt;: *defaults
  consumer_key: 12345678
  consumer_secret: this-is-your-application-secret
&nbsp;
production:
  &lt;&lt;: *defaults
  consumer_key: 12345678
  consumer_secret: this-is-your-application-secret</pre></div></div>

<p>It&#8217;s also useful if you want to regenerate your secret key and need a simple declarative way to update it. </p>
<p>To install the plugin:</p>

<div class="wp_syntax"><div class="code"><pre class="bash"> script<span style="color: #000000; font-weight: bold;">/</span>plugin <span style="color: #c20cb9; font-weight: bold;">install</span> git:<span style="color: #000000; font-weight: bold;">//</span>github.com<span style="color: #000000; font-weight: bold;">/</span>peteonrails<span style="color: #000000; font-weight: bold;">/</span>yaml_twitter_oauth.git</pre></div></div>

<p>Enjoy! </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=tDAsi8PYjIY:Q6ze6mbWb24:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=tDAsi8PYjIY:Q6ze6mbWb24:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=tDAsi8PYjIY:Q6ze6mbWb24:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=tDAsi8PYjIY:Q6ze6mbWb24:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=tDAsi8PYjIY:Q6ze6mbWb24:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=tDAsi8PYjIY:Q6ze6mbWb24:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=tDAsi8PYjIY:Q6ze6mbWb24:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=tDAsi8PYjIY:Q6ze6mbWb24:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PeteOnRails/~4/tDAsi8PYjIY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.peteonrails.com/2009/11/new-rails-plugin-available-yaml-twitter-oauth/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://blog.peteonrails.com/2009/11/new-rails-plugin-available-yaml-twitter-oauth/</feedburner:origLink></item>
		<item>
		<title>VoteFu is now available on GemCutter</title>
		<link>http://feedproxy.google.com/~r/PeteOnRails/~3/QcZRmO33JW4/</link>
		<comments>http://blog.peteonrails.com/2009/11/votefu-is-now-available-on-gemcutter/#comments</comments>
		<pubDate>Sat, 14 Nov 2009 10:48:24 +0000</pubDate>
		<dc:creator>pete</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.peteonrails.com/?p=191</guid>
		<description><![CDATA[@alexanderkahn asked me via Twitter whether I&#8217;d be pushing VoteFu to GemCutter. To tell you the truth, I hadn&#8217;t really thought about it. But, it does seem to be what all the cool kids are doing. Want to see how easy it was to move to GemCutter? ping:$ sudo gem install gemcutter Password: &#160; ======================================================================== [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-thumbnail wp-image-195" title="gem" src="http://blog.peteonrails.com/wp-content/uploads/2009/11/gem-150x150.jpg" alt="gem" width="150" height="150" />@alexanderkahn asked me via <a class="zem_slink" title="Twitter" rel="homepage" href="http://twitter.com/">Twitter</a> whether I&#8217;d be pushing VoteFu to GemCutter. To tell you the truth, I hadn&#8217;t really thought about it. But, it does seem to be what all the cool kids are doing.</p>
<p>Want to see how easy it was to move to GemCutter?</p>

<div class="wp_syntax"><div class="code"><pre class="bash"><span style="color: #c20cb9; font-weight: bold;">ping</span>:$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> gem <span style="color: #c20cb9; font-weight: bold;">install</span> gemcutter
Password:
&nbsp;
========================================================================
&nbsp;
           Thanks <span style="color: #000000; font-weight: bold;">for</span> installing Gemcutter<span style="color: #000000; font-weight: bold;">!</span> You can now run:
&nbsp;
    gem tumble        use Gemcutter <span style="color: #c20cb9; font-weight: bold;">as</span> your primary RubyGem <span style="color: #7a0874; font-weight: bold;">source</span>
    gem push          publish your gems <span style="color: #000000; font-weight: bold;">for</span> the world to use and enjoy
    gem migrate       take over your gem from <span style="color: #000000; font-weight: bold;">&lt;</span>a <span style="color: #007800;">class=</span><span style="color: #ff0000;">&quot;zem_slink&quot;</span> <span style="color: #007800;">title=</span><span style="color: #ff0000;">&quot;RubyForge&quot;</span> <span style="color: #007800;">rel=</span><span style="color: #ff0000;">&quot;homepage&quot;</span> <span style="color: #007800;">href=</span><span style="color: #ff0000;">&quot;http://rubyforge.org/&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span>RubyForge<span style="color: #000000; font-weight: bold;">&lt;/</span>a<span style="color: #000000; font-weight: bold;">&gt;</span> on Gemcutter
    gem owner         allow<span style="color: #000000; font-weight: bold;">/</span>disallow others to push to your gems
&nbsp;
========================================================================
&nbsp;
Successfully installed gemcutter<span style="color: #000000;">-0.1</span><span style="color: #000000;">.6</span>
<span style="color: #000000;">1</span> gem installed
Installing ri documentation <span style="color: #000000; font-weight: bold;">for</span> gemcutter<span style="color: #000000;">-0.1</span><span style="color: #000000;">.6</span>...
Installing RDoc documentation <span style="color: #000000; font-weight: bold;">for</span> gemcutter<span style="color: #000000;">-0.1</span><span style="color: #000000;">.6</span>...
<span style="color: #c20cb9; font-weight: bold;">ping</span>: Pete$ gem tumble
Thanks <span style="color: #000000; font-weight: bold;">for</span> using Gemcutter<span style="color: #000000; font-weight: bold;">!</span>
Your gem sources are now:
- http:<span style="color: #000000; font-weight: bold;">//</span>gemcutter.org
- http:<span style="color: #000000; font-weight: bold;">//</span>gems.rubyforge.org
- http:<span style="color: #000000; font-weight: bold;">//</span>gems.github.com
<span style="color: #c20cb9; font-weight: bold;">ping</span>:workspace Pete$ <span style="color: #7a0874; font-weight: bold;">cd</span> vote_fu_harness<span style="color: #000000; font-weight: bold;">/</span>vendor<span style="color: #000000; font-weight: bold;">/</span>plugins<span style="color: #000000; font-weight: bold;">/</span>vote_fu<span style="color: #000000; font-weight: bold;">/</span>
<span style="color: #c20cb9; font-weight: bold;">ping</span>:vote_fu Pete$ <span style="color: #c20cb9; font-weight: bold;">ls</span>
CHANGELOG.markdown      README.markdown         examples                init.rb                 rails                   <span style="color: #7a0874; font-weight: bold;">test</span>
MIT-LICENSE             db                      generators              lib                     spec                    vote_fu.gemspec
<span style="color: #c20cb9; font-weight: bold;">ping</span>:vote_fu Pete$ gem build vote_fu.gemspec
WARNING:  no rubyforge_project specified
  Successfully built RubyGem
  Name: vote_fu
  Version: <span style="color: #000000;">0.0</span><span style="color: #000000;">.11</span>
  File: vote_fu<span style="color: #000000;">-0.0</span><span style="color: #000000;">.11</span>.gem
<span style="color: #c20cb9; font-weight: bold;">ping</span>:vote_fu Pete$ gem push vote_fu<span style="color: #000000;">-0.0</span><span style="color: #000000;">.11</span>.gem
Enter your Gemcutter credentials. Don<span style="color: #ff0000;">'t have an account yet? Create one at http://gemcutter.org/sign_up
Email:   pete@peteonrails.com
Password:
Signed in. Your api key has been stored in ~/.gemrc
Pushing gem to Gemcutter...
Successfully registered gem: vote_fu (0.0.11)
ping:vote_fu Pete$
</span</pre></div></div>

<p>Scarily easy. In under 3 minutes I have a new primary gem source and am set up to publish to GemCutter.</p>
<p>So, why would one want o host Gems on GemCutter? I asked the same question. In a nutshell:</p>
<ol>
<li>Download counts are shown inline</li>
<li>Build locally, then push-to-publish. No more waiting to make your way through DJ, BJ, Resque, or whatever the background framework of the day is at <a class="zem_slink" title="GitHub" rel="homepage" href="http://github.com">GitHub</a>.</li>
<li>It&#8217;s nothing but gem hosting, so it&#8217;ll probably grow to do gem hosting really well.</li>
<li>It&#8217;s ThoughtBot. I like the ThoughtBot guys.</li>
</ol>
<p>So, there&#8217;s no real compelling reason to run out and move your gems to GemCutter, but if your users ask you to do it, it takes 3 minutes or less.</p>
<div class="zemanta-pixie" style="margin-top: 10px; height: 15px;"><a class="zemanta-pixie-a" title="Reblog this post [with Zemanta]" href="http://reblog.zemanta.com/zemified/a240f45a-6168-42d3-808c-922211278fb5/"><img class="zemanta-pixie-img" style="border: none; float: right;" src="http://img.zemanta.com/reblog_e.png?x-id=a240f45a-6168-42d3-808c-922211278fb5" alt="Reblog this post [with Zemanta]" /></a><span class="zem-script more-related pretty-attribution"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=QcZRmO33JW4:eXpYIbFNoSM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=QcZRmO33JW4:eXpYIbFNoSM:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=QcZRmO33JW4:eXpYIbFNoSM:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=QcZRmO33JW4:eXpYIbFNoSM:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=QcZRmO33JW4:eXpYIbFNoSM:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=QcZRmO33JW4:eXpYIbFNoSM:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=QcZRmO33JW4:eXpYIbFNoSM:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=QcZRmO33JW4:eXpYIbFNoSM:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PeteOnRails/~4/QcZRmO33JW4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.peteonrails.com/2009/11/votefu-is-now-available-on-gemcutter/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<feedburner:origLink>http://blog.peteonrails.com/2009/11/votefu-is-now-available-on-gemcutter/</feedburner:origLink></item>
		<item>
		<title>How I became convinced to use db:populate instead of db:migrate with inline data seeding, and why you should too.</title>
		<link>http://feedproxy.google.com/~r/PeteOnRails/~3/TnJnGwM_cj0/</link>
		<comments>http://blog.peteonrails.com/2009/11/how-i-became-convinced-to-use-dbpopulate-instead-of-dbmigrate-with-inline-data-seeding-and-why-you-should-too/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 06:28:40 +0000</pubDate>
		<dc:creator>pete</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.peteonrails.com/?p=161</guid>
		<description><![CDATA[There&#8217;s a lot of established debate and best practice around how to populate your database with the initial reference data it needs in order to operate. I&#8217;m not going to rehash that here. If you&#8217;re interested in the options available for seeding data, read Luke Franci&#8217;s article on Rails Spikes. Many people I work with [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-thumbnail wp-image-178" title="iStock_000002051165XSmall" src="http://blog.peteonrails.com/wp-content/uploads/2009/11/iStock_000002051165XSmall-150x150.jpg" alt="iStock_000002051165XSmall" width="150" height="150" />There&#8217;s a lot of established debate and best practice around how to populate your database with the initial reference data it needs in order to operate. I&#8217;m not going to rehash that here. If you&#8217;re interested in the options available for seeding data, <a href="http://railspikes.com/2008/2/1/loading-seed-data">read Luke Franci&#8217;s article on Rails Spikes.</a> Many people I work with seem to like &#8220;db:populate&#8221; which, while very nice and flexible, always seemed like a little bit of overkill to me.</p>
<p>I was always in favor of seeding short reference data right in the migration like this:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby"><span style="color:#9966CC; font-weight:bold;">class</span> CreateTestScopes <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Migration</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">up</span>
    create_table <span style="color:#ff3333; font-weight:bold;">:test_scopes</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>t<span style="color:#006600; font-weight:bold;">|</span>
      t.<span style="color:#CC0066; font-weight:bold;">string</span>  :name
      t.<span style="color:#9900CC;">timestamps</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    <span style="color:#006600; font-weight:bold;">%</span>w<span style="color:#006600; font-weight:bold;">&#40;</span>first second third<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>e<span style="color:#006600; font-weight:bold;">|</span>
       TestScope.<span style="color:#9900CC;">create</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:name</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> e<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;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">down</span>
    drop_table <span style="color:#ff3333; font-weight:bold;">:test_scopes</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>JUST TO BE CLEAR: we&#8217;re talking about production reference data that the application requires in order to run. We are not talking about TEST data, which belongs in mocks or (gasp) fixtures. A really good example of legitimate production seed data is the creation of the out-of-box Administrative user.</p>
<p>And if I had to update my reference data, I was also a fan of including it in the migration. After all, it&#8217;s reference data, not test data, fixture data (eww!) or user data.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby"><span style="color:#9966CC; font-weight:bold;">class</span> CapitalizeTestScopes <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Migration</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">up</span>
    TestScope.<span style="color:#9900CC;">all</span>.<span style="color:#9900CC;">each</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>t<span style="color:#006600; font-weight:bold;">|</span> t.<span style="color:#9900CC;">name</span> = t.<span style="color:#9900CC;">name</span>.<span style="color:#9900CC;">capitalize</span>; t.<span style="color:#9900CC;">save</span>! <span style="color:#006600; font-weight:bold;">&#125;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">down</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Can't undo, but don't freak out!&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Later, I decided I wanted a sort-order column and decided to add something like this:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby"><span style="color:#9966CC; font-weight:bold;">class</span> AddSortOrderToTestScopes <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Migration</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">up</span>
    add_column <span style="color:#ff3333; font-weight:bold;">:test_scopes</span>, <span style="color:#ff3333; font-weight:bold;">:sort_order</span>, <span style="color:#ff3333; font-weight:bold;">:integer</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#008000; font-style:italic;"># omit self.down ....</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> TestScope <span style="color:#006600; font-weight:bold;">&amp;</span>lt; <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  default_scope <span style="color:#ff3333; font-weight:bold;">:order</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;sort_order&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>And here&#8217;s the crux of the issue:</p>
<p>By adding a column that the model depends on in the default_scope, we&#8217;ve made it a requirement for the sort_order column to be present in order to load and query the model object. That&#8217;s fine for me. This migration will run with no errors on my workstation, provided that I ran db:migrate immediately prior to my latest changeset.</p>
<p>However, if you want to come up to speed on my project, you cannot do this:</p>

<div class="wp_syntax"><div class="code"><pre class="bash"> bash<span style="color: #666666; font-style: italic;"># rake db:setup</span>
 bash<span style="color: #666666; font-style: italic;"># rake db:migrate</span></pre></div></div>

<p>Because here&#8217;s what will happen:</p>

<div class="wp_syntax"><div class="code"><pre class="bash">==  CapitalizeTestScopes: migrating ===========================================
rake aborted<span style="color: #000000; font-weight: bold;">!</span>
An error has occurred, this and all later migrations canceled:
&nbsp;
SQLite3::SQLException: no such column: sort_order: SELECT <span style="color: #000000; font-weight: bold;">*</span> FROM <span style="color: #ff0000;">&quot;test_scopes&quot;</span>  ORDER BY sort_order</pre></div></div>

<p>Since we&#8217;re using the ActiveRecord object to do our reference updates (which is A GOOD THING, since we get validations and abbreviated syntax), we can&#8217;t have dependencies in the default scope that are not defined before the first use of the ActiveRecord object in our migrations.</p>
<p>A lot of folks argue that migrations are not reliable and shouldn&#8217;t be the way you&#8217;re creating your schema in the first place. To that, I respectfully say, &#8220;You&#8217;re wrong.&#8221;</p>
<p>It is only because we developers make boneheaded mistakes like the one outlined above that we cannot rely on migrations to rebuild our schema incrementally from migrations. Rather than be boneheaded, we should <strong>be awesome instead</strong> and fix the migration dependencies by moving the data seeding out to a db:populate or other rake task that operates on a completely built data structure. (I know: this is not in line with the movement toward schema.rb as the authoritative source of the database structure. I&#8217;m not up for arguing that point today, but I will argue it.)</p>
<p>The answer is to do this:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby"><span style="color:#008000; font-style:italic;"># file: db/migrate/X_create_test_scopes.rb</span>
<span style="color:#9966CC; font-weight:bold;">class</span> CreateTestScopes <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Migration</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">up</span>
    create_table <span style="color:#ff3333; font-weight:bold;">:test_scopes</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>t<span style="color:#006600; font-weight:bold;">|</span>
      t.<span style="color:#CC0066; font-weight:bold;">string</span>  <span style="color:#ff3333; font-weight:bold;">:name</span>
      t.<span style="color:#9900CC;">timestamps</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> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">down</span>
    drop_table <span style="color:#ff3333; font-weight:bold;">:test_scopes</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># File: db/populate/001_seed_scopes.rb</span>
<span style="color:#006600; font-weight:bold;">%</span>w<span style="color:#006600; font-weight:bold;">&#40;</span>first second third<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>e<span style="color:#006600; font-weight:bold;">|</span>
   TestScope.<span style="color:#9900CC;">create</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:name</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> e<span style="color:#006600; font-weight:bold;">&#41;</span>
 <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Then, when you have to capitalize your model data:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby"><span style="color:#008000; font-style:italic;"># File: db/populate/002_capitalize_scopes.rb</span>
TestScope.<span style="color:#9900CC;">all</span>.<span style="color:#9900CC;">each</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>t<span style="color:#006600; font-weight:bold;">|</span> t.<span style="color:#9900CC;">name</span> = t.<span style="color:#9900CC;">name</span>.<span style="color:#9900CC;">capitalize</span>; t.<span style="color:#9900CC;">save</span>! <span style="color:#006600; font-weight:bold;">&#125;</span></pre></div></div>

<p>And then when you add the sort order:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby"><span style="color:#9966CC; font-weight:bold;">class</span> AddSortOrderToTestScopes <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Migration</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">up</span>
    add_column <span style="color:#ff3333; font-weight:bold;">:test_scopes</span>, <span style="color:#ff3333; font-weight:bold;">:sort_order</span>, <span style="color:#ff3333; font-weight:bold;">:integer</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#008000; font-style:italic;"># omit self.down ....</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> TestScope <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  default_scope <span style="color:#ff3333; font-weight:bold;">:order</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;sort_order&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># file db/populate/003_seed_sort_order.rb</span>
TestScope.<span style="color:#9900CC;">each_with_index</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>e, i<span style="color:#006600; font-weight:bold;">|</span> e.<span style="color:#9900CC;">sort_order</span> = i; e.<span style="color:#9900CC;">save</span>! <span style="color:#006600; font-weight:bold;">&#125;</span></pre></div></div>

<p>Voila! You can run db:migrate with a fresh database and have no errors.</p>
<p>So far, when I encounter an issue that prevents me from rebuilding my complete schema incrementally using db:migrate, it&#8217;s been a Rails Smell. I haven&#8217;t found a legitimate reason why migrations can&#8217;t be sorted out to build cleanly every time. If you can&#8217;t rebuild your database incrementally using migrations, it&#8217;s likely that you&#8217;re doing something wrong.</p>
<p>I ignored this debate for a long time because it didn&#8217;t really affect me. Don&#8217;t be like me. Save yourself the trouble of unwinding your migration mess and use an outside seeding package like db:populate.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=TnJnGwM_cj0:arja28T5gjU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=TnJnGwM_cj0:arja28T5gjU:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=TnJnGwM_cj0:arja28T5gjU:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=TnJnGwM_cj0:arja28T5gjU:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=TnJnGwM_cj0:arja28T5gjU:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=TnJnGwM_cj0:arja28T5gjU:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=TnJnGwM_cj0:arja28T5gjU:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=TnJnGwM_cj0:arja28T5gjU:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PeteOnRails/~4/TnJnGwM_cj0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.peteonrails.com/2009/11/how-i-became-convinced-to-use-dbpopulate-instead-of-dbmigrate-with-inline-data-seeding-and-why-you-should-too/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.peteonrails.com/2009/11/how-i-became-convinced-to-use-dbpopulate-instead-of-dbmigrate-with-inline-data-seeding-and-why-you-should-too/</feedburner:origLink></item>
		<item>
		<title>MyQuotable source code available again</title>
		<link>http://feedproxy.google.com/~r/PeteOnRails/~3/6q8MHLLoPeI/</link>
		<comments>http://blog.peteonrails.com/2009/04/myquotable-source-code-available-again/#comments</comments>
		<pubDate>Fri, 03 Apr 2009 18:17:03 +0000</pubDate>
		<dc:creator>pete</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.peteonrails.com/?p=148</guid>
		<description><![CDATA[I took the MyQuotable example code down from github for a little while because I&#8217;d hosed it up trying to convert it into a facebook application. A few users have emailed me in the past month or so asking where the code is located. I&#8217;ve just republished the source code, so you can again download [...]]]></description>
			<content:encoded><![CDATA[<p>I took the MyQuotable example code down from github for a little while because I&#8217;d hosed it up trying to convert it into a facebook application. A few users have emailed me in the past month or so asking where the code is located. </p>
<p>I&#8217;ve just republished the source code, so you can again download my example application for VoteFu. </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=6q8MHLLoPeI:9QEDrvhPeTg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=6q8MHLLoPeI:9QEDrvhPeTg:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=6q8MHLLoPeI:9QEDrvhPeTg:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=6q8MHLLoPeI:9QEDrvhPeTg:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=6q8MHLLoPeI:9QEDrvhPeTg:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=6q8MHLLoPeI:9QEDrvhPeTg:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=6q8MHLLoPeI:9QEDrvhPeTg:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=6q8MHLLoPeI:9QEDrvhPeTg:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PeteOnRails/~4/6q8MHLLoPeI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.peteonrails.com/2009/04/myquotable-source-code-available-again/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://blog.peteonrails.com/2009/04/myquotable-source-code-available-again/</feedburner:origLink></item>
		<item>
		<title>Why Rails Developers are at such peace with the world.</title>
		<link>http://feedproxy.google.com/~r/PeteOnRails/~3/Rxb4DOclWhg/</link>
		<comments>http://blog.peteonrails.com/2009/03/why-rails-developers-are-at-such-peace-with-the-world/#comments</comments>
		<pubDate>Mon, 16 Mar 2009 14:14:20 +0000</pubDate>
		<dc:creator>pete</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[humor]]></category>

		<guid isPermaLink="false">http://blog.peteonrails.com/?p=145</guid>
		<description><![CDATA[Because they already know the answer to the burning theological question that has ignited fury around the globe for thousands of years. &#91;pete@me.local log&#93;$ which god /usr/local/bin/god]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-169" title="Girl working with laptop in a flowering field" src="http://blog.peteonrails.com/wp-content/uploads/2009/11/iStock_000004133301XSmall.jpg" alt="Girl working with laptop in a flowering field" width="425" height="282" /></p>
<p>Because they already know the answer to the burning theological question that has ignited fury around the globe for thousands of years.</p>

<div class="wp_syntax"><div class="code"><pre class="bash"><span style="color: #7a0874; font-weight: bold;">&#91;</span>pete<span style="color: #000000; font-weight: bold;">@</span>me.<span style="color: #7a0874; font-weight: bold;">local</span> log<span style="color: #7a0874; font-weight: bold;">&#93;</span>$ <span style="color: #c20cb9; font-weight: bold;">which</span> god
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">local</span><span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>god</pre></div></div>

<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=Rxb4DOclWhg:GUzUGZKx6uE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=Rxb4DOclWhg:GUzUGZKx6uE:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=Rxb4DOclWhg:GUzUGZKx6uE:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=Rxb4DOclWhg:GUzUGZKx6uE:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=Rxb4DOclWhg:GUzUGZKx6uE:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=Rxb4DOclWhg:GUzUGZKx6uE:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=Rxb4DOclWhg:GUzUGZKx6uE:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=Rxb4DOclWhg:GUzUGZKx6uE:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PeteOnRails/~4/Rxb4DOclWhg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.peteonrails.com/2009/03/why-rails-developers-are-at-such-peace-with-the-world/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		<feedburner:origLink>http://blog.peteonrails.com/2009/03/why-rails-developers-are-at-such-peace-with-the-world/</feedburner:origLink></item>
		<item>
		<title>The Case for Story Points</title>
		<link>http://feedproxy.google.com/~r/PeteOnRails/~3/1en_GSxXzjo/</link>
		<comments>http://blog.peteonrails.com/2009/02/the-case-for-story-points/#comments</comments>
		<pubDate>Thu, 05 Feb 2009 23:16:07 +0000</pubDate>
		<dc:creator>pete</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[estimation]]></category>
		<category><![CDATA[planning]]></category>
		<category><![CDATA[scrum]]></category>

		<guid isPermaLink="false">http://blog.peteonrails.com/?p=139</guid>
		<description><![CDATA[Scrum Masters embarking on a project or converting a team from conventional development to Scrum often run into one big roadblock: convincing the stakeholders to use Agile Estimation techniques. One of the most important and success-inducing things you can do when estimating an Agile project is to abandon the &#8220;hour&#8221; as the unit of estimation [...]]]></description>
			<content:encoded><![CDATA[<p>Scrum Masters embarking on a project or converting a team from conventional development to Scrum often run into one big roadblock: convincing the stakeholders to use Agile Estimation techniques. One of the most important and success-inducing things you can do when estimating an Agile project is to abandon the &#8220;hour&#8221; as the unit of estimation in favor of &#8220;story points&#8221;.</p>
<p>The idea is, instead of using &#8220;hours&#8221; to estimate how long a story will take to complete, you instead have the team use an arbitrary figure called a &#8220;story point&#8221;. So, a new input field on a web page might be &#8220;1 point&#8221;. A new login screen is probably &#8220;3 points&#8221;. And adding a new payment gateway may be &#8220;8 points&#8221;.</p>
<p>Each iteration will then have a point value assigned to it. For example, Iteration 6 may be &#8220;23 points&#8221;. When your team completes all of the functionality, the team&#8217;s velocity is &#8220;23 story points per iteration&#8221;. Savvy Scrum Masters will calculate Velocity as the moving average of the last 4 iterations.</p>
<p>Why bother ditching the &#8220;hour&#8221;? Here&#8217;s why:</p>
<ol>
<li> It eliminates preconceived notions about how much code can be written in a day.</li>
<li>It eliminates the &#8220;Day&#8221; as an important unit of measure.</li>
<li>It forces you to forecast completion of your project based on evidence. If you estimate in hours, you&#8217;re already forecasting. If you estimate in points, you&#8217;re simply measuring complexity in relative terms and relying on past performance to predict future results. In software, that&#8217;s a good thing.</li>
<li>It helps to gel the team. If Joe can do a feature in 8 hours, and Eric can do that same feature in 12 hours, there&#8217;s going to be a disagreement on how much to estimate. Instead, shouldn&#8217;t Joe and Eric agree that &#8220;Two new fields on the screen is twice as big as one new field on the screen?&#8221; Over time, the difference in coding productivity between your team members will be abstracted away by the estimation technique, which allows each team member to play to their own strengths without being measures in widgets-per-hour.</li>
<li>It ends up being more accurate after 2 or 3 iterations.</li>
<li>It avoids the mythical man month problem. By insisting that you forecast based on evidence, a manager cannot offer to double the team size and cut the deadline in half.</li>
</ol>
<p>There are lots more benefits. There are books full of the benefits. Read them.</p>
<p>In convincing stakeholders to allow the engineering team to use Story Points, I have run into several objections. Here they are, along with the answers that I use.</p>
<p><strong>Objection: </strong>But if your numbers don&#8217;t map to hours, how do I know how long something will take?</p>
<p><strong>Answer:</strong> You use Velocity, as calculated by the evidence of progress your team produces, and map target dates based on what actually happened instead of a gut feeling.</p>
<p><strong>Objection:</strong> But then how do you know how much more you can get done by adding more resources to the project?</p>
<p><strong>Answer:</strong> Again, you use the evidence. Adding a new team member doesn&#8217;t immediately produce a faster tempo on a project. There is no way to know how a new team member will contribute to a self-organizing team until you see them perform. As that team member ramps up, the team will eventually start producing more story points per iteration. You will only take on work in a sprint that you historically could complete, and as you start completing all of the committed work faster, your velocity increases. The team is continually winning instead of lagging. If you instead use &#8220;hours&#8221; to estimate, you&#8217;d be tempted to just add &#8220;40 hours&#8221; to the velocity. That&#8217;s a guess, and it&#8217;ll be wrong every time.</p>
<p><strong>Objection</strong>: But then how do I calculate what a project costs me?<strong></strong></p>
<p><strong>Answer</strong>: If you have all of the members of a Scrum team properly allocated, and you have an accurate forecast of the completion date, then you can easily calculate the project labor cost using very simple math. If you use hours instead, you use the same simple math, it&#8217;ll just be inaccurate.</p>
<p><strong>Objection:</strong> But then how do I know how much overtime to ask the developers to work in order to meet my deadlines?</p>
<p><strong>Answer:</strong> Forcing overtime to meet deadlines is a Scrum Smell. It means you are planning poorly, sticking to unreasonable deadlines, sacrificing quality, or the team is failing because of some organizational, process, or performance issue. That said, it is sometimes necessary to work overtime. Rather than tell everyone they need to work 10 extra hours this week to make the deliverable, it&#8217;s actually BETTER to say to your team: &#8220;We have 10 more story points to complete in 2 days, and we&#8217;re only burning 3 points per day.&#8221; If the Scrum Master is good, the team will know what to do. And they&#8217;ll do it as a team.</p>
<p>Good luck! Let me know how it goes.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=1en_GSxXzjo:G7pH1KVZcL8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=1en_GSxXzjo:G7pH1KVZcL8:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=1en_GSxXzjo:G7pH1KVZcL8:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=1en_GSxXzjo:G7pH1KVZcL8:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=1en_GSxXzjo:G7pH1KVZcL8:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=1en_GSxXzjo:G7pH1KVZcL8:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=1en_GSxXzjo:G7pH1KVZcL8:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=1en_GSxXzjo:G7pH1KVZcL8:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PeteOnRails/~4/1en_GSxXzjo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.peteonrails.com/2009/02/the-case-for-story-points/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		<feedburner:origLink>http://blog.peteonrails.com/2009/02/the-case-for-story-points/</feedburner:origLink></item>
		<item>
		<title>MyQuotable.com Source Code released</title>
		<link>http://feedproxy.google.com/~r/PeteOnRails/~3/qmQ2VVXwuA8/</link>
		<comments>http://blog.peteonrails.com/2008/12/myquotablecom-source-code-released/#comments</comments>
		<pubDate>Thu, 04 Dec 2008 19:48:38 +0000</pubDate>
		<dc:creator>pete</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://blog.peteonrails.com/?p=130</guid>
		<description><![CDATA[A number of VoteFu users have asked me for help integrating VoteFu into their codebase. I recognize that this means I&#8217;ve probably left the documentation lacking in a couple of places, but in order to immediately help those folks who want a reference implementation of VoteFu, I am releasing the full source code of MyQuotable.com. [...]]]></description>
			<content:encoded><![CDATA[<p>A number of VoteFu users have asked me for help integrating VoteFu into their codebase. I recognize that this means I&#8217;ve probably left the documentation lacking in a couple of places, but in order to immediately help those folks who want a reference implementation of VoteFu, I am releasing the full source code of <a href="http://www.myquotable.com">MyQuotable.com</a>. </p>
<p>MyQuotable was a fun distraction for me, but frankly, I really wrote it so I could have a POC application for VoteFu and a couple other plugins. it doesn&#8217;t have any particularly useful Intellectual Property and it&#8217;s not the Next Big Thing. So it doesn&#8217;t make sense to keep the source closed. </p>
<p>You can get the <a href="http://github.com/peteonrails/myquotable/tree/master">source code from GitHub.</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=qmQ2VVXwuA8:c7rK9OawLVQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=qmQ2VVXwuA8:c7rK9OawLVQ:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=qmQ2VVXwuA8:c7rK9OawLVQ:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=qmQ2VVXwuA8:c7rK9OawLVQ:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=qmQ2VVXwuA8:c7rK9OawLVQ:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=qmQ2VVXwuA8:c7rK9OawLVQ:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=qmQ2VVXwuA8:c7rK9OawLVQ:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=qmQ2VVXwuA8:c7rK9OawLVQ:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PeteOnRails/~4/qmQ2VVXwuA8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.peteonrails.com/2008/12/myquotablecom-source-code-released/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://blog.peteonrails.com/2008/12/myquotablecom-source-code-released/</feedburner:origLink></item>
		<item>
		<title>Amusing Javascript Snippet</title>
		<link>http://feedproxy.google.com/~r/PeteOnRails/~3/hdMdrrwA1I8/</link>
		<comments>http://blog.peteonrails.com/2008/12/amusing-javascript-snippet/#comments</comments>
		<pubDate>Wed, 03 Dec 2008 18:21:22 +0000</pubDate>
		<dc:creator>pete</dc:creator>
				<category><![CDATA[Blogging]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Snippets]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[funny javascript]]></category>

		<guid isPermaLink="false">http://blog.peteonrails.com/?p=134</guid>
		<description><![CDATA[I saw this posted on Jacqui Maher&#8217;s blog today and was so amused I had to reblog it. if &#40;!&#40;typeof worldHasEnded == &#34;undefined&#34;&#41;&#41; &#123; document.write&#40;&#34;YUP.&#34;&#41;; &#125; else &#123; document.write&#40;&#34;NOPE.&#34;&#41;; &#125; From http://hasthelargehadroncolliderdestroyedtheworldyet.com/. Aside from the very obvious &#8220;you don&#8217;t need to negate that test condition, just reverse your simple if and else clauses&#8221; issue, it&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>I saw this posted on <a href="http://brighter.net">Jacqui Maher&#8217;s blog</a> today and was so amused I had to reblog it.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript"><span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span> worldHasEnded <span style="color: #339933;">==</span> <span style="color: #3366CC;">&quot;undefined&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   document.<span style="color: #000066; font-weight: bold;">write</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;YUP.&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
   document.<span style="color: #000066; font-weight: bold;">write</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;NOPE.&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>From <a href="http://hasthelargehadroncolliderdestroyedtheworldyet.com/"> http://hasthelargehadroncolliderdestroyedtheworldyet.com/</a>.</p>
<p>Aside from the very obvious &#8220;you don&#8217;t need to negate that test condition, just reverse your simple if and else clauses&#8221; issue, it&#8217;s quite amusing.</p>
<p>Clever. I like it.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=hdMdrrwA1I8:b372kJNunMk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=hdMdrrwA1I8:b372kJNunMk:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=hdMdrrwA1I8:b372kJNunMk:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=hdMdrrwA1I8:b372kJNunMk:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=hdMdrrwA1I8:b372kJNunMk:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=hdMdrrwA1I8:b372kJNunMk:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=hdMdrrwA1I8:b372kJNunMk:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=hdMdrrwA1I8:b372kJNunMk:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PeteOnRails/~4/hdMdrrwA1I8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.peteonrails.com/2008/12/amusing-javascript-snippet/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		<feedburner:origLink>http://blog.peteonrails.com/2008/12/amusing-javascript-snippet/</feedburner:origLink></item>
		<item>
		<title>VoteFu 0.0.7</title>
		<link>http://feedproxy.google.com/~r/PeteOnRails/~3/Od1oYX8Ngqs/</link>
		<comments>http://blog.peteonrails.com/2008/12/votefu-007/#comments</comments>
		<pubDate>Tue, 02 Dec 2008 19:44:20 +0000</pubDate>
		<dc:creator>pete</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blog.peteonrails.com/?p=123</guid>
		<description><![CDATA[A couple of contributors forked VoteFu and submitted some patches. I&#8217;ve updated the master branch to integrate the changes. Notably: VoteFu now works as a standard gem in a Ruby application. (i.e. not as a Rails plugin) VoteFu now works as a Rails Gem Plugin. VoteFu now works with Rails 2.2.2. Other assorted small bugfixes. [...]]]></description>
			<content:encoded><![CDATA[<p>A couple of contributors forked VoteFu and submitted some patches. I&#8217;ve updated the master branch to integrate the changes. Notably:</p>
<ul>
<li>VoteFu now works as a standard gem in a Ruby application. (i.e. not as a Rails plugin)</li>
<li>VoteFu now works as a Rails Gem Plugin.</li>
<li>VoteFu now works with Rails 2.2.2.</li>
<li>Other assorted small bugfixes.</li>
</ul>
<p>To install VoteFu as a Gem Plugin:</p>

<div class="wp_syntax"><div class="code"><pre class="bash"><span style="color: #c20cb9; font-weight: bold;">sudo</span> gem <span style="color: #c20cb9; font-weight: bold;">install</span> peteonrails-vote_fu</pre></div></div>

<p>Then in config/environment.rb:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby">  config.<span style="color:#9900CC;">gem</span> <span style="color:#996600;">&quot;peteonrails-vote_fu&quot;</span>, 
     <span style="color:#ff3333; font-weight:bold;">:source</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;http://gems.github.com&quot;</span>, 
     <span style="color:#ff3333; font-weight:bold;">:lib</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;vote_fu&quot;</span></pre></div></div>

<p>And then, optionally:</p>

<div class="wp_syntax"><div class="code"><pre class="bash">rake gems:unpack</pre></div></div>

<p>Special thanks to Jon Maddox and Bence Nagy for the updated code. <a href="http://github.com/peteonrails/vote_fu/tree/master">Check it out yourself!</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=Od1oYX8Ngqs:wtZYU_RxsOs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=Od1oYX8Ngqs:wtZYU_RxsOs:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=Od1oYX8Ngqs:wtZYU_RxsOs:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=Od1oYX8Ngqs:wtZYU_RxsOs:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=Od1oYX8Ngqs:wtZYU_RxsOs:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=Od1oYX8Ngqs:wtZYU_RxsOs:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=Od1oYX8Ngqs:wtZYU_RxsOs:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=Od1oYX8Ngqs:wtZYU_RxsOs:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PeteOnRails/~4/Od1oYX8Ngqs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.peteonrails.com/2008/12/votefu-007/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		<feedburner:origLink>http://blog.peteonrails.com/2008/12/votefu-007/</feedburner:origLink></item>
		<item>
		<title>Book musings: Ubuntu Kung Fu is released and other fun</title>
		<link>http://feedproxy.google.com/~r/PeteOnRails/~3/YhA9spHd1K4/</link>
		<comments>http://blog.peteonrails.com/2008/09/book-musings-ubuntu-kung-fu-is-released-and-other-fun/#comments</comments>
		<pubDate>Wed, 24 Sep 2008 15:32:21 +0000</pubDate>
		<dc:creator>pete</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[books]]></category>

		<guid isPermaLink="false">http://blog.peteonrails.com/?p=114</guid>
		<description><![CDATA[I absolutely LOVE the cover of this book. And the book itself looks pretty decent, though how the author fills 300 pages with tricks and tips on Ubuntu it beyond me. I&#8217;m not sure when it happened, but the technical world starting using amusing pictures of animals on the covers of their books some time [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_113" class="wp-caption alignnone" style="width: 200px"><a href="http://blog.peteonrails.com/wp-content/uploads/2008/09/ktuk.jpg"><img class="size-medium wp-image-113" title="Ubuntu Kung Fu cover" src="http://blog.peteonrails.com/wp-content/uploads/2008/09/ktuk.jpg" alt="Picture of a cute kitten attacking unseen prey" width="190" height="228" /></a><p class="wp-caption-text">Picture of a cute kitten attacking unseen prey</p></div>
<p>I absolutely LOVE the <a href="http://www.pragprog.com/titles/ktuk/ubuntu-kung-fu">cover of this book</a>. And the book itself looks pretty decent, though how the author fills 300 pages with tricks and tips on Ubuntu it beyond me.</p>
<p>I&#8217;m not sure when it happened, but the technical world starting using amusing pictures of animals on the covers of their books some time in the late 1980s or early 1990s, and they seem to be the only ones I can remember. I&#8217;ll bet they typically sell well too.</p>
<p>The first book I can remember buying in this genre was the <a href="http://en.wikipedia.org/wiki/Programming_Perl">Pink Camel Perl book</a> in 1995 or so (it was published in 1991), with a picture of a camel on the front. This book proved to be a long-lived reference guide for me, and now I hold onto it for sentimental value. Interestingly enough, I&#8217;d never have been able to tell you the name of the book, which is &#8220;Programming Perl&#8221;. Here is a picture of it:</p>
<p><a href="http://blog.peteonrails.com/wp-content/uploads/2008/09/9780937175644_cat.gif"><img class="alignnone size-medium wp-image-116" title="Programming Perl, 1st ed" src="http://blog.peteonrails.com/wp-content/uploads/2008/09/9780937175644_cat.gif" alt="" width="180" height="270" /></a></p>
<p><a href="http://blog.peteonrails.com/wp-content/uploads/2008/09/200px-programming_perl.jpg"><br />
</a></p>
<p>Oddly, O&#8217;Reilly kinda blew it with <a href="http://oreilly.com/catalog/9780596001841/">Ant: The Definitive Guide</a>. It has a picture of a lizard on the front. What&#8217;s that about? Wouldn&#8217;t you put a picture of an Ant on the cover of this book?</p>
<p><a href="http://blog.peteonrails.com/wp-content/uploads/2008/09/0596001843_cat.gif"><img class="alignnone size-medium wp-image-117" title="Ant: The definitive guide" src="http://blog.peteonrails.com/wp-content/uploads/2008/09/0596001843_cat.gif" alt="" width="180" height="236" /></a></p>
<p>Compare those three covers with these covers, from two of the most important and influential books in programming:</p>
<p><a href="http://blog.peteonrails.com/wp-content/uploads/2008/09/2364f1.png"><img class="size-medium wp-image-119 alignright" title="2364f1" src="http://blog.peteonrails.com/wp-content/uploads/2008/09/2364f1.png" alt="" width="183" height="235" /></a><a href="http://blog.peteonrails.com/wp-content/uploads/2008/09/180px-kr_c_prog_lang.jpg"><img class="alignleft size-medium wp-image-118" title="180px-kr_c_prog_lang" src="http://blog.peteonrails.com/wp-content/uploads/2008/09/180px-kr_c_prog_lang.jpg" alt="" width="180" height="237" /></a></p>
<p>Boring! But again, these are two very important books based on their content. Care to wager how the relative sales numbers of the Camel Book and K&amp;R look?</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=YhA9spHd1K4:Y4MTGnD6h84:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=YhA9spHd1K4:Y4MTGnD6h84:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=YhA9spHd1K4:Y4MTGnD6h84:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=YhA9spHd1K4:Y4MTGnD6h84:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=YhA9spHd1K4:Y4MTGnD6h84:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=YhA9spHd1K4:Y4MTGnD6h84:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=YhA9spHd1K4:Y4MTGnD6h84:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=YhA9spHd1K4:Y4MTGnD6h84:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PeteOnRails/~4/YhA9spHd1K4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.peteonrails.com/2008/09/book-musings-ubuntu-kung-fu-is-released-and-other-fun/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.peteonrails.com/2008/09/book-musings-ubuntu-kung-fu-is-released-and-other-fun/</feedburner:origLink></item>
		<item>
		<title>A rare post on politics</title>
		<link>http://feedproxy.google.com/~r/PeteOnRails/~3/qW0JyqRtCjs/</link>
		<comments>http://blog.peteonrails.com/2008/09/a-rare-post-on-politics/#comments</comments>
		<pubDate>Sat, 06 Sep 2008 14:58:38 +0000</pubDate>
		<dc:creator>pete</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.peteonrails.com/?p=110</guid>
		<description><![CDATA[I don&#8217;t like to write about politics. However, I am glad to see that I am not the only one who thinks of Bob the Builder every time I hear Barak Obama say, &#8220;Yes we can!&#8221;.]]></description>
			<content:encoded><![CDATA[<p>I don&#8217;t like to write about politics. However, I am glad to see that <a href="http://political-fallout.blogspot.com/2008/01/obama-plagiarizes-bob-builder-in-nh.html">I am not the only one who</a> thinks of Bob the Builder every time I hear Barak Obama say, &#8220;Yes we can!&#8221;.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=qW0JyqRtCjs:STHwHDMnAfQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=qW0JyqRtCjs:STHwHDMnAfQ:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=qW0JyqRtCjs:STHwHDMnAfQ:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=qW0JyqRtCjs:STHwHDMnAfQ:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=qW0JyqRtCjs:STHwHDMnAfQ:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=qW0JyqRtCjs:STHwHDMnAfQ:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=qW0JyqRtCjs:STHwHDMnAfQ:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=qW0JyqRtCjs:STHwHDMnAfQ:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PeteOnRails/~4/qW0JyqRtCjs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.peteonrails.com/2008/09/a-rare-post-on-politics/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.peteonrails.com/2008/09/a-rare-post-on-politics/</feedburner:origLink></item>
		<item>
		<title>Visualizing user interaction with your site.</title>
		<link>http://feedproxy.google.com/~r/PeteOnRails/~3/O74G-Zx-veA/</link>
		<comments>http://blog.peteonrails.com/2008/09/visualizing-user-interaction-with-your-site/#comments</comments>
		<pubDate>Thu, 04 Sep 2008 18:16:34 +0000</pubDate>
		<dc:creator>pete</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://blog.peteonrails.com/?p=108</guid>
		<description><![CDATA[I really like the app on AngelSoft&#8217;s new homepage. A long time ago I created an app that would post messages to the homepage in a ticker when site visitors would do stuff. It was for a liberal political action NGO. From the homepage of this NGO&#8217;s site the ticker would flash messages like &#8220;A [...]]]></description>
			<content:encoded><![CDATA[<p>I really like the app on <a href="http://www.angelsoft.net/">AngelSoft&#8217;s new homepage.</a></p>
<p>A long time ago I created an app that would post messages to the homepage in a ticker when site visitors would do stuff. It was for a liberal political action NGO. From the homepage of this NGO&#8217;s site the ticker would flash messages like &#8220;A member just sent a fax to Senator Jim Webb about Senate Bill 1022&#8243; or &#8220;Bill Jones just became a new member. Welcome Bill!&#8221;</p>
<p>I like how they&#8217;ve taken that concept and put it on a map. Nice.</p>
<p>Funny how we forget cool ideas from long ago. And funny how we forget that there&#8217;s always a chance to build off of old ideas to create newer, better ones. </p>
<p>Great work, AngelSoft. I expect to see a lot of people follow suit. </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=O74G-Zx-veA:-vHQDlOHujc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=O74G-Zx-veA:-vHQDlOHujc:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=O74G-Zx-veA:-vHQDlOHujc:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=O74G-Zx-veA:-vHQDlOHujc:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=O74G-Zx-veA:-vHQDlOHujc:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=O74G-Zx-veA:-vHQDlOHujc:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=O74G-Zx-veA:-vHQDlOHujc:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=O74G-Zx-veA:-vHQDlOHujc:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PeteOnRails/~4/O74G-Zx-veA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.peteonrails.com/2008/09/visualizing-user-interaction-with-your-site/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.peteonrails.com/2008/09/visualizing-user-interaction-with-your-site/</feedburner:origLink></item>
		<item>
		<title>Filed under: “you gotta be kidding me” — Patent issued for Page Up Page Down</title>
		<link>http://feedproxy.google.com/~r/PeteOnRails/~3/0O-y_43Qa-I/</link>
		<comments>http://blog.peteonrails.com/2008/08/filed-under-you-gotta-be-kidding-me-patent-issued-for-page-up-page-down/#comments</comments>
		<pubDate>Thu, 28 Aug 2008 01:27:54 +0000</pubDate>
		<dc:creator>pete</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://blog.peteonrails.com/?p=104</guid>
		<description><![CDATA[Microsoft has been issued a patent on Page-Up/Page-Down functionality (see below). I was annoyed when Amazon patented One-Click-Checkout, but this patent is even more troubling. I have written about Patent craziness before, mostly as it related to &#8220;Submarine Patents&#8221; (i.e. patents for products that will never see the light of day, to the benefit of [...]]]></description>
			<content:encoded><![CDATA[<p>Microsoft has been issued a patent on Page-Up/Page-Down functionality (see below). I was annoyed when Amazon patented One-Click-Checkout, but this patent is even more troubling. I have written about Patent craziness before, mostly as it related to &#8220;Submarine Patents&#8221; (i.e. patents for products that will never see the light of day, to the benefit of the patent-holder).</p>
<p>This tactic is somewhat different. It patents an industry standard that has been in effect for a long time. 30 years ago, computers had page-up and page-down keys on their keyboards. It seems a little late to be seeking protection for such an innovation.</p>
<p>Anyone know the prior art backstory here?</p>
<p>From the <a href="http://www.freepatentsonline.com/7415666.html?query=PN%2F7415666+OR+7415666&amp;stemming=on">FreePatentsOnline</a></p>
<blockquote><p>A method and system in a document viewer for scrolling a substantially exact increment in a document, such as one page, regardless of whether the zoom is such that some, all or one page is currently being viewed. In one implementation, pressing a Page Down or Page Up keyboard key/button allows a user to begin at any starting vertical location within a page, and navigate to that same location on the next or previous page.</p>
<p>For example, if a user is viewing a page starting in a viewing area from the middle of that page and ending at the bottom, a Page Down command will cause the next page to be shown in the viewing area starting at the middle of the next page and ending at the bottom of the next page. Similar behavior occurs when there is more than one column of pages being displayed in a row.</p></blockquote>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=0O-y_43Qa-I:iJW7NkfYiLo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=0O-y_43Qa-I:iJW7NkfYiLo:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=0O-y_43Qa-I:iJW7NkfYiLo:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=0O-y_43Qa-I:iJW7NkfYiLo:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=0O-y_43Qa-I:iJW7NkfYiLo:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=0O-y_43Qa-I:iJW7NkfYiLo:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=0O-y_43Qa-I:iJW7NkfYiLo:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=0O-y_43Qa-I:iJW7NkfYiLo:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PeteOnRails/~4/0O-y_43Qa-I" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.peteonrails.com/2008/08/filed-under-you-gotta-be-kidding-me-patent-issued-for-page-up-page-down/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://blog.peteonrails.com/2008/08/filed-under-you-gotta-be-kidding-me-patent-issued-for-page-up-page-down/</feedburner:origLink></item>
		<item>
		<title>New VoteFu Feature: karma counting</title>
		<link>http://feedproxy.google.com/~r/PeteOnRails/~3/Vo4uqRoWk4E/</link>
		<comments>http://blog.peteonrails.com/2008/08/new-votefu-feature-karma-counting/#comments</comments>
		<pubDate>Fri, 22 Aug 2008 16:50:08 +0000</pubDate>
		<dc:creator>pete</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.peteonrails.com/?p=101</guid>
		<description><![CDATA[I have just introduced the &#8220;has_karma&#8221; mixin to VoteFu. It aims to assign a karma score to the owners of voteable objects. This is designed to allow you to see which users are submitting the most highly voted content. Currently, karma is only &#8220;positive&#8221;. That is, +1 votes add to karma, but -1 votes do [...]]]></description>
			<content:encoded><![CDATA[<p>I have just introduced the &#8220;has_karma&#8221; mixin to VoteFu. It aims to assign a karma score to the owners of voteable objects. This is designed to allow you to see which users are submitting the most highly voted content. Currently, karma is only &#8220;positive&#8221;. That is, +1 votes add to karma, but -1 votes do not detract from it.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="ruby"><span style="color:#9966CC; font-weight:bold;">class</span> User 
  has_many <span style="color:#ff3333; font-weight:bold;">:posts</span>
  has_karma <span style="color:#ff3333; font-weight:bold;">:posts</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> Post
  acts_as_voteable
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># in your view, you can then do this: </span>
Karma: <span style="color:#006600; font-weight:bold;">&lt;%</span>= <span style="color:#0066ff; font-weight:bold;">@user</span>.<span style="color:#9900CC;">karma</span> <span style="color:#006600; font-weight:bold;">%&gt;</span></pre></td></tr></table></div>

<p>This feature is new and probably going to be enhanced significantly, but useful enough that I&#8217;m releasing it now.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=Vo4uqRoWk4E:oYDElRD-wxc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=Vo4uqRoWk4E:oYDElRD-wxc:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=Vo4uqRoWk4E:oYDElRD-wxc:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=Vo4uqRoWk4E:oYDElRD-wxc:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=Vo4uqRoWk4E:oYDElRD-wxc:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=Vo4uqRoWk4E:oYDElRD-wxc:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=Vo4uqRoWk4E:oYDElRD-wxc:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=Vo4uqRoWk4E:oYDElRD-wxc:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PeteOnRails/~4/Vo4uqRoWk4E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.peteonrails.com/2008/08/new-votefu-feature-karma-counting/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://blog.peteonrails.com/2008/08/new-votefu-feature-karma-counting/</feedburner:origLink></item>
		<item>
		<title>Scrum: Top Ten Signs You’re Doing It Wrong</title>
		<link>http://feedproxy.google.com/~r/PeteOnRails/~3/VSv-L_4F7tY/</link>
		<comments>http://blog.peteonrails.com/2008/08/scrum-top-ten-signs-youre-doing-it-wrong/#comments</comments>
		<pubDate>Tue, 19 Aug 2008 22:05:38 +0000</pubDate>
		<dc:creator>pete</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://blog.peteonrails.com/?p=98</guid>
		<description><![CDATA[A lot of people are in the business of cataloging &#8220;Scrum Smells&#8221;,  those warning flags that indicate you may have some problems in your agile development process. These are the ones that I think are important, and common. If these things are happening on your team, UR DOIN IT WRONG. Your Burndown Chart does not [...]]]></description>
			<content:encoded><![CDATA[<p>A lot of people are in the business of cataloging &#8220;Scrum Smells&#8221;,  those warning flags that indicate you may have some problems in your agile development process.</p>
<p>These are the ones that I think are important, and common. If these things are happening on your team, <a href="http://punkrockhr.com/?s=DOIN+IT+WRONG">UR DOIN IT WRONG. </a></p>
<ol>
<li>Your Burndown Chart does not have an entry on it for every day&#8217;s remaining activity.</li>
<li>Someone asks you how your sprint velocity is changing over time and you answer, &#8220;It&#8217;s hard to compare sprints, because each one is a different length.&#8221;</li>
<li>You can&#8217;t tell me when the next Sprint Planning Meeting is, or what was agreed to at the last meeting.</li>
<li>You have no idea what you&#8217;ll be working on in 4 weeks. Not even a foggy notion.</li>
<li>When asked if you use scrum, you have to answer, &#8220;We use our own special flavor of scrum.&#8221; Seriously. There isn&#8217;t enough process involved in scrum to have seasonings added to it.</li>
<li>You are the product owner and the scrum master.</li>
<li>You are the scrum master and the boss of your scrum team members.</li>
<li>Your burndown chart goes up sharply at the beginning of each sprint (hint: play planning poker 2 days ahead of the sprint meeting).</li>
<li>Business stakeholders get mad at the engineering team when their feature isn&#8217;t scheduled for an upcoming milestone (hint: that&#8217;s the product owner&#8217;s baliwick.)</li>
<li>You have more than 3 or fewer than 1 sprint goals on the board.</li>
</ol>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=VSv-L_4F7tY:KC7O_6rEgA8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=VSv-L_4F7tY:KC7O_6rEgA8:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=VSv-L_4F7tY:KC7O_6rEgA8:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=VSv-L_4F7tY:KC7O_6rEgA8:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=VSv-L_4F7tY:KC7O_6rEgA8:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?i=VSv-L_4F7tY:KC7O_6rEgA8:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=VSv-L_4F7tY:KC7O_6rEgA8:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PeteOnRails?a=VSv-L_4F7tY:KC7O_6rEgA8:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PeteOnRails?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PeteOnRails/~4/VSv-L_4F7tY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.peteonrails.com/2008/08/scrum-top-ten-signs-youre-doing-it-wrong/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		<feedburner:origLink>http://blog.peteonrails.com/2008/08/scrum-top-ten-signs-youre-doing-it-wrong/</feedburner:origLink></item>
	</channel>
</rss>
