<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7133390695499881876</id><updated>2012-02-15T23:46:37.861-08:00</updated><category term='music'/><title type='text'>That is, I think it's not too bad</title><subtitle type='html'>Mostly, but not always, about developing software.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://workingpeter.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7133390695499881876/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://workingpeter.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Peter Moran</name><uri>http://www.blogger.com/profile/04949499747361034820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>9</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7133390695499881876.post-2312075217169663206</id><published>2010-06-18T22:34:00.000-07:00</published><updated>2010-06-20T05:04:14.338-07:00</updated><title type='text'>Specifications with ActiveRecord named scopes</title><content type='html'>The &lt;a href="http://en.wikipedia.org/wiki/Specification_pattern"&gt;specification pattern&lt;/a&gt; is a useful technique for encapsulating the (potentially complex) logic for selecting or validating domain objects in small, composable classes or code blocks. &lt;br /&gt;&lt;br /&gt;Previously on  Java projects I'd used Hibernate's Criteria API to provide chaining across composed selection criteria (validation is the subject for a different post). For Ruby/ActiveRecord, there are a few projects that have implemented similar APIs, but none are especially mature. Handily, ActiveRecord's own &lt;a href="http://api.rubyonrails.org/classes/ActiveRecord/NamedScope/ClassMethods.html"&gt;named scopes&lt;/a&gt; provides a nice way to achieve what I needed (or at least the Rails 2 version of them, things have changed in &lt;a href="http://edgerails.info/articles/what-s-new-in-edge-rails/2010/02/23/the-skinny-on-scopes-formerly-named-scope/"&gt;Rails 3&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;In particular, the undocumented &lt;code&gt;scoped&lt;/code&gt; class method can be used to "disconnect" selection criteria from the model object and encapsulate them in Specification classes. A simple specification can be:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;class IsEffectiveProductSpecification&lt;br /&gt;&lt;br /&gt;  def criteria&lt;br /&gt;    { :conditions =&gt; ["effective_from &lt;= :today", { :today =&gt; Date.today}] }&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;To chain specifications, a composite applies each composed specification's criteria against the model's scoped method:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;class CompositeSpecification &amp;lt; Array&lt;br /&gt;&lt;br /&gt;  def all&lt;br /&gt;    self.inject(Product.scoped(nil)) do |combined_scope, specification|&lt;br /&gt;      combined_scope.scoped(specification.criteria)&lt;br /&gt;    end&lt;br /&gt;  end  &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now in the model we can provide the selection interface that selects from one or more assembled specifications:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;class Product&lt;br /&gt;&lt;br /&gt;  def self.select_satisfying(specification)&lt;br /&gt;    satisfying = specification.all&lt;br /&gt;    # apply more complex selection, such as selecting across different combination of model objects&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I'd be interested in any Rails 3 (or other) approaches that might improve on this implementation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7133390695499881876-2312075217169663206?l=workingpeter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://workingpeter.blogspot.com/feeds/2312075217169663206/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://workingpeter.blogspot.com/2010/06/specification-pattern-is-useful.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7133390695499881876/posts/default/2312075217169663206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7133390695499881876/posts/default/2312075217169663206'/><link rel='alternate' type='text/html' href='http://workingpeter.blogspot.com/2010/06/specification-pattern-is-useful.html' title='Specifications with ActiveRecord named scopes'/><author><name>Peter Moran</name><uri>http://www.blogger.com/profile/04949499747361034820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7133390695499881876.post-3614901661377958849</id><published>2009-10-06T15:46:00.000-07:00</published><updated>2009-10-06T22:24:22.224-07:00</updated><title type='text'>Moving to modular Javascript</title><content type='html'>Once in a while, you come across a site that has exactly the information you're after, when you need it. Recently I was bashing out some Javascript in my usual function-frenzy, randomly adding various comments like&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;// TODO: get rid of all these globals&lt;br /&gt;// TODO: make this more modular and nice&lt;br /&gt;// TODO: I know this is bad, but I'll fix it up later&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://www.klauskomenda.com/code/javascript-programming-patterns/"&gt;JavaScript Programming Patterns&lt;/a&gt; does a terrific job of showing in simple terms some of the approaches to better programming styles for Javascript. I especially like how it discusses moving from the "Old-School Way" (that's me) to my current favourite, "Revealing Modular Pattern". It took me about 15 mins to refactor to this pattern, and I'm already feeling the benefits, particularly in introducing some much needed testing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7133390695499881876-3614901661377958849?l=workingpeter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://workingpeter.blogspot.com/feeds/3614901661377958849/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://workingpeter.blogspot.com/2009/10/moving-to-modular-javascript.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7133390695499881876/posts/default/3614901661377958849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7133390695499881876/posts/default/3614901661377958849'/><link rel='alternate' type='text/html' href='http://workingpeter.blogspot.com/2009/10/moving-to-modular-javascript.html' title='Moving to modular Javascript'/><author><name>Peter Moran</name><uri>http://www.blogger.com/profile/04949499747361034820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7133390695499881876.post-1513203206322302426</id><published>2009-06-16T05:03:00.000-07:00</published><updated>2009-06-26T03:46:45.039-07:00</updated><title type='text'>Iterative website development with Webby</title><content type='html'>Recently I was involved in building a static website and chose to use &lt;a href="http://webby.rubyforge.org/"&gt;Webby&lt;/a&gt; to help build and manage the site. Written in Ruby, Webby is a command line tool that allows you to keep the site content separate from the layout; simple Textile (or other markup languages) content files are rendered into HTML layouts. I soon found that Webby provided nice benefits when we wanted to add functionality to the site incrementally.&lt;br /&gt;&lt;br /&gt;For the first iteration we focused on the static design of the site. A common menu linked to secondary pages. Because Webby lets me use &lt;a href="http://www.ruby-doc.org/stdlib/libdoc/erb/rdoc/classes/ERB.html"&gt;ERB&lt;/a&gt;, I can write (and test, naturally) simple helper methods in Ruby  to build up the menu:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;def menu_items&lt;br /&gt;  @pages.find(:all, :in_directory =&gt; "/main", :sort_by =&gt; 'order')&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Then in the layout (which is mostly HTML but can also use ERB):&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt; &amp;lt;% menu_items.each do |page| %&amp;gt;&lt;br /&gt;   &amp;lt;% if is_current_page?(page) %&amp;gt;&lt;br /&gt;     &amp;lt;li class='current'&amp;gt;&amp;lt;p&amp;gt;&amp;lt;%= page.title %&amp;gt;&amp;lt;/p&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;   &amp;lt;% else %&amp;gt;&lt;br /&gt;     &amp;lt;li&amp;gt;&amp;lt;%= link_to_page(page) %&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;   &amp;lt;% end %&amp;gt;&lt;br /&gt; &amp;lt;% end %&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;If this needs to be reused, it too can be moved into a helper - Webby is great for &lt;a href="http://en.wikipedia.org/wiki/Don%27t_repeat_yourself"&gt;DRYing&lt;/a&gt; up site code.&lt;br /&gt;&lt;br /&gt;After we had the initial design, we naturally decided to sprinkle some effects. Rather than have the menu links load new pages, we used a JQuery animation to fade in the linked content on the main page. For this iteration, we just had to change our full pages into partials (by simply adding an underscore to the filename). Now in our layout, we can generate each partial's content into hidden divs:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&amp;lt;% @partials.find(:all, :in_directory =&amp;gt; "/main") do  |partial| %&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;div id='&amp;lt;%= partial.name %&amp;gt;' style='display: none'&amp;gt;&lt;br /&gt;   &amp;lt;div&amp;gt;&amp;lt;%= render(:partial =&amp;gt; partial) %&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;% end %&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Some simple Javascript now lets the menu items update the main content area with a nice fade effect and no full page load.&lt;br /&gt;&lt;br /&gt;But now we've actually incurred some information loss: instead of a nice url such as &lt;span style="font-style:italic;"&gt;http://somedomain.com/about&lt;/span&gt;, our menu links use &lt;span style="font-style:italic;"&gt;http://somedomain.com/#&lt;/span&gt;, with Javascript doing the work of detecting which link was clicked. Now we can't easily publish our nice urls, plus we might negatively affect SEO. The next iteration fixes that.&lt;br /&gt;&lt;br /&gt;Our content pages have become partials, which can easily be re-used. By creating new Webby pages for each content page, we can simply render each partial. So in the &lt;span style="font-style:italic;"&gt;about&lt;/span&gt; content file, we just have to:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;---&lt;br /&gt;title:      About Us&lt;br /&gt;order:      1&lt;br /&gt;filter:     erb&lt;br /&gt;---&lt;br /&gt;&amp;lt;%= render(:partial =&gt; "main/about") %&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;and we get back our full, url-addressable content page.&lt;br /&gt;&lt;br /&gt;So now after a couple of iterations our site has a bit of sizzle, is SEO-friendly and even works with Javascript turned off! Webby has been a great benefit in achieving this by letting us make small, incremental changes with minimal code duplication. And it means I get to write Ruby code for my HTML/CSS/Javascript website!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7133390695499881876-1513203206322302426?l=workingpeter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://workingpeter.blogspot.com/feeds/1513203206322302426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://workingpeter.blogspot.com/2009/06/iterative-website-development-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7133390695499881876/posts/default/1513203206322302426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7133390695499881876/posts/default/1513203206322302426'/><link rel='alternate' type='text/html' href='http://workingpeter.blogspot.com/2009/06/iterative-website-development-with.html' title='Iterative website development with Webby'/><author><name>Peter Moran</name><uri>http://www.blogger.com/profile/04949499747361034820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7133390695499881876.post-6955050009320359908</id><published>2009-06-16T04:40:00.000-07:00</published><updated>2009-06-16T04:55:26.909-07:00</updated><title type='text'>Portable agile burn-down charts</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_tnqvTMFW7ko/SjeGF1sQT4I/AAAAAAAAAQc/LHPdOZH0po4/s1600-h/16062009188.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 261px;" src="http://1.bp.blogspot.com/_tnqvTMFW7ko/SjeGF1sQT4I/AAAAAAAAAQc/LHPdOZH0po4/s320/16062009188.jpg" alt="" id="BLOGGER_PHOTO_ID_5347890517395918722" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Great idea, Erik&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7133390695499881876-6955050009320359908?l=workingpeter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://workingpeter.blogspot.com/feeds/6955050009320359908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://workingpeter.blogspot.com/2009/06/portable-agile-burn-down-charts.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7133390695499881876/posts/default/6955050009320359908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7133390695499881876/posts/default/6955050009320359908'/><link rel='alternate' type='text/html' href='http://workingpeter.blogspot.com/2009/06/portable-agile-burn-down-charts.html' title='Portable agile burn-down charts'/><author><name>Peter Moran</name><uri>http://www.blogger.com/profile/04949499747361034820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_tnqvTMFW7ko/SjeGF1sQT4I/AAAAAAAAAQc/LHPdOZH0po4/s72-c/16062009188.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7133390695499881876.post-5224100394104061404</id><published>2009-06-15T17:19:00.000-07:00</published><updated>2009-06-24T00:49:39.246-07:00</updated><title type='text'>Open gem in Textmate</title><content type='html'>I frequently use the &lt;a href="http://stephencelis.com/2008/06/12/bashfully-yours-gem-shortcuts.html"&gt;gemdoc&lt;/a&gt; bash completion to quickly view Ruby Gem RDocs. A quick addition lets me open a gem in Textmate:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;gemmate() {&lt;br /&gt;mate $GEMDIR/gems/`$(which ls) $GEMDIR/gems | grep $1 | sort`&lt;br /&gt;}&lt;br /&gt;complete -o default -o nospace -F _gemdocomplete gemmate&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now I can do&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;gemmate webby-0.9.4&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7133390695499881876-5224100394104061404?l=workingpeter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://workingpeter.blogspot.com/feeds/5224100394104061404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://workingpeter.blogspot.com/2009/06/open-gem-in-textmate.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7133390695499881876/posts/default/5224100394104061404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7133390695499881876/posts/default/5224100394104061404'/><link rel='alternate' type='text/html' href='http://workingpeter.blogspot.com/2009/06/open-gem-in-textmate.html' title='Open gem in Textmate'/><author><name>Peter Moran</name><uri>http://www.blogger.com/profile/04949499747361034820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7133390695499881876.post-853949045518676995</id><published>2009-04-08T22:55:00.000-07:00</published><updated>2009-04-09T03:55:16.703-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>Remembering Kurt</title><content type='html'>Early on April 9th 1994, I was getting ready to fly to Canada with the band I was playing in at the time (yes I was in a band). It was the biggest day of our musical career, and the start of a pretty big and fairly torrid adventure into the unknown. The overnight news was coming in of Kurt Cobain's death. At the time I was in like (not love) with Nirvana, but the impact of that event is still with me, and it's unsettling to re-visit the &lt;a href="http://www.youtube.com/watch?v=bwPOQ6jijNw"&gt;news footage&lt;/a&gt; and to remember the house and attic that was shown so often as the story broke.&lt;br /&gt;&lt;br /&gt;In the couple of days after we arrived in Vancouver, we took a trip down to Seattle. I remember a service station buried in some woods off the highway and watching some fairly stereotypical redneck types pick up a magazine with Kurt on the cover, put cocked fingers in their mouths and have a good laugh about the whole thing. We didn't stick around - we didn't exactly look like locals and were driving a friend's old Chevy (?) with bullet holes in the front windscreen.&lt;br /&gt;&lt;br /&gt; In Seattle, we went straight the Sub Pop shop and met up with the label guys. At the time we had just had a single released on Sub Pop, so we were feeling pretty cool and a bit self important. It became pretty clear pretty quickly that we were in Kurt's heartland, and folks weren't taking it all that well. There were lots of candlight vigils going on, even church signs that were normally displaying anti-abortion messages were showing messages of support for the fans that were taking it so hard.&lt;br /&gt;&lt;br /&gt;I think that seeing the impact Kurt's death had on so many people is part of what ultimately rebounded on me. After we got back from the trip (which broke the band btw, probably compounding the impact of the recent events) I had a drink with a friend who, until then, I didn't even know liked anything other than electro. He was seriously depressed, and even broke down after a few. He said he just couldn't get over Kurt's death. This was months after.&lt;br /&gt;&lt;br /&gt;Kurt's music wasn't life-altering for me by any means, but his death just might have been. I think it scarred a lot of people back then, and I expect it's bringing back some sad memories with the 15th anniversary.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7133390695499881876-853949045518676995?l=workingpeter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://workingpeter.blogspot.com/feeds/853949045518676995/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://workingpeter.blogspot.com/2009/04/early-on-april-9th-1994-i-was-getting.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7133390695499881876/posts/default/853949045518676995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7133390695499881876/posts/default/853949045518676995'/><link rel='alternate' type='text/html' href='http://workingpeter.blogspot.com/2009/04/early-on-april-9th-1994-i-was-getting.html' title='Remembering Kurt'/><author><name>Peter Moran</name><uri>http://www.blogger.com/profile/04949499747361034820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7133390695499881876.post-4781634079264604273</id><published>2009-03-31T20:04:00.000-07:00</published><updated>2009-03-31T22:03:22.853-07:00</updated><title type='text'>Back to index cards</title><content type='html'>Over a range of projects that have been based around user stories, I have seen a number of different means of story management, including &lt;a href="http://www.xplanner.org/"&gt;XPlanner&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Mingle"&gt;Mingle&lt;/a&gt;, &lt;a href="http://google.com/docs"&gt;spreadsheets&lt;/a&gt;, &lt;a href="http://www.pivotaltracker.com/"&gt;Pivotal Tracker&lt;/a&gt; and &lt;a href="http://www.officeworks.com.au"&gt;index cards&lt;/a&gt;. Each of these has good and bad points (some more than others), but I've come to regard index cards blue-tack'ed to the wall as the simplest and best option.&lt;br /&gt;&lt;br /&gt;The major factor is visibility: regardless of what lanes you use, it is close to instant to view where each story is at and who is working on what. Compare this with logging onto your web-based story management tool (you remember your password/have enough licenses don't you?), selecting the right project, applying a few filters, removing the lanes you aren't interested in and hopefully getting a view of the current iteration.&lt;br /&gt;&lt;br /&gt;Of course, you still might want to use a tool for history, backups or to share across team sites. I know of one rambunctious manager who likes to wander around project rooms silently removing random cards from stories walls, just to see what would happen!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7133390695499881876-4781634079264604273?l=workingpeter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://workingpeter.blogspot.com/feeds/4781634079264604273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://workingpeter.blogspot.com/2009/03/back-to-index-cards.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7133390695499881876/posts/default/4781634079264604273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7133390695499881876/posts/default/4781634079264604273'/><link rel='alternate' type='text/html' href='http://workingpeter.blogspot.com/2009/03/back-to-index-cards.html' title='Back to index cards'/><author><name>Peter Moran</name><uri>http://www.blogger.com/profile/04949499747361034820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7133390695499881876.post-8086945091784090664</id><published>2009-03-18T20:56:00.000-07:00</published><updated>2009-03-19T03:31:28.091-07:00</updated><title type='text'>Git toolbag</title><content type='html'>Here are a couple of helpful git tools that I seem to use most days...&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://railstips.org/2009/2/2/bedazzle-your-bash-prompt-with-git-info"&gt;bedazzle your bash prompt with git info&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://grb.rubyforge.org/"&gt;git_remote_branch&lt;/a&gt; - hide away those curly remote branch commands&lt;/li&gt;&lt;li&gt;&lt;a href="http://gitready.com/"&gt;git ready&lt;/a&gt; - great git tips well explained&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7133390695499881876-8086945091784090664?l=workingpeter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://workingpeter.blogspot.com/feeds/8086945091784090664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://workingpeter.blogspot.com/2009/03/git-toolbag.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7133390695499881876/posts/default/8086945091784090664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7133390695499881876/posts/default/8086945091784090664'/><link rel='alternate' type='text/html' href='http://workingpeter.blogspot.com/2009/03/git-toolbag.html' title='Git toolbag'/><author><name>Peter Moran</name><uri>http://www.blogger.com/profile/04949499747361034820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7133390695499881876.post-3275013459204555703</id><published>2009-03-17T03:15:00.000-07:00</published><updated>2009-03-17T03:23:00.887-07:00</updated><title type='text'>Cherry pickins with git</title><content type='html'>Git came to my rescue very nicely today by allowing me to replay history a bit. Earlier in the day I had to revert a commit because I got interrupted half way through getting the new changes working on our build server. By the time I got around to having a second attempt, the repository had moved on a number of commits. So I wanted to reverse the revert, but was nervous about losing any of the later changes.&lt;br /&gt;&lt;br /&gt;After a few branch-merge and branch-rebase attempts in different directions, a colleague suggested &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/git-cherry-pick.html"&gt;git cherry-pick&lt;/a&gt;. Using &lt;a href="http://gitx.frim.nl/"&gt;gitx&lt;/a&gt;, I grabbed the sha of the commit that I wanted to re-apply and ran &lt;span style="font-family: courier new;"&gt;git cherry-pick &amp;lt;sha-to-reapply&amp;gt;&lt;/span&gt; (on a new branch from master). This created a new commit as a descendant of HEAD, with exactly the changes I wanted re-applied. It even re-applied the commit message (although next time I'll use the -x option to flag the commit as a cherry pick - should have read the man page a bit closer).&lt;br /&gt;&lt;br /&gt;Not only was cherry-pick the right tool, but git allowed me to very quickly branch, merge and rebase any number of times until I found the best way to do the job. Nice.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7133390695499881876-3275013459204555703?l=workingpeter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://workingpeter.blogspot.com/feeds/3275013459204555703/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://workingpeter.blogspot.com/2009/03/cherry-pickins-with-git.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7133390695499881876/posts/default/3275013459204555703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7133390695499881876/posts/default/3275013459204555703'/><link rel='alternate' type='text/html' href='http://workingpeter.blogspot.com/2009/03/cherry-pickins-with-git.html' title='Cherry pickins with git'/><author><name>Peter Moran</name><uri>http://www.blogger.com/profile/04949499747361034820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
