<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:planet="http://planet.intertwingly.net/" xmlns:indexing="urn:atom-extension:indexing" indexing:index="no"><access:restriction xmlns:access="http://www.bloglines.com/about/specs/fac-1.0" relationship="deny"/>
  <title>Planet TW</title>
  <updated>2008-05-12T12:06:15Z</updated>
  <generator uri="http://intertwingly.net/code/venus/">Venus</generator>
  <author>
    <name>Test</name>
    <email>test@example.com</email>
  </author>
  <id>http://blogs.thoughtworks.com/atom.xml</id>
  <link href="http://blogs.thoughtworks.com/atom.xml" rel="self" type="application/atom+xml"/>
  <link href="http://blogs.thoughtworks.com/" rel="alternate"/>

  <entry xml:lang="en">
    <id>http://ca.rroll.net/?p=138</id>
    <link href="http://ca.rroll.net/2008/05/12/old-school-editors-for-python-development/" rel="alternate" type="text/html"/>
    <title>Old School Editors for Python Development</title>
    <summary>Here are a couple of good resources for configuring Vim and Emacs for Python development.  I know more key-bindings with Emacs than Vim, so my preference is for Emacs, but I am certainly intrigued about trying Vim again after reading how to set it up for Python coding.</summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Here are a couple of good resources for configuring <a href="http://blog.sontek.net/2008/05/11/python-with-a-modular-ide-vim/">Vim</a> and <a href="http://www.enigmacurry.com/2008/05/09/emacs-as-a-powerful-python-ide/">Emacs</a> for Python development.  I know more key-bindings with Emacs than Vim, so my preference is for Emacs, but I am certainly intrigued about trying Vim again after reading how to set it up for Python coding.</p></div>
    </content>
    <updated>2008-05-12T11:47:21Z</updated>
    <category term="ThoughtWorks"/>
    <category term="emacs"/>
    <category term="python"/>
    <category term="vim"/>
    <author>
      <name>Nick</name>
    </author>
    <source>
      <id>http://ca.rroll.net</id>
      <link href="http://ca.rroll.net/category/thoughtworks/feed" rel="self" type="application/atom+xml"/>
      <link href="http://ca.rroll.net" rel="alternate" type="text/html"/>
      <subtitle>business technology consultant</subtitle>
      <title>Nick Carroll » ThoughtWorks</title>
      <updated>2008-05-12T11:47:21Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-1042801964488488185.post-4770533027656772369</id>
    <link href="http://jakescruggs.blogspot.com/2008/05/metricfu-now-measures-churn.html" rel="alternate" type="text/html"/>
    <link href="http://www.blogger.com/comment.g?blogID=1042801964488488185&amp;postID=4770533027656772369" rel="replies" type="text/html"/>
    <link href="http://jakescruggs.blogspot.com/feeds/4770533027656772369/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="http://jakescruggs.blogspot.com/feeds/posts/default/4770533027656772369" rel="self" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/1042801964488488185/posts/default/4770533027656772369" rel="edit" type="application/atom+xml"/>
    <title>Metric_fu Now Measures Churn</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Sometimes a class does too much.   It's used everywhere, does everything, knows all about the nasty internals of all the other classes, and every time you change anything in the application it has to change.   Or maybe you have a class that everyone loves to refactor because it's so bad.  One developer changes it to be better, then another changes it to be a different kind of better, and this keeps happening without it ever getting any easier to use.  There's a lot of bad reasons why a class might change all the time so I added a churn report capability to <a href="http://metric-fu.rubyforge.org/">metric_fu</a> version 0.6.0.<br/><br/>Now you can use metric_fu to create a report like this:<br/><br/><a href="http://metric-fu.rubyforge.org/churn.gif"><img alt="" border="0" src="http://metric-fu.rubyforge.org/churn.gif" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;"/></a>By issuing this command:<br/><pre>    rake metrics:churn<br/></pre> And use the results to find classes that might have problems.  It uses 'svn log' to create this report so currently you need to be using subversion.  (If anyone out there want to contribute some code to get it working with git, lemme know.)  The default is to start counting changes from the start of the repository's creation.  That may be too much for your project so you can change the start by adding these lines to your Rakefile:<br/><pre>    namespace :metrics do<br/>     CHURN_OPTIONS = { :start_date =&gt; lambda{3.months.ago} }<br/>   end<br/></pre>  The Proc is there because '3.months.ago' only works after the Rails Environment is loaded (and Rails extends Fixnum) which I didn't want to do every time you run a rake task.<br/><br/>You can also change the minimum churn count (files with changes less than this number won't be included in the report) like so:<br/><pre>    namespace :metrics do<br/>     CHURN_OPTIONS = { :minimum_churn_count =&gt; 3 }<br/>   end   <br/></pre>Also in this release I added the 'metrics:all_with_migrate' task because of some feedback I got that running 'metrics:all' in a cc.rb build fails if there have been migrations.  So the new task migrates the test db before running all the metrics tasks.<br/><br/>Check out the metric_fu project <a href="http://metric-fu.rubyforge.org/">home page</a> for more information and installation instructions.  Or you can jump right in by doing this in the root of your project:<br/><pre>script/plugin install \<br/> http://metric-fu.rubyforge.org/svn/tags/CURRENT/metric_fu/<br/>sudo gem install rcov<br/>sudo gem install flog<br/></pre></div>
    </content>
    <updated>2008-05-12T04:03:08Z</updated>
    <published>2008-05-12T02:39:00Z</published>
    <category scheme="http://www.blogger.com/atom/ns#" term="churn"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="Rake"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="Metrics"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="metric_fu"/>
    <author>
      <name>Jake Scruggs</name>
      <email>noreply@blogger.com</email>
      <uri>http://www.blogger.com/profile/16274380203959781950</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-1042801964488488185</id>
      <author>
        <name>Jake Scruggs</name>
        <email>noreply@blogger.com</email>
        <uri>http://www.blogger.com/profile/16274380203959781950</uri>
      </author>
      <link href="http://jakescruggs.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://jakescruggs.blogspot.com/feeds/posts/default?start-index=26&amp;max-results=25" rel="next" type="application/atom+xml"/>
      <link href="http://jakescruggs.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://jakescruggs.blogspot.com/feeds/posts/default" rel="self" type="application/atom+xml"/>
      <title>Jake Scruggs</title>
      <updated>2008-05-12T04:03:08Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://wuetender-junger-mann.de/wordpress/?p=569</id>
    <link href="http://wuetender-junger-mann.de/wordpress/?p=569" rel="alternate" type="text/html"/>
    <title>More Thoughts about Mocking and State</title>
    <summary>Steve rightfully asked for the source of the
 bad feelings we had about about adding a sequential return value feature to Mockito.
The issue is that a Mockito stub is stateless, i.e. the value returned depended solely on the
parameters being passed in when calling the stub.


Statelessness is generally a nice property. ...</summary>
    <updated>2008-05-12T01:08:56Z</updated>
    <source>
      <id>http://wuetender-junger-mann.de/wordpress</id>
      <author>
        <name>Felix Leipold</name>
      </author>
      <link href="http://wuetender-junger-mann.de/wordpress" rel="alternate" type="text/html"/>
      <link href="http://wuetender-junger-mann.de/wordpress/?cat=22&amp;feed=rss" rel="self" type="application/rss+xml"/>
      <subtitle>Der Freiheit eine Gasse</subtitle>
      <title>wuetender-junger-mann.de » Software Development</title>
      <updated>2008-05-12T01:08:56Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-19626531.post-1082505282810152772</id>
    <link href="http://ola-bini.blogspot.com/2008/05/javaone-2008-other-half.html" rel="alternate" type="text/html"/>
    <link href="http://www.blogger.com/comment.g?blogID=19626531&amp;postID=1082505282810152772" rel="replies" type="text/html"/>
    <link href="http://ola-bini.blogspot.com/feeds/1082505282810152772/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="http://ola-bini.blogspot.com/feeds/posts/default/1082505282810152772" rel="self" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/19626531/posts/default/1082505282810152772" rel="edit" type="application/atom+xml"/>
    <title>JavaOne 2008, the other half</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">So, the Thursday got a late start. For some strange reason I didn't feel motivated to go see the Intel General Session, so I showed up for Nick's session about JRuby on Rails deployment instead. Nick did a good job of outlining both the problem and the solution, and I have to say that this presentation was a good end cap for the JRuby week at JavaOne.<br/><br/>I had planned to go to some sessions after that, but I ended up hacking on JRuby instead. An interesting parser bug reared its head.<br/><br/>So the next session I went to was the Filthy Rich Clients one. Quite entertaining, although my interest in Swing is not what it used to be.<br/><br/>The final session of the day was the BOF about writing great technology books. This proved highly enjoyable since joining Josh Bloch and Brian Goetz as panelists were Burt Bates and Kathy Sierra. They did a wonderful job talking about how to write books that captures the readers attention and how to correctly use the brains weaknesses against it. I am tempted to say that this was the best session of the whole JavaOne. Brilliant.<br/><br/>On the Friday I was up early and sat in on Goslings Toy Story. Always funny, and some cool things there. For a geek like me, the CERN stuff and jMars was especially cool.<br/><br/>I managed to see quite a lot of sessions during the rest of the day. More Effective Java was useful as always, the Maxine Virtual Machine looks really cool, Neal Ford did an excellent job of comparing JRuby and Groovy, highlighting both the differences and similarities between the two. Finally the Jython session talked about some of the implementation challenges we in the JRuby team have wrestled with too, implementing a highly dynamic language on top of the JVM.<br/><br/>All in all, this JavaOne definitely stood out as the first non-Java-language JavaOne for me. And I didn't even attend a single one of the gazillions of JavaFX presentations. It was a good year in general, and specifically for dynamic languages.<br/><br/>Oh, and my book is the 5th bestseller in the conference bookstore. Yay!</div>
    </content>
    <updated>2008-05-11T23:19:47Z</updated>
    <published>2008-05-11T23:09:00Z</published>
    <category scheme="http://www.blogger.com/atom/ns#" term="jruby"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="javaone"/>
    <author>
      <name>Ola Bini</name>
      <email>noreply@blogger.com</email>
      <uri>http://www.blogger.com/profile/15793488672952593953</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-19626531</id>
      <author>
        <name>Ola Bini</name>
        <email>noreply@blogger.com</email>
        <uri>http://www.blogger.com/profile/15793488672952593953</uri>
      </author>
      <link href="http://ola-bini.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://ola-bini.blogspot.com/feeds/posts/default?start-index=26&amp;max-results=25" rel="next" type="application/atom+xml"/>
      <link href="http://ola-bini.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://ola-bini.blogspot.com/feeds/posts/default" rel="self" type="application/atom+xml"/>
      <title>Ola Bini: Programming Language Synchronicity</title>
      <updated>2008-05-11T23:19:47Z</updated>
    </source>
  </entry>

  <entry>
    <id>urn:lj:livejournal.com:atom1:dynamicproxy:35321</id>
    <link href="http://dynamicproxy.livejournal.com/35321.html" rel="alternate" type="text/html"/>
    <link href="http://dynamicproxy.livejournal.com/data/atom/?itemid=35321" rel="self" type="text/xml"/>
    <title>Charles Nutter's post -&amp;gt; "The Power of the JVM".</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Nirav pointed me to this educational read <a href="http://headius.blogspot.com/2008/05/power-of-jvm.html"> The power of the JVM </a>.<br/><br/>Innovations in the JVM space are good news and make for interesting reading always.</div>
    </content>
    <updated>2008-05-11T23:02:37Z</updated>
    <published>2008-05-09T20:49:09Z</published>
    <source>
      <id>urn:lj:livejournal.com:atom1:dynamicproxy</id>
      <author>
        <name>dynamicproxy</name>
      </author>
      <link href="http://dynamicproxy.livejournal.com/" rel="alternate" type="text/html"/>
      <link href="http://dynamicproxy.livejournal.com/data/atom" rel="self" type="application/atom+xml"/>
      <subtitle>dynamicproxy</subtitle>
      <title>Ram's Live Journal</title>
      <updated>2008-05-11T23:02:37Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-2144813210603379421.post-6982130482293628831</id>
    <link href="http://geekdamana.blogspot.com/2008/05/sir-robin-and-bubbles.html" rel="alternate" type="text/html"/>
    <link href="http://www.blogger.com/comment.g?blogID=2144813210603379421&amp;postID=6982130482293628831" rel="replies" type="text/html"/>
    <link href="http://geekdamana.blogspot.com/feeds/6982130482293628831/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="http://geekdamana.blogspot.com/feeds/posts/default/6982130482293628831" rel="self" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/2144813210603379421/posts/default/6982130482293628831" rel="edit" type="application/atom+xml"/>
    <title>Sir Robin and the Bubbles</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I often tease my friends at Google about the preschool environment they work in - bright colours; soft furnishings and mobiles hanging from the ceiling. After stepping back and trying to argue that <a href="http://www.worldrps.com/">RPS</a> is a valid way to settle a small <a href="http://www.urbandictionary.com/define.php?term=bikeshedding">bike-shedding</a> disagreement, I realised that my time at TW has been more of a game than a job. That's a good thing. Work is fun but it's probably not the definition of "<span style="font-style: italic;">grown up</span>" - which is just so over-rated anyway.<br/><br/>Our team is known as Team Bubbles for classified reasons. Of course, we've gone wild with that idea. There are bubble machines, individual bubble packs (manual) that are great on breaks.<br/><br/><div style="text-align: center;"><div style="text-align: center;"><span style="font-size: 78%;">This is one of the bubble machines that greets people as they enter</span><br/></div></div><br/>Then there are the non-bubble things like Sir Robin, our check-in chick-en. He's our check-in token and as we try to maintain a green build (especially) through UAT, he makes sure we only commit while we are in his company. We are currently trying to get him on to our RM list as a Release Manager but our Resource Manager guy is resisting... so far. Sir Robin has connections though so we might get him signed up as an official TWer.<br/><br/><div style="text-align: center;"><a href="http://bp2.blogger.com/_A7vd1oW85hU/SCZa2_SnKKI/AAAAAAAACEY/GXSq1JxdsK4/s1600-h/Sir+Robin+and+Roy.JPG"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5198942720594749602" src="http://bp2.blogger.com/_A7vd1oW85hU/SCZa2_SnKKI/AAAAAAAACEY/GXSq1JxdsK4/s400/Sir+Robin+and+Roy.JPG" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;"/></a><span style="font-size: 78%;">Sir Robin with the founder of TW at the Australian Team Hug<br/>(photo by Lachlan)<br/><br/></span><div style="text-align: left;">The aircon in our building hardly ever works so we have a portable aircon unit and since there was a spare beach ball hanging around (as usual) we got the anti-gravity going.<br/><br/><div style="text-align: center;"><span style="font-size: 78%;">The magic falling floating ball</span><br/></div><br/><br/>Then there is the lolly drawer for sustenance, the hats to let everyone know when you aren't working on a story and the pweety flowers. It's fun. I hope we don't have to grow up any time soon.<br/></div></div><br/><div style="text-align: center;"><a href="http://bp0.blogger.com/_A7vd1oW85hU/SCZdRfSnKLI/AAAAAAAACEg/RpHak4k9naA/s1600-h/Lolly+Drawer.jpg"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5198945374884538546" src="http://bp0.blogger.com/_A7vd1oW85hU/SCZdRfSnKLI/AAAAAAAACEg/RpHak4k9naA/s320/Lolly+Drawer.jpg" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;"/></a><span style="font-size: 78%;">The very unhealthy lolly drawer full of 10kg of lollies at a time</span><br/><br/><a href="http://bp2.blogger.com/_A7vd1oW85hU/SCZdR_SnKMI/AAAAAAAACEo/heM42s0xPeE/s1600-h/SOAP+Images+098.jpg"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5198945383474473154" src="http://bp2.blogger.com/_A7vd1oW85hU/SCZdR_SnKMI/AAAAAAAACEo/heM42s0xPeE/s320/SOAP+Images+098.jpg" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;"/></a><span style="font-size: 78%;">Sam + I not working on our stories</span><br/><br/><a href="http://bp0.blogger.com/_A7vd1oW85hU/SCZdSfSnKNI/AAAAAAAACEw/fLrm0eee65c/s1600-h/StickyFlower.jpg"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5198945392064407762" src="http://bp0.blogger.com/_A7vd1oW85hU/SCZdSfSnKNI/AAAAAAAACEw/fLrm0eee65c/s320/StickyFlower.jpg" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;"/></a><span style="font-size: 78%;">A sticky note flower</span><br/></div></div>
    </content>
    <updated>2008-05-11T02:56:53Z</updated>
    <published>2008-05-11T02:05:00Z</published>
    <category scheme="http://www.blogger.com/atom/ns#" term="Fun"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="Thoughtworks"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="Work"/>
    <author>
      <name>Mana</name>
      <email>noreply@blogger.com</email>
      <uri>http://www.blogger.com/profile/00506368430609135921</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-2144813210603379421</id>
      <author>
        <name>Mana</name>
        <email>noreply@blogger.com</email>
        <uri>http://www.blogger.com/profile/00506368430609135921</uri>
      </author>
      <link href="http://geekdamana.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://geekdamana.blogspot.com/feeds/posts/default?start-index=26&amp;max-results=25" rel="next" type="application/atom+xml"/>
      <link href="http://geekdamana.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://geekdamana.blogspot.com/feeds/posts/default" rel="self" type="application/atom+xml"/>
      <title>Geek Diva</title>
      <updated>2008-05-11T02:56:53Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://blog.kriskemper.com/2008/05/10/the-law-of-demeter/</id>
    <link href="http://blog.kriskemper.com/2008/05/10/the-law-of-demeter/" rel="alternate" type="text/html"/>
    <title>The Law of Demeter</title>
    <summary>The other day I came across a reference to something called the law of demeter. With much sadness, I realized that I could not remember what that law was. It sounded familiar, and was probably an answer to some test question in college. Nonetheless, I had forgotten it, and I felt that it was my [...]</summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>The other day I came across a reference to something called the law of demeter. With much sadness, I realized that I could not remember what that law was. It sounded familiar, and was probably an answer to some test question in college. Nonetheless, I had forgotten it, and I felt that it was my duty to look it up.</p>
<p>Wikipedia had a nice page[1] on it, and I was happy to know that I was following this policy already. In fact, the concept is core to well encapsulated code and a good domain model.</p>
<p>It’s a shame that it has such a pedantic sounding name; I don’t see myself being able to tell someone that their code would better if they only followed the law of demeter. Principle of least knowledge sounds better, but it’s still kind of vague. Unfortunately, it’s a very commonly violated principle, but it is one that should guide our default programming behavior. That is, when we aren’t being forced to violate it because of an api or legacy code base.</p>
<p>Anyway, to summarize what it is, it basically says that an object A can only use other objects that are fields, parameters to a method, or created inside of A. Here is a nicely contrived example of violating this principle:</p>
<pre>class Book {
    double cost;
    public double getCost() { return cost; }
}

class ShoppingCart {
    List books;
    public List getBooks() { return books; }
}

public class SalesCalculator {
    public void calculateTotalCost(ShoppingCart cart) {
        double total = 0;
        for (Book item : cart.getBooks()) {
            total += item.getCost();
        }
        System.out.println(”Total cost is: ” + total);
    }
}
</pre>
<p>Actually, this isn’t that contrived. For some reason, people love putting calculations into a class with Calculator in the name. In this example, SalesCalculator knows about more than just the ShoppingCart it’s given. It knows about the internals of the shopping cart. Not only does it know that it has books, but that it stores the books in a List. Now, the getter provides a slight appearance that it doesn’t really know that it’s stored in a list, but in this example, it’s returning the exact list object that it is storing internally. In this situation, if I modify the list outside of the ShoppingCart, then it’s internal state changes. We may as well be accessing books by doing a cart.books and leave out the getter code.</p>
<p>I’m digressing here; there is probably some other elitist sounding principle that basically says that I should not be able to mutate an objects internal state from outside the object. An improved version of the code would look like:</p>
<pre>class Book {
    double cost;
    public double getCost() { return cost; }
}

class ShoppingCart {
    List books;
    public double calculateTotalCost() {
        double total = 0;
        for (Book book : books) {
            total += book.getCost();
        }
        return total;
    }
}

public class SalesCalculator {
    public void calculateTotalCost(ShoppingCart cart) {
        System.out.println(”Total cost is: ”
+ cart.calculateTotalCost());
    }
}
</pre>
<p>That’s better. Now SalesCalculator knows nothing about Book objects, nor is it playing around with the List that shopping cart was using to hold the books. In fact, it looks like the SalesCalculator barely has a reason to exist. And it probably shouldn’t, not as a calculator. Maybe it could be a SalesPrinter or something.</p>
<p>The benefit of this increases as the logic of a domain model grows. Another common smell are objects like Managers:</p>
<pre>class ShoppingCart {
    List books;
    int numberOfComicBooks;
    public List getBooks() {
        return books;
    }
    public int getNumberOfComicBooks() {
        return numberOfComicBooks;
    }
    public void setNumberOfComicBooks(int numberOfComicBooks) {
        this.numberOfComicBooks = numberOfComicBooks;
    }
}

class ShoppingCartManager {
    public void addBookToCart(ShoppingCart cart, Book book) {
        cart.getBooks().add(book);
        if (book.isComicBook) {
            cart.setNumberOfComicBooks(
cart.getNumberOfComicBooks() + 1);
        }
    }
}
</pre>
<p>Why can’t the Shopping cart manage the adding of books and counting of comic books itself? If it did we would have less code anyway:</p>
<pre>class ShoppingCart {
    List books;
    int numberOfComicBooks;

    public void add(Book book) {
        books.add(book);
        if (book.isComicBook()) {
            numberOfComicBooks++;
        }
    }
}
</pre>
<p>Some developers have a default behavior that results in less code following the law of demeter (and tosses encapsulation in the garbage). That is, when they create an object, they immediately have their IDE generate getters and setters for all the fields they added. I think the idea is that it will save them time later or some nonsense like that. The unfortunate reality is that when I begin changing the ShoppingCart class, I’m going to have to traverse a tangled web of references across the code base trying to figure out what other objects are holding onto the ShoppingCarts book list and changing it on me. It gets even worse if you introduce multiple threads in to the mix.</p>
<p>[1] http://en.wikipedia.org/wiki/Law_of_Demeter</p></div>
    </content>
    <updated>2008-05-10T23:04:27Z</updated>
    <category term="Best Practices"/>
    <category term="code"/>
    <category term="encapsulation"/>
    <category term="java"/>
    <category term="law of demeter"/>
    <category term="programming"/>
    <author>
      <name>Kris Kemper</name>
    </author>
    <source>
      <id>http://blog.kriskemper.com</id>
      <link href="http://blog.kriskemper.com" rel="alternate" type="text/html"/>
      <link href="http://blog.kriskemper.com/feed/" rel="self" type="application/rss+xml"/>
      <subtitle>Thoughtworker, Agile Philosopher, Hero</subtitle>
      <title>Kris Kemper</title>
      <updated>2008-05-10T23:04:27Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://www.thekua.com/atwork/2008/05/10/behaviours-of-a-tech-lead/</id>
    <link href="http://www.thekua.com/atwork/2008/05/10/behaviours-of-a-tech-lead/" rel="alternate" type="text/html"/>
    <title>Behaviours of a Tech Lead</title>
    <summary>In the spirit of Goldratt’s understanding of metrics, “Tell me how you are going to measure me and I will tell you how I will behave,” here are some questions I ask myself when I play the role of a Technical Lead.

Picture of Einstein figurine taken from Dunechaser’s Flickr stream under the Creative Commons Licence.

Have [...]</summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>In the spirit of Goldratt’s understanding of metrics, <em>“Tell me how you are going to measure me and I will tell you how I will behave,”</em> here are some questions I ask myself when I play the role of a Technical Lead.</p>
<div style="text-align: center;"><img alt="Einstein" src="http://www.thekua.com/atwork/wp-content/uploads/2008/05/einstein.jpg"/></div>
<blockquote><p>Picture of Einstein figurine taken from <a href="http://www.flickr.com/photos/dunechaser/">Dunechaser’s Flickr stream</a> under the Creative Commons Licence.</p></blockquote>
<ul>
<li><strong>Have I fostered a learning environment?</strong> Do people feel safe to make mistakes, and more importantly, learn from them and share them with the rest of the team?</li>
<li><strong>Have I fostered an attitude of continuous improvement?</strong> Can people talk openly about what they see on the project, determine what impact it has or how people feel about it, and encourage more of it (if it’s a good thing) or try something different (if it’s less than ideal). Do people feel empowered to do things without feeling like they need authorisation every step of the way.</li>
<li><strong>Does the development team collaborate well with the other parts?</strong> Do they talk to other people with respect, and do they try to involve them as much as possible where it makes sense?</li>
<li><strong>Does the development team balance the needs of the business with the demands of the technology and toolset?</strong> Are they doing what’s right for the business in the long term? Do they share the same vision? </li>
<li><strong>Do I act as I say?</strong> Even though this sounds obvious, I’ve seen many people fail at this and, as a result, the non-verbal cues that conflict with verbal cues and confuse the team.</li>
</ul>
<p>And of course, <a href="http://magpiebrain.com/blog/2006/09/12/a-tech-lead-manifesto/">this resource</a> is a useful one too.</p></div>
    </content>
    <updated>2008-05-10T22:23:52Z</updated>
    <category term="Coaching"/>
    <category term="Learning"/>
    <category term="Management"/>
    <category term="Teams"/>
    <author>
      <name>Patrick</name>
    </author>
    <source>
      <id>http://www.thekua.com/atwork</id>
      <link href="http://www.thekua.com/atwork" rel="alternate" type="text/html"/>
      <link href="http://www.thekua.com/atwork/?feed=rss2" rel="self" type="application/rss+xml"/>
      <subtitle>Just another WordPress weblog</subtitle>
      <title>thekua.com@work</title>
      <updated>2008-05-10T22:31:29Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>d10481e0-d7e7-4234-9ab6-db53a9657b7e:1509</id>
    <link href="http://manicprogrammer.com/cs/blogs/heynemann/archive/2008/05/10/jsunit-accuracy.aspx" rel="alternate" type="text/html"/>
    <title>JsUnit + Accuracy</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">After I got my tests passing in JsUnit , I decided I needed to automate the execution of the JavaScript Unit Tests for Fjords(more on that in a later post). So, the only way I could think of doing that was to drive the browser to the JsUnit Test Runner...(<a href="http://manicprogrammer.com/cs/blogs/heynemann/archive/2008/05/10/jsunit-accuracy.aspx">read more</a>)<img height="1" src="http://manicprogrammer.com/cs/aggbug.aspx?PostID=1509" width="1"/></div>
    </summary>
    <updated>2008-05-10T16:15:43Z</updated>
    <category scheme="http://manicprogrammer.com/cs/blogs/heynemann/archive/tags/Stormwind/default.aspx" term="Stormwind"/>
    <category scheme="http://manicprogrammer.com/cs/blogs/heynemann/archive/tags/Accuracy/default.aspx" term="Accuracy"/>
    <category scheme="http://manicprogrammer.com/cs/blogs/heynemann/archive/tags/Acceptance+Testing/default.aspx" term="Acceptance Testing"/>
    <category scheme="http://manicprogrammer.com/cs/blogs/heynemann/archive/tags/JavaScript/default.aspx" term="JavaScript"/>
    <category scheme="http://manicprogrammer.com/cs/blogs/heynemann/archive/tags/Unit+Testing/default.aspx" term="Unit Testing"/>
    <category scheme="http://manicprogrammer.com/cs/blogs/heynemann/archive/tags/JsUnit/default.aspx" term="JsUnit"/>
    <author>
      <name>heynemann</name>
    </author>
    <source>
      <id>http://manicprogrammer.com/cs/blogs/heynemann/default.aspx</id>
      <link href="http://manicprogrammer.com/cs/blogs/heynemann/default.aspx" rel="alternate" type="text/html"/>
      <link href="http://manicprogrammer.com/cs/blogs/heynemann/rss.aspx" rel="self" type="application/rss+xml"/>
      <subtitle>Working at ThoughtWorks, Stormwind Community, writing, reading and some insight on the funniest, most complex thing to do on earth: write software.</subtitle>
      <title>while(availableTime&gt;0) {</title>
      <updated>2008-05-12T01:04:17Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://nutrun.com/?p=139</id>
    <link href="http://nutrun.com/weblog/confidence-as-a-test-code-metric/" rel="alternate" type="text/html"/>
    <title>Confidence as a test code metric</title>
    <summary>With testing occupying a major part of our development process, we have often attempted to quantify test code quality. Like many things, it is worth considering how test code ultimately manifests itself in terms of added value. This is why Stuart and I recently tend to conclude that, stripped from technically granular details, test code [...]</summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>With testing occupying a major part of our development process, we have often attempted to quantify test code quality. Like many things, it is worth considering how test code ultimately manifests itself in terms of added value. This is why <a href="http://no-new-ideas.blogspot.com/" title="No New Ideas">Stuart</a> and I recently tend to conclude that, stripped from technically granular details, test code must fundamentally contribute in building confidence that the system under test is complete, a proof that what we’ve built is and will continue working as intended.</p>
<p>A working system fulfilling its business objectives can be considered complete enough, but, if not easily extensible and maintainable, will not grant itself to the conclusion of being as good as it can be. Advancements in software development methodologies that assist in delivering working software that is easy to extend and maintain - higher level abstractions, modeling and design - have been driven by the need to reduce technical debt. Technical debt can be viewed as the cost of change.</p>
<p>Test code is code, too. As code bases grow more elaborate, test code also suffers from technical debt, demanding methods to eliminate the factors that hinder its maintainability and extensibility. Present procedures geared towards extensible and maintainable test code are habitually counter-proportional to the amount of confidence they achieve.</p>
<p class="centered"><img alt="The confidence scale" class="boxed" src="http://farm4.static.flickr.com/3143/2479820537_9f597a7c42.jpg"/></p>
<p>The different categories on the scale are not mutually exclusive, in fact they are commonly combined as members of a suite that exercises the system in various degrees of instrumentation. Walking the scale from left (empty) to right (full), we move from tests that are generally easier to write, understand, run and maintain but at the same time are less representative of the <em>real</em> system with all its components integrated.</p>
<p>Dependency neutral tests with all of the tested component’s dependencies stubbed are disconnected, vaguely describe how the component interacts with its environment and offer minimal proof that the component will work as specified once a member of the application ecosystem.</p>
<p>The fundamental difference between interaction based dependency neutral tests and their stubbed counterparts is the accurate interaction specification of collaborating components through the use of mock objects instead of stubs. Here, we concentrate on specifying the contract of communication between two components. Although much closer to how the actual system operates, these tests are still disconnected. Despite the accurate specification of the interaction, we have don’t have complete proof that the pieces fit. In particular, interaction based dependency neutral tests do not offer proof that the mocked collaborators have been tested to work.</p>
<p>It becomes apparent that the major flaw of interaction based dependency neutral tests is their disconnect from their peers.</p>
<p>As we move towards the “full” side of the confidence scale, tests tend to become larger and more complicated. Wired tests draw a picture much closer to that of the system in its entire form but suffer from poor defect localization (test failures are not always directly related to the intent of the specific test) and disrespect encapsulation (setup code often exposes the behavior of components irrelevant to the context of the current test). The dependency wired tests’ contribution to technical debt is much more significant.</p>
<p>Understanding the importance of confidence in our system and aiming to reduce technical debt, <a href="http://synthesis.rubyforge.org/" title="synthesis">Synthesized Testing</a> suggests a solution that attempts to rectify the disconnect of lightweight, interaction based dependency neutral tests and reduce the need of overarching, prone to technical debt dependency wired tests.</p></div>
    </content>
    <updated>2008-05-10T15:10:14Z</updated>
    <category term="Software"/>
    <author>
      <name>George Malamidis</name>
    </author>
    <source>
      <id>http://nutrun.com</id>
      <link href="http://nutrun.com/weblog/category/software/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://nutrun.com" rel="alternate" type="text/html"/>
      <subtitle>Just another WordPress weblog</subtitle>
      <title>nutrun » Software</title>
      <updated>2008-05-10T15:10:14Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-5116471530866808083.post-1723044413079782490</id>
    <link href="http://tw-oss.blogspot.com/2008/05/picocontainer-22-released.html" rel="alternate" type="text/html"/>
    <link href="http://www.blogger.com/comment.g?blogID=5116471530866808083&amp;postID=1723044413079782490" rel="replies" type="text/html"/>
    <link href="http://tw-oss.blogspot.com/feeds/1723044413079782490/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="http://tw-oss.blogspot.com/feeds/posts/default/1723044413079782490" rel="self" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/5116471530866808083/posts/default/1723044413079782490" rel="edit" type="application/atom+xml"/>
    <title>PicoContainer 2.2 released</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">PicoContainer 2.2 has been released with a slew of new features and a bug fix.<div><br/></div><div>The <a href="http://picocontainer.org/news.html">news page</a> from the project's site details the changes.</div><div><br/></div><div>For the uninitiated it is an container for components that follow the Inversion of Control and Dependency Injection  principles. When it first started as a project in 2003, it was the only container that did the auto wiring of Constructor Injection. There are plenty of choices in this field these days, but PicoContainer is still used inside Intellij IDEA and JIRA.  </div><div><br/></div><div>Also using PicoContainer: Waffle is a Rails "convention over configuration" inspired web framework that some suggest is a deal more pleasant to develop with than Struts/WebWork.</div></div>
    </content>
    <updated>2008-05-10T14:55:34Z</updated>
    <published>2008-05-10T14:42:00Z</published>
    <author>
      <name>Paul Hammant</name>
      <email>noreply@blogger.com</email>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-5116471530866808083</id>
      <author>
        <name>Paul Hammant</name>
        <email>noreply@blogger.com</email>
      </author>
      <link href="http://tw-oss.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://tw-oss.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://tw-oss.blogspot.com/feeds/posts/default" rel="self" type="application/atom+xml"/>
      <title>ThoughtWorkers on Open Source</title>
      <updated>2008-05-12T03:40:17Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-34378650.post-3005741345715337355</id>
    <link href="http://feeds.feedburner.com/~r/patforna/~3/285642218/private-method-anti-pattern.html" rel="alternate" type="text/html"/>
    <link href="http://www.blogger.com/comment.g?blogID=34378650&amp;postID=3005741345715337355" rel="replies" type="text/html"/>
    <link href="http://patforna.blogspot.com/feeds/3005741345715337355/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/34378650/posts/default/3005741345715337355" rel="self" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/34378650/posts/default/3005741345715337355" rel="edit" type="application/atom+xml"/>
    <title>Private Method Anti(?)-Pattern</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Some (actually quite a long) time ago, <a href="http://monkeyisland.pl/" target="_blank">Szczepan</a> asked if <a href="http://monkeyisland.pl/2008/01/05/private-method-antipattern/" target="_blank">private methods are an anti-pattern</a> and I've been promising him ever since to post a reply. The reasoning behind his statement was derived from the fact that TDD purists often maintain that untestable code is very likely bad code. Private methods are hard to test and it therefore seems to follow naturally that they, too, are a sign of bad code. While I'm sure that this is true in some cases, I think there are a lot of good reasons to have private methods or classes.<br/><br/><span style="font-weight: bold;">Implementation vs. Behavior</span><br/><br/>Many developers focus too much on implementation details when they write tests. Ask yourself what you really care about a class: implementation details or behavior? It turns out that in most cases, one is only interested in the latter. So when writing tests, we should focus more on the public API of a class and not about its internal structure.<br/><br/><span style="font-weight: bold;">Modularization vs. Encapsulation</span><br/><br/>In summary, I agree with <a href="http://monkeyisland.pl/" target="_blank">Szczepan</a> when he says that there is probably a lot of code out there in which private methods could be factored out into public classes or methods which would, in turn, increase code modularity. Often, however, encapsulation and a lean public API might be favored over modularization. More importantly, modularization might not always be needed, and therefore complicate and bloat the codebase unnecessarily. If modularization is still required at a later stage, internal code can be refactored and made public without breaking existing code.<br/><br/><span style="font-weight: bold;">Are You Over-Mocking?</span><br/><br/>Stubbing and mocking techniques and tools, especially <a href="http://code.google.com/p/mockito/" target="_blank">Mockito</a>, are great and make perfect sense in many situations (e.g. faking a network connection, a database, a service etc.). Breaking up a public method that consists of <span style="font-style: italic;">n</span> private methods into <span style="font-style: italic;">n</span> public methods of <span style="font-style: italic;">n</span> new classes only so that we can test that the methods are indeed invoked, however, introduces unwanted complexity and completely breaks encapsulation principles, without yielding any real benefits.<br/><br/><span style="font-weight: bold;">Don't Defend Yourself!</span><br/><br/>Private methods and classes are also a good thing because they allow to code non-defensively, which will make code simpler. As soon as logic is offered to the world as a public method, one needs to ensure that the implementation also caters for unexpected scenarios. If the implementation is private, on the other hand, it is easy to determine that a certain variable will never be <span style="font-style: italic;">null</span>, for example, and can thus be safely ignored.<br/><br/><span style="font-weight: bold;">Public APIs are Contracts</span><br/><br/>The API of a class (i.e. it's non-private methods) represents a contract with whoever is going to use it. Sure, as long as the class is used only within a single source repository this might not be a big issues, because powerful refactoring tools make it easy to change the contracts. But what happens if code is being used externally - maybe because other people find it useful, too? It won't be possible to change public method signatures that easily anymore, because other code will have been built on top of them.<br/><br/><span style="font-weight: bold;">Reduce Public API complexity</span><br/><br/>Private methods and classes can greatly reduce the complexity of a public API. Compare the Java API and its source code, for example. You'll realize that a lot of complexity is encapsulated in private methods and classes, which is a good thing, because it keeps the public APIs complexity low(er(-ish)).<br/><br/><span style="font-weight: bold;">To sum up...</span><br/><br/>Although these are very much thoughts-in-progress, I think that in summary:<br/><ul><li>We focus too much on implementation details and not enough on externally observable behavior of a class when writing tests</li><li>We often create code that is unnecessarily modular, because we are test-obsessed</li><li>We often mock too much (probably as a consequence or mutual reaction of the above two points)</li><li>We often create APIs that expose too much and therefore break encapsulation</li></ul></div>
    </content>
    <updated>2008-05-10T08:07:07Z</updated>
    <published>2008-05-06T21:25:00Z</published>
    <category scheme="http://www.blogger.com/atom/ns#" term="software development"/><feedburner:origlink xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://patforna.blogspot.com/2008/05/private-method-anti-pattern.html</feedburner:origlink>
    <author>
      <name>Patric Fornasier</name>
      <email>noreply@blogger.com</email>
      <uri>http://www.blogger.com/profile/06567767149588932272</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-34378650</id>
      <author>
        <name>Patric Fornasier</name>
        <email>noreply@blogger.com</email>
        <uri>http://www.blogger.com/profile/06567767149588932272</uri>
      </author>
      <link href="http://patforna.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://www.blogger.com/feeds/34378650/posts/default?start-index=26&amp;max-results=25&amp;redirect=false" rel="next" type="application/atom+xml"/>
      <link href="http://patforna.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://feeds.feedburner.com/patforna" rel="self" type="application/atom+xml"/>
      <title>Patric Fornasier's Blog</title>
      <updated>2008-05-10T08:07:07Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-us">
    <id>http://del.icio.us/brunns#2008-05-09</id>
    <link href="http://feeds.feedburner.com/~r/SmallValuesOfCool/~3/287297743/brunns" rel="alternate" type="text/html"/>
    <title>Links for 2008-05-09 [del.icio.us]</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><ul>
<li><a href="http://www.manning.com/sande/">Manning: Hello World!</a><br/>
Computer Programming for Kids (and Other Beginners)</li>
<li><a href="http://playthisthing.com/games-studies-good-you">Games Studies is Good for You</a></li>
<li><a href="http://blogs.guardian.co.uk/inside/2008/05/the_web_on_the_move_xtech_2008.html">The Web on the move: XTech 2008</a><br/>
Phil Wills speaking at Xtech</li>
<li><a href="http://today.reuters.co.uk/news/articlenews.aspx?type=topNews&amp;storyid=2008-05-09T090537Z_01_L09417801_RTRUKOC_0_UK-BRITAIN-GUIDE.xml">English "self-important and irritating"</a><br/>
Oh yes.</li>
<li><a href="http://ejohn.org/blog/processingjs/">Processing.js</a><br/>
Excellent hack.</li>
<li><a href="http://www.macosxtips.co.uk/index_files/terminal-commands-for-hidden-settings-in-leopard.html">Terminal Commands for Hidden Settings in Leopard</a></li>
</ul></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><ul>
<li><a href="http://www.manning.com/sande/">Manning: Hello World!</a><br/>
Computer Programming for Kids (and Other Beginners)</li>
<li><a href="http://playthisthing.com/games-studies-good-you">Games Studies is Good for You</a></li>
<li><a href="http://blogs.guardian.co.uk/inside/2008/05/the_web_on_the_move_xtech_2008.html">The Web on the move: XTech 2008</a><br/>
Phil Wills speaking at Xtech</li>
<li><a href="http://today.reuters.co.uk/news/articlenews.aspx?type=topNews&amp;storyid=2008-05-09T090537Z_01_L09417801_RTRUKOC_0_UK-BRITAIN-GUIDE.xml">English "self-important and irritating"</a><br/>
Oh yes.</li>
<li><a href="http://ejohn.org/blog/processingjs/">Processing.js</a><br/>
Excellent hack.</li>
<li><a href="http://www.macosxtips.co.uk/index_files/terminal-commands-for-hidden-settings-in-leopard.html">Terminal Commands for Hidden Settings in Leopard</a></li>
</ul></div>
    </content>
    <updated>2008-05-10T05:00:00Z</updated><feedburner:origlink xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://del.icio.us/brunns#2008-05-09</feedburner:origlink>
    <source>
      <id>http://www.brunningonline.net/simon/blog/</id>
      <author>
        <name>Simon Brunning</name>
        <email>simon.brunning+smallvaluescomment@gmail.com</email>
      </author>
      <link href="http://www.brunningonline.net/simon/blog/" rel="alternate" type="text/html"/>
      <link href="http://feeds.feedburner.com/SmallValuesOfCool" rel="self" type="application/rss+xml"/>
      <rights>Copyright 2008</rights>
      <subtitle>Simon Brunning - stuff that I find interesting</subtitle>
      <title>Small Values of Cool</title>
      <updated>2008-05-07T14:42:11Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>d10481e0-d7e7-4234-9ab6-db53a9657b7e:1508</id>
    <link href="http://manicprogrammer.com/cs/blogs/heynemann/archive/2008/05/09/jsunit.aspx" rel="alternate" type="text/html"/>
    <title>JSUnit</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">These days I've been doing more and more JScript, thanks to JQuery and ExtJs . I've been moving more and more of the application logic to the client side. That has some advantages and some disadvantages, which are clearly out of the scope of this post....(<a href="http://manicprogrammer.com/cs/blogs/heynemann/archive/2008/05/09/jsunit.aspx">read more</a>)<img height="1" src="http://manicprogrammer.com/cs/aggbug.aspx?PostID=1508" width="1"/></div>
    </summary>
    <updated>2008-05-10T01:30:02Z</updated>
    <category scheme="http://manicprogrammer.com/cs/blogs/heynemann/archive/tags/JavaScript/default.aspx" term="JavaScript"/>
    <category scheme="http://manicprogrammer.com/cs/blogs/heynemann/archive/tags/Unit+Testing/default.aspx" term="Unit Testing"/>
    <author>
      <name>heynemann</name>
    </author>
    <source>
      <id>http://manicprogrammer.com/cs/blogs/heynemann/default.aspx</id>
      <link href="http://manicprogrammer.com/cs/blogs/heynemann/default.aspx" rel="alternate" type="text/html"/>
      <link href="http://manicprogrammer.com/cs/blogs/heynemann/rss.aspx" rel="self" type="application/rss+xml"/>
      <subtitle>Working at ThoughtWorks, Stormwind Community, writing, reading and some insight on the funniest, most complex thing to do on earth: write software.</subtitle>
      <title>while(availableTime&gt;0) {</title>
      <updated>2008-05-12T01:04:17Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>tag:studios.thoughtworks.com,2008-05-09:1068</id>
    <link href="http://feeds.feedburner.com/~r/ThoughtworksStudios/~3/287146455/automated-testing-poll" rel="alternate" type="text/html"/>
    <title xml:lang="en-US">Automated Testing Poll</title>
    <content type="xhtml" xml:lang="en-US"><div xmlns="http://www.w3.org/1999/xhtml">Our testers at ThoughtWorks use several different automation tools. A lot of people know us for starting the <a href="http://selenium.openqa.org/">Selenium</a> OSS project, but ThoughtWorkers have actually built several test automation tools over the years, including <a href="http://www.sahi.co.in/w/">Sahi</a>, <a href="http://frankenstein.openqa.org/">Frankenstein</a>, and <a href="http://www.codeplex.com/white">White</a> (and now we're building <a href="http://studios.thoughtworks.com/twist/">Twist</a>).   What tools does your company use?  Tell us why and your likes/dislikes in the comments. 

<br/>
<br/>
<br/>
<br/>

&lt;embed salign='tl' name='beta3' bgcolor='#ffffff' scale='autoscale' pluginspage='http://www.macromedia.com/go/getflashplayer' type='application/x-shockwave-flash' src='http://www.polldaddy.com/poll.swf' flashvars='p=597299' allowscriptaccess='never' height='659' wmode='transparent' quality='high' width='252' saveembedtags='true'&gt;&lt;/embed&gt;
          </div>
    </content>
    <updated>2008-05-09T22:58:17Z</updated>
    <published>2008-05-09T22:36:00Z</published>
    <category term="Blog"/><feedburner:origlink xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://studios.thoughtworks.com/2008/5/9/automated-testing-poll</feedburner:origlink>
    <author>
      <name>Chad Wathington</name>
    </author>
    <source>
      <id>tag:studios.thoughtworks.com,2008:mephisto/blog</id>
      <link href="http://studios.thoughtworks.com/blog" rel="alternate" type="text/html"/>
      <link href="http://feeds.feedburner.com/ThoughtworksStudios" rel="self" type="application/atom+xml"/>
      <title xml:lang="en-US">studios.thoughtworks.com - Blog</title>
      <updated>2008-05-09T22:58:17Z</updated>
    </source>
  </entry>

  <entry>
    <id>urn:lj:livejournal.com:atom1:dynamicproxy:35718</id>
    <link href="http://dynamicproxy.livejournal.com/35718.html" rel="alternate" type="text/html"/>
    <link href="http://dynamicproxy.livejournal.com/data/atom/?itemid=35718" rel="self" type="text/xml"/>
    <title>Why CDDL and why not GPL ?</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This is a question that I've been asked several times this week.<br/><br/>Here is the FAQ entry entry <a href="http://opensolaris.org/os/about/faq/licensing_faq/#why-not-GPL"> explaining why </a><br/><br/>So for those who ask "Why is Sun being selfish and not releasing the ZFS/DTrace/other-good-technologies under the GPL ?", it's because the GPL forbids the linking with code from other licenses, the CDDL does not.<br/><br/>This is why FreeBSD has been able to take the ZFS and DTrace, for e.g.<br/><br/>The <a href="http://opensolaris.org/os/about/faq/licensing_faq/">other questions </a> on the licensing FAQ are educational too.</div>
    </content>
    <updated>2008-05-09T21:27:52Z</updated>
    <published>2008-05-09T21:27:52Z</published>
    <source>
      <id>urn:lj:livejournal.com:atom1:dynamicproxy</id>
      <author>
        <name>dynamicproxy</name>
      </author>
      <link href="http://dynamicproxy.livejournal.com/" rel="alternate" type="text/html"/>
      <link href="http://dynamicproxy.livejournal.com/data/atom" rel="self" type="application/atom+xml"/>
      <subtitle>dynamicproxy</subtitle>
      <title>Ram's Live Journal</title>
      <updated>2008-05-11T23:02:37Z</updated>
    </source>
  </entry>

  <entry>
    <id>urn:lj:livejournal.com:atom1:dynamicproxy:35460</id>
    <link href="http://dynamicproxy.livejournal.com/35460.html" rel="alternate" type="text/html"/>
    <link href="http://dynamicproxy.livejournal.com/data/atom/?itemid=35460" rel="self" type="text/xml"/>
    <title>Thamarai's presentation on the Da Vinci Machine</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Thamarai, who works at Thoughtworks Bangalore, presented some time ago at Jax India 2008. <br/><br/>Here is his presentation titled <a href="http://docs.google.com/Present?docid=dgmr9kck_448zkrssdt&amp;skipauth=true#0">  The Da Vinci Machine: Multi Language Environment for Java Virtual Machine </a><br/><br/><br/>Read more on the Da Vinci machine <a href="http://openjdk.java.net/projects/mlvm/">here </a></div>
    </content>
    <updated>2008-05-09T20:54:57Z</updated>
    <published>2008-05-09T20:54:57Z</published>
    <source>
      <id>urn:lj:livejournal.com:atom1:dynamicproxy</id>
      <author>
        <name>dynamicproxy</name>
      </author>
      <link href="http://dynamicproxy.livejournal.com/" rel="alternate" type="text/html"/>
      <link href="http://dynamicproxy.livejournal.com/data/atom" rel="self" type="application/atom+xml"/>
      <subtitle>dynamicproxy</subtitle>
      <title>Ram's Live Journal</title>
      <updated>2008-05-11T23:02:37Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-us">
    <id>urn:uuid:de32bc5a-699e-45bf-9e92-c011c1c50690</id>
    <link href="http://journal.bitshaker.com/articles/2008/05/09/when-distrust-turns-to-disdain" rel="alternate" type="text/html"/>
    <title>When Distrust Turns To Disdain</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>While taking computer science classes in college, I was taught to distrust a user’s input in all cases.  The theory goes that a user’s data can’t be trusted because it could be malicious or just a simple mistake that causes your program to have an error with input it didn’t expect.  So you protect your system from incorrect user input and sanitize it.  It always felt like one of our dirtier secrets to me, however I fully advocate the practice in code.</p>


	<p>My problem comes when the people building software turn from distrusting their user’s input to having a level of disdain for the users themselves.  It starts innocently enough with the engineering principles I described above, but can sometimes turn into small things like, “Our users won’t understand that,” and starts to slip into things like, “Our users are dumb, so we won’t do that.”  If you’ve started to hate your users, you’ve gone too far.  If something is too complex for your users to understand, it’s your job as the developer/engineer/analyst/etc. to make it so that they can understand it.  If you think of your users like idiots, your system will reflect that and they will notice.</p>


	<p>If your job is to design software for people to use (which, is pretty much all software), make sure you work with the user, instead of against their best interests.</p></div>
    </summary>
    <updated>2008-05-09T19:45:00Z</updated>
    <category term="Design"/>
    <category term="Work"/>
    <author>
      <name>Joe</name>
      <email>joe@thanksno.com</email>
    </author>
    <source>
      <id>http://journal.bitshaker.com/</id>
      <link href="http://journal.bitshaker.com/" rel="alternate" type="text/html"/>
      <link href="http://feeds.feedburner.com/bitshaker" rel="self" type="application/rss+xml"/>
      <subtitle>shaking things up</subtitle>
      <title>bitshaker.com</title>
      <updated>2008-05-12T01:08:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-19829485.post-6457019734397855987</id>
    <link href="http://taowen.blogspot.com/2008/05/anemic-domain-model.html" rel="alternate" type="text/html"/>
    <link href="http://www.blogger.com/comment.g?blogID=19829485&amp;postID=6457019734397855987" rel="replies" type="text/html"/>
    <link href="http://taowen.blogspot.com/feeds/6457019734397855987/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="http://taowen.blogspot.com/feeds/posts/default/6457019734397855987" rel="self" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/19829485/posts/default/6457019734397855987" rel="edit" type="application/atom+xml"/>
    <title>Anemic Domain Model</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Martin wrote a blog a long time before: http://www.martinfowler.com/bliki/AnemicDomainModel.html. It was about domain model without rich behavior (anemic). Today, I am going to analyze why we have this problem, and try to give a elegant solution.<br/><br/>Let's give a example first. This is a task management system. Two entities in the domain, Employee, Task. So we can write the relationship as following codes:<br/><br/><pre><br/>public class Employee {<br/>    private Set&lt;Task&gt; tasks = new HashSet&lt;Task&gt;();<br/>}<br/><br/>public class Task {<br/>    private String name;<br/>    private Employee owner;<br/>    private Date startTime;<br/>    private Date endTime;<br/>}</pre><br/><br/>It is a very typical parent/child relationship. Now, I want to add a behavior to my domain model. The behavior is: get all the processing task owned by a specified employee. If we ignore the existence of database, very naturally, this behavior belongs to Employee entity.<br/><br/><pre><br/>public class Employee {<br/>    private Set&lt;Task&gt; tasks = new HashSet&lt;Task&gt;();<br/>    public Set&lt;Task&gt; getProcessingTask() {<br/>       ...<br/>    }<br/>}</pre><br/><br/>But if we do care the database. This design is not acceptable. Where can I get all my tasks? Are you going to load all my tasks when building the employee object? If we only have five tasks, that is OK. But if we have 5000 tasks, that probably is not acceptable. So, before the age of hibernate, we wrote:<br/><br/><pre><br/>public class TaskDAO {<br/>   public Set&lt;Task&gt; getProcessingTasks(Employee employee) {<br/>      ...//sql<br/>   }<br/>}</pre><br/><br/>hmmm, wait a moment... Is DAO part of domain model. Yeah... you can. Just rename it to TaskRepository, then it is part of your domain model. Really? I don't believe it. DAO is not part of your domain model. Instead, it stole the logic from domain. It is the reason why our domain model is anemic. Because the getProcessingTasks was part of Employee, but now belongs to a DAO. Can hibernate solve the problem?<br/><br/><pre><br/>@Entity<br/>public class Employee {<br/>    @OneToMany<br/>    private Set&lt;Task&gt; tasks = new HashSet&lt;Task&gt;();<br/>    public Set&lt;Task&gt; getProcessingTasks() {<br/>       ...<br/>    }<br/>}</pre><br/><br/>yes! Hibernate rocks!<br/>Have we succeed? No, not yet. Hibernate can make the tasks lazy-loaded. But you only have two options. Load, or not. If you are iterating tasks inside the impl of getProcessingTasks, you still end up as loading all the tasks from the database. <br/><br/>To solve this problem, many people tried many different ways. The goal was "injecting something" into domain, then domain can execute query itself. The attempts including using hibernate interceptor, static code instrument, aspectj... Spring gave a answer to this:<br/><br/><pre><br/>@Entity<br/>@Configurable<br/>public class Employee {<br/>    private TaskDao dao;<br/>    public Set&lt;Task&gt; getProcessingTask() {<br/>        return dao.getProcessingTask(this);<br/>    }<br/>    public void setTaskDao(TaskDao dao) {<br/>        this.dao = dao;<br/>    }<br/>}</pre><br/><br/>The @Configurable annotation was introduced to inject DAO into domain model. Now, the domain can do what it supposed to do. Really? domain model depending on DAO made lots of people unhappy. The argued, the cyclic dependencies between DAO layer and Domain layer. The argued, domain should not be "bound" with database or any container. I personally think, it is not that a big issue... I think RoR Active Record is bounding the domain model with database, people still love it. Anyway, I started again, and looking for a more elegant solution.<br/><br/>Finally, I found, what if I wrote this:<br/><br/><pre><br/>public class Employee {<br/>    private RichSet&lt;Task&gt; tasks = new DefaultRichSet&lt;Task&gt;();<br/>    public RichSet&lt;Task&gt; getProcessingTasks() {<br/>        return tasks.find("startTime").le(new Date()).find("endTime").isNull();<br/>    }<br/>...<br/>}</pre><br/><br/>RichSet is a Set with extra capabilities (query, sum...)<br/><br/><pre><br/>public interface RichSet&lt;T&gt; extends Set&lt;T&gt; {<br/>    Finder&lt;RichSet&lt;T&gt;&gt; find(String expression);<br/>    int sum(String expression);<br/>}</pre><br/><br/>DefaultRichSet is pure in memory implementation of those operations by iterating the set. So you can new a Employee in your unit test, and test the getProcessingTasks right way. No need to worry about database or dependency injection. Do you feel better?<br/><br/>But, where is the database? Er... This is complicated, you know. The first thing I need to do is mapping the entity in Hibernate. Er... hibernate do not like it. Hibernate expect a Set, not RichSet. I think I need to write more things to make hibernate happy:<br/><br/><pre><br/>&lt;hibernate-mapping default-access="field" package="net.sf.ferrum.example.domain"&gt;<br/>    &lt;class name="Employee"&gt;<br/>        &lt;tuplizer entity-mode="pojo" class="net.sf.ferrum.RichEntityTuplizer"/&gt;<br/>        &lt;id name="id"&gt;<br/>            &lt;generator class="native"/&gt;<br/>        &lt;/id&gt;<br/>        &lt;set name="tasks" cascade="all" inverse="true" lazy="true"&gt;<br/>            &lt;key/&gt;<br/>            &lt;one-to-many class="Task" /&gt;<br/>        &lt;/set&gt;<br/>    &lt;/class&gt;<br/>&lt;/hibernate-mapping&gt;</pre><br/><br/>What is tuplizer? It is used by hibernate to replace your set with hibernate enhanced set. So, I wrote my own tuplizer, and replace your set with my enhanced set.<br/><br/><pre><br/>public class RichEntityTuplizer extends PojoEntityTuplizer {<br/>    public RichEntityTuplizer(EntityMetamodel entityMetamodel, PersistentClass mappedEntity) {<br/>        super(entityMetamodel, mappedEntity);<br/>    }<br/><br/>    protected Setter buildPropertySetter(final Property mappedProperty, PersistentClass mappedEntity) {<br/>        final Setter setter = super.buildPropertySetter(mappedProperty, mappedEntity);<br/>        if (!(mappedProperty.getValue() instanceof org.hibernate.mapping.Set)) {<br/>            return setter;<br/>        }<br/>        return new Setter() {<br/>            public void set(Object target, Object value, SessionFactoryImplementor factory) throws HibernateException {<br/>                Object wrappedValue = value;<br/>                if (value instanceof Set) {<br/>                    HibernateRepository repository = new HibernateRepository();<br/>                    repository.setSessionFactory(factory);<br/>                    wrappedValue = new HibernateRichSet((Set) value, repository, getCriteria(mappedProperty, target));<br/>                }<br/>                setter.set(target, wrappedValue, factory);<br/>            }<br/><br/>            public String getMethodName() {<br/>                return setter.getMethodName();<br/>            }<br/><br/>            public Method getMethod() {<br/>                return setter.getMethod();<br/>            }<br/>        };<br/>    }<br/>}</pre><br/><br/>In short, the code means:<br/><br/><pre><br/>employee.tasks = new HibernateRichSet&lt;Task&gt;(...)<br/></pre><br/><br/>This version of RichSet is much smarter. It will translate your find statements from<br/><br/><pre><br/>tasks.find("startTime").le(new Date()).find("endTime").isNull(); <br/></pre><br/><br/>---&gt;<br/><br/><pre><br/>DetachedCriteria.forClass(..).add(...).add(...)<br/></pre><br/><br/>Now, in the domain, you can query against your collection without worrying about how the query will be done. Domain is still pure, no dependency on DAO. Domain is still all InMemory, no need to start up your container, your database to test domain logic.</div>
    </content>
    <updated>2008-05-09T11:47:58Z</updated>
    <published>2008-05-09T08:50:00Z</published>
    <author>
      <name>taowen</name>
      <email>noreply@blogger.com</email>
      <uri>http://www.blogger.com/profile/15207556318302866600</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-19829485</id>
      <author>
        <name>taowen</name>
        <email>noreply@blogger.com</email>
        <uri>http://www.blogger.com/profile/15207556318302866600</uri>
      </author>
      <link href="http://taowen.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://taowen.blogspot.com/feeds/posts/default?start-index=26&amp;max-results=25" rel="next" type="application/atom+xml"/>
      <link href="http://taowen.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://feeds.feedburner.com/taowen" rel="self" type="application/atom+xml"/>
      <title>TaoWen's English Blog</title>
      <updated>2008-05-09T11:47:58Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://agilehongkong.com/2008/05/09/code-jam-2/</id>
    <link href="http://agilehongkong.com/2008/05/09/code-jam-2/" rel="alternate" type="text/html"/>
    <title>Code Jam 2</title>
    <summary>Hot on the heels of the “Will Agile work for you?” presentation is our second code jam. In this session, Tom and I will dust off the projector and give a short demonstration on pairing with particular focus given to Test Driven Development. We’ll also try working under time constrained mini-iterations. Duly, we’ll supply the [...]</summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Hot on the heels of the “Will Agile work for you?” presentation is our second code jam. In this session, Tom and I will dust off the projector and give a short demonstration on pairing with particular focus given to Test Driven Development. We’ll also try working under time constrained mini-iterations. Duly, we’ll supply the problem specification on the night so you don’t have any preconceptions. This session will be good for developers of all levels. If you are a seasoned TDDer come along and we’ll prepare something of a more challenging nature.</p>
<p>When: 7pm until whenever, Monday, 19th of May<br/>
Where: Gecko Lounge<br/>
Address:  				 					 LG/F, Ezra Lane Lower Hollywood Road, Hong Kong<br/>
Directions: Gecko is on Ezra Lane which runs between Pottinger St and the Escalator. Ezra lane is below Hollywood Road. If you enter off Pottinger Street you will find the lane is just opposite Soda Bar. If you enter the lane from the escalator you will find it opposite the Hot Dog shop. If you have any problems finding it call the Gecko Lounge on: 2537 4680<br/>
Map:<br/>
<a href="http://agilehongkong.com/wp-content/uploads/2008/05/locationofgeckos.jpg" title="Map of Gecko"><img alt="Map of Gecko" src="http://agilehongkong.com/wp-content/uploads/2008/05/locationofgeckos.thumbnail.jpg"/></a></p></div>
    </content>
    <updated>2008-05-09T10:01:01Z</updated>
    <category term="code jam"/>
    <author>
      <name>Conrad Benham</name>
    </author>
    <source>
      <id>http://agilehongkong.com</id>
      <link href="http://agilehongkong.com" rel="alternate" type="text/html"/>
      <link href="http://agilehongkong.com/feed" rel="self" type="application/rss+xml"/>
      <subtitle>Introducing Agile to Hong Kong</subtitle>
      <title>Agile Hong Kong</title>
      <updated>2008-05-09T10:01:01Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://www.fuzzylizard.com/?p=940</id>
    <link href="http://www.fuzzylizard.com/archives/2008/05/09/940/" rel="alternate" type="text/html"/>
    <link href="http://www.fuzzylizard.com/archives/2008/05/09/940/#comments" rel="replies" type="text/html"/>
    <link href="http://www.fuzzylizard.com/archives/2008/05/09/940/feed/atom/" rel="replies" type="application/atom+xml"/>
    <title xml:lang="en">Github trick - associate commits with your user account</title>
    <summary xml:lang="en">On Github, in order to have your commits associated with your github user account, the email address you use when pushing code to the origin must match an email address associated with your github account. This is something I discovered after noticing that my commits were showing up as grey and not blue on the [...]</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>On Github, in order to have your commits associated with your github user account, the email address you use when pushing code to the origin must match an email address associated with your github account. This is something I discovered after noticing that my commits were showing up as grey and not blue on the activity bar.</p>
<p>Setting your git email account is really easy. There are two different ways of doing it. First, you can directly edit your <code>.git/config</code> file and add a section like this:</p>
<pre>[user]
	email = you@example.com
	name = Your Name
</pre>
<p>The second method is by using the following command from the root folder of your project:</p>
<pre>git config user.name "Your Name"
git config user.email "you@example.com"
</pre></div>
    </content>
    <updated>2008-05-09T05:32:01Z</updated>
    <published>2008-05-09T05:30:16Z</published>
    <category scheme="http://www.fuzzylizard.com" term="Git"/>
    <category scheme="http://www.fuzzylizard.com" term="Tips and Tricks"/>
    <author>
      <name>Chris Johnston</name>
      <uri>http://www.fuzzylizard.com</uri>
    </author>
    <source>
      <id>http://www.fuzzylizard.com/feed/atom/</id>
      <link href="http://www.fuzzylizard.com" rel="alternate" type="text/html"/>
      <link href="http://www.fuzzylizard.com/feed/atom/" rel="self" type="application/atom+xml"/>
      <subtitle xml:lang="en">My thoughts on Agile, Java and Ruby on Rails (mostly)</subtitle>
      <title xml:lang="en">fuzzylizard</title>
      <updated>2008-05-09T05:32:01Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-us">
    <id>urn:uuid:215edd9d-3f8e-482b-9581-b65ce38a7428</id>
    <link href="http://blog.brianguthrie.com/articles/2008/05/09/out-of-hibernation" rel="alternate" type="text/html"/>
    <title>Out of Hibernation</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Many people can drink and write; there is, in fact, a grand tradition of engaging in both simultaneously. I am not one of those people<sup><a href="http://blog.brianguthrie.com/articles.rss#fn1">1</a></sup>, and have spent much of the last year in this new city, job, and social circle engaged in much of the former and not enough of the latter. Even that cannot suffice to explain my extended absence from blogging; indeed, I must ultimately confess to having surrendered to the shallow charms of sloth. No more! Everything is now deployed, configured, and arranged in more or less the fashion that I desire. I have met the enemy, and he is me, and he is vanquished. Allow me to take a moment and put in an associate cheer for <a href="http://modrails.com">mod_rails</a>.</p>


	<p>I’ve also taken the opportunity to finally design my own custom theme. Many good and widely admired technical bloggers use stock or mostly-stock layouts. But it’s my little corner of the internet, and I can stumble blindly around Photoshop as well or better than the next poor sap when the need arises. Folly follows futility, however, with the knowledge that a large proportion of readers will simply consume this content through syndication and never stop to admire the elegant curve of my header, or its tacky nod to Web circa-2.0 fashion. In fact I haven’t even bothered testing it in <span class="caps">IE6</span>, and almost certainly never will; I am profoundly, almost fanatically indifferent to legacy browsers, even though their users are, being somewhat behind the technical curve, proportionately far less likely to consume this content through a feed reader and must thus endure my less-than-finely-tuned <span class="caps">CSS</span>.</p>


	<p>I nonetheless submit that I am part of the solution, not the problem.</p>


	<p>Frankly I haven’t tested it in <span class="caps">IE7</span> either. I tried Firefox 3 and Safari 3 and then I got bored and went out for coffee. Either way, expect future blog entries to be more technical and perhaps less baldly narcissistic.</p>


	<p id="fn1"><sup>1</sup> I’m young yet, though, and everybody needs a dream.</p></div>
    </summary>
    <updated>2008-05-09T05:06:00Z</updated>
    <category term="Professional"/>
    <category term="blog"/>
    <category term="meta"/>
    <category term="mod_rails"/>
    <category term="drinking"/>
    <author>
      <name>Brian Guthrie</name>
      <email>btguthrie@gmail.com</email>
    </author>
    <source>
      <id>http://blog.brianguthrie.com/articles.rss</id>
      <link href="http://blog.brianguthrie.com/articles.rss" rel="alternate" type="text/html"/>
      <link href="http://blog.brianguthrie.com/xml/rss20/feed.xml" rel="self" type="application/rss+xml"/>
      <subtitle>brian guthrie blogs</subtitle>
      <title>Erudition and Inanity</title>
      <updated>2008-05-12T01:07:43Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-us">
    <id>http://del.icio.us/brunns#2008-05-08</id>
    <link href="http://feeds.feedburner.com/~r/SmallValuesOfCool/~3/286579219/brunns" rel="alternate" type="text/html"/>
    <title>Links for 2008-05-08 [del.icio.us]</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><ul>
<li><a href="http://fuseurl.com/">Fuse url</a><br/>
Create a single URL from multiple URLs</li>
<li><a href="http://oss.oetiker.ch/rrdtool/index.en.html">RRDtool</a><br/>
RRDtool is the OpenSource industry standard, high performance data logging and graphing system for time series data. Use it to write your custom monitoring shell scripts or create whole applications using its Perl, Python, Ruby, TCL or PHP bindings.</li>
<li><a href="http://google-code-updates.blogspot.com/2008/05/guido-van-rossum-releases-mondrian.html">Guido van Rossum releases Mondrian-clone: Rietveld</a><br/>
Guido's code review tool</li>
<li><a href="http://zovirl.com/2006/07/13/xcode-python/">XCode &amp; Python</a></li>
<li><a href="http://www.greenplastic.com/news/archives/2008/05/see-if-you-can.php">green plastic radiohead: See if you can get through this without laughing</a></li>
<li><a href="http://dev.pocoo.org/~mitsuhiko/pythonruby.html">Python / Ruby Comparison</a><br/>
Seems pretty neutral and balanced, and fairly knowledgable.</li>
<li><a href="http://code.google.com/p/django-photologue/">django-photologue - Google Code</a><br/>
Image management solution for Django</li>
</ul></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><ul>
<li><a href="http://fuseurl.com/">Fuse url</a><br/>
Create a single URL from multiple URLs</li>
<li><a href="http://oss.oetiker.ch/rrdtool/index.en.html">RRDtool</a><br/>
RRDtool is the OpenSource industry standard, high performance data logging and graphing system for time series data. Use it to write your custom monitoring shell scripts or create whole applications using its Perl, Python, Ruby, TCL or PHP bindings.</li>
<li><a href="http://google-code-updates.blogspot.com/2008/05/guido-van-rossum-releases-mondrian.html">Guido van Rossum releases Mondrian-clone: Rietveld</a><br/>
Guido's code review tool</li>
<li><a href="http://zovirl.com/2006/07/13/xcode-python/">XCode &amp; Python</a></li>
<li><a href="http://www.greenplastic.com/news/archives/2008/05/see-if-you-can.php">green plastic radiohead: See if you can get through this without laughing</a></li>
<li><a href="http://dev.pocoo.org/~mitsuhiko/pythonruby.html">Python / Ruby Comparison</a><br/>
Seems pretty neutral and balanced, and fairly knowledgable.</li>
<li><a href="http://code.google.com/p/django-photologue/">django-photologue - Google Code</a><br/>
Image management solution for Django</li>
</ul></div>
    </content>
    <updated>2008-05-09T05:00:00Z</updated><feedburner:origlink xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://del.icio.us/brunns#2008-05-08</feedburner:origlink>
    <source>
      <id>http://www.brunningonline.net/simon/blog/</id>
      <author>
        <name>Simon Brunning</name>
        <email>simon.brunning+smallvaluescomment@gmail.com</email>
      </author>
      <link href="http://www.brunningonline.net/simon/blog/" rel="alternate" type="text/html"/>
      <link href="http://feeds.feedburner.com/SmallValuesOfCool" rel="self" type="application/rss+xml"/>
      <rights>Copyright 2008</rights>
      <subtitle>Simon Brunning - stuff that I find interesting</subtitle>
      <title>Small Values of Cool</title>
      <updated>2008-05-07T14:42:11Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://www.digitaldimsum.co.uk/?p=29</id>
    <link href="http://www.digitaldimsum.co.uk/2008/05/09/the-first-bite-is-with-the-eye/" rel="alternate" type="text/html"/>
    <title>The first bite is with the eye</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>I think I first heard the phrase “<em>the first bite is with the eye</em>” from a TV chef, but it applies equally to the software creation process as it does to cookery.</p>
<p>A user’s interaction with a piece of software or web site is as much emotional as it is functional. Compare the soft, warm, fuzzy feeling you get when first interacting with a product from <a href="http://www.37signals.com/">37 Signals</a>, say, to the <a href="http://noteshater.blogspot.com/">stomach churning reaction you get when booting up Lotus Notes</a>, for example.</p>
<p>This immediate emotional response will pervade the whole of a user’s long-term impression of a product, imbuing their relationship with whatever feeling was conjured up in those preliminary interactions. They say that in most job interviews the interviewer makes up their mind within the first 5 minutes. The same is equally true for software.</p>
<p><!--more--></p>
<p>That’s the reason that I’m often accused of prematurely optimizing the UI. I’ve been round the block enough times to have been bitten by the following type of interaction:</p>
<p>Me: “This is just a wire-frame, we’re only trying to prove out the functional flows of the application. Don’t worry about the layout or the look and feel - that will be dealt with later.”</p>
<p>Client: “Ooh, I don’t like that font … and I think that’s our old logo. Maybe we should give it a drop-shadow or something. I’m disappointed, I expected more from you guys …”</p>
<p>After a host of similar experiences I now make sure that I give whatever product I’m working on an appropriate level of design and polish for the current stage, while still trying to evoke positive emotional responses. In my mind it’s always worth spending an hour or two tweaking a CSS file to tighten the layout, soften the lines and add a little sparkle - a little :hover goes a long way. Then even if the application isn’t functionally complete at least it looks professional and imbues the client with a sense of confidence and pleasure. This will put them into a much more positive state of mind, which can only be a good thing for the next stages of the project.</p>
<p>Call me shallow if you want, but when I arrive at a (studiously) un-styled site, like <a href="http://martinfowler.com/">our guru Martin Fowler’s</a>, I have a negative knee-jerk reaction making me resist reading the wise words he’s actually written. When, however, I land on a site <a href="http://www.digitaldimsum.co.uk/">where they care about the first bite</a> I feel compelled to carry on reading all day.</p>
<p>If someone in a meeting has a bit of chopped herb stuck in their teeth it’s really hard to focus on what they’re saying - you get distracted and have a negative emotional response. In the same way drizzling some coulis and sprinkling a bit of chopped herb onto a plate before serving can provoke a positive emotional response which fools the diner into enjoying their food more.</p></div>
    </summary>
    <updated>2008-05-09T02:40:30Z</updated>
    <category term="UI"/>
    <category term="computing"/>
    <category term="design"/>
    <author>
      <name>jonny</name>
    </author>
    <source>
      <id>http://www.digitaldimsum.co.uk</id>
      <link href="http://www.digitaldimsum.co.uk/feed" rel="self" type="application/atom+xml"/>
      <link href="http://www.digitaldimsum.co.uk" rel="alternate" type="text/html"/>
      <subtitle>Bite sized info snacks for the digital generation</subtitle>
      <title>Digital Dim Sum</title>
      <updated>2008-05-09T06:31:35Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>d10481e0-d7e7-4234-9ab6-db53a9657b7e:1502</id>
    <link href="http://manicprogrammer.com/cs/blogs/heynemann/archive/2008/05/08/extjs-monorail-community-contributions-success.aspx" rel="alternate" type="text/html"/>
    <title>ExtJs + Monorail + Community Contributions = Success!</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I tend to write titles using additions and equals... Hmm... Guess I like simple math... Who knows? Anyway, I want to stress out today how cool I find Monorail right now! I always thought it was a cool framework, but after I wired my controllers through...(<a href="http://manicprogrammer.com/cs/blogs/heynemann/archive/2008/05/08/extjs-monorail-community-contributions-success.aspx">read more</a>)<img height="1" src="http://manicprogrammer.com/cs/aggbug.aspx?PostID=1502" width="1"/></div>
    </summary>
    <updated>2008-05-08T23:39:16Z</updated>
    <category scheme="http://manicprogrammer.com/cs/blogs/heynemann/archive/tags/Stormwind/default.aspx" term="Stormwind"/>
    <category scheme="http://manicprogrammer.com/cs/blogs/heynemann/archive/tags/Monorail+Contrib/default.aspx" term="Monorail Contrib"/>
    <category scheme="http://manicprogrammer.com/cs/blogs/heynemann/archive/tags/ExtJs/default.aspx" term="ExtJs"/>
    <category scheme="http://manicprogrammer.com/cs/blogs/heynemann/archive/tags/Monorail/default.aspx" term="Monorail"/>
    <category scheme="http://manicprogrammer.com/cs/blogs/heynemann/archive/tags/Restful/default.aspx" term="Restful"/>
    <author>
      <name>heynemann</name>
    </author>
    <source>
      <id>http://manicprogrammer.com/cs/blogs/heynemann/default.aspx</id>
      <link href="http://manicprogrammer.com/cs/blogs/heynemann/default.aspx" rel="alternate" type="text/html"/>
      <link href="http://manicprogrammer.com/cs/blogs/heynemann/rss.aspx" rel="self" type="application/rss+xml"/>
      <subtitle>Working at ThoughtWorks, Stormwind Community, writing, reading and some insight on the funniest, most complex thing to do on earth: write software.</subtitle>
      <title>while(availableTime&gt;0) {</title>
      <updated>2008-05-12T01:04:17Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-7807708.post-1042725734655988164</id>
    <link href="http://feeds.feedburner.com/~r/YoudThinkWithAllMy/~3/286383799/simple-rules-for-enterprise.html" rel="alternate" type="text/html"/>
    <link href="http://www.blogger.com/comment.g?blogID=7807708&amp;postID=1042725734655988164&amp;isPopup=true" rel="replies" type="text/html"/>
    <link href="http://jchyip.blogspot.com/feeds/1042725734655988164/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/7807708/posts/default/1042725734655988164" rel="self" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/7807708/posts/default/1042725734655988164" rel="edit" type="application/atom+xml"/>
    <title>Simple rules for enterprise architecture?</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Thinking about simple rules in order of priority...<span style="font-weight: bold;"><br/><br/>1.    Available</span> - Availability is more important than anything else.  Do not introduce things that reduce the overall reliability of the enterprise.  This should lead to things like decentralised graceful degradation.<br/><span style="font-weight: bold;">2.    Easily verified</span> - How are you going to test it?  How are you going to test it when it's running (aka monitoring)?<br/><span style="font-weight: bold;">3.    Single Source of Information</span> - Don't present contradicting data to customers.<br/><span style="font-weight: bold;">4.    Easy to Describe</span> - The enterprise architecture should reflect the enterprise's structure.  See <a href="http://en.wikipedia.org/wiki/Conway%27s_Law">Conway's Law</a>.  This works both ways.  Change the architecture or change the organisation.<br/><span style="font-weight: bold;">5.    Least Number of Systems</span> - Less stuff to deal with, monitor, and fail.<br/><br/>See also <a href="http://www.dreamsongs.com/Files/DesignBeyondHumanAbilitiesSimp.pdf">Design Beyond Human Abilities</a>.
<p><map name="google_ad_map_kUnpE-zuVa0y2O9wa.4nA-XvjBA_"><area coords="1,2,367,28" href="http://imageads.googleadservices.com/pagead/imgclick/kUnpE-zuVa0y2O9wa.4nA-XvjBA_?pos=0" shape="rect"/><area coords="384,10,453,23" href="http://services.google.com/feedback/abg" shape="rect"/></map><img border="0" src="http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=ca-pub-0066960119164536&amp;output=png&amp;cuid=kUnpE-zuVa0y2O9wa.4nA-XvjBA_&amp;url=http%3A%2F%2Fjchyip.blogspot.com%2F2008%2F05%2Fsimple-rules-for-enterprise.html" usemap="http://feeds.feedburner.com/YoudThinkWithAllMy#google_ad_map_kUnpE-zuVa0y2O9wa.4nA-XvjBA_"/></p><img height="1" src="http://feeds.feedburner.com/~r/YoudThinkWithAllMy/~4/286383799" width="1"/></div>
    </content>
    <updated>2008-05-08T22:02:24Z</updated>
    <published>2008-05-01T21:43:00Z</published>
    <category scheme="http://www.blogger.com/atom/ns#" term="enterprise architecture"/><feedburner:origlink xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://jchyip.blogspot.com/2008/05/simple-rules-for-enterprise.html</feedburner:origlink>
    <author>
      <name>Jason Yip</name>
      <email>noreply@blogger.com</email>
      <uri>http://www.blogger.com/profile/08286768587936088382</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-7807708</id>
      <logo>http://creativecommons.org/images/public/somerights20.gif</logo>
      <author>
        <name>Jason Yip</name>
        <email>noreply@blogger.com</email>
        <uri>http://www.blogger.com/profile/08286768587936088382</uri>
      </author>
      <link href="http://jchyip.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://www.blogger.com/feeds/7807708/posts/default?start-index=26&amp;max-results=25&amp;redirect=false" rel="next" type="application/atom+xml"/>
      <link href="http://jchyip.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://creativecommons.org/licenses/by/2.0/" rel="license" type="text/html"/>
      <link href="http://feeds.feedburner.com/YoudThinkWithAllMy" rel="self" type="application/atom+xml"/>
      <title>You'd think with all my video game experience that I'd be more prepared for this</title>
      <updated>2008-05-11T04:09:36Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-19626531.post-885213642637976201</id>
    <link href="http://ola-bini.blogspot.com/2008/05/javaone-halfway-point.html" rel="alternate" type="text/html"/>
    <link href="http://www.blogger.com/comment.g?blogID=19626531&amp;postID=885213642637976201" rel="replies" type="text/html"/>
    <link href="http://ola-bini.blogspot.com/feeds/885213642637976201/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="http://ola-bini.blogspot.com/feeds/posts/default/885213642637976201" rel="self" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/19626531/posts/default/885213642637976201" rel="edit" type="application/atom+xml"/>
    <title>JavaOne halfway point</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">To say that I am seriously tired of JavaFX at this point, would be a gross understatement. So let's not even go there.<br/><br/>CommunityOne was a nice event. I like the feeling of it more and more, and the new open spaces approach seemed to be really successful. The alternative languages presentations were well attended and good. I recommend anyone in the Bay Area, or anyone attending JavaOne, to make the effort to go to CommunityOne next year. It's definitely worth it.<br/><br/>Tuesday was, for undisclosed reasons, a day where I didn't attend so many presentations. In fact, I missed both the keynote and Tom&amp;Charlies JRuby talk. Bad on me. I did manage to go to both the technical session and the BOF about upcoming language features in Java 7. Let me say immediately that I don't want pluggable type systems as a part of Java. Yes, they are useful in certain settings, but they don't fit Java. Not at all. I'm all for having it possible to have annotations in more places, but not for type systems.<br/><br/>Wednesday was "my" day of the conference. Started out early with the Script Bowl, where Groovy, JRuby, Jython and Scala faced off in three different challenges. I was one of the three judges. It was a actually a great fun. Some people have gotten annoyed at it, but I feel that they are taking it too seriously. This format was a good way of introducing the audience to the capabilities of four languages that are sometimes very much alike and sometimes very different.<br/><br/>It's also interesting to note that Charles was the only one of the panel who solved his challenges by asking the community for help with it. In fact, Charles didn't do any of them himself, while the other three did their code in isolation. My opinion is that this shows a difference in attitude between the communities, and it's very interesting.<br/><br/>After that I took it easy for some time, and then it was time for my JRuby on Rails presentation. It went fairly well and was also well attended. I did a serious mistake in my database configuration, but Tom helped me out and the rest of the demonstrations was good.<br/><br/>I did a book signing session after that and then headed back to the office for a while before coming back and holding my JRuby at ThoughtWorks BOF which was also nice.<br/><br/>Today I'm going to take it easy and relax. I'll go to Nick's session in an hour and then I'll go to Josh and Brian's BOF tonight. After that we host a party which I'm going to attend for a while. It's going to be a nice day.</div>
    </content>
    <updated>2008-05-08T17:19:36Z</updated>
    <published>2008-05-08T16:58:00Z</published>
    <category scheme="http://www.blogger.com/atom/ns#" term="javaone"/>
    <author>
      <name>Ola Bini</name>
      <email>noreply@blogger.com</email>
      <uri>http://www.blogger.com/profile/15793488672952593953</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-19626531</id>
      <author>
        <name>Ola Bini</name>
        <email>noreply@blogger.com</email>
        <uri>http://www.blogger.com/profile/15793488672952593953</uri>
      </author>
      <link href="http://ola-bini.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://ola-bini.blogspot.com/feeds/posts/default?start-index=26&amp;max-results=25" rel="next" type="application/atom+xml"/>
      <link href="http://ola-bini.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://ola-bini.blogspot.com/feeds/posts/default" rel="self" type="application/atom+xml"/>
      <title>Ola Bini: Programming Language Synchronicity</title>
      <updated>2008-05-11T23:19:47Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://jim.webber.name/2008/05/08/863535a7-5e9c-459a-80ec-b1257e32170e.aspx</id>
    <link href="http://jim.webber.name/2008/05/08/863535a7-5e9c-459a-80ec-b1257e32170e.aspx" rel="alternate" type="text/html"/>
    <title>ECOWS 2008 Call for Papers</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><div><p>ECOWS 2008: The 6th European Conference on Web Services, November 12-14, 2008 in Dublin, Ireland </p><p><a href="http://www.computing.dcu.ie/ecows08">http://www.computing.dcu.ie/ecows08</a></p><p>The European Conference on Web Services (ECOWS) is the premier conference for both researchers and practitioners to exchange the latest advances in the state of the art and practices of Web Services. The main objectives of this conference are to facilitate the exchange between researchers and practitioners and to foster future collaborations in Europe and beyond. </p><p>The success encountered by the Web has shown that tightly coupled software systems are only good for niche markets, whereas loosely coupled software systems can be more flexible, more adaptive and often more appropriate in practice. Loose coupling makes it easier for a given system to interact with other systems, possibly legacy systems that share very little with it. </p><p>Web services are at the crossing of distributed computing and loosely coupled systems. When applications adopt service-oriented architectures, they can evolve during their lifespan more easily and better adapt to changing or unpredictable environments. When properly implemented, services can be discovered and invoked dynamically using non-proprietary mechanisms, while each service can still be implemented in a black-box manner. This is important from a business perspective since each service can be implemented using any technology, independently of the others. What matters is that everybody agrees on the integration technology, and there is a consensus about this in today's middleware market: customers want to use Web technologies. Despite these promises, however, service integrators, developers, and providers need to create methods tools   <br/>and techniques to support cost-effective development and the use of dependable services and service-oriented applications. </p><p><u>Topics of Interest</u></p><p>The ECOWS 2008 program committee seeks high quality papers related to all aspects of Web Services, which constitute the current main   <br/>technology available for implementing service-oriented architectures and computing. Topics of interest to the Research Track include, but are not limited to, the following: </p><ul><li>Life-Cycle of Web Services Implementations</li><li>Dynamic Web Services</li><li>Semantic Web Services</li><li>Economics and Web Services</li><li>Quality Requirements for Web Services</li><li>Web Services for Grids</li><li>Web Services in a Service-Oriented Environment</li><li>Web Services and Mobility</li><li>Frameworks for Building Web Service-Based Applications</li><li>Formal Methods for Web Services </li></ul><p><u>Research Paper Submission Guidelines</u></p><p>We solicit papers with a maximum of 10 pages, containing new material. Submissions must be in English, must be original, and must not have been submitted for publication elsewhere. There will be an award for the best paper and best student paper. Submissions should be made through the website. </p><p>As in the previous years, we plan to publish the ECOWS 2008 Proceedings with IEEE Computer Society Press. Technical papers must be conform to the IEEE paper guidelines which will be made available at the ECOWS 2008 web page. Submit your paper in PDF or Postscript format via the electronic submission system which will be made available via the ECOWS 2008 web site. </p><p><u>Deadlines</u></p><p>Abstract Submission May 18, 2008   <br/>Electronic Paper Submission May 25, 2008    <br/>Acceptance Notification July 7, 2008    <br/>Camera Ready Version August 4, 2008 </p></div></div>
    </summary>
    <updated>2008-05-08T15:40:56Z</updated>
    <source>
      <id>http://jim.webber.name/</id>
      <author>
        <name>Jim Webber</name>
        <email>jim@webber.name</email>
      </author>
      <link href="http://jim.webber.name/" rel="alternate" type="text/html"/>
      <link href="http://jim.webber.name/feeds/rss.aspx" rel="self" type="application/rss+xml"/>
      <rights>Copyright © 2008 Jim Webber</rights>
      <subtitle>Jim Webber's Blog</subtitle>
      <title>World Wide Webber</title>
      <updated>2008-05-12T03:04:18Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://www.thekua.com/atwork/2008/05/08/retrospectives-go-beyond-the-report/</id>
    <link href="http://www.thekua.com/atwork/2008/05/08/retrospectives-go-beyond-the-report/" rel="alternate" type="text/html"/>
    <title>Retrospectives go beyond the report</title>
    <summary>One of the things that constantly surprises me about facilitating retrospectives is about the energy that a well run session can result in. For most heartbeat retrospectives, I feel it’s not normally that useful to write up a comprehensive report, as the team should feel ownership of the action items. 
An important aspect to the [...]</summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>One of the things that constantly surprises me about facilitating retrospectives is about the energy that a well run session can result in. For most heartbeat retrospectives, I feel it’s not normally that useful to write up a comprehensive report, as the team should feel ownership of the action items. </p>
<p>An important aspect to the role of the facilitator, is to do as much as they can to sustain the energy of the group and to tap into everyone’s capacity for embracing and dealing with change. Helping people contribute their story to the retrospective helps. Letting people tell their story in full helps. Facilitating difficult conversations towards a non destructive outcome helps. Moving the team towards specific, tangible actions or concrete lessons learns helps. </p>
<p>After the retrospective, I’ve always wondered what responsibility the facilitator has for ensuring change. My conclusion is that, in reality if they are truly independent, it’s none. Of course, the facilitator may care (and I can assure you I do) about following through on the change, yet all the systemic forces that push for and against change tend to be out of the influence of a <em>truly independent</em> facilitator. </p>
<p>In short, retrospectives are agents for change, yet ultimately it comes down to the empowered team to make sure the changes really happen. My advice to managers is to give teams responsibility and, with that, the decision making authority, to help them make the changes they need to.</p></div>
    </content>
    <updated>2008-05-08T13:34:09Z</updated>
    <category term="Retrospective"/>
    <author>
      <name>Patrick</name>
    </author>
    <source>
      <id>http://www.thekua.com/atwork</id>
      <link href="http://www.thekua.com/atwork" rel="alternate" type="text/html"/>
      <link href="http://www.thekua.com/atwork/?feed=rss2" rel="self" type="application/rss+xml"/>
      <subtitle>Just another WordPress weblog</subtitle>
      <title>thekua.com@work</title>
      <updated>2008-05-10T22:31:29Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-3718956085911858962.post-4870310377994695399</id>
    <link href="http://blog.sidu.in/2008/05/get-dirty-objects-in-rails.html" rel="alternate" type="text/html"/>
    <link href="http://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=4870310377994695399" rel="replies" type="text/html"/>
    <link href="http://blog.sidu.in/feeds/4870310377994695399/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/3718956085911858962/posts/default/4870310377994695399" rel="self" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/3718956085911858962/posts/default/4870310377994695399" rel="edit" type="application/atom+xml"/>
    <title>Get dirty objects in Rails</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Dirty object functionality has been in edge rails for a month now, allowing you to see what changes have been made to an object prior to saving it. Here's an example from <a href="http://ryandaigle.com/articles/2008/3/31/what-s-new-in-edge-rails-dirty-objects">Ryan's edge rails blog</a> -<pre class="ruby"><span class="ident">article</span> <span class="punct">=</span> <span class="constant">Article</span><span class="punct">.</span><span class="ident">find</span><span class="punct">(</span><span class="symbol">:first</span><span class="punct">)</span><br/><span class="ident">article</span><span class="punct">.</span><span class="ident">changed?</span>  <span class="comment">#=&gt; false</span><br/><br/><span class="comment"># Track changes to individual attributes with</span><br/><span class="comment"># attr_name_changed? accessor</span><br/><span class="ident">article</span><span class="punct">.</span><span class="ident">title</span>  <span class="comment">#=&gt; "Title"</span><br/><span class="ident">article</span><span class="punct">.</span><span class="ident">title</span> <span class="punct">=</span> <span class="punct">"</span><span class="string">New Title</span><span class="punct">"</span><br/><span class="ident">article</span><span class="punct">.</span><span class="ident">title_changed?</span> <span class="comment">#=&gt; true</span><br/><br/><span class="comment"># Access previous value with attr_name_was accessor</span><br/><span class="ident">article</span><span class="punct">.</span><span class="ident">title_was</span>  <span class="comment">#=&gt; "Title"</span><br/><br/><span class="comment"># See both previous and current value with attr_name_change accessor</span><br/><span class="ident">article</span><span class="punct">.</span><span class="ident">title_change</span>  <span class="comment">#=&gt; ["Title", "New Title"]</span></pre>Dirty objects should be available with the next release of Rails. Unfortunately, you need it in your Rails 2.0 project right away and can't wait. Well, you're in luck; adding this functionality to a Rails project turns out to be dead simple thanks to <code>Dirty</code> being a nicely decoupled module.<br/>Here's what you need to do:<ul><li>Download the source for <code>dirty.rb</code> from <a href="http://dev.rubyonrails.org/browser/trunk/activerecord/lib/active_record/dirty.rb?rev=9127">http://dev.rubyonrails.org/browser/trunk/activerecord/lib/active_record/dirty.rb?rev=9127</a>. I'm specifically picking revision 9127 because later versions incorporate partial updates (also new in edge rails), which complicates matters.</li><li>Once you've got the file create a directory called <code>active_record</code> under <code>RAILS_ROOT/config/initializers</code> and copy <code>dirty.rb</code> into it. Thus, if your project is under <code>/home/work/myproj</code>, the path to <code>dirty.rb</code> should be <code>/home/work/myproj/config/initializers/dirty.rb</code>.</li><li>Reopen <code>active_record</code> and mixin <code>Dirty</code>. Do this by creating a file called <code>active_record.rb</code> under <code>RAILS_ROOT/config/initializers</code> and putting the following bit of code in it:<pre class="ruby"><span class="ident">require</span> <span class="punct">"</span><span class="string"><span class="expr">#{File.dirname(__FILE__)}</span>/active_record/dirty</span><span class="punct">"</span><br/><br/><span class="constant">ActiveRecord</span><span class="punct">::</span><span class="constant">Base</span><span class="punct">.</span><span class="ident">class_eval</span> <span class="keyword">do</span><br/>  <span class="ident">include</span> <span class="constant">ActiveRecord</span><span class="punct">::</span><span class="constant">Dirty</span><br/><span class="keyword">end</span></pre></li></ul><br/>There, you're all set. You can verify that <code>Dirty</code> actually works by adding the following spec to your suite.<pre class="ruby"><span class="ident">require</span> <span class="constant">File</span><span class="punct">.</span><span class="ident">dirname</span><span class="punct">(</span><span class="constant">__FILE__</span><span class="punct">)</span> <span class="punct">+</span> <span class="punct">'</span><span class="string">/../spec_helper</span><span class="punct">'</span><br/><br/><span class="keyword">class </span><span class="class">TestModel</span> <span class="punct">&lt;</span> <span class="constant">ActiveRecord</span><span class="punct">::</span><span class="constant">Base</span><br/><span class="keyword">end</span><br/><br/><span class="ident">describe</span> <span class="punct">'</span><span class="string">Models with Dirty enabled</span><span class="punct">'</span> <span class="keyword">do</span><br/>  <span class="ident">before</span><span class="punct">(</span><span class="symbol">:all</span><span class="punct">)</span> <span class="keyword">do</span><br/>    <span class="ident">connection</span> <span class="punct">=</span> <span class="constant">ActiveRecord</span><span class="punct">::</span><span class="constant">Base</span><span class="punct">.</span><span class="ident">connection</span><br/>    <span class="keyword">begin</span><br/>      <span class="ident">connection</span><span class="punct">.</span><span class="ident">create_table</span><span class="punct">(</span><span class="symbol">:test_models</span><span class="punct">)</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">t</span><span class="punct">|</span><br/>        <span class="ident">t</span><span class="punct">.</span><span class="ident">column</span> <span class="symbol">:name</span><span class="punct">,</span> <span class="symbol">:string</span><br/>        <span class="ident">t</span><span class="punct">.</span><span class="ident">column</span> <span class="symbol">:age</span><span class="punct">,</span> <span class="symbol">:integer</span><br/>      <span class="keyword">end</span><br/>    <span class="keyword">rescue</span> <span class="constant">Exception</span> <span class="punct">=&gt;</span> <span class="ident">e</span><br/>      <span class="ident">puts</span> <span class="punct">"</span><span class="string">Error <span class="expr">#{e}</span> when creating test table</span><span class="punct">"</span><br/>    <span class="keyword">end</span><br/>  <span class="keyword">end</span><br/><br/>  <span class="ident">it</span> <span class="punct">"</span><span class="string">should mark new (unsaved) objects as changed</span><span class="punct">"</span> <span class="keyword">do</span><br/>    <span class="constant">TestModel</span><span class="punct">.</span><span class="ident">new</span><span class="punct">(</span><span class="symbol">:name</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">Ooga</span><span class="punct">',</span> <span class="symbol">:age</span> <span class="punct">=&gt;</span> <span class="number">15</span><span class="punct">).</span><span class="ident">should</span> <span class="ident">be_changed</span><br/>  <span class="keyword">end</span><br/>  <br/>  <span class="ident">it</span> <span class="punct">"</span><span class="string">should mark all fields of a new (unsaved) object as changed</span><span class="punct">"</span> <span class="keyword">do</span><br/>    <span class="ident">t</span> <span class="punct">=</span> <span class="constant">TestModel</span><span class="punct">.</span><span class="ident">new</span><span class="punct">(</span><span class="symbol">:name</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">Ooga</span><span class="punct">',</span> <span class="symbol">:age</span> <span class="punct">=&gt;</span> <span class="number">15</span><span class="punct">)</span><br/>    <span class="ident">t</span><span class="punct">.</span><span class="ident">name_changed?</span><span class="punct">.</span><span class="ident">should</span> <span class="ident">be_true</span><br/>    <span class="ident">t</span><span class="punct">.</span><span class="ident">age_changed?</span><span class="punct">.</span><span class="ident">should</span> <span class="ident">be_true</span><br/>  <span class="keyword">end</span><br/><br/>  <span class="ident">it</span> <span class="punct">"</span><span class="string">should mark newly created objects as unchanged</span><span class="punct">"</span> <span class="keyword">do</span><br/>    <span class="constant">TestModel</span><span class="punct">.</span><span class="ident">create</span><span class="punct">(</span><span class="symbol">:name</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">Ooga</span><span class="punct">',</span> <span class="symbol">:age</span> <span class="punct">=&gt;</span> <span class="number">15</span><span class="punct">).</span><span class="ident">should_not</span> <span class="ident">be_changed</span><br/>  <span class="keyword">end</span><br/><br/>  <span class="ident">it</span> <span class="punct">"</span><span class="string">should consider objects retrieved from the database to be unchanged</span><span class="punct">"</span> <span class="keyword">do</span><br/>    <span class="constant">TestModel</span><span class="punct">.</span><span class="ident">create</span><span class="punct">(</span><span class="symbol">:name</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">Ooga</span><span class="punct">',</span> <span class="symbol">:age</span> <span class="punct">=&gt;</span> <span class="number">15</span><span class="punct">)</span><br/>    <span class="constant">TestModel</span><span class="punct">.</span><span class="ident">find</span><span class="punct">(</span><span class="symbol">:first</span><span class="punct">).</span><span class="ident">should_not</span> <span class="ident">be_changed</span><br/>  <span class="keyword">end</span><br/><br/>  <span class="ident">it</span> <span class="punct">"</span><span class="string">should know when an object is dirty</span><span class="punct">"</span> <span class="keyword">do</span><br/>    <span class="ident">t</span> <span class="punct">=</span> <span class="constant">TestModel</span><span class="punct">.</span><span class="ident">create</span><span class="punct">(</span><span class="symbol">:name</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">Ooga</span><span class="punct">',</span> <span class="symbol">:age</span> <span class="punct">=&gt;</span> <span class="number">15</span><span class="punct">)</span><br/>    <span class="ident">t</span><span class="punct">.</span><span class="ident">age</span> <span class="punct">=</span> <span class="number">5</span><br/>    <span class="ident">t</span><span class="punct">.</span><span class="ident">should</span> <span class="ident">be_changed</span><br/>  <span class="keyword">end</span><br/><br/>  <span class="ident">it</span> <span class="punct">"</span><span class="string">should know when a field is dirty</span><span class="punct">"</span> <span class="keyword">do</span><br/>    <span class="ident">t</span> <span class="punct">=</span> <span class="constant">TestModel</span><span class="punct">.</span><span class="ident">create</span><span class="punct">(</span><span class="symbol">:name</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">Ooga</span><span class="punct">',</span> <span class="symbol">:age</span> <span class="punct">=&gt;</span> <span class="number">15</span><span class="punct">)</span><br/>    <span class="ident">t</span><span class="punct">.</span><span class="ident">age</span> <span class="punct">=</span> <span class="number">5</span><br/>    <span class="ident">t</span><span class="punct">.</span><span class="ident">age_changed?</span><span class="punct">.</span><span class="ident">should</span> <span class="ident">be_true</span><br/>  <span class="keyword">end</span><br/><br/>  <span class="ident">it</span> <span class="punct">"</span><span class="string">should mark an object as clean after a successful save</span><span class="punct">"</span> <span class="keyword">do</span><br/>    <span class="ident">t</span> <span class="punct">=</span> <span class="constant">TestModel</span><span class="punct">.</span><span class="ident">create</span><span class="punct">(</span><span class="symbol">:name</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">Ooga</span><span class="punct">',</span> <span class="symbol">:age</span> <span class="punct">=&gt;</span> <span class="number">15</span><span class="punct">)</span><br/>    <span class="ident">t</span><span class="punct">.</span><span class="ident">age</span> <span class="punct">=</span> <span class="number">5</span><br/>    <span class="ident">t</span><span class="punct">.</span><span class="ident">save</span><span class="punct">.</span><span class="ident">should</span> <span class="ident">be_true</span><br/>    <span class="ident">t</span><span class="punct">.</span><span class="ident">should_not</span> <span class="ident">be_changed</span><br/>  <span class="keyword">end</span><br/><br/>  <span class="ident">after</span><span class="punct">(</span><span class="symbol">:all</span><span class="punct">)</span> <span class="keyword">do</span><br/>    <span class="ident">drop_tables</span><span class="punct">(</span><span class="constant">ActiveRecord</span><span class="punct">::</span><span class="constant">Base</span><span class="punct">.</span><span class="ident">connection</span><span class="punct">,</span>  <span class="symbol">:test_models</span><span class="punct">)</span><br/>  <span class="keyword">end</span><br/><span class="keyword">end</span></pre><br/>Note that Rails automatically loads files under <code>config/initializers</code> - you can put these files elsewhere in your project, but make sure you tell Rails to pick them up and that the paths are alright. It is also possible that Dirty Objects may break some plugins, <a href="http://opensoul.org/2006/7/21/acts_as_audited">acts_as_audited</a> being a case in point.
<p><a href="http://feeds.feedburner.com/~a/diningtablecoder?a=a1UPUa"><img border="0" src="http://feeds.feedburner.com/~a/diningtablecoder?i=a1UPUa"/></a></p><img height="1" src="http://feeds.feedburner.com/~r/diningtablecoder/~4/285445395" width="1"/></div>
    </content>
    <updated>2008-05-08T05:49:07Z</updated>
    <published>2008-05-07T15:08:00Z</published>
    <category scheme="http://www.blogger.com/atom/ns#" term="rails"/>
    <author>
      <name>Sidu</name>
      <email>noreply@blogger.com</email>
      <uri>http://www.blogger.com/profile/11938300811286150164</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-3718956085911858962</id>
      <author>
        <name>Sidu</name>
        <email>noreply@blogger.com</email>
        <uri>http://www.blogger.com/profile/11938300811286150164</uri>
      </author>
      <link href="http://blog.sidu.in/" rel="alternate" type="text/html"/>
      <link href="http://www.blogger.com/feeds/3718956085911858962/posts/default?start-index=26&amp;max-results=25&amp;redirect=false" rel="next" type="application/atom+xml"/>
      <link href="http://blog.sidu.in/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://feeds.feedburner.com/diningtablecoder" rel="self" type="application/atom+xml"/>
      <title>Work at the dining table</title>
      <updated>2008-05-08T05:49:07Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-us">
    <id>http://del.icio.us/brunns#2008-05-07</id>
    <link href="http://feeds.feedburner.com/~r/SmallValuesOfCool/~3/285842106/brunns" rel="alternate" type="text/html"/>
    <title>Links for 2008-05-07 [del.icio.us]</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><ul>
<li><a href="http://www.guardian.co.uk/politics/2008/may/07/london.drugsandalcohol">Boris bans booze on London transport</a><br/>
Fascist.</li>
</ul></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><ul>
<li><a href="http://www.guardian.co.uk/politics/2008/may/07/london.drugsandalcohol">Boris bans booze on London transport</a><br/>
Fascist.</li>
</ul></div>
    </content>
    <updated>2008-05-08T05:00:00Z</updated><feedburner:origlink xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://del.icio.us/brunns#2008-05-07</feedburner:origlink>
    <source>
      <id>http://www.brunningonline.net/simon/blog/</id>
      <author>
        <name>Simon Brunning</name>
        <email>simon.brunning+smallvaluescomment@gmail.com</email>
      </author>
      <link href="http://www.brunningonline.net/simon/blog/" rel="alternate" type="text/html"/>
      <link href="http://feeds.feedburner.com/SmallValuesOfCool" rel="self" type="application/rss+xml"/>
      <rights>Copyright 2008</rights>
      <subtitle>Simon Brunning - stuff that I find interesting</subtitle>
      <title>Small Values of Cool</title>
      <updated>2008-05-07T14:42:11Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>tag:www.pgrs.net,2008-05-08:1694</id>
    <link href="http://www.pgrs.net/2008/5/8/factory-pattern-with-syntactic-sugar" rel="alternate" type="text/html"/>
    <title xml:lang="en-US">Factory pattern with syntactic sugar</title>
    <content type="xhtml" xml:lang="en-US"><div xmlns="http://www.w3.org/1999/xhtml"><p><a href="http://www.dcmanges.com">Dan Manges</a> has a nice write-up on why the factory pattern is better than Rails fixtures: <a href="http://www.dcmanges.com/blog/38">Rails: Fixin’ Fixtures with Factory</a>.  The factory is used to create valid objects for testing with default values for all of the fields.  These objects can be used in tests without cluttering the test with attributes we do not care about.</p>


	<p>On my current project, we like the factory pattern but favor a slightly better syntax.  We wanted to replace:</p>


<pre><code class="ruby">
Factory.create_paperboy
</code></pre>

	<p>with</p>


<pre><code class="ruby">
Paperboy.build!
</code></pre>

	<p>We use the build method (for lack of a better name) to create test data.  We are calling a class method on Paperboy in order to create an instance, which seems more consistent with object creation in ruby than calling a method on a Factory class:</p>


<pre><code class="ruby">
Paperboy.new
Paperboy.create
Paperboy.build!
</code></pre>

	<p>In addition to build! (which is like create!), we added a build method which creates the object without saving it.  We put our code in a file called factory.rb (which we require in spec_helper.rb) that looks like:</p>


<pre><code class="ruby">
module Factory

  def self.included(base)
    base.extend(self)
  end

  def build(params = {})
    raise "There are no default params for #{self.name}" unless self.respond_to?(self.name.underscore)
    new(self.send(self.name.underscore).merge(params))
  end

  def build!(params = {})
    obj = build(params)
    obj.save!
    obj
  end

  def customer
    {
      :first_name =&gt; "Joe",
      :last_name  =&gt; "Guy",
      :paperboy   =&gt; Paperboy.build,
    }
  end

  def newspaper
    {
      :customer =&gt; Customer.build,
      :headline =&gt; "Read all about it!",
      :paperboy =&gt; Paperboy.build,
    }
  end

  def paperboy
    {
      :first_name     =&gt; "Paper",
      :last_name      =&gt; "Boy",
      :delivery_route =&gt; "Main St Route" 
    }
  end  
end

ActiveRecord::Base.class_eval do
  include Factory
end
</code></pre>

	<p>The build method uses the class name to find the default params, which are defined as a method per class.  Then, it merges any user supplied params and creates the object.  Now, when we see test code that looks like:</p>


<pre><code class="ruby">
Paperboy.new :first_name =&gt; "some", :last_name =&gt; "person" 
</code></pre>

	<p>we can replace it with:</p>


<pre><code class="ruby">
Paperboy.build
</code></pre>

	<p>or, if one of the fields is important for the test:</p>


<pre><code class="ruby">
Paperboy.build :first_name =&gt; "joe" 
</code></pre>

	<p>It is easy to swap the word “new” or “create” for “build” or “build!” and then delete the params that we do not care about.</p></div>
    </content>
    <updated>2008-05-08T01:53:57Z</updated>
    <published>2008-05-08T01:53:00Z</published>
    <author>
      <name>paul</name>
    </author>
    <source>
      <id>tag:www.pgrs.net,2008:mephisto/</id>
      <link href="http://www.pgrs.net/feed/atom.xml" rel="self" type="application/atom+xml"/>
      <link href="http://www.pgrs.net/" rel="alternate" type="text/html"/>
      <title xml:lang="en-US">Paul Gross's Blog - Home</title>
      <updated>2008-05-08T01:53:57Z</updated>
    </source>
  </entry>

  <entry>
    <id>urn:lj:livejournal.com:atom1:dynamicproxy:34933</id>
    <link href="http://dynamicproxy.livejournal.com/34933.html" rel="alternate" type="text/html"/>
    <link href="http://dynamicproxy.livejournal.com/data/atom/?itemid=34933" rel="self" type="text/xml"/>
    <title>Alan McClellan joins the OpenSolaris Documentation community</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><a href="http://blogs.sun.com/docexchange/entry/an_expatriate_returns">Alan McClellan </a>must be one of the calmest persons I've met. Conversations with him are thought provoking. He asks you a question and ask you answer that question, you are forced to think and rethink. I'm certain now that this in itself compells technical people to give him good responses.<br/><br/>Michelle Olson, meanwhile, will be moving on to take over other responsibilities.<br/><br/>The Docs group at opensolaris.org has done great work so far, and I'm excited to help out fixing things that need fixing and writing things that need writing :)</div>
    </content>
    <updated>2008-05-07T23:37:59Z</updated>
    <published>2008-05-07T23:37:59Z</published>
    <source>
      <id>urn:lj:livejournal.com:atom1:dynamicproxy</id>
      <author>
        <name>dynamicproxy</name>
      </author>
      <link href="http://dynamicproxy.livejournal.com/" rel="alternate" type="text/html"/>
      <link href="http://dynamicproxy.livejournal.com/data/atom" rel="self" type="application/atom+xml"/>
      <subtitle>dynamicproxy</subtitle>
      <title>Ram's Live Journal</title>
      <updated>2008-05-11T23:02:37Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://nutrun.com/?p=138</id>
    <link href="http://nutrun.com/weblog/unambiguous-command-abbreviation/" rel="alternate" type="text/html"/>
    <title>Unambiguous command abbreviation</title>
    <summary>When using RubyGems from the command line, I almost always type sudo gem i synthesis as opposed to sudo gem install rails, the emphasis targeted at using “i” instead of “install”, of course. The gem executable happily understands what command it is being asked to execute when provided with the first few letters of the [...]</summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>When using <a href="http://www.rubygems.org/" title="RubyGems Manuals">RubyGems</a> from the command line, I almost always type <code>sudo gem i synthesis</code> as opposed to <code>sudo gem install rails</code>, the emphasis targeted at using <em>“i”</em> instead of <em>“install”</em>, of course. The <code>gem</code> executable happily understands what command it is being asked to execute when provided with the first few letters of the command, as long as those letters are not ambiguous, i.e. don’t clash with the names of other commands. So even though <code>sudo gem u foo</code> complains that <code>Ambiguous command u matches [uninstall, unpack, update]</code>, <code>sudo gem uni foo</code> will uninstall the specified gem.</p>
<p>Here’s how this is implemented in RubyGems.</p>
<pre>def find_command(cmd_name)
  possibilities = find_command_possibilities(cmd_name)
  if possibilities.size &gt; 1
    raise "Ambiguous command #{cmd_name} matches [#{possibilities.join(', ')}]"
  end
  if possibilities.size &lt; 1
    raise "Unknown command #{cmd_name}"
  end

  self[possibilities.first]
end

def find_command_possibilities(cmd_name)
  len = cmd_name.length
  self.command_names.select { |n| cmd_name == n[0,len] }
end
</pre>
<p>In the same vein, although not strictly a command abbreviation, <a href="http://www.dtsato.com/blog" title="Danilo Sato">Danilo</a> pointed out <a href="http://git.or.cz/" title="Git - Fast Version Control System">git</a> understands abbreviated revision hashes, so it’s possible to use something like <code>git diff d0a..HEAD</code> even with the hash’s complete representation being <code>d0aa7dd4aa9a95090df1e0b9d0f426d5a5bd56ae</code>.</p>
<p>Less typing is almost always a good option to have. The easy to implement <em>Unambiguous command abbreviation</em> trick adds a subtle usability improvement to command line interfaces and holds a nice treat to the utility’s power users.</p></div>
    </content>
    <updated>2008-05-07T21:36:38Z</updated>
    <category term="Software"/>
    <author>
      <name>George Malamidis</name>
    </author>
    <source>
      <id>http://nutrun.com</id>
      <link href="http://nutrun.com/weblog/category/software/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://nutrun.com" rel="alternate" type="text/html"/>
      <subtitle>Just another WordPress weblog</subtitle>
      <title>nutrun » Software</title>
      <updated>2008-05-10T15:10:14Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>d10481e0-d7e7-4234-9ab6-db53a9657b7e:1493</id>
    <link href="http://manicprogrammer.com/cs/blogs/heynemann/archive/2008/05/07/amazing-results.aspx" rel="alternate" type="text/html"/>
    <title>Amazing Results</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">It's been only 2 days after I first implemented my new exception throwing mechanism , and I already feel an enormous difference. It's not just having the exceptions with better messages per se, it's actually having to think why I'm throwing that exception...(<a href="http://manicprogrammer.com/cs/blogs/heynemann/archive/2008/05/07/amazing-results.aspx">read more</a>)<img height="1" src="http://manicprogrammer.com/cs/aggbug.aspx?PostID=1493" width="1"/></div>
    </summary>
    <updated>2008-05-07T20:41:51Z</updated>
    <author>
      <name>heynemann</name>
    </author>
    <sourc