<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;AkUFQ3Y4fCp7ImA9WhdaFUk.&quot;"><id>tag:blogger.com,1999:blog-5159103</id><updated>2011-10-25T08:10:12.834-05:00</updated><category term="ruby" /><category term="rules" /><category term="test case" /><category term="test/spec" /><category term="tools" /><category term="campfire" /><category term="collaboration" /><category term="quote" /><category term="art" /><category term="conference" /><category term="open source" /><category term="sci fi" /><category term="presentation" /><category term="satir" /><category term="agile" /><category term="git" /><category term="active record" /><category term="tips" /><category term="rails" /><category term="aye" /><category term="tom robbins" /><category term="tdd" /><category term="mini" /><category term="productivity" /><category term="code" /><category term="bdd" /><category term="review" /><category term="learning" /><category term="rake" /><category term="patch" /><category term="fixtures" /><category term="retrospectives" /><category term="Seminar" /><category term="rails plugin sql migrations" /><category term="waste" /><category term="vmware" /><category term="tutorial" /><category term="example" /><category term="jerryweinberg" /><category term="scm" /><category term="alan cooper" /><category term="pretty print" /><category term="textmate" /><category term="communication" /><category term="flog" /><category term="meeting" /><category term="2007" /><category term="bash" /><category term="book" /><category term="Seth Godin" /><category term="build" /><category term="iTerm" /><category term="mac" /><category term="Notes" /><category term="book review" /><category term="unit testing" /><category term="team" /><category term="project management" /><category term="testing" /><category term="svn" /><category term="interaction design" /><title>Mundane Essays</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://muness.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://muness.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>muness</name><uri>http://www.blogger.com/profile/13080591937269765506</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="21" height="32" src="http://bp0.blogger.com/_X2VtRiH_7DA/R56LyWhXlmI/AAAAAAAAAoM/_yR-nOi5JJ0/S220/PICT0025.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>653</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/muness" /><feedburner:info uri="muness" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-sa/3.0/" /><logo>http://creativecommons.org/images/public/somerights20.gif</logo><feedburner:emailServiceId>muness</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Fmuness" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fmuness" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Fmuness" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/muness" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fmuness" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fmuness" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fmuness" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2Fmuness" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://www.addtoany.com/?linkname=Mundane%20Essays&amp;linkurl=http%3A%2F%2Ffeeds.feedburner.com%2Fmuness&amp;type=feed" src="http://www.addtoany.com/addfr-b.gif">Add to Any Feed Reader</feedburner:feedFlare><entry gd:etag="W/&quot;A0QCSH07eSp7ImA9WxVWFks.&quot;"><id>tag:blogger.com,1999:blog-5159103.post-2319817875162591337</id><published>2009-02-20T13:07:00.005-05:00</published><updated>2009-02-26T12:29:29.301-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-26T12:29:29.301-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="rails plugin sql migrations" /><title>Generate SQL from your migrations</title><content type="html">&lt;p&gt;
On one of the projects &lt;a href="http://thinkrelevance.com"&gt;we&lt;/a&gt;'re working on, we needed to occassionaly generate SQL from our migrations.  Déjà vu, I thought.  A few minutes of Googling later, I &lt;a href="http://blog.jayfields.com/2006/11/rails-generate-sql-from-migrations.html"&gt;remembered why&lt;/a&gt;: Jay and I had been on a project a couple of years ago whence we had the same need.  Jay's code didn't quite work any more due to some ActiveRecord changes, and a search for an alternative implementation turned up nothing.
&lt;/p&gt;
&lt;p&gt;
I took his code and modified it to our needs.  A short time later, I had the code pulled out into a rails plugin, &lt;a href="http://github.com/muness/migration_sql_generator"&gt;migration_sql_generator&lt;/a&gt;.  Install it (&lt;code&gt;script/plugin install git://github.com/muness/migration_sql_generator.git&lt;/code&gt;) and then run the rake task:
&lt;code&gt;
&lt;pre&gt;
rake db:generate:migration_sql
&lt;/pre&gt;
&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;Running this task generates two sql files per migration in &lt;code&gt;db/migration_sql&lt;/code&gt; in the form &lt;code&gt;20090216224354_add_users.sql&lt;/code&gt; and &lt;code&gt;20090216224354_add_users_down.sql&lt;/code&gt;.
&lt;/p&gt;
&lt;p&gt;
I've used the plugin with success using the sqlserver adapter, less luck with the mysql adapter (change_column and rename_column blow up because the mysql adapter checks for the presence of a column first) and no luck with the sqlite adapter.  Haven't tried it with the postgres adapter.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5159103-2319817875162591337?l=muness.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/muness?a=pbVsyP6VdqE:Zdd4HaZP0vE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=pbVsyP6VdqE:Zdd4HaZP0vE:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=pbVsyP6VdqE:Zdd4HaZP0vE:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=pbVsyP6VdqE:Zdd4HaZP0vE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=pbVsyP6VdqE:Zdd4HaZP0vE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=pbVsyP6VdqE:Zdd4HaZP0vE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=pbVsyP6VdqE:Zdd4HaZP0vE:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=pbVsyP6VdqE:Zdd4HaZP0vE:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=pbVsyP6VdqE:Zdd4HaZP0vE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=pbVsyP6VdqE:Zdd4HaZP0vE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/muness/~4/pbVsyP6VdqE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://muness.blogspot.com/feeds/2319817875162591337/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5159103&amp;postID=2319817875162591337" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/2319817875162591337?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/2319817875162591337?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/muness/~3/pbVsyP6VdqE/generate-sql-from-your-migrations.html" title="Generate SQL from your migrations" /><author><name>muness</name><uri>http://www.blogger.com/profile/13080591937269765506</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="21" height="32" src="http://bp0.blogger.com/_X2VtRiH_7DA/R56LyWhXlmI/AAAAAAAAAoM/_yR-nOi5JJ0/S220/PICT0025.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://muness.blogspot.com/2009/02/generate-sql-from-your-migrations.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkIFR3Y4eyp7ImA9WhZVEUg.&quot;"><id>tag:blogger.com,1999:blog-5159103.post-7663891767652584690</id><published>2009-02-20T12:05:00.011-05:00</published><updated>2011-05-23T08:48:36.833-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-23T08:48:36.833-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><title>Easily switch between Ruby 1.8.6 and 1.9.1</title><content type="html">&lt;p&gt;
&lt;strong&gt;NOTE: I don't keep Ruby Switcher updated anymore.  Use &lt;a href="https://rvm.beginrescueend.com/"&gt;RVM&lt;/a&gt; instead.&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;a href="http://spicycode.com/"&gt;Chad&lt;/a&gt; mentioned that he'd gotten ruby 1.9.1 and 1.8.6 side by side on his workstation (his &lt;a href="http://github.com/spicycode/spicy-config/commit/aa264bb6e809af6f669a3678dc1f13c6579732a7"&gt;code&lt;/a&gt; for this is in his awesome spicy-config repo).
&lt;/p&gt;
&lt;p&gt;
I took some time this morning to get a &lt;a href="http://github.com/relevance/etc/blob/c0f4ad613c208eb80a239e1c986ecc9e29aa1d9e/bash/ruby_switcher.sh"&gt;similar setup&lt;/a&gt; working.  Now, on my prompt, I type, &lt;code&gt;use_ruby_186&lt;/code&gt; or &lt;code&gt;use_ruby_191&lt;/code&gt; to go back and forth between the Ruby 1.8.6 shipped with Leopard and a self-compiled install of ruby 1.9.1.
&lt;/p&gt;
&lt;p&gt;Steps for you to get there:
&lt;ol&gt;
&lt;li&gt;Compile and install ruby 1.9.1:
&lt;code&gt;
&lt;pre&gt;
mkdir -p ~/tmp
cd ~/tmp
curl -O ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-p0.tar.gz
tar xzf ruby-1.9.1-p0.tar.gz
cd ruby-1.9.1-p0
./configure --prefix=$HOME/.ruby_versions/ruby_191
make
make install
&lt;/pre&gt;
&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Install the ruby switcher:
&lt;code&gt;
&lt;pre&gt;
curl -L http://github.com/relevance/etc/tree/master%2Fbash%2Fruby_switcher.sh?raw=true?raw=true &gt; ~/ruby_switcher.sh
echo "source ~/ruby_switcher.sh" &gt;&gt; ~/.bash_profile
&lt;/pre&gt;
&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
Note that I use ~/.gem for my gems.  If you don't do that, you'll have to modify the switcher to specify your &lt;code&gt;GEM_HOME&lt;/code&gt;.  Type &lt;code&gt;gem env&lt;/code&gt; and look for GEM PATHS to figure out what you should set it to.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5159103-7663891767652584690?l=muness.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/muness?a=jamvhQJANyo:JGrD2vy0nUg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=jamvhQJANyo:JGrD2vy0nUg:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=jamvhQJANyo:JGrD2vy0nUg:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=jamvhQJANyo:JGrD2vy0nUg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=jamvhQJANyo:JGrD2vy0nUg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=jamvhQJANyo:JGrD2vy0nUg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=jamvhQJANyo:JGrD2vy0nUg:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=jamvhQJANyo:JGrD2vy0nUg:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=jamvhQJANyo:JGrD2vy0nUg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=jamvhQJANyo:JGrD2vy0nUg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/muness/~4/jamvhQJANyo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://muness.blogspot.com/feeds/7663891767652584690/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5159103&amp;postID=7663891767652584690" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/7663891767652584690?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/7663891767652584690?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/muness/~3/jamvhQJANyo/easily-switch-between-ruby-186-and-191.html" title="Easily switch between Ruby 1.8.6 and 1.9.1" /><author><name>muness</name><uri>http://www.blogger.com/profile/13080591937269765506</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="21" height="32" src="http://bp0.blogger.com/_X2VtRiH_7DA/R56LyWhXlmI/AAAAAAAAAoM/_yR-nOi5JJ0/S220/PICT0025.jpg" /></author><thr:total>4</thr:total><feedburner:origLink>http://muness.blogspot.com/2009/02/easily-switch-between-ruby-186-and-191.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEIFQ3s6cCp7ImA9WxVQFkk.&quot;"><id>tag:blogger.com,1999:blog-5159103.post-2506006018434173045</id><published>2009-02-03T01:10:00.002-05:00</published><updated>2009-02-03T01:28:32.518-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-03T01:28:32.518-05:00</app:edited><title>Maatkit installation: the concise guide</title><content type="html">If you use MySQL, odds are you need &lt;a href="http://www.maatkit.org/doc/"&gt;Maatkit&lt;/a&gt; whether you know it or not.  It's &lt;strong&gt;the&lt;/strong&gt; Swiss army knife: I mostly use it to parallelize backup and restore of huge databases on multi-core machines, but it's also handy for &lt;a href="http://www.maatkit.org/doc/mk-fifo-split.html"&gt;fake splitting large files&lt;/a&gt;, &lt;a href="http://www.maatkit.org/doc/mk-find.html"&gt;executing sql on multiple tables&lt;/a&gt; and a whole lot more.  (You also want &lt;a href="http://jeremy.zawodny.com/mysql/mytop/"&gt;mytop&lt;/a&gt; if you're wondering what's up with MySQL connections.)
&lt;p&gt;
Here's the install script if you too want Maatkit at your fingertips (and you do.  trust me.):
&lt;pre&gt;
&lt;code&gt;
#!/bin/sh
# tested on Leopard with MySQL installed using the &lt;a href="http://dev.mysql.com/downloads/mysql/5.1.html#macosx-dmg"&gt;package installer&lt;/a&gt;

sudo perl -MCPAN -e 'install DBI::Bundle'
sudo perl -MCPAN -e 'install DBD::mysql'
# you may need to force the install as follows:
# sudo perl -MCPAN -e 'force install DBD::mysql'

mkdir -p ~/tmp
cd ~/tmp
curl -O http://maatkit.googlecode.com/files/maatkit-2725.tar.gz
tar xzvf maatkit-2725.tar.gz
cd maatkit-2725
perl Makefile.PL
sudo make install
&lt;/code&gt;
&lt;/pre&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5159103-2506006018434173045?l=muness.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/muness?a=88NeCv0P8IQ:jPjNi1GuTSA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=88NeCv0P8IQ:jPjNi1GuTSA:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=88NeCv0P8IQ:jPjNi1GuTSA:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=88NeCv0P8IQ:jPjNi1GuTSA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=88NeCv0P8IQ:jPjNi1GuTSA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=88NeCv0P8IQ:jPjNi1GuTSA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=88NeCv0P8IQ:jPjNi1GuTSA:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=88NeCv0P8IQ:jPjNi1GuTSA:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=88NeCv0P8IQ:jPjNi1GuTSA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=88NeCv0P8IQ:jPjNi1GuTSA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/muness/~4/88NeCv0P8IQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://muness.blogspot.com/feeds/2506006018434173045/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5159103&amp;postID=2506006018434173045" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/2506006018434173045?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/2506006018434173045?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/muness/~3/88NeCv0P8IQ/maatkit-installation-concise-guide.html" title="Maatkit installation: the concise guide" /><author><name>muness</name><uri>http://www.blogger.com/profile/13080591937269765506</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="21" height="32" src="http://bp0.blogger.com/_X2VtRiH_7DA/R56LyWhXlmI/AAAAAAAAAoM/_yR-nOi5JJ0/S220/PICT0025.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://muness.blogspot.com/2009/02/maatkit-installation-concise-guide.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YESH08fCp7ImA9WxVRFk4.&quot;"><id>tag:blogger.com,1999:blog-5159103.post-5758646917993489524</id><published>2009-01-22T09:24:00.003-05:00</published><updated>2009-01-22T09:38:29.374-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-22T09:38:29.374-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><category scheme="http://www.blogger.com/atom/ns#" term="vmware" /><title>No network after copying an Ubuntu VMWare image</title><content type="html">After you copy an Ubuntu image, you'll probably lose your network connectivity.  After a little bit of &lt;a href="http://communities.vmware.com/thread/46069"&gt;digging&lt;/a&gt;, it turns out that Ubuntu persists the MAC address of the network device in &lt;code&gt;/etc/udev/rules.d/*net.rules&lt;/code&gt; .  The fix:
&lt;pre&gt;
  &lt;code&gt;sudo rm /etc/udev/rules.d/*net.rules&lt;/code&gt;
  &lt;code&gt;sudo shutdown -r now #to reboot&lt;/code&gt;
&lt;/pre&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5159103-5758646917993489524?l=muness.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/muness?a=PU94EaZQROE:59TGJR0lV8o:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=PU94EaZQROE:59TGJR0lV8o:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=PU94EaZQROE:59TGJR0lV8o:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=PU94EaZQROE:59TGJR0lV8o:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=PU94EaZQROE:59TGJR0lV8o:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=PU94EaZQROE:59TGJR0lV8o:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=PU94EaZQROE:59TGJR0lV8o:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=PU94EaZQROE:59TGJR0lV8o:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=PU94EaZQROE:59TGJR0lV8o:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=PU94EaZQROE:59TGJR0lV8o:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/muness/~4/PU94EaZQROE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://muness.blogspot.com/feeds/5758646917993489524/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5159103&amp;postID=5758646917993489524" title="17 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/5758646917993489524?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/5758646917993489524?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/muness/~3/PU94EaZQROE/no-network-after-copying-ubuntu-vmware.html" title="No network after copying an Ubuntu VMWare image" /><author><name>muness</name><uri>http://www.blogger.com/profile/13080591937269765506</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="21" height="32" src="http://bp0.blogger.com/_X2VtRiH_7DA/R56LyWhXlmI/AAAAAAAAAoM/_yR-nOi5JJ0/S220/PICT0025.jpg" /></author><thr:total>17</thr:total><feedburner:origLink>http://muness.blogspot.com/2009/01/no-network-after-copying-ubuntu-vmware.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8CQXk9eip7ImA9WxRVFkU.&quot;"><id>tag:blogger.com,1999:blog-5159103.post-7565609565025339031</id><published>2008-11-14T09:44:00.008-05:00</published><updated>2008-11-14T12:47:40.762-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-14T12:47:40.762-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="scm" /><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><category scheme="http://www.blogger.com/atom/ns#" term="git" /><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><title>Git: things I love and manipulating remote branches</title><content type="html">&lt;p&gt;I've been happily using &lt;a href=http://git.or.cz/&gt;Git&lt;/a&gt; for months now.  The primary benefit for me has been the ability to work offline without messing with &lt;a href=http://svk.bestpractical.com/view/HomePage&gt;SVK&lt;/a&gt;, not having to use the &lt;a href=http://subversion.tigris.org/&gt;svn&lt;/a&gt; commands for renames and moves, the ability to use multiple remote servers and better tools to look at branch level history (think gitk).&lt;/p&gt;

&lt;p&gt;Branching is much improved, besides.  In Subversion, to branch, you copy the current tree elsewhere and then you work in this branch and finally, merge your changes manually back into trunk (to wit, you have to keep track of what was already merged and not reapply those commits).  In git, though, that's all handled for you.  Another difference is best illustrated by example: you've started a new feature.  Several file modifications later, you look at your diff and realize, "I should have started a new branch for this.  doh."  With Subversion, there's not much you can do automatically to get these changes into a branch.  You'd typically now:
&lt;ol&gt;
&lt;li&gt;generate a diff&lt;/li&gt;
&lt;li&gt;undo your changes&lt;/li&gt;
&lt;li&gt;create a branch&lt;/li&gt;
&lt;li&gt;switch to the branch&lt;/li&gt;
&lt;li&gt;apply the diff&lt;/li&gt;
&lt;li&gt;back to work&lt;/li&gt;
&lt;/ol&gt;
In git on the other hand, you type &lt;code&gt;git branch feature_22&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
Sweet, huh?
&lt;/p&gt;
&lt;p&gt;Well, not altogether.  Pushing this local branch to a remote server is altogether too complicated:
&lt;pre&gt;
&lt;code&gt;
git push origin feature_22:refs/heads/feature_22
git fetch origin
git config branch.feature_22.remote origin
git config branch.feature_22.merge refs/heads/feature_22
git checkout feature_22
&lt;/code&gt;
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;Sure, you could have created the branch on the remote server first and saved yourself some hassle:
&lt;pre&gt;
&lt;code&gt;
git push origin master:refs/heads/feature_22
git fetch origin
git branch --track feature_22 origin/feature_22
git checkout feature_22
&lt;/code&gt;
&lt;/pre&gt;
Not exactly straight forward either.  Neither are other standard branch related activities.  Here's how you delete that remote branch:
&lt;pre&gt;
&lt;code&gt;
git push origin :refs/heads/feature_22 # yeah, that's how you delete a remote branch.  :(
git branch -d feature_22 # delete it locally too
&lt;/code&gt;
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;Fortunately, Git has a vibrant community that work to abstract away some of these complications.  One of my favorite Git tools is &lt;a href=http://github.com/webmat/git_remote_branch/tree/master&gt;git_remote_branch&lt;/a&gt;.  By using it, working with remote git branches becomes a breeze:
&lt;pre&gt;
&lt;code&gt;
grb publish feature_22 # publish a local branch
grb create feature_22 # create a remote branch and local branch to track it
grb delete feature_22 # delete the remote and local tracking branch
&lt;/code&gt;
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
Ah, that's better!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5159103-7565609565025339031?l=muness.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/muness?a=U-dtFULHvfs:uQV_B8DLNIg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=U-dtFULHvfs:uQV_B8DLNIg:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=U-dtFULHvfs:uQV_B8DLNIg:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=U-dtFULHvfs:uQV_B8DLNIg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=U-dtFULHvfs:uQV_B8DLNIg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=U-dtFULHvfs:uQV_B8DLNIg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=U-dtFULHvfs:uQV_B8DLNIg:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=U-dtFULHvfs:uQV_B8DLNIg:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=U-dtFULHvfs:uQV_B8DLNIg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=U-dtFULHvfs:uQV_B8DLNIg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/muness/~4/U-dtFULHvfs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://muness.blogspot.com/feeds/7565609565025339031/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5159103&amp;postID=7565609565025339031" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/7565609565025339031?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/7565609565025339031?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/muness/~3/U-dtFULHvfs/git-things-i-love-and-manipulating.html" title="Git: things I love and manipulating remote branches" /><author><name>muness</name><uri>http://www.blogger.com/profile/13080591937269765506</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="21" height="32" src="http://bp0.blogger.com/_X2VtRiH_7DA/R56LyWhXlmI/AAAAAAAAAoM/_yR-nOi5JJ0/S220/PICT0025.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://muness.blogspot.com/2008/11/git-things-i-love-and-manipulating.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEADSX4_eip7ImA9WxRVFko.&quot;"><id>tag:blogger.com,1999:blog-5159103.post-4900468041711873007</id><published>2008-09-21T12:12:00.005-05:00</published><updated>2008-11-14T10:32:58.042-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-14T10:32:58.042-05:00</app:edited><title>Mingle, meet Git</title><content type="html">&lt;p&gt;
Several weeks back, &lt;a href="http://www.adammonago.com/blog/blog.html"&gt;Adam Monago&lt;/a&gt;, &lt;a href="http://studios.thoughtworks.com/mingle-project-intelligence"&gt;Mingle&lt;/a&gt;'s product manager was visiting our office in Chapel Hill.  One of the topics that came up was Git integration with Mingle. Alas, it sounded like it was a ways out.  But he explained that the SCM integration was pluggable and that we could write the code and drop it in place, echoing things I'd heard from other ThoughtWorkers.
&lt;/p&gt;
&lt;p&gt;A couple of days later, &lt;a href="http://www.donmullen.net/"&gt;Don&lt;/a&gt; and I were curious as to just what it'd take to implement the integration.  Reverse engineering the interface we had to implement from the Subversion and Perforce plug-ins was anything but fun, but before the day was over, we had rudimentary integration working: we could see commit messages and the list of files modified per check-in.  Since then, Don implemented the rest of it including Mingle-based source code browsing.&lt;/p&gt;

&lt;p&gt;We've been using the &lt;a href="http://github.com/donmullen/mingle_git/"&gt;mingle_git&lt;/a&gt; plugin for a little while with no problems.  For performance reasons, we're not using the source code browsing from inside Mingle.  Instead, we use GitHub's source browsing: see the &lt;a href="http://github.com/donmullen/mingle_git/tree/master%2FREADME.rdoc?raw=true"&gt;README&lt;/a&gt; for instructions on wiring things that way too.&lt;/p&gt;
&lt;p&gt;
Installation is documented in the README.  We've only used this on Mac OS, FreeBSD and Linux.  Windows users, you may have luck by using &lt;a href="http://code.google.com/p/msysgit/"&gt;msysgit&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Caveat emptor&lt;/strong&gt;: if you browse around the code, you'll quickly conclude that it is a &lt;strong&gt;spike&lt;/strong&gt;: we started with the subversion plugin and evolved it to this.  Since the SCM integration API is not documented, we can't even be positive that we implemented it correctly (though the evidence suggests that we have).  Also note that Mingle makes the assumption that check-in numbers are sequential, and that's an assumption that is not Git-friendly and it shows in the code.
&lt;/p&gt;
&lt;p&gt;
Enjoy, but keep in mind that this is unsupported, use-at-your-own-risk software.  For me, that's better than no Git integration.  ;)
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Mingle's APIs changed from 2.0 to 2.1 and we haven't had a chance to update this plugin yet.  If you installed this plugin, and are ready to upgrade to 2.1, you'll want to remove the plugin and then execute this SQL on your Mingle database:
&lt;code&gt;
delete from plugin_schema_info where plugin_name = 'mingle_git';
&lt;/code&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5159103-4900468041711873007?l=muness.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/muness?a=LJTLk41qSOM:j25-S6DPYGc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=LJTLk41qSOM:j25-S6DPYGc:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=LJTLk41qSOM:j25-S6DPYGc:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=LJTLk41qSOM:j25-S6DPYGc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=LJTLk41qSOM:j25-S6DPYGc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=LJTLk41qSOM:j25-S6DPYGc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=LJTLk41qSOM:j25-S6DPYGc:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=LJTLk41qSOM:j25-S6DPYGc:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=LJTLk41qSOM:j25-S6DPYGc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=LJTLk41qSOM:j25-S6DPYGc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/muness/~4/LJTLk41qSOM" height="1" width="1"/&gt;</content><link rel="related" href="http://github.com/donmullen/mingle_git/" title="Mingle, meet Git" /><link rel="replies" type="application/atom+xml" href="http://muness.blogspot.com/feeds/4900468041711873007/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5159103&amp;postID=4900468041711873007" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/4900468041711873007?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/4900468041711873007?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/muness/~3/LJTLk41qSOM/mingle-meet-git.html" title="Mingle, meet Git" /><author><name>muness</name><uri>http://www.blogger.com/profile/13080591937269765506</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="21" height="32" src="http://bp0.blogger.com/_X2VtRiH_7DA/R56LyWhXlmI/AAAAAAAAAoM/_yR-nOi5JJ0/S220/PICT0025.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://muness.blogspot.com/2008/09/mingle-meet-git.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkIGRXw6eip7ImA9WxdaEUk.&quot;"><id>tag:blogger.com,1999:blog-5159103.post-3148383727785714020</id><published>2008-08-17T11:35:00.007-05:00</published><updated>2008-08-19T07:22:04.212-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-19T07:22:04.212-05:00</app:edited><title>Encrypt your client data in 53 minutes</title><content type="html">&lt;p&gt;Thanks to &lt;a href="http://aaronbedra.com"&gt;Aaron&lt;/a&gt;'s continued efforts to make us ever more security conscious, I've been encrypting client data on my laptop.  This came up in conversation during &lt;a href="http://erubycon.com"&gt;e&lt;strong&gt;ruby&lt;/strong&gt;con&lt;/a&gt; (thanks &lt;a href="http://theedgecase.com"&gt;EdgeCase&lt;/a&gt; for a fun conference with engaging &lt;a href="http://twitter.com/muncman/statuses/889085361"&gt;evening events&lt;/a&gt;).  A couple of people asked me to get them started on encrypting their data too.

&lt;p&gt;Here are instructions.  They're written for Mac users, but they'd be nearly identical for Linux and Windows users since TrueCrypt is available there too.
&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install &lt;a href=http://www.truecrypt.org/downloads.php&gt;TrueCrypt&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Create a container based encrypted file.  Pick FAT as the file system.  I use both keyfiles and a password.&lt;/li&gt;
&lt;li&gt;Erase the FAT partition and then format as HFS/ext2/[fs of choice] using Disk Utility/[partition manager of choice].  Name it &lt;code&gt;client_data&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Mount the newly created partition.&lt;/li&gt;
&lt;li&gt;Move your sensitive data to &lt;code&gt;/Volumes/client_data&lt;/code&gt;.  This is by far the slowest part of the process.  While you wait, watch &lt;a href="http://video.google.com/videoplay?docid=-2293483151556804649"&gt;The Enemies of Reason&lt;/a&gt; (48 minutes -- everything else should take 5 minutes or less).&lt;/li&gt;
&lt;li&gt;Modify TrueCrypt preferences to suit your needs.  Some suggestions: leave encrypted volumes mounted when quitting TrueCrypt, set Auto-dismount volume after 30 minutes of inactivity in the partition.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As mentioned in &lt;a href="http://muness.blogspot.com/2008/06/lazy-bash-cd-aliaes.html"&gt;my previous blog entry&lt;/a&gt;, I use a script to automatically create aliases to allow easy switching to project directories.  All I had to do was switch that entry to point to &lt;code&gt;/Volumes/client_data&lt;/code&gt; instead of the old &lt;code&gt;~/work/client_data&lt;/code&gt;.  Now, when I want to work on client projects or contracts, I launch TrueCrypt, mount the container and open a new terminal window.  All my old aliases work just like they used to.&lt;/p&gt;

&lt;p&gt;Mac users: if you don't care about the cross-platform compatibility that TrueCrypt offers, and trust Apple to encrypt your data, you  could use Disk Utility to &lt;a href="http://support.apple.com/kb/HT1578"&gt;create encrypted partitions&lt;/a&gt; instead.  Some people insist it's more convenient (&lt;a href="http://jasonrudolph.com/blog"&gt;You&lt;/a&gt; &lt;a href="http://tech.hickorywind.org/"&gt;know&lt;/a&gt; who you are!).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5159103-3148383727785714020?l=muness.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/muness?a=9qlLhZb3_UU:y6YtqoFVK80:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=9qlLhZb3_UU:y6YtqoFVK80:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=9qlLhZb3_UU:y6YtqoFVK80:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=9qlLhZb3_UU:y6YtqoFVK80:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=9qlLhZb3_UU:y6YtqoFVK80:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=9qlLhZb3_UU:y6YtqoFVK80:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=9qlLhZb3_UU:y6YtqoFVK80:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=9qlLhZb3_UU:y6YtqoFVK80:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=9qlLhZb3_UU:y6YtqoFVK80:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=9qlLhZb3_UU:y6YtqoFVK80:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/muness/~4/9qlLhZb3_UU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://muness.blogspot.com/feeds/3148383727785714020/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5159103&amp;postID=3148383727785714020" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/3148383727785714020?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/3148383727785714020?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/muness/~3/9qlLhZb3_UU/encrypt-your-client-data-in-53-minutes.html" title="Encrypt your client data in 53 minutes" /><author><name>muness</name><uri>http://www.blogger.com/profile/13080591937269765506</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="21" height="32" src="http://bp0.blogger.com/_X2VtRiH_7DA/R56LyWhXlmI/AAAAAAAAAoM/_yR-nOi5JJ0/S220/PICT0025.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://muness.blogspot.com/2008/08/encrypt-your-client-data-in-53-minutes.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YCRXc_fip7ImA9WxNSGUw.&quot;"><id>tag:blogger.com,1999:blog-5159103.post-7821339018035122458</id><published>2008-06-29T13:04:00.011-05:00</published><updated>2009-09-02T13:12:44.946-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-02T13:12:44.946-05:00</app:edited><title>Lazy bash cd aliases</title><content type="html">Those of you who've found value in my last couple of bash specific posts may also like the &lt;a href="http://github.com/relevance/etc/tree/master/bash/project_aliases.sh"&gt;latest addition&lt;/a&gt; to my &lt;code&gt;~/.bash_profile&lt;/code&gt;.
&lt;p&gt;
This one iterates through the one or more directories and creates aliases to the subdirectories so I don't have to.  Here's the scenario: I've got a directory ~/work/ where I keep work projects, a ~/writings/ where I keep all the writing projects and so on.  I used to have aliases to each subdirectory.  e.g. &lt;code&gt;alias project1="cd /Users/muness/work/project1"&lt;/code&gt;.  With shame, I admit that I maintained each of these manually.  No more!&lt;/p&gt;
&lt;p&gt;
Install instructions:
&lt;code&gt;
&lt;pre&gt;
curl -L http://github.com/relevance/etc/tree/master%2Fbash%2Fproject_aliases.sh?raw=true?raw=true &gt; ~/.project_aliases.sh
echo "source ~/. project_aliases.sh" &gt;&gt; ~/.bash_profile
&lt;/pre&gt;
&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
Usage instructions:
&lt;ul&gt;
&lt;li&gt;Move your work projects to &lt;code&gt;~/work&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Above the &lt;code&gt;source ~/. project_aliases.sh&lt;/code&gt; add &lt;code&gt;PROJECT_PARENT_DIRS[0]="$HOME/work"&lt;/code&gt;.
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;You may be interested in my blog post over at &lt;a href="http://pragmactic-osxer.blogspot.com/2008/06/pimp-my-shell.html"&gt;PragMactic OS-Xer&lt;/a&gt; where I describe my motivation for these recent shell scripts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5159103-7821339018035122458?l=muness.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/muness?a=mzCviwqt7Kk:h6_90fR28bE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=mzCviwqt7Kk:h6_90fR28bE:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=mzCviwqt7Kk:h6_90fR28bE:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=mzCviwqt7Kk:h6_90fR28bE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=mzCviwqt7Kk:h6_90fR28bE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=mzCviwqt7Kk:h6_90fR28bE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=mzCviwqt7Kk:h6_90fR28bE:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=mzCviwqt7Kk:h6_90fR28bE:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=mzCviwqt7Kk:h6_90fR28bE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=mzCviwqt7Kk:h6_90fR28bE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/muness/~4/mzCviwqt7Kk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://muness.blogspot.com/feeds/7821339018035122458/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5159103&amp;postID=7821339018035122458" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/7821339018035122458?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/7821339018035122458?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/muness/~3/mzCviwqt7Kk/lazy-bash-cd-aliaes.html" title="Lazy bash cd aliases" /><author><name>muness</name><uri>http://www.blogger.com/profile/13080591937269765506</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="21" height="32" src="http://bp0.blogger.com/_X2VtRiH_7DA/R56LyWhXlmI/AAAAAAAAAoM/_yR-nOi5JJ0/S220/PICT0025.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://muness.blogspot.com/2008/06/lazy-bash-cd-aliaes.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEEAR38zcCp7ImA9WxVQFkk.&quot;"><id>tag:blogger.com,1999:blog-5159103.post-5915576812994224892</id><published>2008-06-16T19:56:00.008-05:00</published><updated>2009-02-03T01:30:46.188-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-03T01:30:46.188-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="bash" /><category scheme="http://www.blogger.com/atom/ns#" term="interaction design" /><category scheme="http://www.blogger.com/atom/ns#" term="iTerm" /><title>bash: don't make me think</title><content type="html">&lt;p&gt;
&lt;a href="http://muness.blogspot.com/2008/06/stop-presses-bash-said-to-embrace.html"&gt;Last week&lt;/a&gt; I figured out a way to make my life a little bit easier  by abstracting the scm I was using and having the prompt indicate whether I was in a Subversion or Git.  Thanks to Mike Hommey whose &lt;A HREF=http://glandium.org/blog/?p=170&gt;script&lt;/A&gt; I tweaked for my needs.
&lt;/p&gt;
&lt;p&gt;
For a long time, I've wanted my iTerm tab title to be more useful.  I started by having it display the last process I executed in that tab (this also shows the full path in iTerm's window title bar):
&lt;pre&gt;
&lt;code&gt;
PS1='\[\e]2;\h::\]${PWD/$HOME/~}\[\a\]\[\e]1;\]$(history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g")\a\]\$ '
&lt;/code&gt;
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
Next up I wanted to show the currently running command.  Google showed &lt;a href="http://www.davidpashley.com/articles/xterm-titles-with-bash.html"&gt;me how&lt;/a&gt;:
&lt;pre&gt;
&lt;code&gt;
trap 'echo -e "\e]1;$BASH_COMMAND\007\c"' DEBUG
&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Instead of trying to explain this code I'll quote the Bash man page:
&lt;blockquote&gt;
BASH_COMMAND&lt;br/&gt;
The  command  currently being executed or about to be executed, unless the shell is executing a command as the result of a trap, in which case it is the command executing at the time of the trap.
&lt;/blockquote&gt;
&lt;/p&gt;
&lt;p&gt;
Some more tweaks followed: 
&lt;ul&gt;
&lt;li&gt;Distinguish between a previously executed command and a currently executing command by decorating them (I chose surrounding the former with braces and the latter with &amp;gt;/&amp;lt;. e.g. &lt;code&gt;[ls] and &amp;gt;vi&amp;lt;&lt;/code&gt;).
&lt;li&gt;Show the context of the executing command in the tab. This is just the repository where I executed the command.  
&lt;li&gt;Make this coexist with TextMate.
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;
And a screenshot to summarize:
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_X2VtRiH_7DA/SFcPaHEgkdI/AAAAAAAAArw/xVgpaEFFg94/s1600-h/dont-make-me-think-iterm.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_X2VtRiH_7DA/SFcPaHEgkdI/AAAAAAAAArw/xVgpaEFFg94/s800/dont-make-me-think-iterm.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5212652034953613778" /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;The code is in github&lt;a href="http://github.com/relevance/etc/tree/master/bash/bash_vcs.sh"&gt;/relevance/etc/tree/master/bash/bash_vcs.sh&lt;/a&gt;.  
&lt;/p&gt;
&lt;p&gt;
Install instructions:
&lt;pre&gt;
&lt;code&gt;
curl -L http://github.com/relevance/etc/tree/master%2Fbash%2Fbash_vcs.sh?raw=true &gt; ~/.bash_dont_think.sh
echo "source ~/.bash_dont_think.sh" &gt;&gt; ~/.bash_profile
&lt;/code&gt;
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;Enjoy!  Tested with iTerm on Leopard.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5159103-5915576812994224892?l=muness.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/muness?a=gIi8-fo3HLk:DF4JP_OZojM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=gIi8-fo3HLk:DF4JP_OZojM:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=gIi8-fo3HLk:DF4JP_OZojM:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=gIi8-fo3HLk:DF4JP_OZojM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=gIi8-fo3HLk:DF4JP_OZojM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=gIi8-fo3HLk:DF4JP_OZojM:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=gIi8-fo3HLk:DF4JP_OZojM:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=gIi8-fo3HLk:DF4JP_OZojM:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=gIi8-fo3HLk:DF4JP_OZojM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=gIi8-fo3HLk:DF4JP_OZojM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/muness/~4/gIi8-fo3HLk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://muness.blogspot.com/feeds/5915576812994224892/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5159103&amp;postID=5915576812994224892" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/5915576812994224892?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/5915576812994224892?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/muness/~3/gIi8-fo3HLk/bash-dont-make-me-think.html" title="bash: don't make me think" /><author><name>muness</name><uri>http://www.blogger.com/profile/13080591937269765506</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="21" height="32" src="http://bp0.blogger.com/_X2VtRiH_7DA/R56LyWhXlmI/AAAAAAAAAoM/_yR-nOi5JJ0/S220/PICT0025.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_X2VtRiH_7DA/SFcPaHEgkdI/AAAAAAAAArw/xVgpaEFFg94/s72-c/dont-make-me-think-iterm.jpg" height="72" width="72" /><thr:total>5</thr:total><feedburner:origLink>http://muness.blogspot.com/2008/06/bash-dont-make-me-think.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMCQ3w7cCp7ImA9WxRbGE0.&quot;"><id>tag:blogger.com,1999:blog-5159103.post-8830395601576300730</id><published>2008-06-10T19:41:00.009-05:00</published><updated>2008-12-09T01:17:42.208-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-09T01:17:42.208-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="bash" /><category scheme="http://www.blogger.com/atom/ns#" term="git" /><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><category scheme="http://www.blogger.com/atom/ns#" term="svn" /><title>Stop the presses: bash said to embrace subversion and git</title><content type="html">&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I've since updated and moved this script.  See &lt;a href="http://muness.blogspot.com/2008/06/bash-dont-make-me-think.html"&gt;my new blog post&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;I had a chance to pair with &lt;a href="http://robsanheim.com"&gt;Rob&lt;/a&gt; today.  On his console window, I noticed something I wanted: his bash prompt had an indication that he was in a  Git repository along with the branch he was on.  Later, after he'd left, I found myself wondering how that worked and that I simply had to have it, and I wasn't willing to wait a whole day to figure out how he'd done it.  Patience is &lt;em&gt;not&lt;/em&gt; a virtue.  (In that spirit, click &lt;a href="http://github.com/relevance/etc/tree/master%2Fbash%2Fbash_vcs.sh?raw=true"&gt;here&lt;/a&gt; for the code if you're too impatient to read the rest of this blog entry which I spent countless hours writing.  Uphill both ways.  In the snow.)&lt;/p&gt;
&lt;p&gt;
A few minutes of googling turned up a blog entry with relevant &lt;a href="http://glandium.org/blog/?p=170"&gt;bash fu&lt;/a&gt;.  The code there was for changing the prompt such that it indicated whether you were using svn, git, svk or Mercurial along with some repository metadata.  A couple of minutes later (it took a while to copy and paste the code since it was interweaved with comments), I found out it didn't work on Leopard.  &lt;code&gt;readlink&lt;/code&gt; turned out to be the culprit.  Instead of figuring out why it wasn't working, I replaced it with something simpler (specifically I used: &lt;code&gt;base_dir=`cd $base_dir; pwd`&lt;/code&gt;).  Voila, things worked: I now had a hella cool prompt that showed me if I was in a Subversion or a Git repository - I never used Mercurial, and left SVK for Git a couple of months ago.  Yay.
&lt;/p&gt;
&lt;p&gt;
Being who I am I had to do something more with this new ability to distinguish between Subversion and Git.  And I knew exactly which itch to scratch: 90% of the time I use the same scm commands.  I even had shell aliases for them so I wouldn't have to type them.  A few minutes later I'd converted my previously Subversion specific aliases to generic ones that worked with Git too.  Screenshot says it all:
&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_X2VtRiH_7DA/SE8kdQ5Uc_I/AAAAAAAAAro/qLjIzmgKkCg/s1600-h/screen-capture.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_X2VtRiH_7DA/SE8kdQ5Uc_I/AAAAAAAAAro/qLjIzmgKkCg/s800/screen-capture.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5210423379061142514" /&gt;&lt;/a&gt;
&lt;p&gt;
If you want the same, download &lt;a href="http://github.com/relevance/etc/tree/master%2Fbash%2Fbash_vcs.sh?raw=true"&gt;the script&lt;/a&gt; as &lt;code&gt;~/.bash_vcs&lt;/code&gt; and add &lt;code&gt;source ~/.bash_vcs&lt;/code&gt; at the end of your &lt;code&gt;~/.bash_profile&lt;/code&gt;.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5159103-8830395601576300730?l=muness.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/muness?a=T-CEN5yWzDI:OrtJPI7zYzk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=T-CEN5yWzDI:OrtJPI7zYzk:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=T-CEN5yWzDI:OrtJPI7zYzk:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=T-CEN5yWzDI:OrtJPI7zYzk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=T-CEN5yWzDI:OrtJPI7zYzk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=T-CEN5yWzDI:OrtJPI7zYzk:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=T-CEN5yWzDI:OrtJPI7zYzk:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=T-CEN5yWzDI:OrtJPI7zYzk:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=T-CEN5yWzDI:OrtJPI7zYzk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=T-CEN5yWzDI:OrtJPI7zYzk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/muness/~4/T-CEN5yWzDI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://muness.blogspot.com/feeds/8830395601576300730/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5159103&amp;postID=8830395601576300730" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/8830395601576300730?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/8830395601576300730?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/muness/~3/T-CEN5yWzDI/stop-presses-bash-said-to-embrace.html" title="Stop the presses: bash said to embrace subversion and git" /><author><name>muness</name><uri>http://www.blogger.com/profile/13080591937269765506</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="21" height="32" src="http://bp0.blogger.com/_X2VtRiH_7DA/R56LyWhXlmI/AAAAAAAAAoM/_yR-nOi5JJ0/S220/PICT0025.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_X2VtRiH_7DA/SE8kdQ5Uc_I/AAAAAAAAAro/qLjIzmgKkCg/s72-c/screen-capture.png" height="72" width="72" /><thr:total>6</thr:total><feedburner:origLink>http://muness.blogspot.com/2008/06/stop-presses-bash-said-to-embrace.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMCQnozfip7ImA9WxRbGE0.&quot;"><id>tag:blogger.com,1999:blog-5159103.post-5242540846920615639</id><published>2008-04-25T10:23:00.012-05:00</published><updated>2008-12-09T01:17:43.486-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-09T01:17:43.486-05:00</app:edited><title>Buckets of mice</title><content type="html">&lt;center&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_X2VtRiH_7DA/SBH4DqhRgAI/AAAAAAAAAqQ/Rnde9NuPB1U/s1600-h/20080418-P1000587-1.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_X2VtRiH_7DA/SBH4DqhRgAI/AAAAAAAAAqQ/Rnde9NuPB1U/s800/20080418-P1000587-1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5193204587172036610" /&gt;&lt;/a&gt;
&lt;/center&gt;
&lt;p&gt;
&lt;a href="http://thinkrelevance.com"&gt;We&lt;/a&gt; have 24" and 30" pairing stations, an intern, &lt;a href="http://3cups.net/"&gt;freshly roasted coffee&lt;/a&gt; delivered weekly, a fridge stocked with caffeine, more caffeine, beer, and &lt;a href="http://en.wikipedia.org/wiki/Dave's_Gourmet"&gt;Dave's Insanity sauce&lt;/a&gt;.  We have cool &lt;a href="http://store.xkcd.com/"&gt;t-shirts&lt;/a&gt; and all manner of radiators up on the walls, whiteboards and the &lt;a href="http://www.somethingnimble.com/bliki/radiator"&gt;Beta Brite&lt;/a&gt;.  Music &lt;a href="http://www.alteclansing.com/index.php?file=north_product_detail&amp;iproduct_id=57"&gt;is served&lt;/a&gt; by our CI/Music server.  
&lt;/p&gt;
&lt;center&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_X2VtRiH_7DA/SBIJkqhRgCI/AAAAAAAAAqg/o1nd76e6dpI/s1600-h/20080418-P1000588.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_X2VtRiH_7DA/SBIJkqhRgCI/AAAAAAAAAqg/o1nd76e6dpI/s200/20080418-P1000588.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5193223845805391906" /&gt;&lt;/a&gt;
&lt;/center&gt;
&lt;p&gt;
The bookshelves are stocked with reference materials, the occasional bottle of scotch, and recommended readings.  On the list of recommended readings we've got The Carpet Makers, The Company, The Omnivore's Dilemma, The Eyre Affair, Behind Closed Doors, Bloodsucking Fiends and The Deadline, Men In Hats, Volume I, Don't Make me Think, The Insane are Running the Asylum.
&lt;/p&gt;


&lt;p&gt;
Our favorite radiator is the Friday radiator.  &lt;a name="fridays"&gt;Fridays&lt;/a&gt; are special: we don't do billable work.  Instead we open source, blog (self reference makes this blog entry extra cool), watch &lt;a href="http://opuszine.com/blog/entry/cinematic_titanic_vs_the_oozing_skull/"&gt;educational movies&lt;/a&gt;, play Wii on the projector.   Here's today's:
&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_X2VtRiH_7DA/SBH4TahRgBI/AAAAAAAAAqY/za276x3InPo/s1600-h/20080425-P1000606.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_X2VtRiH_7DA/SBH4TahRgBI/AAAAAAAAAqY/za276x3InPo/s800/20080425-P1000606.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5193204857754976274" /&gt;&lt;/a&gt;

&lt;p&gt;Oh, let's not forget the buckets of mice.&lt;/p&gt;
&lt;center&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_X2VtRiH_7DA/SBH3g6hRf_I/AAAAAAAAAqI/uEQJJaHopkI/s1600-h/20080425-P1000603.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_X2VtRiH_7DA/SBH3g6hRf_I/AAAAAAAAAqI/uEQJJaHopkI/s400/20080425-P1000603.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5193203990171582450" /&gt;&lt;/a&gt;
&lt;/center&gt;
&lt;p&gt;
This blog entry inspired by &lt;a href="http://www.gapingvoid.com/Moveable_Type/archives/004493.html"&gt;another excellent business card cartoon&lt;/a&gt; from Hugh Macleod.
&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_X2VtRiH_7DA/SBISH6hRgGI/AAAAAAAAArA/3PCIOE5gTd0/s1600-h/20080418-P1000597.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_X2VtRiH_7DA/SBISH6hRgGI/AAAAAAAAArA/3PCIOE5gTd0/s800/20080418-P1000597.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5193233247488802914" /&gt;&lt;/a&gt;
&lt;br/&gt;

&lt;center&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_X2VtRiH_7DA/SBIJ7ahRgEI/AAAAAAAAAqw/dKiEw5vOAns/s1600-h/20080418-P1000577.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_X2VtRiH_7DA/SBIJ7ahRgEI/AAAAAAAAAqw/dKiEw5vOAns/s200/20080418-P1000577.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5193224236647415874" /&gt;&lt;/a&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_X2VtRiH_7DA/SBIJyahRgDI/AAAAAAAAAqo/r1_-8d__DTU/s1600-h/20080418-P1000575.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_X2VtRiH_7DA/SBIJyahRgDI/AAAAAAAAAqo/r1_-8d__DTU/s200/20080418-P1000575.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5193224082028593202" /&gt;&lt;/a&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_X2VtRiH_7DA/SBILP6hRgFI/AAAAAAAAAq4/-86yDjW_FtQ/s1600-h/20080418-P1000573.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_X2VtRiH_7DA/SBILP6hRgFI/AAAAAAAAAq4/-86yDjW_FtQ/s200/20080418-P1000573.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5193225688346361938" /&gt;&lt;/a&gt;

&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5159103-5242540846920615639?l=muness.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/muness?a=qpNx7vswFQc:bVor2bChYJs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=qpNx7vswFQc:bVor2bChYJs:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=qpNx7vswFQc:bVor2bChYJs:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=qpNx7vswFQc:bVor2bChYJs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=qpNx7vswFQc:bVor2bChYJs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=qpNx7vswFQc:bVor2bChYJs:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=qpNx7vswFQc:bVor2bChYJs:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=qpNx7vswFQc:bVor2bChYJs:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=qpNx7vswFQc:bVor2bChYJs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=qpNx7vswFQc:bVor2bChYJs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/muness/~4/qpNx7vswFQc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://muness.blogspot.com/feeds/5242540846920615639/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5159103&amp;postID=5242540846920615639" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/5242540846920615639?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/5242540846920615639?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/muness/~3/qpNx7vswFQc/buckets-of-mice.html" title="Buckets of mice" /><author><name>muness</name><uri>http://www.blogger.com/profile/13080591937269765506</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="21" height="32" src="http://bp0.blogger.com/_X2VtRiH_7DA/R56LyWhXlmI/AAAAAAAAAoM/_yR-nOi5JJ0/S220/PICT0025.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_X2VtRiH_7DA/SBH4DqhRgAI/AAAAAAAAAqQ/Rnde9NuPB1U/s72-c/20080418-P1000587-1.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://muness.blogspot.com/2008/04/buckets-of-mice.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4HRnw6fip7ImA9WxZbE0g.&quot;"><id>tag:blogger.com,1999:blog-5159103.post-6421023039744662815</id><published>2008-04-16T09:06:00.002-05:00</published><updated>2008-04-16T09:08:57.216-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-16T09:08:57.216-05:00</app:edited><title>cmd line history meme</title><content type="html">&lt;p&gt;&lt;a href=http://robsanheim.com/2008/04/16/history-meme-onwards/&gt;Rob tagged me&lt;/a&gt;.  So:
&lt;code&gt;
&lt;pre&gt;
muness$ history 1000 | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head
102 git
72 ls
63 cd
40 ss
35 rake
24 m
17 up
14 st
12 sc
11 ri
&lt;/pre&gt;
&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;Tag, you're it.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5159103-6421023039744662815?l=muness.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/muness?a=jzQvUhlJCSY:OTGohg7Bevg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=jzQvUhlJCSY:OTGohg7Bevg:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=jzQvUhlJCSY:OTGohg7Bevg:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=jzQvUhlJCSY:OTGohg7Bevg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=jzQvUhlJCSY:OTGohg7Bevg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=jzQvUhlJCSY:OTGohg7Bevg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=jzQvUhlJCSY:OTGohg7Bevg:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=jzQvUhlJCSY:OTGohg7Bevg:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=jzQvUhlJCSY:OTGohg7Bevg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=jzQvUhlJCSY:OTGohg7Bevg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/muness/~4/jzQvUhlJCSY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://muness.blogspot.com/feeds/6421023039744662815/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5159103&amp;postID=6421023039744662815" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/6421023039744662815?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/6421023039744662815?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/muness/~3/jzQvUhlJCSY/cmd-line-history-meme.html" title="cmd line history meme" /><author><name>muness</name><uri>http://www.blogger.com/profile/13080591937269765506</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="21" height="32" src="http://bp0.blogger.com/_X2VtRiH_7DA/R56LyWhXlmI/AAAAAAAAAoM/_yR-nOi5JJ0/S220/PICT0025.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://muness.blogspot.com/2008/04/cmd-line-history-meme.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4FRHoycSp7ImA9WxZbGE0.&quot;"><id>tag:blogger.com,1999:blog-5159103.post-5204672793446017781</id><published>2008-04-11T12:10:00.012-05:00</published><updated>2008-04-21T14:08:35.499-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-21T14:08:35.499-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="example" /><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="retrospectives" /><title>Distributed Retrospectives</title><content type="html">&lt;p&gt;
&lt;em&gt;&lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;location=http%3A%2F%2Fwww.amazon.com%2FAgile-Retrospectives-Making-Teams-Great%2Fdp%2F0977616649%3Fie%3DUTF8%26s%3Dbooks%26qid%3D1208008472%26sr%3D8-1&amp;tag=mundaneessays-20&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325"&gt;Agile Retrospectives&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=mundaneessays-20&amp;amp;l=ur2&amp;amp;o=1" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&lt;/em&gt; (Esther Derby, Diana Larsen) and &lt;em&gt;&lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;location=http%3A%2F%2Fwww.amazon.com%2FProject-Retrospectives-Handbook-Team-Reviews%2Fdp%2F0932633447%3Fie%3DUTF8%26s%3Dbooks%26qid%3D1208008482%26sr%3D8-1&amp;tag=mundaneessays-20&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325"&gt;Project Retrospectives&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=mundaneessays-20&amp;amp;l=ur2&amp;amp;o=1" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&lt;/em&gt; (Norman L. Kerth) have been a great resource in facilitating - or helping others facilitate - retrospectives.  I'll often leaf through them a day or two before a retrospective to remind myself of the framework (more on that in an forthcoming post), and to introduce new activities or create my own.
&lt;/p&gt;
&lt;p&gt;
Something that neither of those books tackle directly is how to facilitate a distributed retrospective.  Given that &lt;a href="http://thinkrelevance.com"&gt;we've&lt;/a&gt; been running a few of those lately, I wanted to share some tips:
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;&lt;strong&gt;Your equipment matters&lt;/strong&gt;.  It took us a while to find a speaker phone that worked well for those in the office and those on the other end.  It's hard enough to communicate effectively without being in the same room, without muffled voices.  We use a Polycom unit with two extensions for a 20x16 room.&lt;/li&gt;
 &lt;li&gt;Prepare.  There's a lot of preparation that goes into running a retrospective in person.  You have to &lt;strong&gt;familiarize yourself with the project, look for a theme, send out invitations, pick activities (and backup activities in case one isn't working), and collect the tools/resources you need for those activities.&lt;/strong&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://docs.google.com"&gt;Google Docs&lt;/a&gt; is your friend.  With its near real time updates for viewers and collaborators, it's been an indispensable tool to take notes.  The facilitator or a scribe can update the document and others can see what's happening, on the fly.&lt;/li&gt;
 &lt;li&gt;It's not enough to use a Google Doc, you need to turn it into an online workspace that makes others feel like they're part of the process.  For example, I prepare a google document with activities scheduled for the retrospective.  I take care to:
 &lt;ul&gt;
  &lt;li&gt;Clearly state activity names.  When we move to the next one, it's enough to say its name and everyone can easily find the appropriate section.&lt;/li&gt;
  &lt;li&gt;Describe the activity.  &lt;strong&gt;Having a written description allows people who miss the spoken description to follow the intent as well as the process involved&lt;/strong&gt;.  Missing a description over a conference call can happen for all sorts of reasons, from people being more easily distracted, to phone problems.&lt;/li&gt;
  &lt;li&gt;State the targeted time for the activity.  People are even more restless on a conference call.  This gives them a sense of the overall meeting's timeline.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Copy or summarize information from previous retrospective documents&lt;/strong&gt; for ease of reference.&lt;/li&gt;
 &lt;/ul&gt;
        &lt;li&gt;Share with others.  Sharing the document with others as collaborators (rather than just viewers) gives them the confidence that they can correct mistakes.&lt;/li&gt;
        &lt;li&gt;Don't forget to &lt;strong&gt;send an email shortly before the meeting that serves as a reminder, repeats the phone number/conference line details and includes a link to the Google Doc&lt;/strong&gt; for that meeting.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;

&lt;p&gt;
I've shared a &lt;a href="http://docs.google.com/Doc?id=dchgzgwd_20cnnwffgs"&gt;Google Doc template&lt;/a&gt; for a 2 hour iteration retrospective for 4 to 8 people you can refer to or use as a starting point for your own living retrospective document.  Credit goes to Agile Retrospectives for the activities.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5159103-5204672793446017781?l=muness.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/muness?a=zpiUPp3TQ6M:kMB0QfnPfrE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=zpiUPp3TQ6M:kMB0QfnPfrE:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=zpiUPp3TQ6M:kMB0QfnPfrE:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=zpiUPp3TQ6M:kMB0QfnPfrE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=zpiUPp3TQ6M:kMB0QfnPfrE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=zpiUPp3TQ6M:kMB0QfnPfrE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=zpiUPp3TQ6M:kMB0QfnPfrE:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=zpiUPp3TQ6M:kMB0QfnPfrE:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=zpiUPp3TQ6M:kMB0QfnPfrE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=zpiUPp3TQ6M:kMB0QfnPfrE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/muness/~4/zpiUPp3TQ6M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://muness.blogspot.com/feeds/5204672793446017781/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5159103&amp;postID=5204672793446017781" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/5204672793446017781?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/5204672793446017781?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/muness/~3/zpiUPp3TQ6M/distributed-retrospectives.html" title="Distributed Retrospectives" /><author><name>muness</name><uri>http://www.blogger.com/profile/13080591937269765506</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="21" height="32" src="http://bp0.blogger.com/_X2VtRiH_7DA/R56LyWhXlmI/AAAAAAAAAoM/_yR-nOi5JJ0/S220/PICT0025.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://muness.blogspot.com/2008/04/distributed-retrospectives.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8GSH0_cCp7ImA9WxZbEE0.&quot;"><id>tag:blogger.com,1999:blog-5159103.post-19428114268638310</id><published>2008-04-11T09:20:00.007-05:00</published><updated>2008-04-12T09:00:29.348-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-12T09:00:29.348-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="waste" /><category scheme="http://www.blogger.com/atom/ns#" term="tdd" /><category scheme="http://www.blogger.com/atom/ns#" term="bdd" /><title>Testing declarative code</title><content type="html">&lt;p&gt;For a while now, I've had my doubts about the usefulness of one aspect of test driven development (which applies equally well to behavior driven development): that it should be done 100% of the time.&lt;/p&gt;

&lt;p&gt;The first time I came across this, was at ThoughtWorks.  The question was whether we should TDD declarative delegations.  I remember a several hour long conversation about the merits of tests for Forwardable based delegations.
&lt;code&gt;
&lt;pre&gt;
class A
  extend Forwardable
  def initialize(b)
    @b = b
  end
  def_delegator :@b, :some_method  # Should I write a test before writing this declaration?!
end
&lt;/pre&gt;
&lt;/code&gt;
&lt;/p&gt;

&lt;p&gt;
A specification for this declaration would be:
&lt;code&gt;
&lt;pre&gt;
describe "A" do
  it "delegates some_method to b" do
    a = A.new(stub(:some_method =&gt; :x))
    a.some_method.should == :x
    # or you could use the &lt;a href=http://handoff.rubyforge.org/&gt;Handoff&lt;/a&gt; assertion:
    assert_handoff.from(A.new).to(:@b).for_method(:some_method)
  end
end
&lt;/pre&gt;
&lt;/code&gt;
&lt;/p&gt;

&lt;p&gt;I didn't get the fuss -- it was clear to me that testing such delegations was wasteful and a maintenance hassle.  But I didn't realize that this was part of a larger argument.&lt;/p&gt;

&lt;h1&gt;Not an isolated case&lt;/h1&gt;
&lt;p&gt;Since then, I've learned that to some developers this is a general rule.  Here's another example, re testing stock ActiveRecord validation declarations, e.g.:
&lt;code&gt;
&lt;pre&gt;
class Model &lt; ActiveRecord::Base
  validates_presence_of :attr_1
end
&lt;/pre&gt;
&lt;/code&gt;
&lt;/p&gt;

&lt;p&gt;
The test for this would be:
&lt;code&gt;
&lt;pre&gt;
describe "Model" do
  it "validates_presence_of :attr_1" do
    model = Model.new
    model.valid?
    model.errors.on(:attr_1).should == "must not be blank"
  end
  # or you might write a helper that reflects on validates_presence_of declarations
  test_model_validates_presence_of Model, :attr_1
end
&lt;/pre&gt;
&lt;/code&gt;
&lt;/p&gt;

&lt;p&gt;It took me a while (too long) to get the general pattern: these discussions I kept finding myself in all had to do with testing declarations.&lt;/p&gt;

&lt;h1&gt;How did we get here?&lt;/h1&gt;

&lt;p&gt;Test driven development as best as I can tell is a - pragmatic - descendant of formal specifications:
&lt;blockquote&gt;
"A formal specification is a mathematical description of software or hardware that may be used to develop an implementation. It describes what the system should do, not how the system should do it. Given such a specification, it is possible to use formal verification techniques to demonstrate that a candidate system design is correct with respect to the specification."
&lt;/blockquote&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Writing formal specifications for the majority of the software isn't practical.  Writing tests first provides us a simple, practical way to write executable specifications.&lt;/strong&gt;  True, they don't give us the ability to use "formal verification techniques" to prove anything about our code, but they do give us confidence that our code does what our tests say the code does (as much confidence as we have in our tests).
&lt;/p&gt;

&lt;h1&gt;The rule&lt;/h1&gt;

&lt;p&gt;The rule regarding TDD is: If you can TDD it and it's destined to be production code, you should TDD it.&lt;/p&gt;

&lt;p&gt;
The problem I find with this rule is that it causes us to write tests like those above that duplicates the declarative code.  At best case it goes like this:
&lt;code&gt;
&lt;pre&gt;
  # We write this code first in the spec:
  test_model_validates_presence_of Model, :attr_1 
  # we run it and watch it fail...
  # and then we write this in the model class:
  validates_presence_of :attr_1 
  # rerun the test and watch it pass...
&lt;/pre&gt;
&lt;/code&gt;
&lt;/p&gt;

&lt;p&gt;
I find this wasteful:  We first implement the &lt;code&gt;test_declaration_is_called&lt;/code&gt; (in this case, &lt;code&gt;test_model_validates_presence_of&lt;/code&gt;) for every declaration.  After all that work (and not to mention code that we have to maintain) we end up with a test that tells us what the declaration itself does.  But with less readability and intent.  Indeed, &lt;strong&gt;declarative code is in fact formal specification&lt;/strong&gt;.
&lt;/p&gt;

&lt;h1&gt;Guidelines not rules&lt;/h1&gt;
&lt;p&gt;Writing tests first is a great guideline.  I do it &lt;strong&gt;almost&lt;/strong&gt; all the time.  But I don't do it all the time.  It makes me &lt;em&gt;angry&lt;/em&gt; when I change declarative code only to have a test that looks exactly the same fail as well.&lt;/p&gt;

&lt;p&gt;OK, tests for declarations don't really make me angry.  But they do make me wonder if the developer who wrote the test really likes to answer the question, "are you sure that you're sure that you want to do what you just said you want to do?"&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5159103-19428114268638310?l=muness.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/muness?a=4QLilylAo-4:DK8Viw7DulE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=4QLilylAo-4:DK8Viw7DulE:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=4QLilylAo-4:DK8Viw7DulE:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=4QLilylAo-4:DK8Viw7DulE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=4QLilylAo-4:DK8Viw7DulE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=4QLilylAo-4:DK8Viw7DulE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=4QLilylAo-4:DK8Viw7DulE:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=4QLilylAo-4:DK8Viw7DulE:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=4QLilylAo-4:DK8Viw7DulE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=4QLilylAo-4:DK8Viw7DulE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/muness/~4/4QLilylAo-4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://muness.blogspot.com/feeds/19428114268638310/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5159103&amp;postID=19428114268638310" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/19428114268638310?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/19428114268638310?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/muness/~3/4QLilylAo-4/testing-declarative-code.html" title="Testing declarative code" /><author><name>muness</name><uri>http://www.blogger.com/profile/13080591937269765506</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="21" height="32" src="http://bp0.blogger.com/_X2VtRiH_7DA/R56LyWhXlmI/AAAAAAAAAoM/_yR-nOi5JJ0/S220/PICT0025.jpg" /></author><thr:total>4</thr:total><feedburner:origLink>http://muness.blogspot.com/2008/04/testing-declarative-code.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUGQnY4cSp7ImA9WxZWFUw.&quot;"><id>tag:blogger.com,1999:blog-5159103.post-7750504015905358521</id><published>2008-03-14T10:59:00.005-05:00</published><updated>2008-03-14T12:37:03.839-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-03-14T12:37:03.839-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><category scheme="http://www.blogger.com/atom/ns#" term="build" /><category scheme="http://www.blogger.com/atom/ns#" term="campfire" /><category scheme="http://www.blogger.com/atom/ns#" term="communication" /><title>Where there's smoke signals...</title><content type="html">In a &lt;a href=http://muness.blogspot.com/2008/02/ccrb-campfire-notifier-released.html&gt;previous post&lt;/a&gt;, I briefly described how we were using cc_campfire_notifier to get build success/failure notifications in campfire.  cc_campfire_notifier has lost momentum over the last couple of months.  Since we actively rely on the notifier for several projects, we've now forked it as &lt;A HREF=http://opensource.thinkrelevance.com/wiki/smoke_signals&gt;smoke_signals&lt;/a&gt;.
&lt;p&gt;The first release offers the following improvements:
&lt;ul&gt;
&lt;li&gt;Each notification includes a link back to the CruiseControl.rb build (so you have one-click access to the full details for each build).
&lt;li&gt;Recognizes apr_error errors as SVN errors (so you'll spend less time scratching your head over generic build failure messages).
&lt;li&gt;Speaks once into the campfire room whenever an unexpected error occurs (as opposed to speaking once per line in the backtrace).
&lt;/ul&gt; 
&lt;p&gt;Check out the notifier's &lt;a href=http://opensource.thinkrelevance.com/wiki/smoke_signals&gt;home page&lt;/a&gt; for installation instructions or head on over to &lt;a href=http://github.com/relevance/smoke_signals/tree&gt;GitHub to browse the code&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5159103-7750504015905358521?l=muness.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/muness?a=YEvJ4qZnHPM:nDMKT9jjDJA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=YEvJ4qZnHPM:nDMKT9jjDJA:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=YEvJ4qZnHPM:nDMKT9jjDJA:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=YEvJ4qZnHPM:nDMKT9jjDJA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=YEvJ4qZnHPM:nDMKT9jjDJA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=YEvJ4qZnHPM:nDMKT9jjDJA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=YEvJ4qZnHPM:nDMKT9jjDJA:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=YEvJ4qZnHPM:nDMKT9jjDJA:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=YEvJ4qZnHPM:nDMKT9jjDJA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=YEvJ4qZnHPM:nDMKT9jjDJA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/muness/~4/YEvJ4qZnHPM" height="1" width="1"/&gt;</content><link rel="related" href="http://opensource.thinkrelevance.com/wiki/smoke_signals" title="Where there's smoke signals..." /><link rel="replies" type="application/atom+xml" href="http://muness.blogspot.com/feeds/7750504015905358521/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5159103&amp;postID=7750504015905358521" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/7750504015905358521?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/7750504015905358521?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/muness/~3/YEvJ4qZnHPM/where-theres-smoke-signals.html" title="Where there's smoke signals..." /><author><name>muness</name><uri>http://www.blogger.com/profile/13080591937269765506</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="21" height="32" src="http://bp0.blogger.com/_X2VtRiH_7DA/R56LyWhXlmI/AAAAAAAAAoM/_yR-nOi5JJ0/S220/PICT0025.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://muness.blogspot.com/2008/03/where-theres-smoke-signals.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkECSHw_fSp7ImA9WxZXGEw.&quot;"><id>tag:blogger.com,1999:blog-5159103.post-3266222172370567112</id><published>2008-03-06T08:46:00.003-05:00</published><updated>2008-03-06T09:44:29.245-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-03-06T09:44:29.245-05:00</app:edited><title>Release early, release often, business edition</title><content type="html">One of the things we preach as software developers is &lt;a href=http://catb.org/~esr/writings/cathedral-bazaar/cathedral-bazaar/ar01s04.html&gt;release early, release often&lt;/a&gt;.  I think ESR is right in that our primary motivation for this is often related to quality:
&lt;blockquote&gt;
In the bazaar view, on the other hand, you assume that bugs are generally shallow phenomena—or, at least, that they turn shallow pretty quickly when exposed to a thousand eager co-developers pounding on every single new release. &lt;strong&gt;Accordingly you release often in order to get more corrections&lt;/strong&gt;, and as a beneficial side effect you have less to lose if an occasional botch gets out the door.
&lt;/blockquote&gt;
&lt;p&gt;
As I've done more project consulting and management, I've realized that the benefits extend well beyond the technical ones.  But I've had a difficult time articulating the business benefits to incremental, frequent releases.  

&lt;p&gt;Last week, Ross posted an article that describes one of the primary business benefits to frequent, early releases, &lt;a href=http://agilemanager.blogspot.com/2008/02/minimising-speculative-risk-of-it.html&gt;Minimising the Speculative Risk of IT Investments&lt;/a&gt;:
&lt;blockquote&gt;
With each incremental delivery, and every increase in tangible value, the intangible or speculative value decreases. &lt;strong&gt;The reduction in speculative value at risk represents a reduction in the total value that can be depressed through delays in delivery&lt;/strong&gt;. Thus, early delivery reduces the risk of speculative value not being realised. Simultaneously, it reduces the volatility of returns.
&lt;/blockquote&gt;
&lt;p&gt;What other benefits do you find to the business from releasing early, releasing often?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5159103-3266222172370567112?l=muness.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/muness?a=Eo-mgTOsG5c:9ZRrFreaEl8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=Eo-mgTOsG5c:9ZRrFreaEl8:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=Eo-mgTOsG5c:9ZRrFreaEl8:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=Eo-mgTOsG5c:9ZRrFreaEl8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=Eo-mgTOsG5c:9ZRrFreaEl8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=Eo-mgTOsG5c:9ZRrFreaEl8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=Eo-mgTOsG5c:9ZRrFreaEl8:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=Eo-mgTOsG5c:9ZRrFreaEl8:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=Eo-mgTOsG5c:9ZRrFreaEl8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=Eo-mgTOsG5c:9ZRrFreaEl8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/muness/~4/Eo-mgTOsG5c" height="1" width="1"/&gt;</content><link rel="related" href="http://agilemanager.blogspot.com/2008/02/minimising-speculative-risk-of-it.html" title="Release early, release often, business edition" /><link rel="replies" type="application/atom+xml" href="http://muness.blogspot.com/feeds/3266222172370567112/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5159103&amp;postID=3266222172370567112" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/3266222172370567112?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/3266222172370567112?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/muness/~3/Eo-mgTOsG5c/release-early-release-often-business.html" title="Release early, release often, business edition" /><author><name>muness</name><uri>http://www.blogger.com/profile/13080591937269765506</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="21" height="32" src="http://bp0.blogger.com/_X2VtRiH_7DA/R56LyWhXlmI/AAAAAAAAAoM/_yR-nOi5JJ0/S220/PICT0025.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://muness.blogspot.com/2008/03/release-early-release-often-business.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkUGQX88fSp7ImA9WxZUGUk.&quot;"><id>tag:blogger.com,1999:blog-5159103.post-4193223504556281643</id><published>2008-02-07T18:19:00.001-05:00</published><updated>2008-04-11T15:03:40.175-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-11T15:03:40.175-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><category scheme="http://www.blogger.com/atom/ns#" term="communication" /><title>CC.rb Campfire Notifier Released</title><content type="html">&lt;strong&gt;Note&lt;/strong&gt;: I've forked this notifier to add features and fix some bugs at in &lt;a href=http://muness.blogspot.com/2008/03/where-theres-smoke-signals.html&gt;Smoke Signals&lt;/a&gt;.

At Relevance, we make heavy use of Campfire for our distributed projects.  One room per project, and we expect everyone to "be in" the relevant room associated with the project they're working on at the time.  We use it to communicate: to ask for a pair (we've tried Leopard's Remote Desktop Sharing, but have no settled mostly on emacs + screen), ask questions, request code reviews (we've taken to using the topic for posting ad hoc requests like that), and make announcements.

&lt;p&gt;
This virtual space has many disadvantages over being in the same room as I'd been used to on my previous couple of projects, but it did have a nice perk: SVN commit notifications were right there alongside our own discussions.  The notices were more useful than I expected, a quick, clear indicator of our pace on a given day.

&lt;p&gt;
Naturally, I wanted our other major automated task to notify us of 
&lt;A HREF=http://ccmenu.sourceforge.net/&gt;CCMenu&lt;/A&gt; is OK, but it's disconnected from our primary virtual space (Campfire, as discussed above).  Being &lt;a href=http://undefined.com/ia/2006/10/24/the-fourteen-types-of-programmers-type-4-lazy-ones/&gt;lazy&lt;/a&gt;, I didn't want to build it myself, so I first looked around for tools that suited my needs.  Much to my chagrin, none did, so I took the one that was closest and added to it what I needed: &lt;a href=http://campfire-ccrb.rubyforge.org/svn/test/campfire_notifier_test.rb&gt;specs&lt;/a&gt;.  Then came the stuff that was missing: ssl support and support for one room per project.  And last but not least, to help deal with configuration hassles and debugging, I added logging.

&lt;p&gt;
If you're using CruiseControl.rb and Campfire, give it a whirl.  Instructions are in the &lt;a href=http://campfire-ccrb.rubyforge.org/svn/CampfireNotifier.README&gt;README&lt;/A&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5159103-4193223504556281643?l=muness.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/muness?a=EmE3JpCdcrw:JFTB04RMrlw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=EmE3JpCdcrw:JFTB04RMrlw:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=EmE3JpCdcrw:JFTB04RMrlw:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=EmE3JpCdcrw:JFTB04RMrlw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=EmE3JpCdcrw:JFTB04RMrlw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=EmE3JpCdcrw:JFTB04RMrlw:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=EmE3JpCdcrw:JFTB04RMrlw:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=EmE3JpCdcrw:JFTB04RMrlw:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=EmE3JpCdcrw:JFTB04RMrlw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=EmE3JpCdcrw:JFTB04RMrlw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/muness/~4/EmE3JpCdcrw" height="1" width="1"/&gt;</content><link rel="related" href="http://gilesbowkett.blogspot.com/2008/02/campfire-ccrb-plugin-v03-released.html" title="CC.rb Campfire Notifier Released" /><link rel="replies" type="application/atom+xml" href="http://muness.blogspot.com/feeds/4193223504556281643/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5159103&amp;postID=4193223504556281643" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/4193223504556281643?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/4193223504556281643?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/muness/~3/EmE3JpCdcrw/ccrb-campfire-notifier-released.html" title="CC.rb Campfire Notifier Released" /><author><name>muness</name><uri>http://www.blogger.com/profile/13080591937269765506</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="21" height="32" src="http://bp0.blogger.com/_X2VtRiH_7DA/R56LyWhXlmI/AAAAAAAAAoM/_yR-nOi5JJ0/S220/PICT0025.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://muness.blogspot.com/2008/02/ccrb-campfire-notifier-released.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMCQns-eSp7ImA9WxRbGE0.&quot;"><id>tag:blogger.com,1999:blog-5159103.post-3824245386675763112</id><published>2008-02-05T16:53:00.000-05:00</published><updated>2008-12-09T01:17:43.551-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-09T01:17:43.551-05:00</app:edited><title>Pi</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.wired.com/science/discoveries/news/2008/02/dayintech_0205"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_X2VtRiH_7DA/R6jjj2hXloI/AAAAAAAAAoc/31Ehh2U21FU/s640/TextMateScreenSnapz002.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5163627177850672770" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5159103-3824245386675763112?l=muness.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/muness?a=ozMWTmJTq5Q:_mhHkDBfr1A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=ozMWTmJTq5Q:_mhHkDBfr1A:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=ozMWTmJTq5Q:_mhHkDBfr1A:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=ozMWTmJTq5Q:_mhHkDBfr1A:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=ozMWTmJTq5Q:_mhHkDBfr1A:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=ozMWTmJTq5Q:_mhHkDBfr1A:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=ozMWTmJTq5Q:_mhHkDBfr1A:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=ozMWTmJTq5Q:_mhHkDBfr1A:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=ozMWTmJTq5Q:_mhHkDBfr1A:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=ozMWTmJTq5Q:_mhHkDBfr1A:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/muness/~4/ozMWTmJTq5Q" height="1" width="1"/&gt;</content><link rel="related" href="http://www.wired.com/science/discoveries/news/2008/02/dayintech_0205" title="Pi" /><link rel="replies" type="application/atom+xml" href="http://muness.blogspot.com/feeds/3824245386675763112/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5159103&amp;postID=3824245386675763112" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/3824245386675763112?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/3824245386675763112?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/muness/~3/ozMWTmJTq5Q/pi.html" title="Pi" /><author><name>muness</name><uri>http://www.blogger.com/profile/13080591937269765506</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="21" height="32" src="http://bp0.blogger.com/_X2VtRiH_7DA/R56LyWhXlmI/AAAAAAAAAoM/_yR-nOi5JJ0/S220/PICT0025.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_X2VtRiH_7DA/R6jjj2hXloI/AAAAAAAAAoc/31Ehh2U21FU/s72-c/TextMateScreenSnapz002.jpg" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://muness.blogspot.com/2008/02/pi.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUUDSH85cCp7ImA9WxZbEUU.&quot;"><id>tag:blogger.com,1999:blog-5159103.post-2158564186679554778</id><published>2008-01-20T18:46:00.001-05:00</published><updated>2008-04-14T10:34:39.128-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-14T10:34:39.128-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="rules" /><category scheme="http://www.blogger.com/atom/ns#" term="jerryweinberg" /><category scheme="http://www.blogger.com/atom/ns#" term="satir" /><category scheme="http://www.blogger.com/atom/ns#" term="project management" /><category scheme="http://www.blogger.com/atom/ns#" term="communication" /><category scheme="http://www.blogger.com/atom/ns#" term="team" /><title>Managers and rules</title><content type="html">&lt;A HREF=http://www.geraldmweinberg.com/BIOStuff/EachBIO/bio.Jerry.html&gt;Jerry Weinberg&lt;/A&gt;, if you don't know him, is the author of more than a dozen books on software development and memorable laws such as the &lt;A HREF=http://en.wikipedia.org/wiki/Weinberg%27s_Law_of_Twins&gt;Law of Twins&lt;/A&gt;.  In Quality Software Management: Systems Thinking, published in '92, he described what we might today call an agile team.  (He lists several levels of software team cultures, ranging from Oblivious to Congruent.  Along that spectrum, an agile team would fall somewhere along Steering, Anticipating and Congruent.)

&lt;p&gt;
At &lt;a href=http://www.ayeconference.com/&gt;AYE&lt;/A&gt; 2007, I had the pleasure of meeting Jerry in person.  Something that I was not aware of was his remarkable skill at helping others.  Instead of answering a request for advice directly, he'd delve into the details, applying something like the &lt;A HREF=http://en.wikipedia.org/wiki/5_Whys&gt;5 Whys&lt;/A&gt;.  Within minutes, he would hone in on a rule that the person had imposed on themselves that was at the root of the problem.  After expressing the problematic rule, he'd help them relax the rule into guidelines.  Several people who've spent more time with him have echoed my gut feel that they too found this ability to help others rare and invaluable.

&lt;p&gt;
His approach to helping individuals is based on &lt;A HREF=http://en.wikipedia.org/wiki/Virginia_Satir&gt;Virginia Satir&lt;/A&gt;'s work in family therapy on survival rule transformation.  An excerpt from The New People Making:
&lt;blockquote&gt;
After you have written down all the rules your family thinks exist and cleared up any misunderstanding about them, go on to the next phase.  Try to discover which of your rules are still up to date and which are not.  As fast as the world changes, it is easy to have out-of-date rules.  Are you driving a modern car with Model T rules?  Many families are doing just this.  If you find that you are, can you bring your rules up to date and throw away the old ones?  One characteristic of a nurturing family is the ability to keep its rules up to date.

&lt;p&gt;
Now ask yourself if your rules are helping or obstructing.  What do you want them to accomplish?  Good rules facilitate instead of limit.
&lt;/blockquote&gt;

&lt;p&gt;
Last weekend, while attending a Satir workshop I was struck by the applicability of Satir's ideas on rules to teams at work.  There too, rules can be unstated, ambiguous or inapplicable sometimes hampering our ability to get things done, other times making everyone miserable.

&lt;p&gt;
(For a valuable discussion on rules suitable for software development teams, check out the section on Rules in chapter 21 of Software Teamwork:Taking Ownership for Success.  To summarize, the rules should be focused on ensuring that a team has "the capabilities and resources to do the right things, rather than on stepwise procedures to be dogmatically followed".) 

&lt;p&gt;
In big companies the problems are magnified as fully connected networks of people become prohibitively expensive.  For example, it'd take each person over a day out of every week for 25 people to stay in meaningful weekly one-on-one contact.  (Indeed, the few who take the time to build an extensive network can become &lt;a href=http://blog.splitbody.com/2007/6/27/social-networks-in-large-companies&gt;stars&lt;/a&gt; capable of getting things done faster than their peers could.)  Additionally, in a big organization, it's likely that a rule that works for one group will be applied to ones where it doesn't fit.

&lt;p&gt;
The role of a manager is to engender an enabling environment.  But how?  Virginia Satir's approach to rule transformation provides one way.  One which fits in well with the management advice in many of the management books I am familiar with, including Behind Closed Doors, Peopleware and Slack.

&lt;p&gt;
Here's how I describe the process:
&lt;ol&gt;
&lt;li&gt;Identify implicit rules and restate the explicit ones.
&lt;li&gt;Explore how they came about.
&lt;li&gt;Express the rules explicitly.
&lt;li&gt;Clear up ambiguities in the team's understanding of each rule.
&lt;li&gt;Evaluate each rule's applicability.
&lt;/ol&gt;

&lt;p&gt;
Having done this, you might find that a rule is:
&lt;ul&gt;
&lt;li&gt;Helpful and reasonable.  So, apply it!
&lt;li&gt;Helpful but impossible or untenable.  Then transform it into one or more guidelines that aren't prohibitive.
&lt;li&gt;Limiting or obstructing your team.  If so, the rule should be challenged, publicly.
&lt;/ul&gt;


&lt;p&gt;
Again, quoting The New People Making:
&lt;blockquote&gt;
What do you think about your rules?  Are they overt, human [i.e. reasonable] and up to date?  Or are they covert, inhuman [i.e. prohibitive, impossible] and out of date?  If your rules are mostly of the second variety, I think you realize that you and your family [or team] have some important and necessary work to do.  If your rules are of the first category, you are probably all having a ball.
&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5159103-2158564186679554778?l=muness.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/muness?a=y0Wmx77ypOg:xpkcE9x-yQc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=y0Wmx77ypOg:xpkcE9x-yQc:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=y0Wmx77ypOg:xpkcE9x-yQc:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=y0Wmx77ypOg:xpkcE9x-yQc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=y0Wmx77ypOg:xpkcE9x-yQc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=y0Wmx77ypOg:xpkcE9x-yQc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=y0Wmx77ypOg:xpkcE9x-yQc:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=y0Wmx77ypOg:xpkcE9x-yQc:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=y0Wmx77ypOg:xpkcE9x-yQc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=y0Wmx77ypOg:xpkcE9x-yQc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/muness/~4/y0Wmx77ypOg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://muness.blogspot.com/feeds/2158564186679554778/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5159103&amp;postID=2158564186679554778" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/2158564186679554778?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/2158564186679554778?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/muness/~3/y0Wmx77ypOg/managers-and-rules.html" title="Managers and rules" /><author><name>muness</name><uri>http://www.blogger.com/profile/13080591937269765506</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="21" height="32" src="http://bp0.blogger.com/_X2VtRiH_7DA/R56LyWhXlmI/AAAAAAAAAoM/_yR-nOi5JJ0/S220/PICT0025.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://muness.blogspot.com/2008/01/managers-and-rules.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UESX89fCp7ImA9WxZSFE8.&quot;"><id>tag:blogger.com,1999:blog-5159103.post-1609694079327489251</id><published>2008-01-19T02:24:00.000-05:00</published><updated>2008-01-27T03:06:48.164-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-01-27T03:06:48.164-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="test/spec" /><category scheme="http://www.blogger.com/atom/ns#" term="tdd" /><title>spec-converter 0.0.3</title><content type="html">Inspired by a link &lt;a href=http://robsanheim.com/&gt;Rob&lt;/a&gt; sent to &lt;a href=http://pivots.pivotallabs.com/users/chad/blog/articles/249-using-search-and-replace-regular-expressions-to-convert-from-test-unit-to-rspec&gt;a blog entry on converting Test::Unit to Rspec&lt;/a&gt;, I added the ability to convert assertions in &lt;a href=http://opensource.thinkrelevance.com/wiki/spec-converter&gt;spec-converter&lt;/a&gt;, as follows:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;assert !foo&lt;/code&gt; with &lt;code&gt;foo.should == false&lt;/code&gt;
&lt;li&gt;&lt;code&gt;assert foo &gt; 20&lt;/code&gt; with &lt;code&gt;foo.should &gt; 20&lt;/code&gt;
&lt;li&gt;&lt;code&gt;assert foo&lt;/code&gt; with &lt;code&gt;foo.should == true&lt;/code&gt;
&lt;li&gt;&lt;code&gt;assert_equal y, x&lt;/code&gt; with &lt;code&gt;x.should == y&lt;/code&gt;
&lt;li&gt;&lt;code&gt;assert_false foo&lt;/code&gt; with &lt;code&gt;foo.should == false&lt;/code&gt;
&lt;li&gt;&lt;code&gt;assert_nil foo&lt;/code&gt; with &lt;code&gt;foo.should == nil&lt;/code&gt;
&lt;li&gt;&lt;code&gt;assert_not_nil foo&lt;/code&gt; with &lt;code&gt;foo.should.not == nil&lt;/code&gt;
&lt;li&gt;&lt;code&gt;assert_true foo &lt;/code&gt; with &lt;code&gt;foo.should == true&lt;/code&gt;
&lt;/ul&gt;
&lt;p&gt;Enjoy your conversion.  ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5159103-1609694079327489251?l=muness.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/muness?a=3fIjftybEKQ:BTNX9Q9luv8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=3fIjftybEKQ:BTNX9Q9luv8:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=3fIjftybEKQ:BTNX9Q9luv8:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=3fIjftybEKQ:BTNX9Q9luv8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=3fIjftybEKQ:BTNX9Q9luv8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=3fIjftybEKQ:BTNX9Q9luv8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=3fIjftybEKQ:BTNX9Q9luv8:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=3fIjftybEKQ:BTNX9Q9luv8:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=3fIjftybEKQ:BTNX9Q9luv8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=3fIjftybEKQ:BTNX9Q9luv8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/muness/~4/3fIjftybEKQ" height="1" width="1"/&gt;</content><link rel="related" href="http://opensource.thinkrelevance.com/wiki/spec-converter" title="spec-converter 0.0.3" /><link rel="replies" type="application/atom+xml" href="http://muness.blogspot.com/feeds/1609694079327489251/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5159103&amp;postID=1609694079327489251" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/1609694079327489251?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/1609694079327489251?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/muness/~3/3fIjftybEKQ/spec-converter-003.html" title="spec-converter 0.0.3" /><author><name>muness</name><uri>http://www.blogger.com/profile/13080591937269765506</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="21" height="32" src="http://bp0.blogger.com/_X2VtRiH_7DA/R56LyWhXlmI/AAAAAAAAAoM/_yR-nOi5JJ0/S220/PICT0025.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://muness.blogspot.com/2008/01/spec-converter-003.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YAQH4ycSp7ImA9WxBbEEg.&quot;"><id>tag:blogger.com,1999:blog-5159103.post-5782931900097321906</id><published>2008-01-18T22:39:00.001-05:00</published><updated>2010-03-08T08:32:21.099-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-08T08:32:21.099-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="alan cooper" /><category scheme="http://www.blogger.com/atom/ns#" term="book review" /><category scheme="http://www.blogger.com/atom/ns#" term="interaction design" /><title>If software could make resolutions...</title><content type="html">Two weeks ago I got what at first glance was yet another electronic greeting, the sort I've come to barely look at for couple of reasons: 1) like everyone else, I never seem to have enough time for everything, and 2) I guess I've become jaded - if someone wants to say hi, I'd rather get a personalized SMS or one sentence email than getting yet another irrelevant "funny" greeting lacking personality.  Seconds after hitting the delete button I restored it from my trash to visit later.
&lt;p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_X2VtRiH_7DA/R5F0J6xrZYI/AAAAAAAAAn4/IXhwqTEaN9k/s1600-h/screen-capture-1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_X2VtRiH_7DA/R5F0J6xrZYI/AAAAAAAAAn4/IXhwqTEaN9k/s320/screen-capture-1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5157030762061194626" /&gt;&lt;/a&gt;
&lt;p&gt;I finally got around to it this evening while catching up on my email, curious as to why I had undeleted it.  For one, it's simple, with lots of white space and only two, clear links: one smack in the middle and an unsubscribe link - noteworthy because unlike most unsubscribe links, it was obvious.
&lt;p&gt;For another it was from Cooper, the interaction design firm.  Over the holidays I'd read Alan Cooper's provocative The Insane are Running the Asylum which resonated with me.  (Just ask the folks at work who must be tired of me ranting, "what do you get when you cross a phone with a computer?  A computer!"  A phone that takes 3 minutes to reboot is more computer than phone, no matter what it looks like.)
&lt;p&gt;I then &lt;a href=http://cdn2.goldmail.com/?GMID=7i8xhec3csrt&gt;clicked the link&lt;/a&gt; and was pleasantly surprised, for what I found was a short, witty presentation with thoughtful design tips, paired with music composed by Philip Glass.  The tips included:
&lt;ul&gt;
&lt;li&gt;Remember users' preferences.
&lt;li&gt;Aesthetics matter.
&lt;li&gt;Stop dialog-boxing your users.
&lt;li&gt;Communicate with them.
&lt;li&gt;Don't follow, lead.
&lt;/ul&gt;
&lt;p&gt;But don't settle for my summary of it, &lt;a href=http://cdn2.goldmail.com/?GMID=7i8xhec3csrt&gt;check it out for yourself&lt;/a&gt;.
&lt;p&gt;These tips are indicative of the ideas in &lt;a href=http://cooper.com/insights/books/&gt;his books&lt;/a&gt;.  The Inmates are Running the Asylum lucidly illustrates various problems that arise when design is merely an afterthought. (Note: his primary focus is on &lt;em&gt;interaction&lt;/em&gt;, not aesthetics.)
&lt;p&gt;One such problem is one I alluded to earlier, about the convergence of various electronics with computers.  When everyone else's focus is on technology and features rather than on user interaction, Apple handily beats them at their own game time and again.  By the by, I contend that this is not because Apple is doing interaction design well as it is because everyone else isn't doing any.
&lt;p&gt;The Insane are Running the Asylum also contained an intriguing discussion of confirmation dialog boxes.  Alan points out that confirmation dialog boxes were a misguided "solution" to a user losing their data.  By adding a dialog box, such a loss was no longer due to poor design, instead it became the user's fault. Why these miserable dialog boxes persist in the days of unlimited undo and Recycle bin recovery is beyond me.
&lt;p&gt;About Face (which I am still reading) focuses on the how instead of the why of interaction design.  It's an interaction design tome.  (I want to point out that it includes an excellent primer on business analysis, covering persona and scenario composition.)  It distinguishes between &lt;em&gt;implementation&lt;/em&gt;, &lt;em&gt;mental&lt;/em&gt; and &lt;em&gt;represented&lt;/em&gt; models.  Simply, the implementation model is the set of classes that encodes the business domain, the mental model is the user's picture of the domain and the represented model is the way the implementation model is presented to the user.
&lt;p&gt;This is in stark contrast to &lt;A HREF=http://domainlanguage.com/ddd/index.html&gt;Domain Driven Design&lt;/A&gt;'s "One Team, One Language" mantra.  By insisting that the implementation must match up with the mental model, it can make our job of building software even more difficult than inherently is.  Or we do the reverse, forcing the implementation model on our user, who thank you very much, already understands her business and will vehemently resent being told what her business &lt;em&gt;really&lt;/em&gt; entails.
&lt;p&gt;By introducing a represented model, we acknowledge that a mental and an implementation model are not equivalent.  The represented model, the result of interaction design, can map from one to the other, facilitating usage and implementation.
&lt;p&gt;If software could make resolutions, it might resolve to be considerate.  Interaction design is part of what will get us there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5159103-5782931900097321906?l=muness.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/muness?a=7pg7bop0Fyw:lmllBk9sABc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=7pg7bop0Fyw:lmllBk9sABc:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=7pg7bop0Fyw:lmllBk9sABc:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=7pg7bop0Fyw:lmllBk9sABc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=7pg7bop0Fyw:lmllBk9sABc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=7pg7bop0Fyw:lmllBk9sABc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=7pg7bop0Fyw:lmllBk9sABc:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=7pg7bop0Fyw:lmllBk9sABc:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=7pg7bop0Fyw:lmllBk9sABc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=7pg7bop0Fyw:lmllBk9sABc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/muness/~4/7pg7bop0Fyw" height="1" width="1"/&gt;</content><link rel="related" href="http://cdn2.goldmail.com/?GMID=7i8xhec3csrt" title="If software could make resolutions..." /><link rel="replies" type="application/atom+xml" href="http://muness.blogspot.com/feeds/5782931900097321906/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5159103&amp;postID=5782931900097321906" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/5782931900097321906?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/5782931900097321906?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/muness/~3/7pg7bop0Fyw/if-software-could-make-resolutions.html" title="If software could make resolutions..." /><author><name>muness</name><uri>http://www.blogger.com/profile/13080591937269765506</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="21" height="32" src="http://bp0.blogger.com/_X2VtRiH_7DA/R56LyWhXlmI/AAAAAAAAAoM/_yR-nOi5JJ0/S220/PICT0025.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_X2VtRiH_7DA/R5F0J6xrZYI/AAAAAAAAAn4/IXhwqTEaN9k/s72-c/screen-capture-1.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://muness.blogspot.com/2008/01/if-software-could-make-resolutions.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUARXc8cCp7ImA9WxZTF0g.&quot;"><id>tag:blogger.com,1999:blog-5159103.post-1282177041666218779</id><published>2008-01-04T22:12:00.000-05:00</published><updated>2008-01-19T10:24:04.978-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-01-19T10:24:04.978-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><category scheme="http://www.blogger.com/atom/ns#" term="test/spec" /><category scheme="http://www.blogger.com/atom/ns#" term="testing" /><title>spec_converter released</title><content type="html">Tired of converting your &lt;A HREF=http://ruby-doc.org/stdlib/libdoc/test/unit/rdoc/classes/Test/Unit.html&gt;Test::Unit &lt;/a&gt; tests over to &lt;a href=http://test-spec.rubyforge.org/test-spec/&gt;test/spec&lt;/a&gt; specs by hand?  So were &lt;a href=http://thinkrelevance.com&gt;we&lt;/a&gt;.  So we made it as &lt;a href=http://spec-converter.rubyforge.org/&gt;easy&lt;/a&gt; as 1,2,3:
&lt;blockquote&gt;
&lt;code&gt;
&lt;pre&gt;
sudo gem install spec-converter
cd ~/work/my_project
spec_converter
&lt;/pre&gt;
&lt;/code&gt;
&lt;/blockquote&gt;
&lt;p&gt;Note that it works on files in place, so be sure to check in or backup first!
&lt;p&gt;It only does the basics right now, converting old style specs to new(&lt;code&gt;context&lt;/code&gt; with &lt;code&gt;describe&lt;/code&gt;, &lt;code&gt;spec&lt;/code&gt; with &lt;code&gt;it&lt;/code&gt;) and things like:
&lt;pre&gt;&lt;code&gt;
def setup
  @o = Object.new
end
def test_should_do_something_cool
  assert_equal 1+1, 2
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;to:
&lt;pre&gt;&lt;code&gt;
before do
  @o = Object.new
end
it "should do something cool" do
  assert_equal 1+1, 2
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;

See &lt;A HREF=http://opensource.thinkrelevance.com/browser/spec_converter/trunk/test/spec_converter_test.rb&gt;its spec&lt;/A&gt; for a full list of features.  If you'd like to grab the latest, get it at &lt;A href=https://opensource.thinkrelevance.com/svn/spec_converter/trunk&gt;the subversion repository&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5159103-1282177041666218779?l=muness.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/muness?a=3DrVNxIbqdM:4LoDpyu_Q7Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=3DrVNxIbqdM:4LoDpyu_Q7Y:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=3DrVNxIbqdM:4LoDpyu_Q7Y:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=3DrVNxIbqdM:4LoDpyu_Q7Y:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=3DrVNxIbqdM:4LoDpyu_Q7Y:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=3DrVNxIbqdM:4LoDpyu_Q7Y:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=3DrVNxIbqdM:4LoDpyu_Q7Y:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=3DrVNxIbqdM:4LoDpyu_Q7Y:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=3DrVNxIbqdM:4LoDpyu_Q7Y:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=3DrVNxIbqdM:4LoDpyu_Q7Y:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/muness/~4/3DrVNxIbqdM" height="1" width="1"/&gt;</content><link rel="related" href="http://spec-converter.rubyforge.org/" title="spec_converter released" /><link rel="replies" type="application/atom+xml" href="http://muness.blogspot.com/feeds/1282177041666218779/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5159103&amp;postID=1282177041666218779" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/1282177041666218779?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/1282177041666218779?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/muness/~3/3DrVNxIbqdM/specconverter-released.html" title="spec_converter released" /><author><name>muness</name><uri>http://www.blogger.com/profile/13080591937269765506</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="21" height="32" src="http://bp0.blogger.com/_X2VtRiH_7DA/R56LyWhXlmI/AAAAAAAAAoM/_yR-nOi5JJ0/S220/PICT0025.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://muness.blogspot.com/2008/01/specconverter-released.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUADQn07cCp7ImA9WB9bGEo.&quot;"><id>tag:blogger.com,1999:blog-5159103.post-3345857122562905683</id><published>2007-12-28T12:11:00.000-05:00</published><updated>2007-12-28T15:29:33.308-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-12-28T15:29:33.308-05:00</app:edited><title>Joining the 5%</title><content type="html">In a &lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=221622"&gt;compelling speech&lt;/a&gt; by Bruce Eckel:
&lt;blockquote&gt;
... Roughly 80% of programmers don't read books, don't go to conferences, don't continue learning, don't do anything but what they covered in college. Maybe they've gotten a job in a big company where they can do the same thing over and over. The other 20% struggle with their profession: they read, try to learn things, listen to podcasts, go to user group meetings and sometimes a conference. 80% of this 20% are not very successful yet; they're still beginning, still trying. The other 20% of this 20% -- &lt;span style="font-weight:bold;"&gt;that's about 5% of the whole who are 20x more productive&lt;/span&gt;.
&lt;p&gt;
So how do you become one of these mythical 5%?
&lt;p&gt;
These people are not those who can remember all the moves and have fingers that fly over the keyboard erupting system commands. In my experience those in the 5% must struggle to get there, and struggle to stay there, and it's the process of continuous learning that makes the difference.
&lt;/blockquote&gt;
&lt;p&gt;It took me a long time to realize that there was such a significant productivity difference.  It took me longer still to realize &lt;a href="http://www.npr.org/templates/story/story.php?storyId=7406521"&gt;that I could - and should - aspire to achieving that increased level of productivity&lt;/a&gt;, and that it wasn't based on innate abilities or otherwise fixed.  Bruce lists some things to do to get there:
&lt;ul&gt;
&lt;li&gt;Read.  A lot.  [Books rife with advice on how to grow as a technical person include Jerry's &lt;em&gt;On Becoming a Technical Leader&lt;/em&gt; and &lt;em&gt;Secrets of Consulting&lt;/em&gt;, the Prags' &lt;em&gt;The Pragmatic Programmer&lt;/em&gt;, and Chad's &lt;em&gt;My Job Went to India&lt;/em&gt;.]
&lt;li&gt;Go to conferences.  But be selective about which ones to go to.
&lt;li&gt;Listen to podcasts.
&lt;li&gt;"Using the best tools, techniques, and ideas at your disposal. Always doing your best."
&lt;li&gt;Attend user group meetings.
&lt;li&gt;Keep the big picture in mind: "... people will still spend all their time on one decision while something else might actually have a far greater influence. Architectural decisions, for example."
&lt;li&gt;Remember Jerry's maxim: "no matter what they tell you, it's always a people problem."
&lt;li&gt;Learn the difference between targets and goals (see the excellent &lt;em&gt;Waltzing with Bears&lt;/em&gt;).  And communicate both.
&lt;li&gt;Never fall for &lt;a href="http://en.wikipedia.org/wiki/No_Silver_Bullet"&gt;silver bullets&lt;/a&gt;.
&lt;li&gt;Keep in mind that "things are the way they are because they got that way ... one logical step at a time."
&lt;/ul&gt;
&lt;p&gt;Tips not in Eckel's speech:
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://headrush.typepad.com/"&gt;Create passionate users&lt;/a&gt;. (The blogosphere isn't the same without you, Kathy!).  This means giving &lt;a href="http://www.cooper.com/insights/books/"&gt;interaction design&lt;/a&gt; the respect and resources that it deserves.
&lt;li&gt;&lt;a href="http://www.zedshaw.com/rants/programmer_stats.html"&gt;Learn statistics&lt;/a&gt;.
&lt;li&gt;&lt;a href=http://muness.blogspot.com/2005/01/bio-and-not-enough-cross-disciplinary.html&gt;Learn about things that have - apparently - nothing to do with programming&lt;/a&gt;.  For example, I've learned much from &lt;A href="http://sethgodin.typepad.com/"&gt;Seth Godin&lt;/a&gt;, who taught me the importance of emotions when delivering a speech, marketing yourself and your team, honesty in that marketing and much more.
&lt;li&gt;Learn &lt;a href=http://www.squidoo.com/thedipbook&gt;when to quit and when to stick&lt;/a&gt;.
&lt;li&gt;Learn how to communicate better.  (Less is more!)
&lt;li&gt;Strive to be the worst member of your team (see &lt;em&gt;My Job Went to India&lt;/em&gt; for a good explanation of what this is all about).
&lt;li&gt;"&lt;a href="http://en.wikipedia.org/wiki/Even_Cowgirls_Get_the_Blues"&gt;Embrace failure!&lt;/a&gt; Seek it out. Learn to love it. That may be the only way any of us will ever be free."  And learn from it.
&lt;li&gt;&lt;a href="http://www.smartlemming.com/blog/index.php/2007/02/12-tips-to-learn-how-to-be-curious/"&gt;Be curious&lt;/a&gt;.
&lt;li&gt;Remember: "no matter what they tell you, it's always a people problem."  Because it bears repeating.
&lt;/ul&gt;
&lt;p&gt;I'd like to close the same way Bruce did his speech:
&lt;blockquote&gt;
You'll need to make a lot of mistakes in order to figure things out. So be humble, and keep asking questions.
&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5159103-3345857122562905683?l=muness.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/muness?a=apa6kwIm1Os:YdzRj0vS8Nw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=apa6kwIm1Os:YdzRj0vS8Nw:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=apa6kwIm1Os:YdzRj0vS8Nw:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=apa6kwIm1Os:YdzRj0vS8Nw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=apa6kwIm1Os:YdzRj0vS8Nw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=apa6kwIm1Os:YdzRj0vS8Nw:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=apa6kwIm1Os:YdzRj0vS8Nw:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=apa6kwIm1Os:YdzRj0vS8Nw:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=apa6kwIm1Os:YdzRj0vS8Nw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=apa6kwIm1Os:YdzRj0vS8Nw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/muness/~4/apa6kwIm1Os" height="1" width="1"/&gt;</content><link rel="related" href="http://www.artima.com/weblogs/viewpost.jsp?thread=221622" title="Joining the 5%" /><link rel="replies" type="application/atom+xml" href="http://muness.blogspot.com/feeds/3345857122562905683/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5159103&amp;postID=3345857122562905683" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/3345857122562905683?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/3345857122562905683?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/muness/~3/apa6kwIm1Os/joining-5.html" title="Joining the 5%" /><author><name>muness</name><uri>http://www.blogger.com/profile/13080591937269765506</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="21" height="32" src="http://bp0.blogger.com/_X2VtRiH_7DA/R56LyWhXlmI/AAAAAAAAAoM/_yR-nOi5JJ0/S220/PICT0025.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://muness.blogspot.com/2007/12/joining-5.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0QFR304fyp7ImA9WB9bFk0.&quot;"><id>tag:blogger.com,1999:blog-5159103.post-247720434582109264</id><published>2007-12-25T13:11:00.000-05:00</published><updated>2007-12-25T14:01:56.337-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-12-25T14:01:56.337-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="sci fi" /><category scheme="http://www.blogger.com/atom/ns#" term="mini" /><category scheme="http://www.blogger.com/atom/ns#" term="review" /><category scheme="http://www.blogger.com/atom/ns#" term="book" /><title>The Carpet Makers</title><content type="html">As you probably know, &lt;a href="http://allconsuming.net/summaries/view/muness/2007/12"&gt;I love reading&lt;/a&gt;.  Sometimes, I come across delightfully engaging books.  This year that's included the masterful Nassim Taleb's &lt;em&gt;&lt;a type="amzn" asin="1400063515"&gt;The Black Swan&lt;/a&gt;&lt;/em&gt;, a &lt;a href="http://en.wikipedia.org/wiki/Black_swan_theory"&gt;provocative look at unexpected, high impact events&lt;/a&gt; and Terry Pratchett's &lt;em&gt;&lt;a type="amzn" asin="0061161640"&gt;Making Money&lt;/a&gt;&lt;/em&gt;, a fantastical treatise on money and how we interact with it (not to mention a fun excursion into the world of systems thinking and modeling).
&lt;p&gt;Today, I finished another excellent book, &lt;em&gt;&lt;a type="amzn" asin="0765305933"&gt;The Carpet Makers&lt;/a&gt;&lt;/em&gt; by Andreas Eschbach (translated from German).  It retells an epic story across planets, solar systems and even dimensions that spans millenniums.  Yet it manages to weave that story with that of individual characters and their personal plight.  The story and his story telling are exciting and engaging making the book difficult to put down.  Highly recommended.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5159103-247720434582109264?l=muness.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/muness?a=K-vDgsgQgY8:EYRnSEXg5yY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=K-vDgsgQgY8:EYRnSEXg5yY:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=K-vDgsgQgY8:EYRnSEXg5yY:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=K-vDgsgQgY8:EYRnSEXg5yY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=K-vDgsgQgY8:EYRnSEXg5yY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=K-vDgsgQgY8:EYRnSEXg5yY:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=K-vDgsgQgY8:EYRnSEXg5yY:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=K-vDgsgQgY8:EYRnSEXg5yY:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=K-vDgsgQgY8:EYRnSEXg5yY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=K-vDgsgQgY8:EYRnSEXg5yY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/muness/~4/K-vDgsgQgY8" height="1" width="1"/&gt;</content><link rel="related" href="http://books.google.com/books?id=Rl3ncXAnmYIC&amp;printsec=frontcover&amp;sig=WG_HfZz8YjRpSRrBcvZAs2myWso" title="The Carpet Makers" /><link rel="replies" type="application/atom+xml" href="http://muness.blogspot.com/feeds/247720434582109264/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5159103&amp;postID=247720434582109264" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/247720434582109264?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/247720434582109264?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/muness/~3/K-vDgsgQgY8/carpet-makers.html" title="The Carpet Makers" /><author><name>muness</name><uri>http://www.blogger.com/profile/13080591937269765506</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="21" height="32" src="http://bp0.blogger.com/_X2VtRiH_7DA/R56LyWhXlmI/AAAAAAAAAoM/_yR-nOi5JJ0/S220/PICT0025.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://muness.blogspot.com/2007/12/carpet-makers.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQFSHkzeip7ImA9WB9bFk0.&quot;"><id>tag:blogger.com,1999:blog-5159103.post-8503166941669833392</id><published>2007-12-25T12:26:00.000-05:00</published><updated>2007-12-25T13:11:59.782-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-12-25T13:11:59.782-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="project management" /><category scheme="http://www.blogger.com/atom/ns#" term="meeting" /><category scheme="http://www.blogger.com/atom/ns#" term="review" /><category scheme="http://www.blogger.com/atom/ns#" term="communication" /><category scheme="http://www.blogger.com/atom/ns#" term="book" /><title>Agile Retrospectives</title><content type="html">&lt;p&gt;At &lt;A href="http://thinkrelevance.com"&gt;Relevance&lt;/A&gt;, we recently added a twist to the way we run our retrospective.  We have a non-team member lead the meeting.  We use this to provide a fresh and impartial perspective give each of a chance to learn about other projects, and introduce more of us to clients.  Here, I wanted to share a primary resource we use for planning and running retrospectives.

&lt;p&gt;Some time back, &lt;a href="http://robsanheim.com/"&gt;Rob&lt;/a&gt; asked me to lead a retrospective for his project.  I’d built up several tools over time to help run a retrospective, but I’d never been quite satisfied with the typical format, consisting of the typical exercise asking participants what they felt was going well and what could be done better.  So I consulted with &lt;a type="amzn" asin="0977616649"&gt;Agile Retrospectives: Making Good Teams Great&lt;/a&gt; and picked out a few exercises from the book including a Check-In, Team Radar, and Learning Matrix.  The book explains the purpose of each exercise, time requirements, a description, necessary materials or preparation as well as an example.  Here’s my summary of the Check-In activity:
&lt;blockquote&gt;
This exercise is used to set the stage and help participants focus on the retrospective.  The format was to go around the room answering the question, "In one or two sentences, what are your hopes for the retrospective?"
&lt;/blockquote&gt;
&lt;p&gt;And of the Team Radar:
&lt;blockquote&gt;
We use this to uncover important factors to the success of the project.  It then is used to measure how well the team members think we're doing in each area by ranking each on a scale from 1 to 10 with higher numbers indicating better performance.  This can be done in future retrospectives and tracked over the life the project.
&lt;/blockquote&gt;
&lt;p&gt;(Check out the &lt;A HREF="http://media.pragprog.com/titles/dlret/Activities.pdf"&gt;Selected Activities (pdf)&lt;/A&gt; on the &lt;A HREF="http://pragprog.com/titles/dlret"&gt;book’s web page&lt;/A&gt; for examples straight out of the book.)
&lt;p&gt;Such exercises have helped me get a lot more out of retrospectives.  Specifically, they've helped our teams get on the same page in terms of important factors to the project and perceptions of how each member thought the team was doing.  We've been able to extract and prioritize action items and track team vitals over time.  Indeed, we've had projects that have had quick, radical changes in project direction and deliverables due to issues uncovered in such meetings.
&lt;p&gt;What resources do you use for running a retrospective?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5159103-8503166941669833392?l=muness.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/muness?a=QJBGJxx4_oc:o7S5NarPLoY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=QJBGJxx4_oc:o7S5NarPLoY:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=QJBGJxx4_oc:o7S5NarPLoY:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=QJBGJxx4_oc:o7S5NarPLoY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=QJBGJxx4_oc:o7S5NarPLoY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=QJBGJxx4_oc:o7S5NarPLoY:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=QJBGJxx4_oc:o7S5NarPLoY:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=QJBGJxx4_oc:o7S5NarPLoY:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/muness?a=QJBGJxx4_oc:o7S5NarPLoY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/muness?i=QJBGJxx4_oc:o7S5NarPLoY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/muness/~4/QJBGJxx4_oc" height="1" width="1"/&gt;</content><link rel="related" href="http://pragprog.com/titles/dlret" title="Agile Retrospectives" /><link rel="replies" type="application/atom+xml" href="http://muness.blogspot.com/feeds/8503166941669833392/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5159103&amp;postID=8503166941669833392" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/8503166941669833392?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5159103/posts/default/8503166941669833392?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/muness/~3/QJBGJxx4_oc/book-review-agile-retrospectives.html" title="Agile Retrospectives" /><author><name>muness</name><uri>http://www.blogger.com/profile/13080591937269765506</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="21" height="32" src="http://bp0.blogger.com/_X2VtRiH_7DA/R56LyWhXlmI/AAAAAAAAAoM/_yR-nOi5JJ0/S220/PICT0025.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://muness.blogspot.com/2007/12/book-review-agile-retrospectives.html</feedburner:origLink></entry></feed>

