<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-12616776</id><updated>2009-09-01T15:48:59.171+10:00</updated><title type='text'>nosewheelie</title><subtitle type='html'>Technology, mountain biking, Mac stuff, politics and music.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://nosewheelie.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default'/><link rel='alternate' type='text/html' href='http://nosewheelie.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default?start-index=26&amp;max-results=25'/><author><name>Tom Adams</name><uri>http://www.blogger.com/profile/16126053163040522576</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>91</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-12616776.post-115192417356800118</id><published>2006-07-03T20:46:00.000+10:00</published><updated>2006-07-03T20:56:13.580+10:00</updated><title type='text'>nosewheelie is moving</title><content type='html'>&lt;p&gt;After lots of contemplating, I've decided to move my blog over to my &lt;a href="http://adams.id.au/"&gt;main site&lt;/a&gt;. I'll be keeping this blog around for posterity (also the Blogger import on Wordpress seems to be broken), but all future posts will be made at the &lt;a href="http://adams.id.au/blog/"&gt;all new nosewheelie&lt;/a&gt;, a new &lt;a href="http://feeds.feedburner.com/nosewheelie"&gt;feed&lt;/a&gt; is also available.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12616776-115192417356800118?l=nosewheelie.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nosewheelie.blogspot.com/feeds/115192417356800118/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=12616776&amp;postID=115192417356800118' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/115192417356800118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/115192417356800118'/><link rel='alternate' type='text/html' href='http://nosewheelie.blogspot.com/2006/07/nosewheelie-is-moving.html' title='nosewheelie is moving'/><author><name>Tom Adams</name><uri>http://www.blogger.com/profile/16126053163040522576</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01309662739466584417'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12616776.post-115012551890213697</id><published>2006-06-13T01:14:00.000+10:00</published><updated>2006-06-13T01:18:38.916+10:00</updated><title type='text'>The 7 (f)laws of the Semantic Web</title><content type='html'>&lt;blockquote&gt;When it comes to the Semantic Web, you might call me a disillusioned advocate. I’ve been dipping in and out of the technologies for the last 5 years or so, but am increasingly frustrated by the lack of any visible progress.&lt;/blockquote&gt;

Source: &lt;a href="http://www.oreillynet.com/xml/blog/2006/06/the_7_flaws_of_the_semantic_we.html"&gt;The 7 (f)laws of the Semantic Web&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12616776-115012551890213697?l=nosewheelie.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nosewheelie.blogspot.com/feeds/115012551890213697/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=12616776&amp;postID=115012551890213697' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/115012551890213697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/115012551890213697'/><link rel='alternate' type='text/html' href='http://nosewheelie.blogspot.com/2006/06/7-flaws-of-semantic-web_13.html' title='The 7 (f)laws of the Semantic Web'/><author><name>Tom Adams</name><uri>http://www.blogger.com/profile/16126053163040522576</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01309662739466584417'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12616776.post-114982558344484486</id><published>2006-06-09T13:53:00.000+10:00</published><updated>2006-06-09T13:59:43.456+10:00</updated><title type='text'>Not on my watch!</title><content type='html'>&lt;p&gt;Our resident IntelliJ plugin guru Rob has been at it again. For a while we've been dreaming up ways to automate a build breakage notification, so that it's really in your face. Rob's solution?&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6952/1077/1600/notonmywatch.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/6952/1077/400/notonmywatch.jpg" border="0" alt="" /&gt;&lt;/a&gt;

&lt;p&gt;Will wonders never cease?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12616776-114982558344484486?l=nosewheelie.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nosewheelie.blogspot.com/feeds/114982558344484486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=12616776&amp;postID=114982558344484486' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/114982558344484486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/114982558344484486'/><link rel='alternate' type='text/html' href='http://nosewheelie.blogspot.com/2006/06/not-on-my-watch.html' title='Not on my watch!'/><author><name>Tom Adams</name><uri>http://www.blogger.com/profile/16126053163040522576</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01309662739466584417'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12616776.post-114967925534564488</id><published>2006-06-07T21:17:00.000+10:00</published><updated>2006-06-07T21:20:55.416+10:00</updated><title type='text'>Why do they hate us?</title><content type='html'>&lt;p&gt;The hypocrisy of the US administration astounds me constantly (and they're not alone unfortunately).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For a textbook example of why we are hated, consider Gaza and the West Bank. There, a brutal Israeli/U.S.-led cutoff in aid has been imposed on the Palestinians for voting the wrong way in a free election.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Query: who, besides al-Qaeda and recruiters of suicide bombers, can conceivably benefit from persecuting the Palestinian people like this? Does President Bush or Condi Rice think the Palestinians will respect an America that did this to their children, after we urged this election, called for Hamas to participate, and preached our devotion to democracy?&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;The White House says we don’t negotiate with terrorists. But when we had to, we did. FDR and Truman summited with Stalin at Yalta and Potsdam. Nixon met with Mao in Beijing. Kissinger negotiated with the Viet Cong and North Vietnamese at Paris. Bush I allied with Assad in the Gulf War. Clinton had Arafat to the White House too many times to count.&lt;/p&gt;
&lt;/blockquote&gt;

Source: &lt;a href="http://www.amconmag.com/2006/2006_06_05/buchanan.html"&gt;The Persecution of the Palestinians&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12616776-114967925534564488?l=nosewheelie.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nosewheelie.blogspot.com/feeds/114967925534564488/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=12616776&amp;postID=114967925534564488' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/114967925534564488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/114967925534564488'/><link rel='alternate' type='text/html' href='http://nosewheelie.blogspot.com/2006/06/why-do-they-hate-us.html' title='Why do they hate us?'/><author><name>Tom Adams</name><uri>http://www.blogger.com/profile/16126053163040522576</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01309662739466584417'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12616776.post-114947778315329094</id><published>2006-06-05T13:17:00.000+10:00</published><updated>2006-06-05T21:03:10.483+10:00</updated><title type='text'>Ruby early return considered harmful (for idiots like me)</title><content type='html'>&lt;p&gt;I've been playing with some Rails code at home to support some of the work we do at the day job. I'm building a search tool that detects the kind of input and performs searches based on this type. I've been working with Ruby's regular expression support, and test driving a class to find UUIDs. Here's what I started with (please don't comment that it could be simpler, I was starting simple... :).&lt;/p&gt;

&lt;pre&gt;
class Uuid
  REGEX = /[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}/

  def Uuid.isUuid(fragment)
    if fragment =~ REGEX
      return true
    end
    return false
  end
end
&lt;/pre&gt;

&lt;p&gt;Thinking that this could be simplified be removing the &lt;code&gt;return&lt;/code&gt; keyword, I removed it!&lt;/p&gt;

&lt;pre&gt;
class Uuid
  REGEX = /[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}/

  def Uuid.isUuid(fragment)
    if fragment =~ REGEX
      true
    end
    false
  end
end
&lt;/pre&gt;

&lt;p&gt;This caused all sorts of funny problems, which in hindsight are painfully obvious, but at the time are just a pain. Removing the return causes the &lt;code&gt;if&lt;/code&gt; to essentially fall-through, &lt;strong&gt;always&lt;/strong&gt; 
returning &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Discussing this at work, perhaps I've hit up against a potential maintenance issue with Ruby. I'm hoping this isn't the case (you can do similar stupid things in most languages), but some of the things you can do with Ruby make me a little nervous. I'm holding my tongue for a while (I did the same thing with XP and am hooked) to see where things go, I'm sure it'll all be fine...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12616776-114947778315329094?l=nosewheelie.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nosewheelie.blogspot.com/feeds/114947778315329094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=12616776&amp;postID=114947778315329094' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/114947778315329094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/114947778315329094'/><link rel='alternate' type='text/html' href='http://nosewheelie.blogspot.com/2006/06/ruby-early-return-considered-harmful.html' title='Ruby early return considered harmful (for idiots like me)'/><author><name>Tom Adams</name><uri>http://www.blogger.com/profile/16126053163040522576</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01309662739466584417'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12616776.post-114904354511122182</id><published>2006-05-31T12:42:00.000+10:00</published><updated>2006-05-31T12:45:45.126+10:00</updated><title type='text'>Managing Software Developers</title><content type='html'>&lt;blockquote&gt;If you're an engineer at a company where becoming a manager is considered a promotion, then you only have three choices: become a manager yourself, or leave, or resign yourself to being a second-class employee. It should be obvious — you can work through the math using three sock puppets — that this is an arrangement that pushes a company inexorably towards mediocrity. The best engineers either leave the company or try their hand at management, often with doubly disastrous consequences: they simultaneously lose the company a great engineer and gain them an awful manager.&lt;/blockquote&gt;

Source: &lt;a href="http://steve-yegge.blogspot.com/2006/05/not-managing-software-developers.html"&gt; (Not) Managing Software Developers&lt;/a&gt; (&lt;a href="http://anarchaia.org/"&gt;Via Anarchaia&lt;/a&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12616776-114904354511122182?l=nosewheelie.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nosewheelie.blogspot.com/feeds/114904354511122182/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=12616776&amp;postID=114904354511122182' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/114904354511122182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/114904354511122182'/><link rel='alternate' type='text/html' href='http://nosewheelie.blogspot.com/2006/05/managing-software-developers.html' title='Managing Software Developers'/><author><name>Tom Adams</name><uri>http://www.blogger.com/profile/16126053163040522576</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01309662739466584417'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12616776.post-114729940813398648</id><published>2006-05-11T08:04:00.000+10:00</published><updated>2006-05-11T08:16:48.206+10:00</updated><title type='text'>On project estimation</title><content type='html'>&lt;p&gt;&lt;a href="http://conversationswithandrew.blogspot.com/"&gt;Tom&lt;/a&gt; writes about &lt;a href="http://conversationswithandrew.blogspot.com/2006/05/how-long-is-piece-of-string.html"&gt; How Long is a Piece of String?&lt;/a&gt;, which addresses one of my main frustrations with software development; estimates and how project managers' and stakeholders deal with them.&lt;/p&gt;

&lt;blockquote&gt;So, how long is a piece of string? ... It's a pretty silly question, isn't it? But would you believe that questions like that are asked all the time regarding IT projects? And what is even more amazing is that people actually give answers to such vague questions and then they make important business decisions based on them.&lt;/blockquote&gt;

&lt;p&gt;Far too often I see people wondering around in disillusionment as estimates are not hit. This can sometimes be exaggerated on agile projects as management get &lt;strong&gt;more&lt;/strong&gt; feedback than they're used to, and some panic.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12616776-114729940813398648?l=nosewheelie.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nosewheelie.blogspot.com/feeds/114729940813398648/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=12616776&amp;postID=114729940813398648' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/114729940813398648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/114729940813398648'/><link rel='alternate' type='text/html' href='http://nosewheelie.blogspot.com/2006/05/on-project-estimation.html' title='On project estimation'/><author><name>Tom Adams</name><uri>http://www.blogger.com/profile/16126053163040522576</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01309662739466584417'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12616776.post-114725656260454722</id><published>2006-05-10T20:16:00.000+10:00</published><updated>2006-05-10T20:22:42.606+10:00</updated><title type='text'>Immediate feedback is a key element to exceptional performance</title><content type='html'>&lt;p&gt;&lt;a href="http://37signals.com/svn/archives2/the_importance_of_instant_feedback.php"&gt;Matt&lt;/a&gt; tells us of the importance of instant feedback, and hightlights &lt;a href="http://www.nytimes.com/2006/05/07/magazine/07wwln_freak.html?ex=1147233600&amp;en=6a3168396c98d5e8&amp;ei=5087%0A"&gt;A Star Is Made&lt;/a&gt;. Very timely considering the time our build takes...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12616776-114725656260454722?l=nosewheelie.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nosewheelie.blogspot.com/feeds/114725656260454722/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=12616776&amp;postID=114725656260454722' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/114725656260454722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/114725656260454722'/><link rel='alternate' type='text/html' href='http://nosewheelie.blogspot.com/2006/05/immediate-feedback-is-key-element-to.html' title='Immediate feedback is a key element to exceptional performance'/><author><name>Tom Adams</name><uri>http://www.blogger.com/profile/16126053163040522576</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01309662739466584417'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12616776.post-114688843260678226</id><published>2006-05-06T13:56:00.000+10:00</published><updated>2006-05-10T20:14:47.296+10:00</updated><title type='text'>How to make programming hard for yourself</title><content type='html'>&lt;p&gt;Reg Braithwaite post about &lt;a href="http://weblog.raganwald.com/2006/05/how-to-make-programming-hard-for.html"&gt;How to make programming hard for yourself&lt;/a&gt;. He makes several interesting comments that ring true with me. I've worked with several people who meet the "people that consider my hard problems to be recreational diversions" comment, and though they are phenomenally smart and can indeed tackle the hardest of the hard problems, (I feel that) they find it hard to produce code that is of a high quality consistently. Then, there are those people, who are naturally smart enough to tackle the hard problems yet are &lt;strong&gt;also&lt;/strong&gt; able to produce good quality code on a day-to-day basis. There would only be about 5-10% of developers who fall into this bucket, and getting the chance to work with them is mind blowing. There is nothing better for your career development than to be thrown in the deep end with a bunch of people that know more about everything than you do. Indeed Dave Hoover's &lt;a href="http://www.redsquirrel.com/dave/work/a2j/patterns/BeTheWorst.html"&gt;Be The Worst&lt;/a&gt; apprenticeship pattern embodies this idea. I'm currently working on a project with several people that fall into this category. There's nothing like a dose of reality to keep an ego in check!&lt;/p&gt;

&lt;p&gt;On a similar note, Damien Katz shows us the &lt;a href="http://damienkatz.net/2006/05/signs_youre_a_c.html"&gt;Signs You're a Crappy Programmer (and don't know it)&lt;/a&gt;. I don't agree with all of these, the 20 lines of code one especially. We spoke about this at work today, and while they're all "magic" numbers, they really force you to think hard about your design. I heard a podcast by David Heinemeier Hansson once that talked about how being under constraints you may not like forces you to be creative (he was referring to Rails). I think length is one of those occasions.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12616776-114688843260678226?l=nosewheelie.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nosewheelie.blogspot.com/feeds/114688843260678226/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=12616776&amp;postID=114688843260678226' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/114688843260678226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/114688843260678226'/><link rel='alternate' type='text/html' href='http://nosewheelie.blogspot.com/2006/05/how-to-make-programming-hard-for.html' title='How to make programming hard for yourself'/><author><name>Tom Adams</name><uri>http://www.blogger.com/profile/16126053163040522576</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01309662739466584417'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12616776.post-114626082687383380</id><published>2006-04-29T07:46:00.000+10:00</published><updated>2006-05-01T14:36:52.420+10:00</updated><title type='text'>Mac Backup Software Harmful</title><content type='html'>&lt;blockquote&gt;Paradoxically, copying a file and being sure that all information has been copied is not easy under Mac OS X.
I analyzed a variety of file copying engines, most of them command-line tools, and demonstrated how they fare in preserving file metadata.&lt;/blockquote&gt;

&lt;p&gt;Source: &lt;a href="http://blog.plasticsfuture.org/2006/04/23/mac-backup-software-harmful/"&gt;Mac Backup Software Harmful&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is quite interesting as I've never felt the need to move from Carbon Copy Cloner to something else, as I've successfully managed upgrades using it from Jaguar to Panther &amp; Panther to Tiger.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12616776-114626082687383380?l=nosewheelie.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nosewheelie.blogspot.com/feeds/114626082687383380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=12616776&amp;postID=114626082687383380' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/114626082687383380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/114626082687383380'/><link rel='alternate' type='text/html' href='http://nosewheelie.blogspot.com/2006/04/mac-backup-software-harmful.html' title='Mac Backup Software Harmful'/><author><name>Tom Adams</name><uri>http://www.blogger.com/profile/16126053163040522576</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01309662739466584417'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12616776.post-114587792283523793</id><published>2006-04-24T21:05:00.000+10:00</published><updated>2006-04-24T21:33:06.056+10:00</updated><title type='text'>Subversion</title><content type='html'>&lt;p&gt;&lt;a href="http://morenews.blogspot.com/"&gt;Andrew&lt;/a&gt; asked me to take a look at some &lt;a href="http://www.jrdf.org/"&gt;JRDF&lt;/a&gt; work he's been working on. As I've been slack lately, I needed to check out the code to take a look, and he's recently moved it over to Subversion. I've dealt with svn before from within IntelliJ, but I usually like to check out my projects from the command line, to get a feel for what's going on. So my running commentary for all today is information on getting svn going for CVS wannabes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://svnbook.red-bean.com/en/1.1/svn-book.html"&gt;The book&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.onlamp.com/pub/a/onlamp/2004/08/19/subversiontips.html"&gt;The Top Ten Subversion Tips for CVS Users&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://hivelogic.com/articles/2006/04/19/svn_on_os_x"&gt;Building Subversion (SVN) on Mac OS X&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://wiki.rubyonrails.org/rails/pages/HowtoUseRailsWithSubversion"&gt;How to Use Rails with Subversion&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gotta love the &lt;code&gt;blame/praise&lt;/code&gt; command!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12616776-114587792283523793?l=nosewheelie.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nosewheelie.blogspot.com/feeds/114587792283523793/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=12616776&amp;postID=114587792283523793' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/114587792283523793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/114587792283523793'/><link rel='alternate' type='text/html' href='http://nosewheelie.blogspot.com/2006/04/subversion_24.html' title='Subversion'/><author><name>Tom Adams</name><uri>http://www.blogger.com/profile/16126053163040522576</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01309662739466584417'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12616776.post-114472184165276770</id><published>2006-04-11T12:14:00.000+10:00</published><updated>2006-04-11T12:17:21.666+10:00</updated><title type='text'>Samurai</title><content type='html'>&lt;p&gt;If anyone ever needs to analyse Java thread dumps, &lt;a href="http://yusuke.homeip.net/samurai/?english"&gt;Samurai&lt;/a&gt; is the &lt;a href="http://www.matildabay.com.au/ourbeers/beezneez.html"&gt;Beez Neez&lt;/a&gt;. No more squinting at less.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12616776-114472184165276770?l=nosewheelie.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nosewheelie.blogspot.com/feeds/114472184165276770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=12616776&amp;postID=114472184165276770' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/114472184165276770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/114472184165276770'/><link rel='alternate' type='text/html' href='http://nosewheelie.blogspot.com/2006/04/samurai.html' title='Samurai'/><author><name>Tom Adams</name><uri>http://www.blogger.com/profile/16126053163040522576</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01309662739466584417'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12616776.post-114463971742174457</id><published>2006-04-10T13:22:00.000+10:00</published><updated>2006-04-10T13:28:37.470+10:00</updated><title type='text'>Cannot Delete</title><content type='html'>&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6952/1077/1600/cantdelete.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/6952/1077/400/cantdelete.jpg" border="0" alt="" /&gt;&lt;/a&gt; The ever helpful error message, from a colleague's interactions with a remote server.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12616776-114463971742174457?l=nosewheelie.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nosewheelie.blogspot.com/feeds/114463971742174457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=12616776&amp;postID=114463971742174457' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/114463971742174457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/114463971742174457'/><link rel='alternate' type='text/html' href='http://nosewheelie.blogspot.com/2006/04/cannot-delete.html' title='Cannot Delete'/><author><name>Tom Adams</name><uri>http://www.blogger.com/profile/16126053163040522576</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01309662739466584417'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12616776.post-114436131642507103</id><published>2006-04-07T08:03:00.000+10:00</published><updated>2006-04-07T08:12:40.046+10:00</updated><title type='text'>SPARQL-a-go-go</title><content type='html'>&lt;p&gt;Via &lt;a href="http://prototypo.blogspot.com/2006/04/sparql-specifications-are-now-w3c.html"&gt;Dave&lt;/a&gt;: The &lt;a href="http://www.w3.org/2001/sw/DataAccess/"&gt;DAWG&lt;/a&gt; (the WG I &lt;a href="http://lists.w3.org/Archives/Public/public-rdf-dawg/2005JanMar/0087.html"&gt;once&lt;/a&gt; sat on) has &lt;a href="http://www.w3.org/News/2006#item60"&gt;just released&lt;/a&gt; three SPARQL specifications as W3C Candidate Recommendations! This is great news for the semweb community, even if some of the decisions made are not ones I agree with. The potential upside of semweb is huge, hopefully it can be another one of those overnight success stories, 10 years in the making.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12616776-114436131642507103?l=nosewheelie.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nosewheelie.blogspot.com/feeds/114436131642507103/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=12616776&amp;postID=114436131642507103' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/114436131642507103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/114436131642507103'/><link rel='alternate' type='text/html' href='http://nosewheelie.blogspot.com/2006/04/sparql-go-go.html' title='SPARQL-a-go-go'/><author><name>Tom Adams</name><uri>http://www.blogger.com/profile/16126053163040522576</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01309662739466584417'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12616776.post-114358452413602690</id><published>2006-03-29T08:20:00.000+10:00</published><updated>2006-03-29T08:22:04.176+10:00</updated><title type='text'>Firing squad</title><content type='html'>&lt;blockquote&gt;I think we should take the “Web Services” label into the jailyard, strap on a blindfold, give it a last cigarette, and shoot it. It doesn’t mean much any more, and to the extent that it does, it’s misleading: WS-* doesn’t have much of the Web about it. I don’t have a proposal for a new name for the WS-* style; sorry, but I just don’t care.&lt;/blockquote&gt;

From Tim Bray, &lt;a href="http://www.tbray.org/ongoing/When/200x/2006/03/26/On-REST"&gt;Styles: Beyond WS and REST&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12616776-114358452413602690?l=nosewheelie.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nosewheelie.blogspot.com/feeds/114358452413602690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=12616776&amp;postID=114358452413602690' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/114358452413602690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/114358452413602690'/><link rel='alternate' type='text/html' href='http://nosewheelie.blogspot.com/2006/03/firing-squad.html' title='Firing squad'/><author><name>Tom Adams</name><uri>http://www.blogger.com/profile/16126053163040522576</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01309662739466584417'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12616776.post-114319831149352746</id><published>2006-03-24T20:54:00.000+10:00</published><updated>2006-03-24T21:10:04.346+10:00</updated><title type='text'>The Wrong Questions</title><content type='html'>&lt;p&gt;Walking around the office this last week, I've begun to notice some things I've forgotten about large bureaucracies built around IT projects. Everyone has great answers, but they're answering the wrong questions.&lt;/p&gt;

&lt;p&gt;A couple of examples. We're collocated within a division who manage the development and deployment of large projects within the company. Walking through the office last week I saw a large poster of the "Rational Unified Process - Process Made Practical". Now I've never developed under any Rational process (or tools for that matter), but the idea of something that calls itself the "Unified Process" (complete with caps) struck fear in my heart.&lt;/p&gt;

&lt;p&gt;In a previous role, we had the experience of receiving several functional requirements specifications that were not suitable to develop from. They missed several key requirements, did not accurately describe the current system and contained lots of diagrams that were nothing more that pretty pictures. One of these specs was a 30-odd page Word file that when distilled contained a page and a half of requirements in bullet point form.&lt;/p&gt;

&lt;p&gt;Now, from a business point of view I'm sure these specs were of value, but for their intended purpose they were of little. The problem was, the documents were produced within a process that did not take into account their value to development, only on their adherence to documentation standards. In one case, the requirements had not been gathered from the customers, and the touch points with the function and capabilities of the current system had not been checked with those who knew it best. The document was derived in complete isolation, from a higher level document alone.&lt;/p&gt;

&lt;p&gt;Now I don't think that anyone truly believes that we know how to develop software. Those of us who practice XP would like to think that agile is &lt;em&gt;the way and the light&lt;/em&gt;. I believe it's a great step forward - and a step that practices self review and the infamous continuous improvement - but it may not be the best way to develop all software.&lt;/p&gt;

&lt;p&gt;All in all I have the sinking feeling that there are lots of people are all busy doing a wonderful job that contributes little to the effective delivery of a software project. There are lots of great answers, but the questions being asked are not the ones that should be.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12616776-114319831149352746?l=nosewheelie.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nosewheelie.blogspot.com/feeds/114319831149352746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=12616776&amp;postID=114319831149352746' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/114319831149352746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/114319831149352746'/><link rel='alternate' type='text/html' href='http://nosewheelie.blogspot.com/2006/03/wrong-questions.html' title='The Wrong Questions'/><author><name>Tom Adams</name><uri>http://www.blogger.com/profile/16126053163040522576</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01309662739466584417'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12616776.post-114233509100750534</id><published>2006-03-14T21:17:00.000+10:00</published><updated>2006-03-15T21:09:25.406+10:00</updated><title type='text'>You know you have problems when...</title><content type='html'>&lt;ul&gt;
&lt;li&gt;Your classes are over 5000 lines long.&lt;/li&gt;
&lt;li&gt;You compare your class to three JDK classes.&lt;/li&gt;
&lt;li&gt;You incorporate transaction management, path management, file management, connection &amp;amp; URL semantics in a single class.&lt;/li&gt;
&lt;li&gt;Your class-level javadoc is 100 lines long.&lt;/li&gt;
&lt;li&gt;You use a version of commons httpclient that has bugs parsing URLs with ports &amp;amp; is incompatible with the latest release.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also known as &lt;a href="http://svn.apache.org/viewcvs.cgi/jakarta/slide/trunk/webdavclient/clientlib/src/java/org/apache/webdav/lib/WebdavResource.java?view=markup"&gt;WebdavResource&lt;/a&gt;. Why this sort of code continues to be written is bizarre.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Update. As James has pointed out in the comments, editing your blog over a modem when you cannot spell is not good. I've never had a good experience with slide, and none of my recent experiences is any better.&lt;/em&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12616776-114233509100750534?l=nosewheelie.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nosewheelie.blogspot.com/feeds/114233509100750534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=12616776&amp;postID=114233509100750534' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/114233509100750534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/114233509100750534'/><link rel='alternate' type='text/html' href='http://nosewheelie.blogspot.com/2006/03/you-know-you-have-problems-when.html' title='You know you have problems when...'/><author><name>Tom Adams</name><uri>http://www.blogger.com/profile/16126053163040522576</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01309662739466584417'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12616776.post-114065649985357298</id><published>2006-02-23T10:17:00.000+10:00</published><updated>2006-02-23T16:34:10.083+10:00</updated><title type='text'>The C guru</title><content type='html'>&lt;p&gt;We have the pleasure of inheriting an application written in C that wraps a GDS API.  I've been in the process of upgrading the API to the latest version and ran into a few stumbling blocks. In typical fasion, I'm posting the resolutions them here so I can find them again.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ldd - Lists shared library dependencies&lt;/li&gt;
&lt;li&gt;nm - Lists symbols from object files&lt;/li&gt;
&lt;li&gt;objdump - Displays information from object files. This is like nm on steroids, and apparently also lists symbols for file that have had their symbols stripped.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;BTW, the title of this post does not alude to me, but rather a label I've been throwing around at work for kicks, only it hasn't stuck to someone yet!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12616776-114065649985357298?l=nosewheelie.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nosewheelie.blogspot.com/feeds/114065649985357298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=12616776&amp;postID=114065649985357298' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/114065649985357298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/114065649985357298'/><link rel='alternate' type='text/html' href='http://nosewheelie.blogspot.com/2006/02/c-guru.html' title='The C guru'/><author><name>Tom Adams</name><uri>http://www.blogger.com/profile/16126053163040522576</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01309662739466584417'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12616776.post-113886084347122839</id><published>2006-02-02T14:54:00.000+10:00</published><updated>2006-02-03T14:55:03.363+10:00</updated><title type='text'>Continuous Integration</title><content type='html'>&lt;p&gt;Was having lunch today with a &lt;a href="http://www.thenewsbeforethenews.com/"&gt;friend&lt;/a&gt; of mine and one of his &lt;a href="http://gregluck.com/blog/"&gt;colleagues&lt;/a&gt; when the topic of my current work came up. I told him that I was working on a new feature of our product and had spent the last chunk of time integrating it with the existing codebase. Greg commented that if I was performing continuous integration I wouldn't have run into this problem. My reply was that we were and I went on to explain why I was having problems.&lt;/p&gt;

&lt;p&gt;On the walk back to the office however, I thought some more about the question and it struck me that I'd misinterpreted it. On reflection I think that perhaps there are two ways that we could have completed this work and continuous integration means more than just good tests running in a continuous build environment.&lt;/p&gt;

&lt;h4&gt;Separate Implementation Method&lt;/h4&gt;

&lt;p&gt;This is the approach we took. Basically, we came up with a high-level approach, decided where we were going to hook it in, then built up the code to match the existing functionality (using a bottom-up TDD approach). We then (this is the situation I'm in now) tried to hook it into the exising code base, where I discovered we did not currently have access to required details.&lt;/p&gt;

&lt;h4&gt;Integrate Always Method&lt;/h4&gt;

&lt;p&gt;Using this approach we would break the system up front by integrating our new code directly into the existing code base. The more code we had written, the closer the system would be to completion. We wouldn't need to perform after the fact integration and we'd more easily know when we where finished.&lt;/p&gt;

&lt;h4&gt;Summary&lt;/h4&gt;

&lt;p&gt;In hindsight, we could have taken option 2 and saved ourselves the hassle. One problem with it is as we are working on a production system, we cannot break current functionality as maintenance releases are frequent and business often changes priority by pulling us off and on "sub-projects" according to their need. For us, this approach requires access to a separate source branch (which we have) in order not to break the system. To me this highlights some lessons I've obviously forgotten...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12616776-113886084347122839?l=nosewheelie.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nosewheelie.blogspot.com/feeds/113886084347122839/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=12616776&amp;postID=113886084347122839' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/113886084347122839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/113886084347122839'/><link rel='alternate' type='text/html' href='http://nosewheelie.blogspot.com/2006/02/continuous-integration.html' title='Continuous Integration'/><author><name>Tom Adams</name><uri>http://www.blogger.com/profile/16126053163040522576</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01309662739466584417'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12616776.post-113806591771969478</id><published>2006-01-24T11:17:00.000+10:00</published><updated>2006-01-25T07:58:01.126+10:00</updated><title type='text'>jMock ordering</title><content type='html'>&lt;p&gt;In case anyone (i.e. me next week) needs to specify explicit method ordering in jMock, here it is. This code specifies the order of a chain of method calls (it came from testing a wire protocol implementation - don't ask...), rather than just expecting &lt;a href="http://www.jmock.org/dynamock-comparison.html"&gt;all calls to come after a single call&lt;/a&gt;. In particular note the ordering of the &lt;code&gt;id()&lt;/code&gt; and &lt;code&gt;after()&lt;/code&gt; calls, once again IntelliJ saves the day.&lt;/p&gt;

&lt;pre&gt;
Mock mock = mock(RedstripeSocketTransport.class);
mock.expects(once()).method(METHOD_OPEN).id("CallOpen");
mock.expects(once()).method(METHOD_WRITE).with(eq(seededRequest))
    .after("CallOpen").will(returnValue("foo")).id("CallWrite");  
mock.expects(once()).method(METHOD_READ).after("CallWrite")
    .will(returnValue(seededResponse)).id("CallRead");
mock.expects(once()).method(METHOD_CLOSE).after("CallRead");
return (RedstripeSocketTransport) mock.proxy();
&lt;/pre&gt;

&lt;p&gt;Note that that &lt;code&gt;write()&lt;/code&gt; does not actually return a value in the production code, it's in the post to help me remember ;) Apologies to Andrew if he's posted this already, I thought he had, but google does not know about it...&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Vlad has made a good suggestion in the comments, that statements have the method name given to them as ID by default. I'd seen this as an error message but wasn't sure what it meant.&lt;/em&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12616776-113806591771969478?l=nosewheelie.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nosewheelie.blogspot.com/feeds/113806591771969478/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=12616776&amp;postID=113806591771969478' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/113806591771969478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/113806591771969478'/><link rel='alternate' type='text/html' href='http://nosewheelie.blogspot.com/2006/01/jmock-ordering.html' title='jMock ordering'/><author><name>Tom Adams</name><uri>http://www.blogger.com/profile/16126053163040522576</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01309662739466584417'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12616776.post-113798458526591161</id><published>2006-01-23T12:36:00.000+10:00</published><updated>2006-01-23T12:49:45.283+10:00</updated><title type='text'>Closures for Java</title><content type='html'>&lt;p&gt;Danny's been talking about &lt;a href="http://www.blog.dannynet.net/archives/39"&gt;Closures in Java&lt;/a&gt;. We did a &lt;a href="http://cvs.sourceforge.net/viewcvs.py/jrdf/jrdf/test/java/org/jrdf/util/test/AssertThrows.java?view=markup"&gt;similar thing&lt;/a&gt; in JRDF for testing.&lt;/p&gt;

&lt;pre&gt;
AssertThrows.assertThrows(RuntimeException.class, new AssertThrows.Block() {
    public void execute() throws Throwable {
      somethingThatIExpectWillThrowAnException();
    }
});
&lt;/pre&gt;

&lt;p&gt;All in all the syntax is ugly and nowhere near as neat as Ruby's, however such constructs can significantly cut back on duplication.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12616776-113798458526591161?l=nosewheelie.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nosewheelie.blogspot.com/feeds/113798458526591161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=12616776&amp;postID=113798458526591161' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/113798458526591161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/113798458526591161'/><link rel='alternate' type='text/html' href='http://nosewheelie.blogspot.com/2006/01/closures-for-java.html' title='Closures for Java'/><author><name>Tom Adams</name><uri>http://www.blogger.com/profile/16126053163040522576</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01309662739466584417'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12616776.post-113762450177713832</id><published>2006-01-19T08:44:00.000+10:00</published><updated>2006-01-19T08:48:21.800+10:00</updated><title type='text'>Up yours</title><content type='html'>&lt;p&gt;Now this is priceless: Mac OSX. &lt;a href="http://www.cashncarrion.co.uk/products/16103/685/"&gt; Mac OSX Up Yours T-Shirt&lt;/a&gt;. &lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.cashncarrion.co.uk/shopimages/products/normal/TechnoDepot_Mac_OSX_TShirt.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px;" src="http://www.cashncarrion.co.uk/shopimages/products/normal/TechnoDepot_Mac_OSX_TShirt.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12616776-113762450177713832?l=nosewheelie.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nosewheelie.blogspot.com/feeds/113762450177713832/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=12616776&amp;postID=113762450177713832' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/113762450177713832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/113762450177713832'/><link rel='alternate' type='text/html' href='http://nosewheelie.blogspot.com/2006/01/up-yours.html' title='Up yours'/><author><name>Tom Adams</name><uri>http://www.blogger.com/profile/16126053163040522576</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01309662739466584417'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12616776.post-113512562042113952</id><published>2005-12-21T09:49:00.000+10:00</published><updated>2005-12-21T10:40:20.463+10:00</updated><title type='text'>Exception messages</title><content type='html'>&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6952/1077/1600/tssexception.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/6952/1077/400/tssexception.jpg" border="0" alt="" /&gt;&lt;/a&gt; I've been spending a lot of time working on legacy code lately and apart from everything else, the thing that sticks out is good exception handling. Doing this has firmed my belief in handling exceptions as close to the source as possible (or alternatively where you have the most context) and wrapping them in RuntimeExceptions (or subclasses of). It also highlights the importance of placing decent messages into exceptions. The usual "Cannot do X" is next to useless. In our bookings engine you have all sorts of good context, booking numbers, flight details, site codes, etc. that allow you to track down problems in code that a stack trace doesn't always allow.&lt;/p&gt;

&lt;p&gt;What prompted this post was the above image from &lt;a href="http://www.theserverside.com/tss"&gt;TheServerSide.com&lt;/a&gt; with a wonderful message.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12616776-113512562042113952?l=nosewheelie.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nosewheelie.blogspot.com/feeds/113512562042113952/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=12616776&amp;postID=113512562042113952' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/113512562042113952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/113512562042113952'/><link rel='alternate' type='text/html' href='http://nosewheelie.blogspot.com/2005/12/exception-messages.html' title='Exception messages'/><author><name>Tom Adams</name><uri>http://www.blogger.com/profile/16126053163040522576</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01309662739466584417'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12616776.post-113461996512664305</id><published>2005-12-15T14:00:00.000+10:00</published><updated>2005-12-15T14:12:45.140+10:00</updated><title type='text'>Software Quality</title><content type='html'>&lt;p&gt;I've been meaning to write about the cost of writing software for a while (unfortunately it's sitting as a draft), but the recent &lt;a href="http://www.latimes.com/business/la-fi-nikkei14dec14,1,2885825.story?ctrack=1&amp;cset=true"&gt;Tokyo Stock Exchange&lt;/a&gt; fiasco highlights the true cost of not making the effort to write software correctly. When will people (i.e. the management with the money bags) learn that the cost of maintenance and also mistakes are orders of magnitude higher than the costs of doing it properly the first time (and doing it once). Creating quality software is not rocket science, there are &lt;a href="http://en.wikipedia.org/wiki/Agile_software_development"&gt;well known methods&lt;/a&gt; for doing this. What I find amazing is how many organisations baulk at paying slightly more initially, but will happily pay bucket loads down the track.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12616776-113461996512664305?l=nosewheelie.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nosewheelie.blogspot.com/feeds/113461996512664305/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=12616776&amp;postID=113461996512664305' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/113461996512664305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/113461996512664305'/><link rel='alternate' type='text/html' href='http://nosewheelie.blogspot.com/2005/12/software-quality.html' title='Software Quality'/><author><name>Tom Adams</name><uri>http://www.blogger.com/profile/16126053163040522576</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01309662739466584417'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12616776.post-113330869107106000</id><published>2005-11-30T08:30:00.000+10:00</published><updated>2005-11-30T11:47:14.320+10:00</updated><title type='text'>IntelliJ and Eclipse</title><content type='html'>&lt;p&gt;Well I thought I'd never stoop so low as to enter into this flame war on my blog, but &lt;a href="http://www.thekua.com/rant/?p=260"&gt;Patrick's&lt;/a&gt; Eclipse Live Templates post is worth keeping, so I may as well document my feelings also...&lt;/p&gt;

&lt;p&gt;As everyone knows, Eclipse is the best IDE out there, it's the only choice right? Very wrong. Sure, Eclipse has the market share, has more plugins, and widepsread industry support, but is it really a better IDE? My take on it is no. Yes I can use it, but it feels like the difference between riding a hardtail vs a dually. Sure they both get you from A to B, but one is much nicer to ride and doesn't hurt your ass as much. Another analogy I like to quote is that Eclipse feels like using Word, it tries hard, but in the end you end up fighting the editor just to get work done.&lt;/p&gt;

&lt;p&gt;I've been using Eclipse a lot lately (by a lot I mean a couple of days solid) as we're merging between branches and IntelliJ does not support this (as far as I can tell anyway). I've also had a lot of people ask me for my opinion on IntelliJ as we've got some spare licences floating around and most of the guys are using Eclipse.&lt;/p&gt;

&lt;p&gt;Eclipse does have some good things going for it.
&lt;ul&gt;
&lt;li&gt;Better CVS support. Eclipse seems to have re-thought the entire revision control experience, making it easy to work with. This does have it's downsides, like Eclipse only developers who don't understand CVS or Subversion fundamentals (and cannot operate outside of Eclipse) or with CVS gurus who cannot understand Eclipse's naming of operations and its workflow.&lt;/li&gt;
&lt;li&gt;Better use of screen real estate. The tree in the Package Explorer is a good example of this. Eclipse seems to use much less horizontal and vertical space in the tree view, allowing more classes to fit in a given screen size.&lt;/li&gt;
&lt;li&gt;Eclipse looks nicer (by default) to me, perhaps owing to its SWT heritage vs IntelliJ's Swing. Its window management is a bit more advanced also.&lt;/li&gt;
&lt;li&gt;Eclipse's debugger is apparently better, I say apparently as I haven't noticed it myself. It supports threaded apps in a more logical way, by sticking to a single thread and not jumping threads when breakpoints are hit in these threads.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So what are the bad things?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Eclipse requires you to save &lt;strong&gt;all the time&lt;/strong&gt;. This gets &lt;strong&gt;very annoying&lt;/strong&gt; when you're used to IntelliJ. Say for example you make a change to a test and you want to run it, why wouldn't I want to save the test file. This stuff should just happen without the need to prompt the user. File management should be taken care of. IntelliJ does a good job of this and allows it to be configurable (the save timing that is), to the point where you forget about it altogether. If you want an older version, it's in CVS (cause you're doing tight spinning when writing new code) or in the local history.&lt;/li&gt;
&lt;li&gt;When comparing files (select two projects, right click, Compare With -&gt; Each Other), copying all changes from one file to another (called "Copy All Non-Conflicting Changes From Right to Left"), Eclipse does not warn you that you need to save the file (I'd been using a different form of merging/diff - the Compare With -&gt; Another Branch or Version... - where this change is automatically saved). So I'd been happily chugging along all morning, when Eclipse crashed, losing a few hours of work. On the plus side, when you do hit save, it quickly shows you the "file has changed" symbols, saves the file, then removes them. Very helpful.&lt;/li&gt;
&lt;li&gt;Eclipse has serious usability issues in graphical diff (Java Source Compare) screen. 1) When merging differences, Eclipse continues to highlight changes, even though they've been applied. Whereas IntelliJ will remove the coloured background and border from changes that you've already applied. This provides an easy visual clue that you've complete a merge. Also, the little buttons for merging are too small, have icons that look the same (probably a result of them being too small, you can see the differences if you look closely) and are in the wrong position. IntelliJ gets this right, by placing the the icons (a cross for delete or directional arrow for merge) at the point of difference, allowing you to clearly see the affect clicking will have.&lt;/li&gt;
&lt;li&gt;Like Word, Eclipse wants to own your files and wants you to make all your changes through it (I assume so it can keep its caches up to date). So if I change a file on the file system (say to back out a change because Eclipse won't undo), Eclipse continuously reports that the file is out of sync with the filesystem. Why on earth it doesn't just sync it and be done with it is beyond me. Now I have to a) remember where I am in my merging, then b) get out of the view, c) re-sync the project and d) re-compare the projects and e) go back to where I was. Again, a little thing that really gets in the way of productivity.&lt;/li&gt;
&lt;li&gt;Eclipse's two ways of comparing do not give the same result. CVS differences (select a project, right click -&gt; Compare With -&gt; Another Branch or Version...) show less files than a straight file system difference (select two projects - representing different branches - right click, Compare With -&gt; Each Other).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By now I think everyone knows my view on the matter, but my short summary is that while Eclipse is fully featured, everything is done in such a half-arsed way that I really don't know how people can use it on a day-to-day basis. I think I'd prefer to go back to using a straight text editor than be forced to work around its inadequacies. And why is IntelliJ better? It just feels right. That's the best way I can put it. Like any tool it takes a while to get used to it, its keyboard shortcuts, etc., but once you learn these you'll never willingly go back. It seems to know what you want to do and will suggest things to improve the way you work all the time. Everyday I find a new thing to like about it. Its smarts are not the Word breed of smarts however. You always have control and it does not bend you into its way of working. It's a tool that works with you rather than against you.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12616776-113330869107106000?l=nosewheelie.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nosewheelie.blogspot.com/feeds/113330869107106000/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=12616776&amp;postID=113330869107106000' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/113330869107106000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12616776/posts/default/113330869107106000'/><link rel='alternate' type='text/html' href='http://nosewheelie.blogspot.com/2005/11/intellij-and-eclipse.html' title='IntelliJ and Eclipse'/><author><name>Tom Adams</name><uri>http://www.blogger.com/profile/16126053163040522576</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01309662739466584417'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry></feed>