<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-30748878</id><updated>2012-01-27T17:24:29.859+11:00</updated><category term='space'/><category term='shrines'/><category term='meme'/><category term='education'/><category term='animals'/><category term='malaysia'/><category term='castles'/><category term='babies'/><category term='accidents'/><category term='sydney'/><category term='phones'/><category term='photography'/><category term='jedi'/><category term='programming'/><category term='kualalumpur'/><category term='osaka'/><category term='cats'/><category term='mediacentre'/><category term='computers'/><category term='boats'/><category term='lightroom'/><category term='svnrevisionlabeller'/><category term='kyoto'/><category term='tokyo'/><category term='trains'/><category term='opensource'/><category term='nightlife'/><category term='holidays'/><category term='flickr'/><category term='mac'/><category term='cruisecontrol'/><category term='religion'/><category term='japan'/><category term='.net'/><category term='weird'/><category term='blogging'/><category term='dance'/><category term='work'/><category term='weddings'/><category term='cars'/><category term='canberra'/><category term='science'/><title type='text'>Add coffee, and shake well</title><subtitle type='html'>A mixture of posts on computers, photography, cats and holidays. In other words, all the things that interest me most.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>96</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-30748878.post-7753433542414165224</id><published>2012-01-27T17:24:00.001+11:00</published><updated>2012-01-27T17:24:29.867+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><title type='text'>A nice little trick with FluentAssertions</title><content type='html'>&lt;p&gt;I love using &lt;a href="http://fluentassertions.codeplex.com"&gt;FluentAssertions&lt;/a&gt; when writing tests for my code, it just makes the code so expressive in plain language. Recently I’ve been working on tests which involve the testing of lots of properties on a test result, and was looking for a way to remove a lot of the repetition involved.&lt;/p&gt;  &lt;p&gt;Usually when asserting the properties on a test result, you can do it in three different ways. If I have my test class defined as below:&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;[TestFixture]&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MyTestFixture&lt;/pre&gt;

  &lt;pre class="alt"&gt;{&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; MyClass _subject; &lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; MyOtherClass _result;&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    [SetUp]&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ExecuteTest() &lt;/pre&gt;

  &lt;pre class="alt"&gt;    { &lt;/pre&gt;

  &lt;pre&gt;        _subject = &lt;span class="kwrd"&gt;new&lt;/span&gt; MyClass(); &lt;/pre&gt;

  &lt;pre class="alt"&gt;        _subject.Initialise(&lt;span class="rem"&gt;/*.. Some parameters here ..*/&lt;/span&gt;); &lt;/pre&gt;

  &lt;pre&gt;        _result = _subject.SomeOperation();&lt;/pre&gt;

  &lt;pre class="alt"&gt;    }&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Then I can test the results as follows:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A. Assert all the properties in a test method&lt;/strong&gt;&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;    [Test]&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ThePropertiesAreSet()&lt;/pre&gt;

  &lt;pre class="alt"&gt;    {&lt;/pre&gt;

  &lt;pre&gt;        _result.First.Should().Be(&lt;span class="str"&gt;&amp;quot;Paula Bean&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;        _result.Second.Should().Be(&lt;span class="str"&gt;&amp;quot;Brillant!&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;This is probably the usual way people do this. However, if the first test fails, the second test will never run, and we'll never know if our test method set the second result correctly or not, so we are lacking information as to the overall state of the test. Secondly, as the number of properties to test increases, you end up with a lot of visual noise, although Intellisense will at least take some of the effort out of creating the noise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;B. Assert the properties in a test method per property&lt;/strong&gt;&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;    [Test]&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; TheFirstPropertyIsSet()&lt;/pre&gt;

  &lt;pre class="alt"&gt;    {&lt;/pre&gt;

  &lt;pre&gt;        _result.First.Should().Be(&lt;span class="str"&gt;&amp;quot;Paula Bean&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;    }&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    [Test]&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; TheSecondPropertyIsSet()&lt;/pre&gt;

  &lt;pre class="alt"&gt;    {&lt;/pre&gt;

  &lt;pre&gt;        _result.Second.Should().Be(&lt;span class="str"&gt;&amp;quot;Brillant!&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;With this approach, we now know if the setting of _result.Second was successful, even if _result.First failed. This extra information does come at the expense of more visual noise (the addition of another test method). Also, it allows you to really game the system if you get rewarded for the number of tests in your project :-)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C. Implement IEquatable&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As the number of properties on MyOtherClass go up, you'll find a lot of code appearing in the test method. You can remove this by implemeting IEquatable&amp;lt;MyOtherClass&amp;gt; on MyOtherClass:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MyOtherClass : IEquatable&amp;lt;MyOtherClass&amp;gt;&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; Equals(MyOtherClass other)&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.First == other.First &amp;amp;&amp;amp; &lt;span class="kwrd"&gt;this&lt;/span&gt;.Second == other.Second;&lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;(please note you should also really implement Object.Equals and Object.GetHashCode if you're going to use IEquatable, and for brevity, I've missed out a lot of the basic implementation of IEquatable&amp;lt;T&amp;gt;)&lt;/p&gt;

&lt;p&gt;The result of this is that our test method now becomes:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;    [Test]&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; TheFirstPropertyIsSet()&lt;/pre&gt;

  &lt;pre class="alt"&gt;    {&lt;/pre&gt;

  &lt;pre&gt;        MyOtherClass expected = &lt;span class="kwrd"&gt;new&lt;/span&gt; MyOtherClass { First = &lt;span class="str"&gt;&amp;quot;Paula Bean&amp;quot;&lt;/span&gt;, Second = &lt;span class="str"&gt;&amp;quot;Brillant!&amp;quot;&lt;/span&gt; };&lt;/pre&gt;

  &lt;pre class="alt"&gt;        _result.Should().Be(expected);&lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Much cleaner and very expressive, and you'll probably find your code benefits elsewhere from having implementations of IEquatable&amp;lt;T&amp;gt;; but you do have to write that implementation (and perhaps unit test it too!). Yet more code...&lt;/p&gt;

&lt;p&gt;This finally leads me to my point: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;D. Use anonymous classes and FluentAssertion's AllProperties&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;How's this for simplicity?&lt;/p&gt;

&lt;pre class="csharpcode"&gt;    [Test]
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; TheFirstPropertyIsSet()
    {
        _result.ShouldHave().AllProperties().EqualTo(&lt;span class="kwrd"&gt;new&lt;/span&gt; { First = &lt;span class="str"&gt;&amp;quot;Paula Bean&amp;quot;&lt;/span&gt;, Second = &lt;span class="str"&gt;&amp;quot;Brillant!&amp;quot;&lt;/span&gt; });
    }&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;ShouldHave().AllProperties() does all the hard work of checking the properties. You can also use SharedProperties() if you only need to test a subset of the properties, and add IncludeNestedObjects if you have a more complex object model.&lt;/p&gt;

&lt;p&gt;P.S. I love the story of &lt;a href="http://thedailywtf.com/Articles/The_Brillant_Paula_Bean.aspx"&gt;the Brillant Paula Bean&lt;/a&gt;. It confirms all your prejudices about contractors.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-7753433542414165224?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/7753433542414165224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=7753433542414165224' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/7753433542414165224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/7753433542414165224'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2012/01/nice-little-trick-with-fluentassertions.html' title='A nice little trick with FluentAssertions'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-2169386345322361936</id><published>2012-01-11T14:22:00.001+11:00</published><updated>2012-01-11T15:33:01.507+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photography'/><category scheme='http://www.blogger.com/atom/ns#' term='lightroom'/><title type='text'>Adobe Lightroom 4 Beta is out!</title><content type='html'>&lt;p&gt;&lt;a href="http://lh6.ggpht.com/-Sm3k4a-bAsM/Tw0Q0r9amMI/AAAAAAAAAaQ/_3rC5PmLrUQ/s1600-h/images%25255B6%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 10px 5px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top: 0px; border-right: 0px; padding-top: 0px" title="Adobe Lightroom 4" border="0" alt="Adobe Lightroom 4" align="left" src="http://lh4.ggpht.com/-jJ0jwkJQp0o/Tw0Q1sR4ZoI/AAAAAAAAAaY/0tUPLmqTvCU/images_thumb%25255B2%25255D.jpg?imgmax=800" width="122" height="122" /&gt;&lt;/a&gt;I’m &lt;a href="http://lightroomkillertips.com/2012/lightroom-4-beta-is-here/"&gt;looking forward to this&lt;/a&gt;. I’ve been a user of Lightroom since it first came out as version one, and it’s been indispensible for managing my growing photo collection (I passed the 10000 mark last year). &lt;/p&gt;  &lt;p&gt;I’m particularly excited by the long-awaited introduction of proper geocoding support. I bought a GPS logger a year or two ago, and use Dirk Stichling’s &lt;a href="http://itunes.apple.com/au/app/mytracks/id403100976?mt=12"&gt;My Tracks&lt;/a&gt; to add geotag my photos prior to importing them into Lightroom. When I export from Lightroom to iPhoto, the geotags are picked up and displayed nicely in the Places section of iPhoto (and on the iPhone and iPad). However, this only works when importing photos – existing photos cannot be geotagged. Jeffrey Friedl has written &lt;a href="http://regex.info/blog/lightroom-goodies/gps"&gt;a plugin for Lightroom&lt;/a&gt; that achieves this, after a fashion, but I prefer my metadata to reside within embedded metadata, rather than in shadow files which are then written on export; and although My Tracks is a good application, I would prefer to have fewer steps in the overall process.&lt;/p&gt;  &lt;p&gt;Of course, the ideal would be for Canon to release an accessory that geotags photos when they are taken, but for the moment, they seem to be preferring to take the third-party route.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-2169386345322361936?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/2169386345322361936/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=2169386345322361936' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/2169386345322361936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/2169386345322361936'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2012/01/adobe-lightroom-4-beta-is-out.html' title='Adobe Lightroom 4 Beta is out!'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-jJ0jwkJQp0o/Tw0Q1sR4ZoI/AAAAAAAAAaY/0tUPLmqTvCU/s72-c/images_thumb%25255B2%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-5784623300911638530</id><published>2012-01-06T11:33:00.003+11:00</published><updated>2012-01-17T13:25:47.582+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='work'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>New Year, New Resolutions</title><content type='html'>&lt;p&gt;&lt;span&gt;よいお年をお迎えください。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;In other words, happy new year! &lt;/p&gt;  &lt;p&gt;As far as making and keeping new resolutions go, I’d already failed miserably by January 2nd, probably setting a new low. The resolution was to take a photograph everyday and upload it to Flickr/Facebook, but that just didn’t happen. In fact, I haven’t picked up my camera for a week or two, and only used the camera in my phone to play around with &lt;a href="http://photosynth.net/"&gt;Photosynth&lt;/a&gt;, which looks completely out of place on an iPhone, having been built for a Windows-based phone with no effort made to translate the UI design, but nevertheless, works very well.&lt;/p&gt;  &lt;p&gt;However, the new year does afford me the chance to indulge in some spring cleaning, even if we are in the early throes of summer here in the Lucky Country. In particular, now that I am back at work, it means opening up the computer case, and having some fun with a rather large air compressor to remove all the dust that has accumulated since the PC was assembled. It also means that I can finally give it a good formatting and install everything afresh, something which every PC user should do at least annually.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-XCzowU2YjAM/TwZBSngcj3I/AAAAAAAAAaA/KP7lHPc-3S0/s1600-h/cleanallthethings-550x4122.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 10px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Clean ALL the things!" border="0" alt="Clean ALL the things!" align="left" src="http://lh6.ggpht.com/-S1LOJvFHZaI/TwZBThX97mI/AAAAAAAAAaI/bKMZ20Ya5vI/cleanallthethings-550x412_thumb.png?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt;This of course reminds me just how many applications I have downloaded and installed in the past year. Just installing Windows 7 with all the layers upon layers of patches takes about half a day, and our internet connection at work feels much slower than my home internet connection. &lt;/p&gt;  &lt;p&gt;To give you an idea of just how much stuff your typical Windows developer needs to make it through the day, here’s an approximate list. So far it’s taken me a whole day to download and install this lot, and I’m still finding those useful little apps that you forget aren’t included out-of-the-box.&lt;/p&gt;  &lt;h4&gt;System&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.7-zip.org/"&gt;7-Zip&lt;/a&gt; – beats WinZip for compression any day; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.dropbox.com/"&gt;DropBox&lt;/a&gt; – file synchronisation across almost any device; &lt;/li&gt;    &lt;li&gt;&lt;a href="https://www.google.com/chrome"&gt;Google Chrome&lt;/a&gt; – the choice of most developers; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.mozilla.org/en-US/firefox/new/"&gt;Mozilla Firefox&lt;/a&gt; – the chose of most other developers; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.skype.com/"&gt;Skype&lt;/a&gt; – for keeping in touch with our other offices around the world; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.slysoft.com/en/virtual-clonedrive.html"&gt;Virtual CloneDrive&lt;/a&gt; – for mounting all those application installation ISOs; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://explore.live.com/windows-live-essentials"&gt;Windows Live Essentials&lt;/a&gt; – Mail, Messenger, and of course, Writer (which no self-respecting blogger should be without – definitely one of the most useful products to come out of Redmond); &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Business Applications&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://office.microsoft.com/en-au/?CTT=97"&gt;Microsoft Office&lt;/a&gt; – of course; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://office.microsoft.com/en-au/visio/"&gt;Microsoft Visio&lt;/a&gt; – when a diagram is worth a thousand words; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.getpaint.net/"&gt;Paint.NET&lt;/a&gt; – this should be in the base Windows installation; &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Developer Tools&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.scootersoftware.com/"&gt;Beyond Compare&lt;/a&gt; – the best diff tool that I’ve tried (&lt;a href="http://winmerge.org/"&gt;WinMerge&lt;/a&gt; is free and also very good, but I just prefer BC); &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.cruisecontrolnet.org/projects/ccnet/wiki"&gt;CruiseControl.NET&lt;/a&gt; – nothing inspires confidence in your day’s work like a row of green lights confirming that it compiles, the tests ran successfully, and the installation package is ready to be shipped; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.fiddler2.com/fiddler2/"&gt;Fiddler&lt;/a&gt; – if you have to send data across the network, you need this tool; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://notepad-plus-plus.org/"&gt;Notepad++&lt;/a&gt; – syntax highlighting for almost every language out there, and tabbed windows too; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://smtp4dev.codeplex.com/"&gt;Smtp4Dev&lt;/a&gt; - for testing the sending of emails; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/b/sqlservercompact/archive/2011/01/12/microsoft-sql-server-compact-4-0-is-available-for-download.aspx"&gt;SQL Server Compact&lt;/a&gt; – for when the application you are developing will not need a full-blown database server; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/sqlserver/en/us/editions/express.aspx"&gt;SQL Server Express&lt;/a&gt; – for when application you are developing will need a full-blown database server;       &lt;ul&gt;&lt;!--EndFragment--&gt;&lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Subversion (&lt;a href="http://www.collab.net/downloads/subversion/"&gt;command-line&lt;/a&gt;, &lt;a href="http://tortoisesvn.tigris.org/"&gt;GUI&lt;/a&gt;, and &lt;a href="http://ankhsvn.open.collab.net/"&gt;IDE&lt;/a&gt; integration) – who wants to be a tightrope walker without a safety net? &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/visualstudio/"&gt;Visual Studio&lt;/a&gt; – where I spend 95% of my time:       &lt;ul&gt;       &lt;li&gt;&lt;a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=1491"&gt;ASP.NET MVC3&lt;/a&gt; - the way to go for building web apps;&lt;/li&gt;        &lt;li&gt;&lt;a href="http://visualstudiogallery.msdn.microsoft.com/7211bcac-091b-4a32-be2d-e797be0db210"&gt;CSS Intellisense Schema&lt;/a&gt; – syntax highlighting for and Intellisense for CSS3; &lt;/li&gt;        &lt;li&gt;&lt;a href="http://visualstudiogallery.msdn.microsoft.com/46a20578-f0d5-4b1e-b55d-f001a6345748"&gt;GhostDoc&lt;/a&gt; – generate XML comments for methods based on name and parameters; &lt;/li&gt;        &lt;li&gt;&lt;a href="http://visualstudiogallery.msdn.microsoft.com/27077b70-9dad-4c64-adcf-c7cf6bc9970c"&gt;NuGet&lt;/a&gt; – essential for adding third-party libraries; &lt;/li&gt;        &lt;li&gt;&lt;a href="http://visualstudiogallery.msdn.microsoft.com/d0d33361-18e2-46c0-8ff2-4adea1e34fef"&gt;Productivity Power Tools&lt;/a&gt; – the bits Microsoft forgot; &lt;/li&gt;        &lt;li&gt;&lt;a href="http://www.jetbrains.com/resharper/"&gt;Resharper&lt;/a&gt; – makes refactoring and code maintenance much more bearable; &lt;/li&gt;        &lt;li&gt;&lt;a href="http://visualstudiogallery.msdn.microsoft.com/0e313dfd-be80-4afb-b5e9-6e74d369f7a1"&gt;SQL Server Compact Toolbox&lt;/a&gt; – for working with SQL Server Compact; &lt;/li&gt;        &lt;li&gt;&lt;a href="http://stylecop.codeplex.com/"&gt;StyleCop&lt;/a&gt; – because well-presented code is much more readable and maintainable; &lt;/li&gt;        &lt;li&gt;&lt;a href="http://www.devexpress.com/"&gt;DevExpress&lt;/a&gt; – our main third-party toolset; &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/download/en/details.aspx?id=8279"&gt;Windows 7 SDK&lt;/a&gt; – essential developer tools;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.silverlight.net/"&gt;Silverlight&lt;/a&gt; – for rich web client development;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://silverlight.codeplex.com/"&gt;Silverlight Toolkit&lt;/a&gt; – the bits that Microsoft forgot in Silverlight&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=3062"&gt;Expression Blend SDK&lt;/a&gt; – another set of bits that Microsoft forgot in Silverlight&lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-5784623300911638530?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/5784623300911638530/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=5784623300911638530' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/5784623300911638530'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/5784623300911638530'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2012/01/new-year-new-resolutions.html' title='New Year, New Resolutions'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/-S1LOJvFHZaI/TwZBThX97mI/AAAAAAAAAaI/bKMZ20Ya5vI/s72-c/cleanallthethings-550x412_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-869159124421121688</id><published>2011-03-25T16:43:00.003+11:00</published><updated>2012-01-06T11:52:05.256+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='work'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>A craftsman knows his tools</title><content type='html'>&lt;p&gt;Those who have worked with me for any length of time will know that I’m always looking for ways to improve my ability as a programmer. It may be in researching the latest available tool libraries (my current new favourite is &lt;a href="http://storyq.codeplex.com/"&gt;StoryQ&lt;/a&gt;, which is great for developing &lt;a href="http://dannorth.net/introducing-bdd/"&gt;BDD-style tests&lt;/a&gt;, and &lt;a href="http://nsubstitute.github.com/"&gt;NSubstitute&lt;/a&gt;, which is as easy to use as &lt;a href="http://code.google.com/p/moq/"&gt;Moq&lt;/a&gt;, but without those annoying calls to &lt;code&gt;.Object&lt;/code&gt;), or how to write better, more reliable, build scripts. Either way, learning new skills and refining existing skills is an essential part of any craft (I’m deliberately steering clear of the ongoing &lt;a href="http://www.thoughtclusters.com/2009/07/the-problem-with-the-software-craftsmanship-concept/"&gt;“software development isn’t a craft”&lt;/a&gt;/&lt;a href="http://www.skorks.com/2009/07/in-defense-of-the-software-craftsmanship-concept/"&gt;“oh yes it is&lt;/a&gt;&lt;a href="http://www.skorks.com/2009/07/in-defense-of-the-software-craftsmanship-concept/"&gt;”&lt;/a&gt; argument – this still applies to trades and scientific disciplines).&lt;/p&gt;  &lt;p&gt;This week I have been focusing on knowing my tools, and being a developer who works with Microsoft technologies, those tools inevitably centre around &lt;a href="http://www.microsoft.com/visualstudio/en-us/"&gt;Visual Studio&lt;/a&gt;. One way to increase your productivity is to reduce the time you spend doing pointless activities, or rather, when faced with two ways of achieving something, to choose the quicker way. The most obvious form for a programmer is to learn to let go of the mouse; a little strange maybe, especially in an operating system that defines itself around the use of the mouse, but it really does act as a great big brake on your productivity. When I first started playing guitar, it would take me several seconds to visualise the necessary finger patterns in my head, and then position my fingers on the fret board. Now after much practising, I can see an F# minor chord written down and play it without having to even think about it.&lt;/p&gt;  &lt;p&gt;The first step was to &lt;a href="http://www.secretgeek.net/vs_toolbar_st.asp"&gt;get rid of all the toolbars and icons&lt;/a&gt;. If there are no icons on screen, there’s not much point using the mouse to click them! The commands are still all there, and they can be accessed via the menu bar if I get really stuck. As a bonus, suddenly I have much more viewable area to concentrate on what really matters – the code.&lt;/p&gt;  &lt;p&gt;So my first shortcut to learn was how to stop a debug session. I knew F5 to launch the debugger, but I always clicked on the Stop icon to stop it; well, it turns out that Shift-F5 was my new best friend. So far, so easy, and not too much time saved. &lt;/p&gt;&lt;p&gt;The next useful one was the Surround-with snippet; this is part of the excellent &lt;a href="http://www.jetbrains.com/resharper/"&gt;Resharper&lt;/a&gt; which really takes the heavy lifting out of Windows programming). I was working with code which was throwing exceptions, and there was no exception handler. Before, I would have used the mouse to click just above the offending line of code, then typed in the standard try/catch blocks, then selected the offending line of code and cut’n’paste it into the try {} block, then clicked into the catch {} and add the exception handling. That’s a lot of pointless mouse and keyboard work. Now, using the keyboard, I would select the line of text (Shift-End to select to the end of the line), then Ctrl-K,S to bring up the Surround-with snippets, then type try and press Enter to surround my code with a try/catch block and automatically position the cursor in the catch {} block ready to select my exception type. Intellisense camel-case matching helped, so I only had to type in CE to match the ConstraintException I was trying to catch, hit Enter, and job done.&lt;/p&gt;&lt;p&gt;There are only so many hours in the day - reclaim yours by learning how to use the tools you have to get more done in less time.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-869159124421121688?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/869159124421121688/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=869159124421121688' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/869159124421121688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/869159124421121688'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2011/03/craftsman-knows-his-tools.html' title='A craftsman knows his tools'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-1183842711870849305</id><published>2011-03-24T08:39:00.001+11:00</published><updated>2011-03-24T08:39:59.510+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='weird'/><title type='text'>Synchronicity Part 2</title><content type='html'>&lt;p&gt;Last year, it was &lt;a href="http://davidkeaveny.blogspot.com/2010/05/synchronicity.html"&gt;Flash crashing Safari&lt;/a&gt; while I was trying to read an article about the problems with Flash. This time, it’s &lt;a href="http://www.google.com/chrome"&gt;Google Chrome&lt;/a&gt; crashing while I’m trying to read about why the &lt;a href="http://blog.mozilla.com/blog/2011/03/22/mozilla-launches-firefox-4-and-delivers-a-fast-sleek-and-customizable-browsing-experience-to-more-than-400-million-users-worldwide-2/"&gt;newly-released Firefox 4&lt;/a&gt; is the new hotness.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_lMyetu2DK1E/TYpoq_1dwqI/AAAAAAAAAZ4/bkp5FednOOE/s1600-h/image%5B3%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_lMyetu2DK1E/TYporqXNZJI/AAAAAAAAAZ8/UOpCmAyQZGY/image_thumb%5B1%5D.png?imgmax=800" width="414" height="209" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Coincidence or conspiracy?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-1183842711870849305?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/1183842711870849305/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=1183842711870849305' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/1183842711870849305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/1183842711870849305'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2011/03/synchronicity-part-2.html' title='Synchronicity Part 2'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_lMyetu2DK1E/TYporqXNZJI/AAAAAAAAAZ8/UOpCmAyQZGY/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-7679009978624018816</id><published>2011-03-22T13:51:00.001+11:00</published><updated>2011-03-22T13:51:45.045+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><title type='text'>Unity and log4net</title><content type='html'>&lt;p&gt;In my current project at &lt;a href="http://www.touchstar.com.au"&gt;TouchStar&lt;/a&gt;, I’ve had the opportunity to play with &lt;a href="http://unity.codeplex.com/"&gt;Unity&lt;/a&gt;, Microsoft’s Inversion-of-Control container. Previously I’ve used &lt;a href="http://structuremap.net/structuremap/"&gt;StructureMap&lt;/a&gt;, which is very popular, but I wanted to broaden my experience of different containers, and given that my project involved a WPF client, Unity seemed to be a good choice.&lt;/p&gt;  &lt;p&gt;One of the first problems was how to configure &lt;a href="http://logging.apache.org/log4net/"&gt;log4net&lt;/a&gt; using Unity. Usually, log4net is called from within a class thusly:&lt;/p&gt;  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; MyClassWithLogger()&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;     private &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; readonly ILog Logger = LogManager.GetLogger(typeof(this));&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; void DoAction()&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;     {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;         Logger.Debug(&amp;quot;Hello world&amp;quot;);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;         DoSomeOtherAction();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;     private void DoSomeOtherAction()&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;     {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;         Logger.Debug(&amp;quot;Still here&amp;quot;);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Which, depending on how you’ve configured your appenders, would produce an output something like this:&lt;/p&gt;

&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; MyClassWithLogger [DEBUG] - Hello world&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; MyClassWithLogger [DEBUG] - Still here&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;So far, so vanilla, and the sort of code that anyone whose used log4net will have written thousands of times; but what happens if we want to apply good &lt;a href="http://www.lostechies.com/blogs/chad_myers/archive/2008/03/07/pablo-s-topic-of-the-month-march-solid-principles.aspx"&gt;SOLID design principles&lt;/a&gt; and inject the log4net dependency into the class, rather than have the class create the instance itself. I prefer constructor injection for this, as it makes it very explicit what the dependencies are, and you can’t accidentally forget to set one without getting a compile-time error. The class would then become:&lt;/p&gt;

&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; MyClassWithLoggerDependency()&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;readonly&lt;/span&gt; ILog Logger;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; MyClassWithLoggerDependency(ILog logger)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;     {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;         Logger = logger;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; DoAction()&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;     {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;         Logger.Debug(&lt;span style="color: #006080"&gt;&amp;quot;Hello world&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;         DoSomeOtherAction();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; DoSomeOtherAction()&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt;     {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt;         Logger.Debug(&lt;span style="color: #006080"&gt;&amp;quot;Still here&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum19"&gt;  19:&lt;/span&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum20"&gt;  20:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;We’re now ready to apply some IoC magic with Unity to create the instance of ILog that our class will use. Since log4net uses its own factory class to instantiate itself, we have to jump through a hoop or two to get Unity to set things up properly:&lt;/p&gt;

&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Program&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Main(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;     {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;         var container = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; UnityContainer()&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;             .Register&amp;lt;ILog&amp;gt;(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; InjectionFactory(x =&amp;gt; LogManager.GetLogger(&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;))));&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;             .Register&amp;lt;MyClassWithLoggerDependency&amp;gt;()&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;         var myClass = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; container.Resolve&amp;lt;MyClassWithLoggerDependency&amp;gt;();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;         myClass.DoStuff();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Which produces an output like this:&lt;/p&gt;

&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; Program [DEBUG] - Hello world&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; Program [DEBUG] - Still here&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;See the problem? Now the logger is using the context of the code where Unity was configured to log from, rather than the context that the logger is being called from. I’ve seen plenty of questions asked about this, but it was only today that I stumbled upon &lt;a href="http://unity.codeplex.com/discussions/203744"&gt;the answer to this problem&lt;/a&gt;, hidden in a discussion on the Unity forums. A developer named &lt;a href="http://www.codeplex.com/site/users/view/marcoerni"&gt;Marco&lt;/a&gt; posted his solution, which was to create two extensions – the first being a BuildTracking extension, and the second being a LogCreation extension. The build tracking extension keeps tabs on what types are being built up, and then calls out to the log creation extension to create the logger component in the context of the class which is asking for it. Another developer, &lt;a href="http://www.codeplex.com/site/users/view/ThunderEagle"&gt;Scott&lt;/a&gt;, then posted his amendments that took care of some breaking API changes from the earlier version of Unity that Marco was using, together with an enhancement to improve detection of the calling class name when log4net is not being used with dependency injection.&lt;/p&gt;

&lt;p&gt;My small contribution to the discussion was to provide the actual implementation code, which is as follows:&lt;/p&gt;

&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Program&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Main(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;     {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;         var container = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; UnityContainer()&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;             .AddNewExtension&amp;lt;BuildTracking&amp;gt;()&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;             .AddNewExtension&amp;lt;LogCreation&amp;gt;()&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;             .Register&amp;lt;MyClassWithLoggerDependency&amp;gt;()&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;         var myClass = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; container.Resolve&amp;lt;MyClassWithLoggerDependency&amp;gt;();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;         myClass.DoStuff();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
Now that in my eyes is a much tidier piece of code. Gone is the explicit registration of the ILog type with its rather ungainly use of the InjectionFactory to create the appropriate implementation, and instead we have the two new extensions registered.

&lt;p&gt;This is a great little bit of code, and big thanks go to Marco and Scott for sharing their contributions with us. I’m sure that many other developers will find this useful.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-7679009978624018816?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/7679009978624018816/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=7679009978624018816' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/7679009978624018816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/7679009978624018816'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2011/03/unity-and-log4net.html' title='Unity and log4net'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-6195954757880851292</id><published>2011-03-21T13:17:00.002+11:00</published><updated>2011-03-21T13:34:34.737+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='cruisecontrol'/><category scheme='http://www.blogger.com/atom/ns#' term='work'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><title type='text'>Watching Ideas Take Flight</title><content type='html'>&lt;p&gt;In my last entry, I mentioned &lt;a href="http://davidkeaveny.blogspot.com/2011/03/publishing-net-applications.html"&gt;an idea I’d had before&lt;/a&gt; on how to make it easier to package .NET applications when run as part of an automated build. It solved a problem for me, and I thought it worth sharing, firstly as an &lt;em&gt;aide mémoire&lt;/em&gt; for myself, and secondly because it seems the sort of thing that other people would find useful.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://ferventcoder.com/"&gt;Rob Reynolds&lt;/a&gt; came across my post, and he obviously found it useful. In fact, he liked it so much that he has put together a &lt;a href="http://www.nuget.org/List/Packages/PublishedApplications"&gt;NuGet package&lt;/a&gt; to make the set-up of _PublishedApplications even easier, together with a demo of how easy it is to use.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:22542ece-6bdb-4347-9c9b-ed5b9451b16f" class="wlWriterEditableSmartContent"&gt;&lt;div id="41f61892-757c-4cb3-82a9-5498f59e6f60" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;object width="448" height="252"&gt;&lt;param name="movie" value="http://www.youtube.com/v/-oPtsb11vBU?hl=en&amp;amp;hd=1"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/-oPtsb11vBU?hl=en&amp;amp;hd=1" type="application/x-shockwave-flash" width="448" height="252"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="width:448px;clear:both;font-size:.8em"&gt;Demo of _PublishedApplications at work&lt;/div&gt;&lt;/div&gt;    &lt;p&gt;I’m thrilled to see this getting out there – a big thanks to Rob for really getting this off the ground, as well as giving it more exposure.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-6195954757880851292?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/6195954757880851292/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=6195954757880851292' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/6195954757880851292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/6195954757880851292'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2011/03/watching-ideas-take-flight.html' title='Watching Ideas Take Flight'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-2831465047814261909</id><published>2011-03-10T11:22:00.001+11:00</published><updated>2011-03-10T11:22:27.028+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='cruisecontrol'/><category scheme='http://www.blogger.com/atom/ns#' term='work'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Publishing .NET Applications</title><content type='html'>&lt;p&gt;This is a problem I came across in my previous job at &lt;a href="www.fairfaxdigital.com.au"&gt;Fairfax Digital&lt;/a&gt;, when setting up automated builds; now that I am working at &lt;a href="www.touchstar.com.au"&gt;TouchStar&lt;/a&gt;, I’m facing the same problem, but couldn’t remember what I did the first time round.&lt;/p&gt;  &lt;p&gt;The problem is this: when building ASP.NET web applications using TFS or some other continuous integration solution (I’m using &lt;a href="http://code.google.com/p/uppercut/"&gt;UppercuT&lt;/a&gt; at TouchStar), the &lt;a href="http://msdn.microsoft.com/en-us/library/wea2sca5(v=vs.90).aspx"&gt;MSBuild&lt;/a&gt; engine very conveniently creates a _PublishedWebsites folder in your output folder, and then creates a subfolder in that folder for each website that you are creating. So far, so good. However, when building executable applications, such as console apps, WPF applications or Windows services (and I’m building all three at TouchStar) then it just throws everything into one directory, and leaves it to you to pick out the bits you need. “If only you could export your build results to a _PublishedApplications folder!”, I hear you cry.&lt;/p&gt;  &lt;p&gt;Well, that’s essentially my solution. I took a copy of the &lt;code&gt;Microsoft.WebApplication.targets&lt;/code&gt; file that is referenced in the ASP.NET project file, renamed it to &lt;code&gt;Microsoft.Application.targets&lt;/code&gt; and saved it to &lt;code&gt;C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Applications&lt;/code&gt;. I then tweaked it, renaming variables and such to match the type of content, and removing any references to /bin folders. I then reference the new file in the Visual Studio project file by adding the following line:&lt;/p&gt;  &lt;pre&gt;&amp;#160; &amp;lt;Import Project=&amp;quot;$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\Applications\Microsoft.Application.targets&amp;quot; /&amp;gt;&lt;/pre&gt;

&lt;p&gt;And voila! I now have one folder per application in the _PublishedApplications folder when run as part of an automated build. If I build from within Visual Studio, outputs are still sent to their usual location (e.g. &lt;code&gt;/bin/Debug/&lt;/code&gt;). I’ve included a link to the file below.&lt;/p&gt;

&lt;p&gt;[&lt;a href="https://docs.google.com/leaf?id=0BzmthFqo65VlMmZkNWNlNDYtM2RhMi00MjdhLTk1ZTYtMmFkODQ1ZGJlNzAx&amp;amp;hl=en"&gt;Download Microsoft.Application.targets&lt;/a&gt;]&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-2831465047814261909?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/2831465047814261909/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=2831465047814261909' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/2831465047814261909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/2831465047814261909'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2011/03/publishing-net-applications.html' title='Publishing .NET Applications'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-8885452143484632355</id><published>2010-08-12T09:06:00.001+10:00</published><updated>2010-08-12T09:06:41.339+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='cruisecontrol'/><category scheme='http://www.blogger.com/atom/ns#' term='work'/><title type='text'>Mixing TFS 2008 and VS 2010</title><content type='html'>&lt;p&gt;At work, we’re in the early phases of migrating our TFS 2008 setup to TFS 2010. However, since some teams have already started work on the new hotness that is VS 2010 and .NET 4, there was a need for us to get their automated builds up and running immediately. We “requisitioned” a desktop that was already running builds for another semi-defunct project using CruiseControl.NET, and installed Team Build on it.&lt;/p&gt;  &lt;p&gt;It took a few tweaks to get the code compiling, but something was wrong with the testing phase – the tests would run, but the test runner would then report a failure, resulting in a yellow warning lights rather than nice green success lights. The error message was:&lt;/p&gt;  &lt;pre&gt;&lt;p&gt;MSBUILD : warning MSB6003: The specified task executable &amp;quot;MSTest.exe&amp;quot; could not be run. The system cannot find the file specified [D:\Source\CommonPlatform\Common Platform Development CI Build\BuildType\TFSBuild.proj]&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;So the tests all passed, but then Team Build couldn’t find the testrunner that it had just used! We tracked down another user with the same complaint on &lt;a href="http://stackoverflow.com/questions/3353414/build-vs2010-solution-on-team-build-2008-mstest-failed-to-run/" target="_blank"&gt;StackOverflow&lt;/a&gt;, but they were shouting in the dark, with no response to their question. &lt;/p&gt;

&lt;p&gt;After much head-scratching alternated with banging our heads against the wall and wondering why Microsoft products are sometimes to great and sometimes so plain awful (often in the space of just five minutes), we eventually found the solution to our problem tucked away &lt;a href="http://social.msdn.microsoft.com/forums/en-US/tfsbuild/thread/950929ca-7996-4a13-a1ab-76a72cc4bf1f" target="_blank"&gt;in forum on MSDN&lt;/a&gt;. The TeamBuild targets file which imports the TestToolsTask has an invalid path reference:&lt;/p&gt;

&lt;pre&gt;&amp;lt;UsingTask TaskName=&amp;quot;TestToolsTask&amp;quot; AssemblyFile=&amp;quot;$(MSTestRefPath)\Microsoft.VisualStudio.QualityTools.MSBuildTasks.dll&amp;quot; 
Condition=&amp;quot;'$(ProjectFileVersion)' == '2'&amp;quot; /&amp;gt;&lt;/pre&gt;

&lt;p&gt;since &lt;code&gt;MSTestRefPath&lt;/code&gt; doesn’t appear to be defined in VS 2010. By changing it to the correct path, the test runner can be found again, and the error disappeared.&lt;/p&gt;

&lt;p&gt;Quite why Microsoft implemented it so that the tests would run but then fail afterwards I don’t know, but at least our builds are all happy, and the developers are happy. Hopefully we can now get back to migrating TFS 2008 to 2010, and we can see the back of this problem.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-8885452143484632355?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/8885452143484632355/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=8885452143484632355' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/8885452143484632355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/8885452143484632355'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2010/08/mixing-tfs-2008-and-vs-2010.html' title='Mixing TFS 2008 and VS 2010'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-3828012623028756645</id><published>2010-05-12T14:51:00.001+10:00</published><updated>2010-05-12T14:51:10.058+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><title type='text'>Synchronicity</title><content type='html'>&lt;p&gt;Apple and Adobe seem to be having a bit of a dummy spit over Flash at the moment, which is polarising the developer community. Well, I opened up Google Reader to read Richard Banks’s &lt;a href="http://richardsbraindump.blogspot.com/2010/05/life-without-flash-acrobat-air-and.html" target="_blank"&gt;latest thoughts on the subject&lt;/a&gt;, and as I do that, bam! Safari crashes with a Flash error.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_lMyetu2DK1E/S-ozudptu5I/AAAAAAAAAYg/E5fxxLfsd6Q/s1600-h/Flash%20Irony%5B5%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Flash Irony" border="0" alt="Flash Irony" src="http://lh3.ggpht.com/_lMyetu2DK1E/S-ozvPGMo7I/AAAAAAAAAYk/aNYsR94sX7E/Flash%20Irony_thumb%5B6%5D.png?imgmax=800" width="433" height="296" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;(the Flash app was running in a different tab, not as part of Google Reader).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-3828012623028756645?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/3828012623028756645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=3828012623028756645' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/3828012623028756645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/3828012623028756645'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2010/05/synchronicity.html' title='Synchronicity'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_lMyetu2DK1E/S-ozvPGMo7I/AAAAAAAAAYk/aNYsR94sX7E/s72-c/Flash%20Irony_thumb%5B6%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-613568459188425449</id><published>2010-05-05T09:37:00.001+10:00</published><updated>2010-05-05T09:37:24.823+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Baseless suggestion</title><content type='html'>&lt;p&gt;I’ve been spending the past few days cleaning up a messy situation at work, where one of our source control branches in TFS 2008 has not been properly merged back into trunk for several months. In trying to tidy things up, I kept getting the following error:&lt;/p&gt;  &lt;p&gt;&lt;font size="1" face="Courier New"&gt;TF14087: Cannot undelete '$/MyCareer/Trunk/build/NightlyBuild/TFSBuild.rsp' because not all of the deletion is being undeleted.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;The problem was that the folder NightlyBuild had been renamed in both the source and destination branch, but there was still a reference to it in this old changeset. Using &lt;em&gt;tf merge /discard&lt;/em&gt; reported that there were no changes to make, which left me stuck for a bit, until one quick application of &lt;a href="http://www.urbandictionary.com/define.php?term=google-fu" target="_blank"&gt;Google-fu&lt;/a&gt;, and I found &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/tfsversioncontrol/thread/2f6faa6d-1c2b-408f-8ff4-6d5183b7409b" target="_blank"&gt;the solution to my problem&lt;/a&gt;. By performing a baseless merge, the offending file is accepted:&lt;/p&gt;  &lt;p&gt;&lt;font size="1" face="Courier New"&gt;tf merge /discard /baseless /version:C13494~C13494 $/MyCareer/Branches/Maintenance $/MyCareer      &lt;br /&gt;/Trunk /recursive       &lt;br /&gt;Resolved D:\Source\MyCareer\Trunk\build\DailyBuild\TFSBuild.rsp as AcceptYours&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Hope that helps!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-613568459188425449?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/613568459188425449/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=613568459188425449' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/613568459188425449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/613568459188425449'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2010/05/baseless-suggestion.html' title='Baseless suggestion'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-357103660687561515</id><published>2010-02-25T12:24:00.001+11:00</published><updated>2010-02-25T12:24:22.189+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photography'/><category scheme='http://www.blogger.com/atom/ns#' term='lightroom'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Lightroom and CS3</title><content type='html'>&lt;p&gt;I recently upgraded my camera from an ageing &lt;a href="http://www.usa.canon.com/consumer/controller?act=ModelInfoAct&amp;amp;fcategoryid=139&amp;amp;modelid=12929" target="_blank"&gt;Canon EOS 30D&lt;/a&gt; to the newly-released &lt;a href="http://www.canon.com.au/en-AU/For-You/Digital-Cameras/EOS-Digital-SLR-Cameras/7D" target="_blank"&gt;EOS 7D&lt;/a&gt;. Jumping from 8 megapixels to 18, and adding HD video recording, as well as niceties such as Auto ISO, are real plusses for me.&lt;/p&gt;  &lt;p&gt;However, I soon found an annoying problem: I use Adobe Lightroom 2 to manage my rapidly-growing photo collection (just a handful shy of 10000 now) and Adobe Photoshop CS3 to do clever stuff like panorama stitching. However, CS3 doesn’t recognise the RAW format that Canon uses in the 7D, although Lightroom 2 does, so I can’t load photos taken with the 7D in Photoshop. Bummer.&lt;/p&gt;  &lt;p&gt;Adobe’s ideal solution is that I upgrade to Photoshop CS4, which will be several hundred dollars. However, the solution I came across was to use Adobe’s own tools to work around the limitation. Lightroom can convert RAW images to its preferred DNG format, and that format &lt;strong&gt;can&lt;/strong&gt; be opened in CS3. Usually I convert my RAW images to DNG as the last step in my development process, but this is a neat little workaround, saving me a big chunk of cash at the same time.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-357103660687561515?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/357103660687561515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=357103660687561515' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/357103660687561515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/357103660687561515'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2010/02/lightroom-and-cs3.html' title='Lightroom and CS3'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-3004968566206981503</id><published>2009-11-05T11:44:00.001+11:00</published><updated>2009-11-05T11:44:26.001+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='work'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Working with bugs</title><content type='html'>&lt;p&gt;&lt;a title="A Swallow Bug" href="http://www.ext.colostate.edu/PUBS/INSECT/insimg/Swallow%20Bug.%20%20Photograph%20courtesy%20Ken%20Gray%20Collection.jpg" target="_blank"&gt;&lt;img style="margin: 0px 10px 0px 0px; display: inline" align="left" src="http://www.ext.colostate.edu/PUBS/INSECT/insimg/Swallow Bug.  Photograph courtesy Ken Gray Collection.jpg" width="240" height="169" /&gt;&lt;/a&gt; No, this is not a post on &lt;a href="http://en.wikipedia.org/wiki/Entomology"&gt;entymology&lt;/a&gt;; rather, it’s a bit of a lament on the lost art of filing bug reports. Though they may bestride the programming world like a colossus, even the best programmers will eventually leave bugs in their code. Sooner or later, some poor user will fall foul of it.&lt;/p&gt;  &lt;p&gt;You then have a number of solutions, depending on where the product came from. For a commercial product, you can:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;ignore it and hope it goes away; &lt;/li&gt;    &lt;li&gt;file a bug report, and hope that the provider will fix it; &lt;/li&gt;    &lt;li&gt;find some sort of workaround, or just learn to live with it; &lt;/li&gt;    &lt;li&gt;vote with your wallet, and switch to a competitor’s product &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;For an open-source product,, you have an extra option:&lt;/p&gt;  &lt;ol start="start"&gt;   &lt;li&gt;download the source code, and fix it yourself, and preferably submitting your fix back to the community. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;In my case, it was a bug in a Microsoft development tool, the succinctly named &lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=bb3ad767-5f69-4db9-b1c9-8f55759846ed"&gt;Microsoft Visual Studio Team System 2008 Database Edition GDR R2&lt;/a&gt;. As an aside, let me say that I’ve been using it for all of 2 days, and I absolutely love its functionality. It finally makes versioning and deploying databases a delight rather than a painful chore. There is now no excuse for organisations not to have their databases under version control, or for having painful manual deployment processes.&lt;/p&gt;  &lt;p&gt;Anyway, it has a bug in it which is holding up a particular project at work. I searched for a solution, and found someone who had reported &lt;a href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=449762"&gt;the same issue&lt;/a&gt; some 9 months ago. Unfortunately the bug report that they filed was so lacking of information that Microsoft promptly closed the bug as Not Reproducible. In fact, it’s not 100% certain that the bug relates to my issue because it is so light on details – it just reports the same error message.&lt;/p&gt;  &lt;p&gt;As it happens, the steps required to reproduce the bug were incredibly trivial, so I &lt;a href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=508336#details"&gt;opened a new bug&lt;/a&gt;, and gave the sort of details that a developer trying to fix a bug needs to see – in other words, I described what I was doing, what I expected to see happening, and what actually was happening. More to the point, I list the steps that the developer should take to make the same thing happen for them.&lt;/p&gt;  &lt;p&gt;The first step to being able to resolve a bug is to be able to reproduce it. If you can’t reproduce it, how can you work out what is going wrong, and how can you prove that you’ve fixed the bug? And if the bug reporter doesn’t tell you how to reproduce the bug, what chance do you have of being able to fix it?&lt;/p&gt;  &lt;p&gt;So please – if you want your bug to be fixed, consider the poor developer who has to fix it, and tell them what they need to know to get the job done. Anything less, and you’ll have a 9 month wait before someone else with the same problem files the same issue again.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-3004968566206981503?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/3004968566206981503/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=3004968566206981503' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/3004968566206981503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/3004968566206981503'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2009/11/working-with-bugs.html' title='Working with bugs'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-1337544007629053541</id><published>2009-09-23T06:39:00.003+10:00</published><updated>2009-11-04T01:05:10.766+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sydney'/><category scheme='http://www.blogger.com/atom/ns#' term='weird'/><title type='text'>Weird Sydney morning weather</title><content type='html'>The joys of parenthood include many early mornings. This is what awaited me this morning when Samuel woke us up. Most freaky!

&lt;a href="http://www.flickr.com/photos/davidkeaveny/3944995523/" title="photo sharing"&gt;&lt;img src="http://farm3.static.flickr.com/2535/3944995523_cccb2bd988_m.jpg" alt="" style="border: 2px solid rgb(0, 0, 0); width: 401px; height: 271px;" /&gt;&lt;/a&gt;

Any ideas what's causing this?&lt;div&gt;
&lt;/div&gt;&lt;div&gt;&lt;b&gt;Update&lt;/b&gt; : apparently it's a dust storm. Western Australia is missing several hundred tonnes of dust and topsoil.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-1337544007629053541?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/1337544007629053541/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=1337544007629053541' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/1337544007629053541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/1337544007629053541'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2009/09/weird-sydney-morning-weather.html' title='Weird Sydney morning weather'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2535/3944995523_cccb2bd988_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-546843413962060030</id><published>2009-06-29T23:38:00.003+10:00</published><updated>2009-06-29T23:43:48.368+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='phones'/><title type='text'>iPhone on 3</title><content type='html'>When the iPhone 3G was originally released in Australia, I and many others complained that 3, who provide some of the best 3G data plans in the country, did not sell it. There were &lt;a href="http://davidkeaveny.blogspot.com/2008/08/getting-iphone-in-australia-with-3.html"&gt;ways around it&lt;/a&gt;,which kind of suggest that it was a problem at Apple's end rather than 3's, but it seems that with the release of the updated iPhone 3GS, users of the 3 network are finally &lt;a href="http://store.three.com.au/Apple-iPhone-3G-Coming-Soon"&gt;getting some Apple love&lt;/a&gt;.

And of course, it's at this point that I notice that my elderly Nokia N95 8Gb is finally fully supported by OS X, including syncing from iTunes and iPhoto. Now where was that a year ago when I really needed it?

Never mind; just as soon as I can sell a kidney on Ebay, I'll have his'n'hers iPhone 3GS's, and the Nokia can go in the phone recycling bin.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-546843413962060030?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/546843413962060030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=546843413962060030' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/546843413962060030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/546843413962060030'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2009/06/iphone-on-3.html' title='iPhone on 3'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-8118515689465585599</id><published>2009-05-20T10:44:00.002+10:00</published><updated>2009-05-21T08:01:35.123+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='cruisecontrol'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='svnrevisionlabeller'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><title type='text'>SvnRevisionLabeller makes its v2 release</title><content type='html'>&lt;p&gt;Recently Thoughtworks started to make available &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/2009/05/10/CruiseControl.NET+1.4.4+RC2+Released" target="_blank"&gt;release candidates for version 1.4.4&lt;/a&gt; of CruiseControl.NET. Tucked away inside there though are some changes to some of the core components, that break compatibility with &lt;a href="http://code.google.com/p/svnrevisionlabeller/" target="_blank"&gt;SvnRevisionLabeller&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;This gave me the proper motivation to find some time to finish off the packaging of a fairly major change to the way the labeller constructs build labels. The &lt;a href="http://code.google.com/p/svnrevisionlabeller/issues/detail?id=3&amp;amp;can=1" target="_blank"&gt;real work&lt;/a&gt; was actually done by another developer, &lt;a href="http://code.google.com/u/fezguy/" target="_blank"&gt;fezguy&lt;/a&gt; - I just had to integrate his patch, tweak it to the way I like things (hey, it is my project after all!), and finally start work on some automated tests. I like automated tests. &lt;/p&gt; &lt;p&gt;Since the two changes combined do break backwards compatibility, it's good to take a step back and see where we are now.&lt;/p&gt; &lt;p&gt;Before, SvnRevisionLabeller was quite opinionated about how it thought build labels should be structured. With version 1.1, it was &lt;em&gt;{major}.{minor}.{svnRevision}.{build}&lt;/em&gt; - &lt;em&gt;{build}&lt;/em&gt; would start at 0, then if you forced another build without another commit having taken place, it would be incremented by one. A commit would then reset &lt;em&gt;{build}&lt;/em&gt; back to 0, so you had a good idea how often the build was being forced. I later added the ability to specify prefix and suffix text for the label.&lt;/p&gt; &lt;p&gt;Version 1.3 saw me rethink things a bit, with the label now defaulting to &lt;em&gt;{major}.{minor}.{build}.{svnRevision}&lt;/em&gt;; now, successive forced builds made no difference to the label. What it did give me was that when I deployed a hotfix to production (usually designated by the incremented &lt;em&gt;{build}&lt;/em&gt; number), I could tell immediately which Subversion revision it was built with.&lt;/p&gt; &lt;p&gt;So it obviously works the way I wanted it to - but what about other people? Version 2.0 makes the label scheme very flexible - some tokens are defined, and you just position the tokens wherever you want them in a string pattern. So for instance, if I set my configuration thusly:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;labeller type=&amp;quot;svnRevisionLabeller&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;major&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;1&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;major&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;minor&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;4&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;minor&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;build&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;2&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;build&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;pattern&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Release v{major}.{minor}.{build} from {revision}&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;pattern&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;labeller&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt; font-size: small;&lt;br /&gt; color: black;&lt;br /&gt; font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt; background-color: #ffffff;&lt;br /&gt; /*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt; background-color: #f4f4f4;&lt;br /&gt; width: 100%;&lt;br /&gt; margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;p&gt;then when revision 42 is committed, the build label will become &lt;em&gt;Release v1.4.2 from 42&lt;/em&gt;. At work, I use the &lt;em&gt;{build}&lt;/em&gt; number to represent the sprint number since we began working on the &lt;em&gt;{minor}&lt;/em&gt; release.&lt;/p&gt;&lt;p&gt;Finally, I noticed that my project was not the only one to be caught out by CC.NET's upgrade - Codeplex's &lt;a href="http://ccnetplugins.codeplex.com/" target="_blank"&gt;CC.NET Community Plugins&lt;/a&gt; are also broken by the change; unfortunately, they have a little more work to do, as it's not just a question of updating their external libraries and recompiling. I'm rather underwhelmed by the amount of activity on the site: I &lt;a href="http://ccnetplugins.codeplex.com/WorkItem/View.aspx?WorkItemId=4324" target="_blank"&gt;raised an issue&lt;/a&gt; earlier this month, and then submitted a patch to fix the issue, and it still hasn't been acknowledged yet, let alone added to the repository. For the time being, I won't be upgrading to v1.4.4 at work, since we need that library for our deployments.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-8118515689465585599?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/8118515689465585599/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=8118515689465585599' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/8118515689465585599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/8118515689465585599'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2009/05/svnrevisionlabeller-makes-its-v2.html' title='SvnRevisionLabeller makes its v2 release'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-1085101440393820907</id><published>2009-04-14T07:41:00.001+10:00</published><updated>2009-04-14T07:41:47.432+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sydney'/><category scheme='http://www.blogger.com/atom/ns#' term='photography'/><title type='text'>An afternoon at Lake Parramatta</title><content type='html'>&lt;p&gt;The Easter weekend was a good opportunity to get out of the house for a while and enjoy some of what Sydney has to offer. Several friends have recommended Lake Parramatta, a small dam and reservoir less than 10 minutes from our house, but we've never been there before. It was built in the late 19th century to provide drinking water for Parramatta, but these days it's a recreation area. It's sometimes swimmable, I think they're still working on the general cleanliness of the water (lots of stormwater drains etc empty into the catchment area).&lt;/p&gt; &lt;p&gt;&lt;a title="The reservoir of Lake Parramatta" href="http://www.flickr.com/photos/84306903@N00/3437386819/"&gt;&lt;img height="267" alt="The reservoir of Lake Parramatta" src="http://static.flickr.com/3540/3437386819_672ee877c8.jpg" width="400" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;There's plenty of parking etc at the entrance, barbecue areas, covered seating, even a playground for the little 'uns. It was quite busy considering sunset was less than an hour away, lots of families having picnics and so on.&lt;/p&gt; &lt;p&gt;&lt;a title="The dam wall of Lake Parramatta" href="http://www.flickr.com/photos/84306903@N00/3438196724/"&gt;&lt;img height="242" alt="The dam wall of Lake Parramatta" src="http://static.flickr.com/3336/3438196724_d9870ee23b.jpg" width="400" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;We took a brief walk round the easy part of the reservoir, down to the dam wall itself. There's a small creek at the base of the dam, with some pretty lush vegetation from the water that trickles down from the dam (although the picture above doesn't explicitly show it, the wall is constantly damp, as the water finds its way through and down).&lt;/p&gt; &lt;p&gt;&lt;a title="Stepping stones" href="http://www.flickr.com/photos/84306903@N00/3438197046/"&gt;&lt;img alt="Stepping stones" src="http://static.flickr.com/3629/3438197046_9efb9220a9.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;The creek at the bottom is crossed with a line of stepping stones. There's a lot of brown algae in the water, so it doesn't look very pleasant, but I think I got enough of an angle above so that it doesn't show. The full circuit around the reservoir is about 4.2km (I did say it was a little reservoir!), and although some of it is paved and flat, some of it requires a bit of a scramble. We'll have to save that for another time, because we got there not long before sunshot, and also because Emily is a bit too pregnant to be climbing anything at the moment.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-1085101440393820907?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/1085101440393820907/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=1085101440393820907' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/1085101440393820907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/1085101440393820907'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2009/04/afternoon-at-lake-parramatta.html' title='An afternoon at Lake Parramatta'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-8247997679839870519</id><published>2009-03-31T18:04:00.001+11:00</published><updated>2009-03-31T18:04:53.258+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><title type='text'>MassTransit</title><content type='html'>&lt;p&gt;Earlier this month, &lt;a href="http://davidkeaveny.blogspot.com/2009/03/topshelf.html" target="_blank"&gt;I mentioned the MassTransit project&lt;/a&gt;, an open-source .NET Enterprise Service Bus implementation, a topic sure to break the ice at a many a party.&lt;/p&gt; &lt;p&gt;We've been getting stuck into MassTransit at work for a major project, and had all sorts of problems along the way, mainly due to the youth of the project and the general lack of documentation. Where there were code samples, sometimes the code just plain didn't work.&lt;/p&gt; &lt;p&gt;&lt;a title="Restaurant tram" href="http://www.flickr.com/photos/84306903@N00/3176042157/"&gt;&lt;img style="margin: 0px 10px 0px 0px" height="138" alt="Blog postings need images, apparently; so here's one that's distantly related to the topic under discussion - it's a restaurant tram in Melbourne" src="http://static.flickr.com/3125/3176042157_955a94bc69.jpg" width="240" align="left" border="0"&gt;&lt;/a&gt;The two main developers, Dru and Chris, have been a fountain of knowledge and general helpfulness, responding quickly to my sometimes continuous barrage of questions, not helped of course by our being on opposite sides of the planet. I've been able to chip in with the occasional patch, nothing to fancy at this stage, but at least enough for me to feel like it's not a completely one-way street.&lt;/p&gt; &lt;p&gt;Anyway, congratulations to MassTransit for &lt;a href="http://blog.phatboyg.com/2009/03/30/masstransit-06-release-candidate/" target="_blank"&gt;shipping their v0.6 release candidate&lt;/a&gt;. I've been running it for a few days now, although without using some of the cooler pieces of new technology, such as the saga state machines. Hopefully with their help, I'll be able to get our project back on track and heading in the right direction.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-8247997679839870519?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/8247997679839870519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=8247997679839870519' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/8247997679839870519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/8247997679839870519'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2009/03/masstransit.html' title='MassTransit'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-7188442540535786624</id><published>2009-03-19T15:46:00.001+11:00</published><updated>2009-03-19T15:46:12.404+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><title type='text'>Topshelf</title><content type='html'>&lt;p&gt;At work, I'm currently working on a project which requires the integration of several different systems, some of them hosted on the internet, and some on different sides of the corporate firewalls. This means that we can expect to lose connections between systems, which naturally pointed us in the direction of message queues, which are designed for such scenarios. A chat with a former colleague pointed me in the direction of enterprise service buses as the core technology to take care of all the plumbing; and after comparing feature sets with our requirements, I downloaded &lt;a href="http://code.google.com/p/masstransit/" target="_blank"&gt;MassTransit&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;What interested me was a spin-off from the MassTransit project, called &lt;a href="http://code.google.com/p/topshelf/" target="_blank"&gt;Topshelf&lt;/a&gt;, which has a single and simple aim - to get rid of all the cruft associated with actually launching .NET programs, especially all the boilerplate code you have to come up with to run services.&lt;/p&gt; &lt;p&gt;I ran into a few issues though: the first was that before, I had been using the &lt;a href="http://wix.sourceforge.net/" target="_blank"&gt;WiX&lt;/a&gt;'s &lt;a href="http://wix.sourceforge.net/manual-wix3/wix_xsd_serviceinstall.htm" target="_blank"&gt;ServiceInstall&lt;/a&gt; code to handle all the service registration, such as setting the service name, description and credentials. However, Topshelf provides its own code to do that, and the two aren't compatible. In the end, the solution I came up with was to remove the WiX code and use Topshelf's, which would be invoked by a custom action in the WiX script:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&amp;lt;CustomAction Id=&lt;span class="str"&gt;"InstallService"&lt;/span&gt; FileKey=&lt;span class="str"&gt;"ServiceExe"&lt;/span&gt; ExeCommand=&lt;span class="str"&gt;"/install"&lt;/span&gt; /&amp;gt;
&amp;lt;InstallExecuteSequence&amp;gt;
    &amp;lt;Custom Action=&lt;span class="str"&gt;"InstallService"&lt;/span&gt; After=&lt;span class="str"&gt;"InstallFinalize"&lt;/span&gt; /&amp;gt;
&amp;lt;/InstallExecuteSequence&amp;gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;FileKey is just a reference to the Id of the executable for the service, and ExeCommand contains the parameter(s) to pass to it.&lt;/p&gt;
&lt;p&gt;All well and good, but unfortunately, Topshelf's implementation currently launches the same dialog box that installutil does, and if you're trying to produce an unattended install file, a dialog box is the last thing you want. I've had a little play around with the source code and came up with something which would technically work, but was nowhere near as elegant as the rest of the code, so I'm not planning on submitting it.&lt;/p&gt;
&lt;p&gt;I did add a few refactorings and documentation into the codebase, nothing clever or anything; I then submitted the changes as a patch to Dru, and within the hour, they had been committed to trunk. This really reminds me why I love open-source programming so much - if the application doesn't do quite what you want it to do, you can download the source code and modify it, and if it works well, you can contribute that change back to the community. Talk about a win-win situation. Non-open source companies have to think about every way that people will use their software, and then program all that functionality in, thus proving the 80-20 rule - 80% of your users are only using 20% of your application's functionality. Did you know that Microsoft Word has a Japanese Greeting dialog box, which allows you to select a greeting specific to the month of the year?! I wonder even how many Japanese people know it exists?&lt;/p&gt;
&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_lMyetu2DK1E/ScHODj8UdYI/AAAAAAAAAUo/J1-eFIMhJ_c/s1600-h/JapaneseGreetings%5B9%5D.gif"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="333" alt="Japanese Greeting dialog box from Microsoft Word 2003" src="http://lh6.ggpht.com/_lMyetu2DK1E/ScHOElNqb_I/AAAAAAAAAUs/6ShX8UEkxTM/JapaneseGreetings_thumb%5B7%5D.gif?imgmax=800" width="424" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Speaking of contributing to open source, I've accepted a couple of patches to my &lt;a href="http://code.google.com/p/svnrevisionlabeller/" target="_blank"&gt;SvnRevisionLabeller&lt;/a&gt; project, and should be releasing a new build soon, once I've figured how to get some good tests in there. You are testing your software, right?!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-7188442540535786624?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/7188442540535786624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=7188442540535786624' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/7188442540535786624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/7188442540535786624'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2009/03/topshelf.html' title='Topshelf'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_lMyetu2DK1E/ScHOElNqb_I/AAAAAAAAAUs/6ShX8UEkxTM/s72-c/JapaneseGreetings_thumb%5B7%5D.gif?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-7949112491723682608</id><published>2009-03-12T11:36:00.001+11:00</published><updated>2009-03-12T11:36:40.758+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='work'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>This stuff is supposed to be fun</title><content type='html'>&lt;p&gt;&lt;a href="http://www.codinghorror.com/blog/archives/000979.html" target="_blank"&gt;So blogged Jeff Attwood&lt;/a&gt; some 18 months ago, and as far as my own experience goes, he is absolutely right. When I went to university, it was to study Electronics and Communications Engineering, but by mid-way through the second year, I really wanted to on Computer Science, but really it was just too late to be changing courses, so I stuck it out to the end. To show willing, I applied to some of the major electronics companies like Philips and Marconi, but nothing came of that, so I managed to convert my summer job at the Foreign &amp;amp; Commonwealth Office into a more permanent job, doing typical admin stuff in the library. A healthy dose of luck and good timing saw me slide into an IT helpdesk/sysadmin role, and from there, I never looked back.&lt;/p&gt; &lt;p&gt;I was then able to leverage (how I hate that word) my IT skills to get into development, and there I knew that I had found my real métier. Like no doubt thousands of my technical colleagues, I have found the perfect union between my favourite pastime and my job. My wife still marvels that I spend eight or more hours a day at the office working with computers, and then when I come home, I'm happy to spend the rest of the evening, or most of the weekend, doing exactly the same thing (and not getting paid for it!).&lt;/p&gt; &lt;p&gt;In fact, I enjoy being a developer so much that I will do everything in my power to avoid promotion to a position where I can't sit down and write code every day. For some, it may be just a step on the ladder to management, and that's OK; but for me, the day I stop coding and using computers is the day they prise the keyboard &lt;a href="http://en.wikipedia.org/wiki/From_my_cold,_dead_hands" target="_blank"&gt;from my cold, dead hands&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;In short, I know &lt;a href="http://www.amazon.com/exec/obidos/ASIN/1580087272/codinghorror-20" target="_blank"&gt;what colour my parachute is&lt;/a&gt;; and being a self-professed geek, it's black.&lt;/p&gt; &lt;p&gt;So are there any other categories of people out there whose private life seems to be just an extension of their working life? Or perhaps even better, they see it as the other way round, where they're getting paid to do something they could spend every day doing? Musicians? Sportsmen? Accountants, anyone?!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-7949112491723682608?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/7949112491723682608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=7949112491723682608' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/7949112491723682608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/7949112491723682608'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2009/03/this-stuff-is-supposed-to-be-fun.html' title='This stuff is supposed to be fun'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-3585656675535611232</id><published>2009-02-27T07:37:00.001+11:00</published><updated>2009-02-27T07:37:12.783+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='osaka'/><category scheme='http://www.blogger.com/atom/ns#' term='blogging'/><category scheme='http://www.blogger.com/atom/ns#' term='japan'/><category scheme='http://www.blogger.com/atom/ns#' term='animals'/><title type='text'>One hour of heavy petting</title><content type='html'>&lt;p&gt;I wonder if there's any chance of &lt;a href="http://sarahmarchildon.blogspot.com/2009/02/one-hour-of-heavy-petting.html" target="_blank"&gt;something like this&lt;/a&gt; taking off in Sydney. Maybe there's just something so incredibly Japanese about it that it wouldn't work, but I just love the idea.&lt;/p&gt; &lt;p&gt;Either way, it seems Sarah Marchildon has &lt;a href="http://sarahmarchildon.blogspot.com/2009/02/heavy-petting-on-cbc.html" target="_blank"&gt;struck a bit of a chord&lt;/a&gt; with her blog posting, generating all sorts of interest.&lt;/p&gt; &lt;p&gt;Perhaps I should buy a fancy espresso machine and add a dozen cats to the household, and set myself up as the Sydney branch of 猫の時間 (Neko no Jikan, or "Cat Time").&lt;/p&gt; &lt;p&gt;&lt;a title="All in a day's work" href="http://www.flickr.com/photos/84306903@N00/476514083/"&gt;&lt;img height="287" alt="It's a hard life being a cat. All that sleeping..." src="http://static.flickr.com/226/476514083_d0cf740294.jpg" width="425" border="0"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-3585656675535611232?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/3585656675535611232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=3585656675535611232' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/3585656675535611232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/3585656675535611232'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2009/02/one-hour-of-heavy-petting.html' title='One hour of heavy petting'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-2321372219867581430</id><published>2009-02-18T13:08:00.001+11:00</published><updated>2009-02-18T13:08:41.598+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Cuuuurses!</title><content type='html'>&lt;p&gt;Oh well, so much for my &lt;a href="http://davidkeaveny.blogspot.com/2009/02/using-sandcastle-with-cruisecontrolnet.html" target="_blank"&gt;earlier optimism&lt;/a&gt; - it turns out, that for the time being at least, Sandcastle can't easily be used on a build server. &lt;/p&gt; &lt;p&gt;The problem is the Help 2.0 Compiler, which in a previous life as the Help 1.x Compiler, was shipped as a standalone product. However, Microsoft, in its infinite wisdom, decided to bundle the 2.0 version into the Visual Studio SDK; and of course, to install the Visual Studio SDK, you need to first have an installation of Visual Studio, which rather defies the point of a build server. Especially for small operations on a budget, having to acquire an extra VS license just to automate the creation of documentation is more than a pain in the neck, it's downright unsociable.&lt;/p&gt; &lt;p&gt;There are some guides on working round this, but they only cover up to VS2005 and its SDK, whereas we're using VS2008 SP1.&lt;/p&gt; &lt;p&gt;I'm going to have a play around with exporting chunks of my registry which has references to the 2.0 compiler, in the hope that that fixes things. I don't hold out much hope.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-2321372219867581430?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/2321372219867581430/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=2321372219867581430' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/2321372219867581430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/2321372219867581430'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2009/02/cuuuurses.html' title='Cuuuurses!'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-6287089380712476899</id><published>2009-02-13T16:51:00.001+11:00</published><updated>2009-02-13T16:51:34.110+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='cruisecontrol'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='svnrevisionlabeller'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><title type='text'>Catching Up</title><content type='html'>&lt;p&gt;It's been a while since my last release of &lt;a href="http://code.google.com/p/svnrevisionlabeller/" target="_blank"&gt;SvnRevisionLabeller&lt;/a&gt;, and I've not paid the project pages too much attention, seeing as everything was very quiet. Unfortunately, I hadn't set up the project to notify me whenever issues were raised, so I'd missed the raising of several bug or change requests.&lt;/p&gt; &lt;p&gt;Well, after stumbling upon one such change request during an unrelated Google session, I thought I'd better catch up on my project maintenance; it doesn't look very professional when your projects have bug reports unloved, unacknowledged, and unresolved.&lt;/p&gt; &lt;p&gt;The biggest change is that build number will be configurable; it was one of the &lt;a href="http://code.google.com/p/svnrevisionlabeller/issues/detail?id=3" target="_blank"&gt;first feature requests&lt;/a&gt;, and for a current project at work, it's something I wanted to do anyway.&lt;/p&gt; &lt;p&gt;BTW if you have downloaded and installed the plugin, I'd be &lt;a href="http://code.google.com/p/svnrevisionlabeller/issues/detail?id=6" target="_blank"&gt;interested to know&lt;/a&gt;. Google reports 822 downloads; the person who filed that request has linked to their site, so that's one, and of course I use it at Fairfax Digital, so that's two. Anyone care to offer up any of the other 820 downloads?!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-6287089380712476899?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/6287089380712476899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=6287089380712476899' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/6287089380712476899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/6287089380712476899'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2009/02/catching-up.html' title='Catching Up'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-4921042982463712765</id><published>2009-02-11T13:11:00.003+11:00</published><updated>2009-02-11T13:14:42.195+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='cruisecontrol'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><title type='text'>Using Sandcastle with CruiseControl.NET</title><content type='html'>&lt;p&gt;For a new project at work, I'm adding automatically-generated API documentation as part of my nightly build. Back in the days of .NET 1.1, we had the &lt;a href="http://ndoc.sourceforge.net/" target="_blank"&gt;NDoc&lt;/a&gt; project, and explicit support for it in &lt;a href="http://nant.sourceforge.net/release/latest/help/tasks/ndoc.html" target="_blank"&gt;NAnt&lt;/a&gt;. Unfortunately, the project never made the transition to .NET 2.0, instead coming to a &lt;a href="http://weblogs.asp.net/bhouse/archive/2006/07/26/NDoc-2.0-_2D00_-R.I.P.aspx" target="_blank"&gt;rather bitter and public end&lt;/a&gt; due to predominantly a lack of community support (despite the large numbers of downloads). I guess it's one the main failing of open-source projects - many are happy to take, but not so happy to give (whether money or time/effort).&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.codeplex.com/Sandcastle/" target="_blank"&gt;Sandcastle&lt;/a&gt; is Microsoft's official documentation generator, but even three years on, it lacks some of the user-friendliness that any NDoc user had come to expect. The &lt;a href="http://www.codeplex.com/SHFB/" target="_blank"&gt;Sandcastle Help File Builder&lt;/a&gt; tool goes a long way to rectifying this, but most of the focus is on the GUI tool. Until the current v1.8 release, command line builds were taken care of by the &lt;font face="Courier New" color="#800000"&gt;SandcastleBuilderConsole.exe&lt;/font&gt; tool; however, the latest release drops this, and instead uses MSBuild, which ships with the .NET Framework. This is a rather nice touch, in my opinion - a clever use of existing tooling, rather than writing another new tool.&lt;/p&gt; &lt;p&gt;However, the documentation about using it in a continuous integration environment is still a little lacking, so I'm documenting here the problems I came up against.&lt;/p&gt; &lt;h4&gt;Installation&lt;/h4&gt; &lt;p&gt;So far, it seems like neither Sandcastle nor SHFB have been designed with easy deployment in mind. I like to include my build tools within my source repository; this saves a &lt;em&gt;lot&lt;/em&gt; of tedious installation and configuration whenever setting up a new developer PC. Both tools come as MSI packages, with Sandcastle deploying as a 220Mb install, so maybe that one you can do without in your repository! SHFB on the other hand is relatively lightweight, at around 3Mb for the files required by the build tasks. You will need to set an environment variable for it to run properly, though:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;setenv&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="SHFBROOT"&lt;/span&gt; 
   &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="${Sandcastle.dir}"&lt;/span&gt; 
   &lt;span class="attr"&gt;unless&lt;/span&gt;&lt;span class="kwrd"&gt;="${environment::variable-exists('SHFBROOT')}"&lt;/span&gt; 
   &lt;span class="attr"&gt;verbose&lt;/span&gt;&lt;span class="kwrd"&gt;="true"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
 font-size: small;
 color: black;
 font-family: consolas, "Courier New", courier, monospace;
 background-color: #ffffff;
 /*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
 background-color: #f4f4f4;
 width: 100%;
 margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;p&gt;The SHFB files that you seem to require are:&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;font face="Courier New" color="#804040"&gt;ColorizerLibrary.dll&lt;/font&gt;;&lt;/li&gt;
&lt;li&gt;&lt;font face="Courier New" color="#804040"&gt;ICSharpCode.TextEditor.dll&lt;/font&gt;;&lt;/li&gt;
&lt;li&gt;&lt;font face="Courier New" color="#804040"&gt;SandcastleBuilder.Components.Config&lt;/font&gt;;&lt;/li&gt;
&lt;li&gt;&lt;font face="Courier New" color="#804040"&gt;SandcastleBuilder.*.dll&lt;/font&gt;;&lt;/li&gt;
&lt;li&gt;&lt;font face="Courier New" color="#804040"&gt;SandcastleHelpFileBuilder.targets&lt;/font&gt;;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;You'll also need the Help 2.0 Compiler tool &lt;font face="Courier New" color="#804040"&gt;hxcomp.exe&lt;/font&gt;, which ships as part of Visual Studio 2008 SDK; and of course, the SDK requires that Visual Studio 2008 is installed before it itself will install. Fortunately, you can pull out the contents of &lt;font face="Courier New" color="#804040"&gt;C:\Program Files\Common Files\Microsoft Shared\Help 2.0 Compiler\&lt;/font&gt; and add that to your repository as well, bypassing that little pain-in-the-neck.&lt;/p&gt;&lt;h4&gt;Configuration&lt;/h4&gt;&lt;p&gt;To use SHFB within CC.NET with NAnt, you'll need the &lt;font face="Courier New" color="#800000"&gt;&amp;lt;msbuild&amp;gt;&lt;/font&gt; task that comes with &lt;a href="http://nantcontrib.sourceforge.net/release/latest/help/tasks/msbuild.html" target="_blank"&gt;NAntContrib&lt;/a&gt;. The syntax is as follows:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;msbuild&lt;/span&gt; &lt;span class="attr"&gt;project&lt;/span&gt;&lt;span class="kwrd"&gt;="${source.basedir}\Documentation.shfbproj"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;arg&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="/property:${HxComp.dir}"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;arg&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="/property:SandcastlePath=C:\Program%20Files\Sandcastle\"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;msbuild&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
 font-size: small;
 color: black;
 font-family: consolas, "Courier New", courier, monospace;
 background-color: #ffffff;
 /*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
 background-color: #f4f4f4;
 width: 100%;
 margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;p&gt;All the properties listed in the SHFB GUI tool can be set as above - just watch out for the need to escape spaces when hard-coding paths, which had me stumbled for an hour or two, until I found a post &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/msbuild/thread/cf5cf81d-d613-458e-bb48-4a92ca68edc1/" target="_blank"&gt;asking the same question&lt;/a&gt;. &lt;/p&gt;&lt;h4&gt;Still To-Do&lt;/h4&gt;&lt;p&gt;The one thing I really want to get done is programatically set the assemblies which will be documented; at the moment, you either use the GUI tool and relative paths, or edit the SHFB project file by hand. You could probably also use NAnt's &lt;font face="Courier New" color="#804040"&gt;&amp;lt;xmlpoke /&amp;gt;&lt;/font&gt; task to edit it, but I would prefer to be able to set it via parameters to the &lt;font face="Courier New" color="#804040"&gt;&amp;lt;msbuild /&amp;gt;&lt;/font&gt; task, so watch this space while I work it out.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-4921042982463712765?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/4921042982463712765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=4921042982463712765' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/4921042982463712765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/4921042982463712765'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2009/02/using-sandcastle-with-cruisecontrolnet.html' title='Using Sandcastle with CruiseControl.NET'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-4103045744852969310</id><published>2009-01-08T00:05:00.001+11:00</published><updated>2009-01-08T00:05:14.676+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='holidays'/><title type='text'>On holiday in Victoria</title><content type='html'>&lt;a href="http://www.flickr.com/photos/84306903@N00/3176941708" title="View 'Crossing the Yarra' on Flickr.com"&gt;&lt;img src="http://farm4.static.flickr.com/3322/3176941708_aa38f057b4_m.jpg" alt="Crossing the Yarra" border="0" width="160" height="240" align="right" style="margin-left:1em;margin-bottom=0.5em" /&gt;&lt;/a&gt;Seeing as work was enticing us to be away from the office in January with free days-in-lieu, I thought I'd take the family away from the madness of Sydney in the summer (seriously, 38C the other day, and it was already hot and sticky by 9am), and head for the cooler climes of Victoria.

We've only visited Melbourne the once, back in 2000 on our first trip to Australia, which after three years of living here, is bordering on the criminal. So here we are in Melbourne, meeting up with my dad and stepmother, who are on the return leg of their round-Australia-by-caravan trip, for a spot of Chinese dinner and a walk along the riverbank.

Tomorrow we head inland for the goldfields. So far, the furthest inland that we've been is Canberra, so we're going to try and get away from the coastal metropolises (metropoli?), and take in some of those big wide vistas that Australia is supposed to be famous for.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-4103045744852969310?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/4103045744852969310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=4103045744852969310' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/4103045744852969310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/4103045744852969310'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2009/01/on-holiday-in-victoria.html' title='On holiday in Victoria'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3322/3176941708_aa38f057b4_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-1068906451410861630</id><published>2009-01-07T09:58:00.005+11:00</published><updated>2009-01-07T10:05:03.557+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='blogging'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Blogging on OS X</title><content type='html'>&lt;a href="http://www.flickr.com/photos/84306903@N00/3173066775" title="View 'Jasmine' on Flickr.com"&gt;&lt;img src="http://farm4.static.flickr.com/3075/3173066775_aec6027ceb_m.jpg" alt="Jasmine" align="left" border="0" height="160" width="240" style="margin-right:1em;margin-bottom:0.25em" /&gt;&lt;/a&gt;Some time back, &lt;a href="http://davidkeaveny.blogspot.com/2008/06/microsoft-beats-apple.html"&gt;I blogged about my dismay&lt;/a&gt; at finding no equivalent to Windows Live Writer for OS X. Well, since then I've been mainly using Blogger's web client to do my blogging, but the lack of a decent offline client has been a bit of a pain. For some reason, having to run Windows Live Writer from within a VMWare session, just grates a bit too much. So I thought I'd try out some of the Mac equivalents.

OS X lacks a clear equivalent to WLW, which is as close to a perfect product as Microsoft is ever likely to release (not inspiring for a platform some 20 years old), and free as well. From what I garnered from the web, the best commercial products for OS X are ecto and MarsEdit. I downloaded both clients this evening, and ran through the setup routines. Ecto was a bit less friendly than MarsEdit, so I'm going to give MarsEdit a go first. This post is being written with MarsEdit, if you couldn't guess.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-1068906451410861630?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/1068906451410861630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=1068906451410861630' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/1068906451410861630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/1068906451410861630'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2009/01/blogging-on-os-x.html' title='Blogging on OS X'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3075/3173066775_aec6027ceb_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-3155755825704741955</id><published>2008-11-20T12:16:00.001+11:00</published><updated>2008-11-20T12:16:07.122+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>T-SQL Mandelbrot</title><content type='html'>&lt;p&gt;From &lt;a href="http://thedailywtf.com/" target="_blank"&gt;The Daily WTF&lt;/a&gt; comes one of the most &lt;a href="http://thedailywtf.com/Articles/Stupid-Coding-Tricks-The-TSQL-Madlebrot.aspx" target="_blank"&gt;awesome and geeky things I've seen in a long time&lt;/a&gt; - the classic &lt;a href="http://en.wikipedia.org/wiki/Mandelbrot_set" target="_blank"&gt;Mandelbrot set&lt;/a&gt;, generated in good ol' ASCII text using a single T-SQL select statement. Since it uses Common Table Expressions and the PIVOT command, it'll be for SQL Server 2005 and 2008 only.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_lMyetu2DK1E/SSS6UhtJRaI/AAAAAAAAARw/HaBrxNnywu4/s1600-h/image%5B4%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="246" alt="The Mandelbrot set (not as ASCII art, though)" src="http://lh6.ggpht.com/_lMyetu2DK1E/SSS6VYVIsxI/AAAAAAAAAR0/MrvL_U8LU7U/image_thumb%5B2%5D.png?imgmax=800" width="326" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;It's reassuring to know that somewhere out there are still some very interesting people with a lot of free time on their hands...&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-3155755825704741955?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/3155755825704741955/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=3155755825704741955' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/3155755825704741955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/3155755825704741955'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2008/11/t-sql-mandelbrot.html' title='T-SQL Mandelbrot'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_lMyetu2DK1E/SSS6VYVIsxI/AAAAAAAAAR0/MrvL_U8LU7U/s72-c/image_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-3069477305072900896</id><published>2008-11-17T16:57:00.002+11:00</published><updated>2009-01-08T00:07:13.530+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='phones'/><title type='text'>iSilo on the iPhone</title><content type='html'>&lt;p&gt;One of the main reasons that I haven't bought an iPhone, apart from &lt;a href="http://davidkeaveny.blogspot.com/2008/08/getting-iphone-in-australia-with-3.html" target="_blank"&gt;the hoops that you have to jump through&lt;/a&gt; to get it on the 3 network, is that it didn't support the &lt;a href="http://www.isilo.com/" target="_blank"&gt;iSilo document reader&lt;/a&gt;. Since iSilo is one of the main document formats for mobile devices (since the days of the Palm Pilot Professional - remember that?!), that would be a bit of a major pain, especially as most of the documents I read are in that format.&lt;/p&gt; &lt;p&gt;Fortunately after a lot of noise has been kicked up on the iSilo forums by iPhone/iPod Touch lovers, this application is &lt;a href="http://www.isilo.com/iPhone/iSilo/" target="_blank"&gt;now available&lt;/a&gt; from Apple's App Store.&lt;/p&gt; &lt;p&gt;One less reason now for me to get an iPhone!&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;UPDATE&lt;/span&gt;: oops, that last line should read, "One less reason now for me to &lt;span style="font-weight: bold;"&gt;not&lt;/span&gt; get an iPhone!".&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-3069477305072900896?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/3069477305072900896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=3069477305072900896' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/3069477305072900896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/3069477305072900896'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2008/11/isilo-on-iphone.html' title='iSilo on the iPhone'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-290994567858282931</id><published>2008-11-06T23:14:00.002+11:00</published><updated>2008-11-06T23:17:27.849+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='religion'/><category scheme='http://www.blogger.com/atom/ns#' term='blogging'/><title type='text'>New blog</title><content type='html'>It's been a while since I posted, so just a quick passing comment - I've started &lt;a href="http://comingtohisword.blogspot.com/"&gt;a new blog&lt;/a&gt;, to track my progress reading through the New Testament over the next two years. If you're at all spiritually-minded, or just curious about what the Bible &lt;span style="font-style: italic;"&gt;really&lt;/span&gt; says (because trust me, traditional Christianity is so often so wide of the mark), then please do drop by. I'll be updating once a week, God willing!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-290994567858282931?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/290994567858282931/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=290994567858282931' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/290994567858282931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/290994567858282931'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2008/11/new-blog.html' title='New blog'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-6715608481146893405</id><published>2008-09-23T17:33:00.001+10:00</published><updated>2008-09-23T17:33:55.186+10:00</updated><title type='text'>Amazon reviews</title><content type='html'>&lt;p&gt;Today has been a little intense at work, so I found myself in need of something to take my mind off it. Talking with a work colleague about incredibly expensive high-end audio equipment reminded me about Denon's $500 ethernet cable, something which usually costs about $1/m. While Googling for a good reference to it, I came across Amazon's &lt;a href="http://www.amazon.com/review/product/B000I1X6PM/ref=cm_cr_pr_link_2?_encoding=UTF8&amp;amp;pageNumber=2&amp;amp;sortBy=bySubmissionDateDescending" target="_blank"&gt;review page of the cable&lt;/a&gt;, and laughed until I cried.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;based on the superb reviews, I am buying this fabled equipment as a gift for my wife, in time for our 4th anniversary. I think it would make for a beautiful necklace.&lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;p&gt;I bought this cable but it refused to plug into my Samsung and Pioneer equipment. When I forced it to connect with them anyway, it killed itself in shame. So I ordered a replacement, but instead of plugging it into inferior devices I plugged it into my Apple Powerbook. There was a brief shudder in the room and a wormhole formed where my bedroom wall had been.&lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;p&gt;I'm kicking myself for not buying on Amazon. I picked up this bad boy in a retail store for what I thought was a bargain closeout price of $749.99, but logging on here, I realize that stupid Radio Shack has ripped me off yet again. &lt;/p&gt; &lt;p&gt;I bought this cable for my new HiFi system because I heard that this is the same one that industry professionals rely on every day for their most complex sound patterns.&lt;/p&gt; &lt;p&gt;As a stress test, I used my stereo with this new cable to watch an Eddie Izzard standup routine I'd recorded on VHS. Let me tell you, the difference in sound was PHENOMENAL. With this new cable, I can suddenly understand every word he says as if he were speaking in a Midwestern American accent. Also, now the tape shows him dressed in men's clothes. For this, I give Denon ten stars. &lt;br&gt;&lt;/p&gt; &lt;p&gt;However, there are some drawbacks to this wonderful new technology. My CDs still skip occasionally, although I probably just need to throw out my audio rack and invest in building a new one from scratch--I doubt the cable is at fault. Also, whenever I try to give it a bath, it refuses to let me remove its nylon covering, or allow me to be in the room when it is bare. However, I suppose this should be expected from a higher quality product. When I buy my companionship, the more expensive ones are a little more particular about nudity protocol. &lt;/p&gt; &lt;p&gt;Overall, an excellent investment for anyone who needs a friend.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Suddenly life doesn't seem so bad, although I do have a bit of a stitch from laughing.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-6715608481146893405?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/6715608481146893405/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=6715608481146893405' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/6715608481146893405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/6715608481146893405'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2008/09/amazon-reviews.html' title='Amazon reviews'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-2089484628567789499</id><published>2008-09-02T09:43:00.001+10:00</published><updated>2008-09-02T09:43:47.162+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='science'/><title type='text'>Time to polish those crystal balls</title><content type='html'>&lt;p&gt;In the summer of 2006, The Guardian announced:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Scientists know a lot about how events will unfold...which means that whatever we do, our climate destiny is fixed for the next few decades... Rainfall will decline in the summer and the increased deluges in winter will struggle to replenish thirsty reservoirs because much of the water will run off the baked ground.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Roll forward two years, and The Daily Telegraph has &lt;a href="http://www.telegraph.co.uk/news/2645227/Reservoirs-are-full-after-washout-August.html" target="_blank"&gt;this to say&lt;/a&gt;:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;The second wet summer in succession has left water levels in many reservoirs at the highest levels seen in recent memory... "It is really exceptional, I've never known it so full at the end of August," he said... Usually you would expect it to be 50 per cent down at this time of year."&lt;br&gt;...&lt;br&gt;In south west England Wimbleball and Burrator reservoirs in Dartmoor are at 100 per cent of their capacity, creating a dramatic waterfall effect as excess water flows over a weir in a storage area.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Sometimes I get the feeling that a Magic 8 ball would be more useful than reading what the mainstream media has to say about the climate's future.&lt;/p&gt; &lt;p&gt;While you're at it, have a read of &lt;a href="http://www.telegraph.co.uk/opinion/main.jhtml?view=DETAILS&amp;amp;grid=A1YourView&amp;amp;xml=/opinion/2008/08/31/do3105.xml" target="_blank"&gt;Christopher Booker's article&lt;/a&gt; on the politics behind the IPCC and the "consensus" that climate change is caused by man's activities, particularly related to CO2. Our governments are planning on spending $45 trillion on fighting climate change, but the supporting evidence is being shown to be increasing unreliable, if not purely fictitious.&lt;/p&gt; &lt;p&gt;As an example, the infamous "hockey stick" graph, showing centuries of level temperatures until recent decades when temperatures swing upwards, is a complete fabrication:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;When, with great difficulty, they eventually persuaded Mann to hand over his data, it turned out he had built into his programme an algorithm which would produce a hockey stick shape whatever data were fed into it. Even numbers from the phonebook would come out looking like a hockey stick.&lt;/p&gt; &lt;p&gt;...&lt;/p&gt; &lt;p&gt;As it was put by Roger Cohen, a senior US physicist formerly involved with the IPCC process, who long accepted its orthodoxy: "I was appalled at how flimsy the case is. I was also appalled at the behaviour of many of those who helped produce the IPCC reports and by many of those who promote it. &lt;p&gt;&amp;nbsp; &lt;p&gt;"In particular I am referring to the arrogance, the activities aimed at shutting down debate; the outright fabrications; the mindless defense of bogus science; and the politicisation of the IPCC process and the science process itself."&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt; So next time that you hear how much the government wants to put up taxes to pay for climate change programs, ask yourself what basis they have for doing it. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-2089484628567789499?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/2089484628567789499/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=2089484628567789499' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/2089484628567789499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/2089484628567789499'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2008/09/time-to-polish-those-crystal-balls.html' title='Time to polish those crystal balls'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-2745225628645087247</id><published>2008-08-29T22:47:00.001+10:00</published><updated>2008-08-29T22:47:57.400+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Hug a developer today</title><content type='html'>&lt;p&gt;Sometimes, every developer hurts; sometimes, every developer cries. And your client changing the requirements on you for the third time in a week is bound to do it to you every time...&lt;/p&gt; &lt;embed src="http://blip.tv/play/gYwjwZJqjdEh" width="640" height="390" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" /&gt;   &lt;p&gt;Blogger's layout will probably mess the video up a bit, so here's &lt;a href="http://blip.tv/file/1061088"&gt;the original&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-2745225628645087247?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/2745225628645087247/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=2745225628645087247' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/2745225628645087247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/2745225628645087247'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2008/08/hug-developer-today.html' title='Hug a developer today'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-5755463797964799790</id><published>2008-08-27T08:21:00.005+10:00</published><updated>2008-08-27T09:55:45.262+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>When True does not equal True</title><content type='html'>&lt;p&gt;One of my colleagues came across an interesting bug today. He was running this test:&lt;/p&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;[Test]&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; DoMXLookupWithValidDomainName()&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;{&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    MXLookupHelper mxHelper = &lt;span class="kwrd"&gt;new&lt;/span&gt; MXLookupHelper();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    mxHelper.DomainName = &lt;span class="str"&gt;"google.com"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    &lt;span class="kwrd"&gt;bool&lt;/span&gt; validDomain = mxHelper.hasMxRecord();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    Assert.IsTrue(validDomain);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt; &lt;p&gt;The test was failing with the rather unhelpful message:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;span style="font-family:Courier;font-size:85%;"&gt;Expected True, but was True.&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;It's not everyday that you see a boolean value of &lt;span style="font-family:Courier;"&gt;True&lt;/span&gt; not equalling &lt;span style="font-family:Courier;"&gt;True&lt;/span&gt;, so he called me over to have a look, we must have had half the office trying to figure that one out.&lt;/p&gt; &lt;p&gt;Our immediate solution was simple enough - modify the method &lt;span style="font-family:Courier;"&gt;hasMxRecord()&lt;/span&gt; so that the last line reads:&lt;/p&gt;&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;return&lt;/span&gt; foundRecord ? &lt;span class="kwrd"&gt;true&lt;/span&gt; : &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt; &lt;p&gt;which is something that sets afire every refactoring nerve in my body, so I had to add a huge comment to that line, to the effect that, "Yes I know it looks pointless, but you'll just have to trust me, it is there for a reason".&lt;/p&gt; &lt;p&gt;We were able to reproduce the effect on another colleague's machine, but of course when I tried it on my machine, the test worked as expected. The only difference that we could tell was the version of the .NET Framework that we were running, mine reporting 2.0.50727.3053, while theirs were reporting 2.0.50727.1433, so it may be a bug in the .NET Framework v2.0 which has been &lt;em&gt;finally&lt;/em&gt; fixed with the release of .NET Framework v3.5 Service Pack 1, which I installed last week.&lt;/p&gt; &lt;p&gt;Of course, this incident just reminded of the frequent stories of people's &lt;a href="http://thedailywtf.com/Articles/It_Depends_on_Your_Definition_of_True.aspx" target="_blank"&gt;flagrant&lt;/a&gt; &lt;a href="http://thedailywtf.com/Articles/Boolean_Bits.aspx" target="_blank"&gt;abuse&lt;/a&gt; of &lt;a href="http://thedailywtf.com/Articles/Boolean-Integers.aspx" target="_blank"&gt;simple&lt;/a&gt; &lt;a href="http://thedailywtf.com/Articles/OurBoolean.aspx" target="_blank"&gt;boolean&lt;/a&gt; &lt;a href="http://thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx" target="_blank"&gt;logic&lt;/a&gt; on The Daily WTF.&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight: bold;"&gt;UPDATE&lt;/span&gt;: this appears to be part of &lt;a href="http://support.microsoft.com/default.aspx?kbid=823071"&gt;a very old bug&lt;/a&gt;. Not bad, only taking three years to fix...
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-5755463797964799790?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/5755463797964799790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=5755463797964799790' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/5755463797964799790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/5755463797964799790'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2008/08/when-true-does-not-equal-true.html' title='When True does not equal True'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-6849517303093743639</id><published>2008-08-14T09:02:00.001+10:00</published><updated>2008-08-14T09:02:15.318+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='phones'/><title type='text'>Getting an iPhone in Australia with 3</title><content type='html'>&lt;p&gt;Only a tribe of cave dwellers in the mountains of Papua New Guinea could have possibly missed the release of Apple's iPhone 3G last month, and even then only because they probably don't have 3G coverage in the vicinity.&lt;/p&gt; &lt;p&gt;Being a geek of the first order, you might expect that I would have got one by now, even if I didn't care to queue for 3-4 hours to get one on release day (the day after release, I was lucky enough to sit on the same aisle on a flight up to Brisbane as someone who &lt;em&gt;had &lt;/em&gt;scored themselves one, so I got to play with it. What a great icebreaker an iPhone is. Just pity the poor woman who was stuck between the two of us!)&lt;/p&gt; &lt;p&gt;The reasons are:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;my network, 3, doesn't sell the iPhone. A bit obvious, but worth saying. The official reasons why are not widely known, but it's a bit strange, as 3's &lt;a href="http://www.three.com.au/cs/ContentServer?c=Page&amp;amp;pagename=Three%2FPage%2FBusinessVideoCallingTemplate&amp;amp;cid=1215747772654" target="_blank"&gt;data plans&lt;/a&gt; are arguably the best available (and the less said about Telstra's data plans, the better);&lt;/li&gt; &lt;li&gt;I'm less than a year into a new contract, so I would get hit with some pretty painful cancellation charges if I hopped to Optus or Vodaphone;&lt;/li&gt; &lt;li&gt;most people that I'm likely to talk to on the phone are on 3 as well, and the free same-network calls would be much missed, on both ends of the conversation.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Fortunately, 3 are still working on the case. It is possible to get an iPhone on to the 3 network. The process is relatively simple:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;buy a pre-paid iPhone from Optus, and pay the $80 unlocking fee;&lt;/li&gt; &lt;li&gt;go to 3, who will &lt;a href="http://www.zdnet.com.au/news/communications/soa/3-launches-iPhone-support/0,130061791,339290990,00.htm" target="_blank"&gt;give you the appropriate SIM card&lt;/a&gt; and &lt;a href="http://apcmag.com/three_australia_announces_multi_gigabyte_iphone_plans.htm" target="_blank"&gt;also refund you $300&lt;/a&gt; of the purchase price of the phone.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;The only downsides to the operation are:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;if you're outside 3's coverage, you'll be paying for &lt;a href="http://www.itwire.com/content/view/18746/1095/" target="_blank"&gt;Sol Trujilo's heavy mob&lt;/a&gt; at the rate of $1.65/Mb, which is enough to make your eyes water;&lt;/li&gt; &lt;li&gt;the new contract will be for 24 months, but I guess if you're in my boat, then that shouldn't matter so much if everyone you also talk to is on the same network.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;So now I only need spousal approval. Oh, and the timely arrival of my 35th birthday...&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-6849517303093743639?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/6849517303093743639/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=6849517303093743639' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/6849517303093743639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/6849517303093743639'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2008/08/getting-iphone-in-australia-with-3.html' title='Getting an iPhone in Australia with 3'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-834741149829698609</id><published>2008-08-12T10:06:00.001+10:00</published><updated>2008-08-12T10:06:39.523+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='science'/><title type='text'>Caspar and the Jesus Paper</title><content type='html'>&lt;p&gt;A fantastic title for a &lt;a href="http://bishophill.squarespace.com/blog/2008/8/11/caspar-and-the-jesus-paper.html"&gt;very eye-opening post&lt;/a&gt; by Bishop Hill, establishing just how corrupt science can be, especially in the field of climate study, where there is so much money to be made, usually provided by the government and environmental lobby concerns.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;With this new, and pretty much entirely arbitrary hurdle in place, Wahl and Amman were able to reject several of the runs which stood between the hockey stick and what they saw as its rightful place as the gold standard for climate reconstructions. That the statistical foundations on which they had built this paleoclimate castle were a swamp of misrepresentation, deceit and malfeasance was, to Wahl and Amman, an irrelevance. For political and public consumption, the hockey stick still lived, ready to guide political decision-making for years to come.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Would you believe that Al Gore's woeful An Inconvenient Truth is being shown to school children in the UK as accepted fact, whereas nearly all its arguments have been shown to be junk science?&lt;/p&gt;  &lt;p&gt;Something to think about next time the government tells you prices will have to shoot up in the next few years to pay for all those carbon trading schemes. I noticed the Sydney Morning Herald has been carrying a lot of articles about climate change, saying that it's all proven scientific fact, that the research has been meticulously peer-reviewed, that anyone who says anything contrary is in the pocket of the energy companies and going against the consensus. I think the above article should put paid to most of that.&lt;/p&gt;  &lt;p&gt;What a shame that the mainstream press aren't interested in covering this sort of thing, preferring populist alarmism to &amp;quot;Sorry folks, it's all a sham&amp;quot;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-834741149829698609?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/834741149829698609/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=834741149829698609' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/834741149829698609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/834741149829698609'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2008/08/caspar-and-jesus-paper.html' title='Caspar and the Jesus Paper'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-2514053589488831833</id><published>2008-07-29T18:51:00.004+10:00</published><updated>2008-07-29T19:12:19.125+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='mediacentre'/><title type='text'>Installing Vista on a Mac Mini</title><content type='html'>Having been bitten by the Mac bug earlier in the year, when I forsook 20 years of building and running Windows-based PCs for the shininess of a MacBook Pro, I've been looking at the possibility of using the diminutive Intel-base &lt;a href="http://www.apple.com/au/macmini/"&gt;Mac Mini&lt;/a&gt; as a replacement for the smaller of my two Home Theatre PCs (the more powerful one has a Blu-Ray drive and runs the HD projector in the &lt;strike&gt;games room&lt;/strike&gt; home theatre downstairs). The advantages of the Mini are:
&lt;ul&gt;&lt;li&gt;size - it's about 20% of the size of the PC it's replacing;&lt;/li&gt;&lt;li&gt;noise - I went to a lot of trouble with designing the PC for low noise, but the Mini is &lt;span style="font-style: italic;"&gt;silent&lt;/span&gt;;&lt;/li&gt;&lt;li&gt;power - the Mini mainly uses laptop components, and isn't readily expandable, so the power supply only goes up to 110W.&lt;/li&gt;&lt;/ul&gt;I've been running Windows XP Media Centre 2005 on the PC for the past three or so years, and thought it was time to upgrade to Vista Premium Media Centre, which is also running on the downstairs HTPC. So my challenge was to get Windows Vista on to a Mac Mini.

The Mini came from Ebay with OS X 10.4 (Tiger) on it, and I expended a lot of effort trying to get Vista on, to no avail. It seems only OS X 10.5 (Leopard) had the wherewithals to make this work, so I borrowed the install disc that came with my MacBook Pro, and fired up the install routine. It promptly informed me that I couldn't use my MBP install disk on a Mini, which was OK, because what I really wanted was the Disk Utility program, accessible from the menu bar at the top of the screen. This allowed me to delete the existing OS X partition, and to set Master Boot Record (very important, if you want to boot a Windows OS), and then create a new partition. The utility doesn't allow you to create NTFS partitions, so FAT it was. I then rebooted, and held down the F12 key on my Windows keyboard to eject the OS X disc.

I then inserted a full version of Windows Vista Premium (the general consensus on the web is that upgrade versions won't work), and hey presto, it detected the disc and launched the installation routine. Vista complained that it didn't want to be installed on to a FAT partition, but then gave me the option to format it as NTFS, so that was OK.

So at this point in time, it's whirring away, extracting files in the hour long snooze-fest that is a Vista install. I'll let you know how it goes.

&lt;span style="font-weight: bold;"&gt;btw&lt;/span&gt;: when I was looking for some help on &lt;a href="http://www.xpmediacentre.com.au/"&gt;Australian Media Centre Community&lt;/a&gt;, someone pointed me in the direction of &lt;a href="http://www.osxbmc.com/2008/07/05/announcing-plex/"&gt;Plex&lt;/a&gt;, which is a port of the XBox Media Centre project to OS X. It looks rather good running on my MacBook Pro, but I'm mindful of it's beta status (I got it to crash within five minutes of loading it). In fact, it looks incredibly pretty, and I would be interested to see it running on an HDTV. It currently only runs on OS X 10.5 (Leopard), but these days I'm not particularly married to any one operating system, so there's definitely a place for it in my home, if they can sort out the stability.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-2514053589488831833?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/2514053589488831833/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=2514053589488831833' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/2514053589488831833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/2514053589488831833'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2008/07/installing-vista-on-mac-mini.html' title='Installing Vista on a Mac Mini'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-2007968165897691532</id><published>2008-07-09T21:53:00.003+10:00</published><updated>2008-07-09T22:04:47.522+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='photography'/><category scheme='http://www.blogger.com/atom/ns#' term='flickr'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Flickr and iPhoto</title><content type='html'>While having a wander around iPhoto, I found a rather nice little feature - subscribing to photo feeds. iPhoto can subscribe to RSS feeds, such as those provided by &lt;a href="http://www.flickr.com"&gt;Flickr&lt;/a&gt;, allowing you to see your friends' latest photos in one place.

Just grab the RSS URL from near the bottom of a contact's site (this can be for the whole site, or just a set or collection), and in iPhoto, select File | Subscribe to Photo Feed, and paste in the URL. iPhoto will grab the most recent photos from their site (it looks like 20 is the default). 

The only problem that I can see is that double-clicking on a thumbnail doesn't take you to the hi-res version, instead magnifying the default lo-res version, so it's not perfect, but it's a good way of keeping an eye on what your friends have been up to.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-2007968165897691532?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/2007968165897691532/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=2007968165897691532' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/2007968165897691532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/2007968165897691532'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2008/07/flickr-and-iphoto.html' title='Flickr and iPhoto'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-4668689925729378075</id><published>2008-06-26T09:38:00.006+10:00</published><updated>2008-08-27T09:04:02.469+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><title type='text'>Implementing a .NET SortedKeyedCollection</title><content type='html'>&lt;p&gt;I've been looking for a solution for this one for a while. The .NET Framework v2 provides a generic &lt;code&gt;KeyedCollection&amp;lt;TKey, TItem&amp;gt;&lt;/code&gt;, that stores objects using a key which is a property on the object being stored, which is a fantastic concept. However, the objects are stored in a standard dictionary, in the order in which they were inserted, and there's no provision in the class for sorting the collection.&lt;/p&gt;&lt;p&gt;So I turned to the web for a solution - surely, someone somewhere must have tried to do the same thing as me. As it turns out, &lt;a href="http://bytes.com/forum/thread783946.html" target="_blank"&gt;they&lt;/a&gt; &lt;a href="http://forums.msdn.microsoft.com/en-US/netfxbcl/thread/56adc0f9-aa1b-4acf-8546-082bb01058f2" target="_blank"&gt;had&lt;/a&gt;. This wasn't the only such example, but unfortunately, the advice given was always the same - add a &lt;code&gt;Sort&lt;/code&gt; method, which is clunky, and forces the implementor to make an extra step to get their collection sorted; or use &lt;code&gt;SortedList&amp;lt;TKey, TItem&amp;gt;&lt;/code&gt; or &lt;code&gt;SortedDictionary&amp;lt;TKey, TItem&amp;gt;&lt;/code&gt;. These collections are full featured, containing all sorts of helpful methods and properties. I see similar arguments made when suggesting people use &lt;code&gt;List&amp;lt;T&amp;gt;&lt;/code&gt; for pretty much any collection. All well and good for 90% of developers, but what do you do about the 10% who are API developers?&lt;/p&gt;&lt;p&gt;The reason why these classes are not so good for API developers is that these helpful classes are not easily extended - few, if any, of the methods or properties are virtual. &lt;a href="http://blogs.msdn.com/kcwalina/archive/2004/09/28/235232.aspx"&gt;Microsoft's own recommendation&lt;/a&gt; for API developers and developers of third-party libraries is that they use the &lt;code&gt;Collection&amp;lt;T&amp;gt;&lt;/code&gt;, &lt;code&gt;KeyedCollection&amp;lt;TKey, TItem&amp;gt;&lt;/code&gt;, and &lt;code&gt;ReadOnlyCollection&amp;lt;T&amp;gt;&lt;/code&gt;, as these classes deliberately provide virtual methods which can be overridden to provide customisation.&lt;/p&gt;&lt;p&gt;So, here is my implementation of a SortedKeyedCollection&amp;lt;TKey, TItem&amp;gt;, which extends the KeyedCollection and sorts the objects at the point at which they are inserted. I'm &lt;a href="http://code.google.com/p/sortedkeyedcollection/" target="_blank"&gt;adding this code&lt;/a&gt; to Google Code, more as a safe repository than to start an open source project - the project's just a shell at the moment, seeing as I can't get an SVN connection to it from work.&lt;/p&gt;&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.ObjectModel;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; SortedKeyedCollection&amp;lt;TKey, TItem&amp;gt; : KeyedCollection&amp;lt;TKey, TItem&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;{&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;virtual&lt;/span&gt; IComparer&amp;lt;TKey&amp;gt; KeyComparer&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        get &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; Comparer&amp;lt;TKey&amp;gt;.Default;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; InsertItem(&lt;span class="kwrd"&gt;int&lt;/span&gt; index, TItem item)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        &lt;span class="kwrd"&gt;int&lt;/span&gt; insertIndex = index;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;        &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; Count; i++)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;            TItem retrievedItem = &lt;span class="kwrd"&gt;this&lt;/span&gt;[i];&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (KeyComparer.Compare(GetKeyForItem(item), GetKeyForItem(retrievedItem)) &amp;lt; 0)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;            {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;                insertIndex = i;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;                &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;            }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;        &lt;span class="kwrd"&gt;base&lt;/span&gt;.InsertItem(insertIndex, item);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;InsertItem&lt;/code&gt; override does most of the work - if you're adding a new object, it intercepts that call, and works out the index that you should be inserting the object, based on its key. By default, it uses the &lt;code&gt;Comparer&amp;lt;TKey&amp;gt;.Default&lt;/code&gt;, so &lt;code&gt;string&lt;/code&gt; keys are compared using the default (case-insensitive) comparer, and other primitives such as &lt;code&gt;int&lt;/code&gt;s and &lt;code&gt;decimal&lt;/code&gt;s are compared in a similar fashion. By providing a virtual property &lt;code&gt;KeyComparer&lt;/code&gt;, I've allowed the user of the class to provide their own &lt;code&gt;IComparer&amp;lt;TKey&amp;gt;&lt;/code&gt;, should they want to use a specific comparer, for instance if the key is a custom class.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-4668689925729378075?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/4668689925729378075/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=4668689925729378075' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/4668689925729378075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/4668689925729378075'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2008/06/implementing-net-sortedkeyedcollection.html' title='Implementing a .NET SortedKeyedCollection'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-5046605309976374622</id><published>2008-06-23T13:53:00.001+10:00</published><updated>2008-06-23T13:53:55.878+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='space'/><category scheme='http://www.blogger.com/atom/ns#' term='science'/><title type='text'>Today's forecast - cold and sunny</title><content type='html'>&lt;p&gt;No, not Sydney; and with a maximum temperature of -32 °C and a minimum of -80 °C, it's not even Canberra. Courtesy of the Canadian Space Agency, we can now get &lt;a href="http://www.space.gc.ca/asc/eng/exploration/phoenix_weather1.asp" target="_blank"&gt;the daily forecast for Mars&lt;/a&gt;. Best wrap up warm.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-5046605309976374622?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/5046605309976374622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=5046605309976374622' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/5046605309976374622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/5046605309976374622'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2008/06/today-forecast-cold-and-sunny.html' title='Today&amp;#39;s forecast - cold and sunny'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-6836500611655910329</id><published>2008-06-19T13:20:00.002+10:00</published><updated>2008-06-19T13:29:56.594+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Tip - Documenting generics in .NET</title><content type='html'>&lt;p&gt;If, like me, you're nuts about documenting all your classes, methods and properties so that &lt;a href="http://ndoc.sourceforge.net/" target="_blank"&gt;NDoc&lt;/a&gt; or &lt;a href="http://blogs.msdn.com/sandcastle/" target="_blank"&gt;Sandcastle&lt;/a&gt; will generate nicely formatted API documentation for you, then you may have found that when it comes to documenting code that includes generics in its signature causes an error. This is because the angled brackets in the generics syntax gets confused with the angled brackets that are the nature of XML.&lt;/p&gt;&lt;p&gt;You can get around this by using the appropriate entity objects, but it's not particularly pretty to look at:&lt;/p&gt;&lt;style&gt;.code { word-wrap:break-word; margin:10px; padding:10px; border:2px ridge white; background-color:#f5f5f5; font-family:courier new; font-size:10pt; } &lt;/style&gt;
&lt;p class="code"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt;&lt;span style="color:#808080;"&gt; &lt;/span&gt;&lt;span style="color:black;"&gt;System.Collections.Generic&lt;/span&gt;&lt;span style="color:blue;"&gt;;&lt;/span&gt;&lt;span style="color:#808080;"&gt;

&lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&lt;span style="color:#808080;"&gt; &lt;/span&gt;&lt;span style="color:blue;"&gt;class&lt;/span&gt;&lt;span style="color:#808080;"&gt; &lt;/span&gt;&lt;span style="color:black;"&gt;MyProgram&lt;/span&gt;&lt;span style="color:#808080;"&gt;
&lt;/span&gt;&lt;span style="color:black;"&gt;{&lt;/span&gt;&lt;span style="color:#808080;"&gt;
    &lt;/span&gt;&lt;span style="color:darkgreen;"&gt;/// &amp;lt;summary&amp;gt;
&lt;/span&gt;&lt;span style="color:#808080;"&gt;    &lt;/span&gt;&lt;span style="color:darkgreen;"&gt;/// Processes the contents of a &amp;lt;see cref="List&amp;amp;lt;T&amp;amp;gt;" /&amp;gt;.
&lt;/span&gt;&lt;span style="color:#808080;"&gt;    &lt;/span&gt;&lt;span style="color:darkgreen;"&gt;/// &amp;lt;/summary&amp;gt;
&lt;/span&gt;&lt;span style="color:#808080;"&gt;    &lt;/span&gt;&lt;span style="color:darkgreen;"&gt;/// &amp;lt;param name="parameters"&amp;gt;The parameters.&amp;lt;/param&amp;gt;
&lt;/span&gt;&lt;span style="color:#808080;"&gt;    &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&lt;span style="color:#808080;"&gt; &lt;/span&gt;&lt;span style="color:blue;"&gt;void&lt;/span&gt;&lt;span style="color:#808080;"&gt; &lt;/span&gt;&lt;span style="color:black;"&gt;MyMethod(&lt;/span&gt;&lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&lt;span style="color:black;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&lt;span style="color:black;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#808080;"&gt; &lt;/span&gt;&lt;span style="color:black;"&gt;parameters)&lt;/span&gt;&lt;span style="color:#808080;"&gt;
    &lt;/span&gt;&lt;span style="color:black;"&gt;{&lt;/span&gt;&lt;span style="color:#808080;"&gt;
        &lt;/span&gt;&lt;span style="color:darkgreen;"&gt;// Process the list
&lt;/span&gt;&lt;span style="color:#808080;"&gt;    &lt;/span&gt;&lt;span style="color:black;"&gt;}&lt;/span&gt;&lt;span style="color:#808080;"&gt;
&lt;/span&gt;&lt;span style="color:black;"&gt;}&lt;/span&gt; &lt;/p&gt;&lt;p&gt;Fortunately, the .NET team thought this one through, and you can use curly brackets in the XML comments instead:&lt;/p&gt;&lt;p class="code"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt;&lt;span style="color:#808080;"&gt; &lt;/span&gt;&lt;span style="color:black;"&gt;System.Collections.Generic&lt;/span&gt;&lt;span style="color:blue;"&gt;;&lt;/span&gt;&lt;span style="color:#808080;"&gt;

&lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&lt;span style="color:#808080;"&gt; &lt;/span&gt;&lt;span style="color:blue;"&gt;class&lt;/span&gt;&lt;span style="color:#808080;"&gt; &lt;/span&gt;&lt;span style="color:black;"&gt;MyProgram&lt;/span&gt;&lt;span style="color:#808080;"&gt;
&lt;/span&gt;&lt;span style="color:black;"&gt;{&lt;/span&gt;&lt;span style="color:#808080;"&gt;
    &lt;/span&gt;&lt;span style="color:darkgreen;"&gt;/// &amp;lt;summary&amp;gt;
&lt;/span&gt;&lt;span style="color:#808080;"&gt;    &lt;/span&gt;&lt;span style="color:darkgreen;"&gt;/// Processes the contents of a &amp;lt;see cref="List{T}" /&amp;gt;.
&lt;/span&gt;&lt;span style="color:#808080;"&gt;    &lt;/span&gt;&lt;span style="color:darkgreen;"&gt;/// &amp;lt;/summary&amp;gt;
&lt;/span&gt;&lt;span style="color:#808080;"&gt;    &lt;/span&gt;&lt;span style="color:darkgreen;"&gt;/// &amp;lt;param name="parameters"&amp;gt;The parameters.&amp;lt;/param&amp;gt;
&lt;/span&gt;&lt;span style="color:#808080;"&gt;    &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&lt;span style="color:#808080;"&gt; &lt;/span&gt;&lt;span style="color:blue;"&gt;void&lt;/span&gt;&lt;span style="color:#808080;"&gt; &lt;/span&gt;&lt;span style="color:black;"&gt;MyMethod(&lt;/span&gt;&lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&lt;span style="color:black;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&lt;span style="color:black;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#808080;"&gt; &lt;/span&gt;&lt;span style="color:black;"&gt;parameters)&lt;/span&gt;&lt;span style="color:#808080;"&gt;
    &lt;/span&gt;&lt;span style="color:black;"&gt;{&lt;/span&gt;&lt;span style="color:#808080;"&gt;
        &lt;/span&gt;&lt;span style="color:darkgreen;"&gt;// Process the list
&lt;/span&gt;&lt;span style="color:#808080;"&gt;    &lt;/span&gt;&lt;span style="color:black;"&gt;}&lt;/span&gt;&lt;span style="color:#808080;"&gt;
&lt;/span&gt;&lt;span style="color:black;"&gt;}&lt;/span&gt; &lt;/p&gt;&lt;p&gt;and they will be rendered as angled brackets when the documentation is created.&lt;/p&gt;&lt;p&gt;btw, if you're curious, the code samples were formatted using CarlosAg's &lt;a href="http://blogs.msdn.com/carlosag/archive/2008/03/03/CodeColorizerForWindowsLiveWriter.aspx" target="_blank"&gt;Insert Colorized Code&lt;/a&gt; plug-in for the &lt;a href="http://davidkeaveny.blogspot.com/2008/06/microsoft-beats-apple.html" target="_blank"&gt;most excellent&lt;/a&gt; Windows Live Writer.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-6836500611655910329?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/6836500611655910329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=6836500611655910329' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/6836500611655910329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/6836500611655910329'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2008/06/tip-documenting-generics-in-net.html' title='Tip - Documenting generics in .NET'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-2545174355793003141</id><published>2008-06-19T10:39:00.001+10:00</published><updated>2008-06-19T10:39:41.719+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Microsoft beats Apple</title><content type='html'>&lt;p&gt;Having made the switch after more than 20 years of PCs to Apple, with the purchase of a MacBook Pro at Heathrow Airport's tax-free shopping, I've slowly been shutting down activities on my recalcitrant LG laptop. I've already got the Mac versions of Microsoft Office, Adobe Lightroom and Photoshop CS3; however, one thing that OS X is really missing is a decent blog client. By far, the best blog client going is &lt;a href="http://windowslivewriter.spaces.live.com/" target="_blank"&gt;Windows Live Writer&lt;/a&gt;. It's probably one of the best pieces of software to come out of Redmond in the past decade.&lt;/p&gt; &lt;p&gt;Until OS X can come up with something equivalent, I'm going to be using either Fusion or Parallels to let me run it in a virtual machine, along with the handful of other Windows-only applications that I use for which there are definitely no equivalents. Either that, or blog from work, where I've co-opted my Windows Server 2003 desktop to run it. During my lunch break, of course.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-2545174355793003141?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/2545174355793003141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=2545174355793003141' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/2545174355793003141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/2545174355793003141'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2008/06/microsoft-beats-apple.html' title='Microsoft beats Apple'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-5801809815376542077</id><published>2008-06-19T09:17:00.002+10:00</published><updated>2008-06-19T11:49:55.097+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogging'/><title type='text'>Metablogging</title><content type='html'>&lt;p&gt;Metablogging is essentially blogging about blogging, and probably a good sign that the author has really run out of things to say. Given that I haven't posted anything since heading off to England for a few weeks in the sun (ha!), it looks like I've reached that point already, so I hope that excuses me.&lt;/p&gt; &lt;p&gt;After a few abortive weeks of trying to catch up with the old Fairfax Digital team (aka &lt;a href="http://damana.blogspot.com/" target="_blank"&gt;Damana&lt;/a&gt;, &lt;a href="http://j00ster.blogspot.com/" target="_blank"&gt;Mei&lt;/a&gt; and &lt;a href="http://sansonlowe.blogspot.com/" target="_blank"&gt;Sanson&lt;/a&gt;), we finally managed to all be in the same place at roughly the same time (despite the best efforts of my local garage to make me miss an entire day by messing up the installation of a wheel bearing in my car, but that's besides the point).&lt;/p&gt; &lt;p&gt;While comparing the merits of our MacBook Pros and why using Safari instead of Camino is bad for your health, I mentioned some of the parental controls, which as the parent of an inquisitive nine year old girl, come as an absolute Godsend, and both Sanson and Damana were very impressed by it all (not that either are in a position to need parental controls on their MBPs yet), so Damana encouraged me to blog about it.&lt;/p&gt; &lt;p&gt;This is not that post.&lt;/p&gt; &lt;p&gt;Instead, it's more of a realisation that a lot of the time, I don't blog stuff because I don't think people will be interested, that it's so obvious to me that it's equally obvious to everyone else. There can be a really bad signal-to-noise ratio on the web, and I'd rather not be contributing to the noise side of the equation. However, the point was made over lunch that what is obvious to me may not be at all obvious to just one person out there, who is even now Googling for some help on the topic that you're not writing about.&lt;/p&gt; &lt;p&gt;So, hopefully in the next few months, I'll be picking up the slack a bit, and writing that post about OS X's parental controls. And I still have one holiday in Europe to blog about, now that I've just about finished with the photos.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-5801809815376542077?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/5801809815376542077/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=5801809815376542077' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/5801809815376542077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/5801809815376542077'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2008/06/metablogging.html' title='Metablogging'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-803479007595553374</id><published>2008-05-09T11:47:00.001+10:00</published><updated>2008-05-09T11:47:34.527+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photography'/><title type='text'>Getting published</title><content type='html'>&lt;p&gt;A couple of my Flickr photos are being used by &lt;a href="http://www.schmap.com/" target="_blank"&gt;Schmap&lt;/a&gt;, a map guide to the world's major cities: &lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://www.schmap.com/australia/panorama/#p=31743&amp;amp;i=31743_12.jpg" target="_blank"&gt;Darling Harbour by night&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;a title="Darling Harbour by night" href="http://www.flickr.com/photos/84306903@N00/484797252/"&gt;&lt;img height="303" alt="Darling Harbour by night" src="http://static.flickr.com/194/484797252_026a2f2537.jpg" width="450" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://www.schmap.com/australia/panorama/#p=126317&amp;amp;i=126317.jpg" target="_blank"&gt;Mount Ainslie&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;a title="Mount Ainslie from Canberra" href="http://www.flickr.com/photos/84306903@N00/452176810/"&gt;&lt;img height="303" alt="Mount Ainslie from Canberra" src="http://static.flickr.com/225/452176810_6743481b43.jpg" width="450" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;It's nice to see that use of Flickr's groups and tags have added a bit of visibility to my photos. It also serves a useful reminder as to why people go to the effort of tagging photos - I took just over 600 hundred photos on my last visit to England, and tagging them is even more daunting a task than processing them, but no less important.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-803479007595553374?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/803479007595553374/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=803479007595553374' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/803479007595553374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/803479007595553374'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2008/05/getting-published.html' title='Getting published'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-5656917667742125108</id><published>2008-04-10T00:23:00.002+10:00</published><updated>2008-04-10T00:27:39.085+10:00</updated><title type='text'>Er, where are we going?</title><content type='html'>Just a quick post while we wait for our transfer on to London Heathrow. We're currently in Hong Kong, although when the pilot was doing his introductory speech, it was more like:
&lt;blockquote&gt;Welcome on board Virgin flight VS201 to... er, where are we going? Oh yes, Hong Kong.&lt;/blockquote&gt;He also announced our arrival with:
&lt;blockquote&gt;To make sure you don't arrive at the arrival pier before we do, please keep your seatbelts fastened...
&lt;/blockquote&gt;Definitely a bit of a humourist. Anyway, it's late, the seats were pretty uncomfortable, and my laptop managed to turn itself on somewhere along the way so I have about 3 minutes charge left.

Next stop London!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-5656917667742125108?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/5656917667742125108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=5656917667742125108' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/5656917667742125108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/5656917667742125108'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2008/04/er-where-are-we-going.html' title='Er, where are we going?'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-6813836388469898394</id><published>2008-04-04T15:45:00.001+11:00</published><updated>2008-04-04T15:45:45.631+11:00</updated><title type='text'>What a waste of effort</title><content type='html'>&lt;p&gt;I got my latest FlyBuys statement in the post (or in my inbox at least), and was duly impressed to see that it had passed the 12000 mark. I registered for one almost as soon as I arrived in Australia, some 2.5 years ago. Apparently, with that 12000 points, I can redeem them all for a $100 gift card.&lt;/p&gt; &lt;p&gt;Well colour me excited.&lt;/p&gt; &lt;p&gt;A few months after arriving and with a job lined up, I was able to apply for a credit card, and in one of my more astute moves, I got a NAB VISA card which was linked to the Velocity reward program, and came with 20000 points out-of-the-box. Velocity is the reward system used by Virgin Blue and its friends, so when we went to Japan last year with Malaysian Airlines, I was able to convert all those miles into points, and with next week's trip to England with Virgin, I'll be able to convert all &lt;em&gt;those&lt;/em&gt; miles to points; oh yes, and our car rentals during that holiday are with Europcar, and guess which reward scheme &lt;em&gt;they&lt;/em&gt; subscribe to.&lt;/p&gt; &lt;p&gt;On top of that, all of the improvements that have been done to our house in the past year (flooring, solar heating, decking, new bedroom, laundry renovation) are all being paid for on the credit card, which adds yet more points to the pot. Those points just keep flooding in.&lt;/p&gt; &lt;p&gt;And these points can be traded in for something more useful then a lousy gift card - I've already used some for a rather nice Audi hire car while my Saab was in the garage, and a bunch more to send a group of church friends to a conference in Tasmania (although not to bring them back again, *grin*).&lt;/p&gt; &lt;p&gt;Just think how much marketing data FlyBuys is getting every time you swipe that card, and after two years of populating their datawarehouses, what do you get? One of the most pathetic rewards I've ever seen.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-6813836388469898394?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/6813836388469898394/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=6813836388469898394' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/6813836388469898394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/6813836388469898394'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2008/04/what-waste-of-effort.html' title='What a waste of effort'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-5718026152337973560</id><published>2008-03-25T23:18:00.001+11:00</published><updated>2008-03-25T23:18:49.863+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photography'/><title type='text'>Easter weekend fun</title><content type='html'>&lt;p&gt;Back in England, the Easter Bank Holiday is traditionally celebrated by spending hours in deep meditation, while stuck behind another caravan in a 10 mile traffic jam. The &lt;a href="http://en.wikipedia.org/wiki/M25_motorway" target="_blank"&gt;M25&lt;/a&gt; is usually involved as well, and rain is usually a dead cert, definitely more so than a white Christmas these days.&lt;/p&gt;  &lt;p&gt;So what else can an expat Brit do at this time of year, then head out of town in search of some sunshine, and instead find copious quantities of rain, and not a few traffic jams. Of course, not to be outdone, England instead had &lt;a href="http://www.telegraph.co.uk/news/main.jhtml?xml=/news/2008/03/23/nweather223.xml" target="_blank"&gt;heavy snow&lt;/a&gt;. Tell me more about this global warming, it sounds fascinating.&lt;/p&gt;  &lt;p&gt;Our first destination, apart from the take-a-break stop for those who had drunk too much tea at breakfast, was Fitzroy Falls, in the Southern Highlands, about 90 minutes drive south-west of Sydney.&lt;/p&gt;  &lt;p&gt;&lt;a title="Fitzroy Falls" href="http://www.flickr.com/photos/30265340@N00/231717291/"&gt;&lt;img height="283" alt="Fitzroy Falls" src="http://static.flickr.com/88/231717291_89298659fe.jpg" width="420" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;(those are the falls in the bottom left corner - the foreground is rather underexposed, but it's not my photo anyway). That's what it's supposed to look like on a good day. This is what &lt;em&gt;we&lt;/em&gt; saw:&lt;/p&gt;  &lt;p&gt;&lt;a title="Misty Falls" href="http://www.flickr.com/photos/84306903@N00/2358333069/"&gt;&lt;img height="285" alt="Misty Falls" src="http://static.flickr.com/2030/2358333069_e052db2037.jpg" width="420" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;There's something very eerie about standing on the edge of a cliff and not being able to see more than 50 metres in any direction, due to the thick mist. Especially when you know it's 80m straight down...&lt;/p&gt;  &lt;p&gt;Fortunately the cold and the rain eased off a little after Fitzroy Falls - Kangaroo Valley was quite pleasant, although my raspberry sorbet was a little suspicious. We did try keeping Lauren quiet with the age-old trick of applying gobstoppers, but we obviously didn't get one big enough, because it only kept her quiet for about 20 minutes. The rest of us availed ourselves of various refreshments...&lt;/p&gt;  &lt;p&gt;&lt;a title="Have A Coke" href="http://www.flickr.com/photos/84306903@N00/2358333919/"&gt;&lt;img height="283" alt="Have A Coke" src="http://static.flickr.com/2298/2358333919_228ff0a1f3.jpg" width="420" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Back in the car again, and on to Seven Mile Beach, which proved to be incredibly windy, so we didn't stay there long. Emily had already swiped my jumper, so we didn't stay too long to admire the view, otherwise Unee would soon be turning blue to match her dress. It didn't stop some people from going surfing though.&lt;/p&gt;  &lt;p&gt;&lt;a title="Two Chilly Sisters" href="http://www.flickr.com/photos/84306903@N00/2361166206/"&gt;&lt;img height="283" alt="Two Chilly Sisters" src="http://static.flickr.com/3073/2361166206_cb60d899d3.jpg" width="420" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Our last stop of the day was Kiama and its famous blowhole. You need a good tide and a storm to really get it spouting, but it did its best to put on a show for the crowds.&lt;/p&gt;  &lt;p&gt;&lt;a title="Kiama Blowhole" href="http://www.flickr.com/photos/84306903@N00/2361182178/"&gt;&lt;img height="283" alt="Kiama Blowhole" src="http://static.flickr.com/2053/2361182178_c99ab68597.jpg" width="420" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I'm told it can be much more impressive than that. Personally, I found the waves breaking against the cliffs below to be more interesting, especially as below when a rather large rockpool was filled up.&lt;/p&gt;  &lt;p&gt;&lt;a title="Kiama Blowhole" href="http://www.flickr.com/photos/84306903@N00/2358335997/"&gt;&lt;img height="283" alt="Waves filling a rockpool" src="http://static.flickr.com/2395/2358335997_d288b9ee4b.jpg" width="420" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Lauren found her own rockpools, fortunately not the one above, and spent the remaining time filling her pockets with shells.&lt;/p&gt;  &lt;p&gt;&lt;a title="Rockpooling" href="http://www.flickr.com/photos/84306903@N00/2359172916/"&gt;&lt;img height="283" alt="Rockpooling" src="http://static.flickr.com/2048/2359172916_5e380f1877.jpg" width="420" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;For her, this was probably the highlight of the day, and fun for me to, because I got to do some father-daughter stuff for once, helping her scrambling over the rocks.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-5718026152337973560?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/5718026152337973560/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=5718026152337973560' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/5718026152337973560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/5718026152337973560'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2008/03/easter-weekend-fun.html' title='Easter weekend fun'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-4295834081026800212</id><published>2008-03-25T14:37:00.001+11:00</published><updated>2008-03-25T14:37:07.883+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><title type='text'>External hard drives</title><content type='html'>&lt;p&gt;In &lt;a href="http://davidkeaveny.blogspot.com/2008/03/no-i-will-not-fix-your-computer.html" target="_blank"&gt;my last post&lt;/a&gt;, I mentioned that backing up to an external hard drive. Most hard drive manufacturers have already considered this, and sell out-of-the-box backup solutions. Some then take this one step further and add a network port, whether wired or wireless, so that the drive can then be shared between computers on the network.&lt;/p&gt; &lt;p&gt;Western Digital is one of those, but here's a word of warning - if you are a typical home user, &lt;em&gt;do not buy their &lt;/em&gt;&lt;a href="http://www.wdc.com/en/products/Products.asp?DriveID=347" target="_blank"&gt;&lt;em&gt;1TB My Book World Edition&lt;/em&gt;&lt;/a&gt; - it very kindly &lt;a href="http://www.theregister.co.uk/2007/12/07/western_digital_drm_crippled_harddrive/" target="_blank"&gt;refuses to share&lt;/a&gt; any music or video files. So if I wanted to, for example, use it to share the video I took of my sister-in-law's wedding, or of a friend's new-born baby; or if (God forbid!) that I got into &lt;a href="http://en.wikipedia.org/wiki/Podcasting" target="_blank"&gt;podcasting&lt;/a&gt; - none of these files that I created could be shared by this device, even on my own private network between my own computers.&lt;/p&gt; &lt;p&gt;Welcome to the wonderful world of &lt;a href="http://en.wikipedia.org/wiki/Defective_by_Design" target="_blank"&gt;DRM&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-4295834081026800212?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/4295834081026800212/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=4295834081026800212' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/4295834081026800212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/4295834081026800212'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2008/03/external-hard-drives.html' title='External hard drives'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-3713702946251114605</id><published>2008-03-19T22:59:00.001+11:00</published><updated>2008-03-19T22:59:40.622+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><title type='text'>No, I will not fix your computer</title><content type='html'>&lt;p&gt;Being known within my circle of acquaintances as a geek tragic, I am usually the first port of call when something goes wrong. I think anyone who can tell one end of a SATA cable from the other knows exactly what I'm talking about - it means spending Sunday evening trying to sort out Uncle Bob's email problems when you could be watching Battlestar Galactica.&lt;/p&gt;  &lt;p&gt;What strikes me every time is that I have yet to see &lt;em&gt;anyone&lt;/em&gt; running backups on their computers when I fix them. At home, my laptop gets backed up twice, once to an external hard disk using &lt;a href="http://www.acronis.com.au/homecomputing/products/trueimage/" target="_blank"&gt;Acronis True Image 11&lt;/a&gt;, and then again to my &lt;a href="http://www.microsoft.com/windows/products/winfamily/windowshomeserver/default.mspx" target="_blank"&gt;Windows Home Server&lt;/a&gt;, which also takes care of all the other computers in the home (currently two media centres and two other laptops). The former backup gets done when I feel like it, the latter gets done every night. Two backups may seem a little paranoid, but I take a lot of photos, and would not like to lose 10 years of data to a crashed hard disk.&lt;/p&gt;  &lt;p&gt;It's not expensive - these days, a 500Gb hard drive with an external enclosure and the aforementioned Acronis software costs less than AU$200. Backup can be automated, and restoring is incredibly easy. They're also usually contain tools allowing you to upgrade hard drives and migrate to new computers.&lt;/p&gt;  &lt;p&gt;So, I've just made a new resolution. People who call me out also get the benefit of a small lecture on the need to run backups. I might even prepare a little hand-out detailing just how to set it all up, and would probably do it all for them at cost.&lt;/p&gt;  &lt;p&gt;If they ignore my advice though, the best they'll get from me is a shoulder to cry on. &lt;a href="http://www.thinkgeek.com/tshirts/frustrations/388b/" target="_blank"&gt;Friends, you've been warned&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-3713702946251114605?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/3713702946251114605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=3713702946251114605' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/3713702946251114605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/3713702946251114605'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2008/03/no-i-will-not-fix-your-computer.html' title='No, I will not fix your computer'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-1765261208534472645</id><published>2008-03-17T14:45:00.001+11:00</published><updated>2008-03-17T14:45:50.980+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><title type='text'>Updates to SvnRevisionLabeller</title><content type='html'>&lt;p&gt;It's a been a while since I uploaded my SvnRevisionLabeller code to the &lt;a href="http://ccnet.thoughtworks.com" target="_blank"&gt;CruiseControl.NET&lt;/a&gt; &lt;a href="http://confluence.public.thoughtworks.org/display/CCNETCOMM/Contributions" target="_blank"&gt;community site&lt;/a&gt;. If you don't know what it does, it allows you to label your Continuous Integration builds with the Subversion revision that they were built from. If you still don't know what it does, I suggest you stop reading now...&lt;/p&gt; &lt;p&gt;I wrote this plugin because it was useful for me, and seeing as CC.NET is a useful piece of Open Source software, I decided to contribute back to the community. I have no idea how many people use it, but I know the number must be greater than four, because three other people have emailed me with bug fixes and enhancements.&lt;/p&gt; &lt;p&gt;With these changes coming through, I decided that it was time to move away from the traditional source control known as a zip file buried somewhere in my email archives. Seeing as I'm currently going through a Google love-in, I &lt;a href="http://code.google.com/p/svnrevisionlabeller/" target="_blank"&gt;uploaded it to Google Code&lt;/a&gt;, which appropriately enough means I have my code under SVN revision control.&lt;/p&gt; &lt;p&gt;On a similar note, my other contributions to the Open Source community, at least that part of the community that develops using .NET, is a GuidTask for &lt;a href="http://nantcontrib.sourceforge.net" target="_blank"&gt;NAntContrib&lt;/a&gt;, but the process for adding code there seems to be a lot more obtuse than Thoughtworks', so at the moment it doesn't appear in the code anyway; but at least I have it on my servers.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-1765261208534472645?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/1765261208534472645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=1765261208534472645' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/1765261208534472645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/1765261208534472645'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2008/03/updates-to-svnrevisionlabeller.html' title='Updates to SvnRevisionLabeller'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-4756938498186887727</id><published>2008-02-25T11:50:00.002+11:00</published><updated>2008-02-25T12:59:24.643+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photography'/><category scheme='http://www.blogger.com/atom/ns#' term='boats'/><title type='text'>I like big boats (and I cannot lie)</title><content type='html'>&lt;p&gt;Like most of Sydney this weekend, I made the journey into the centre of town &lt;a href="http://www.smh.com.au/news/travel/city-bows-to-dancing-queens/2008/02/24/1203788147682.html" target="_blank"&gt;to catch the big show&lt;/a&gt;. Having no interest in the football, the cricket, Soundwave or Mardi Gras, I was there to see the arrival of Cunard's latest new toy, the Queen Victoria.&lt;/p&gt;&lt;p&gt;&lt;a title="Sydney Opera House" href="http://www.flickr.com/photos/84306903@N00/2289375836/"&gt;&lt;img height="296" alt="Sydney Opera House at dawn" src="http://static.flickr.com/3049/2289375836_4cac2f9f87.jpg" width="425" border="0" /&gt;&lt;/a&gt;&lt;a title="Queen Victoria in Sydney Harbour" href="http://www.flickr.com/photos/84306903@N00/2288589799/"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Fortunately, unlike most of Sydney, I went on Saturday morning, and more specifically, before dawn to catch Queen Victoria's arrival at Circular Quay. That meant a nice clear run down the M2 and over the Harbour Bridge, and a parking spot at Dawes Point (usually as rare as hen's teeth), just as the first light of day appeared over the horizon. This gave me about twenty minutes to take some atmosphere photos, mainly of the Opera House, as there were too many numpties standing in the way to take a good photo of the Harbour Bridge, before Queen Victoria rounded the headland and began final approach.&lt;/p&gt;&lt;p&gt;&lt;a title="Queen Victoria in Sydney Harbour" href="http://www.flickr.com/photos/84306903@N00/2288589799/"&gt;&lt;img height="294" alt="Queen Victoria in Sydney Harbour" src="http://static.flickr.com/2094/2288589799_6971c317de.jpg" width="425" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The 90000 tonne floating skyscraper was moored up alongside Circular Quay with impressive speed, and with the sun now fully risen and my first memory card full of pictures, I headed round to the Opera House for more pictures and a well-deserved breakfast.&lt;/p&gt;&lt;p&gt;&lt;a title="Comparative Sizes" href="http://www.flickr.com/photos/84306903@N00/2288598179/"&gt;&lt;img height="253" alt="Comparative Sizes" src="http://static.flickr.com/2419/2288598179_bb42878f2c.jpg" width="425" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;In the excitement of taking this photo, I managed to dump most of my latté into my camera bag. After a lengthy clean-up operation, which left my bag suspiciously coffee-scented, albeit dry enough to pack everything into again, I headed back round the harbour to Dawes Point, and back home; and all before most people had got out of bed.&lt;/p&gt;&lt;p&gt;&lt;a title="Sydney Icons" href="http://www.flickr.com/photos/84306903@N00/2288600043/"&gt;&lt;img height="251" alt="Sydney Icons" src="http://static.flickr.com/2168/2288600043_f924a72326.jpg" width="425" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;This next picture is &lt;a href="http://damana.blogspot.com/2008/02/queen-victoria-has-big-butt.html" target="_blank"&gt;for Damana&lt;/a&gt;, who sadly didn't make our predawn rendezvous, although she did come down later on.&lt;/p&gt;&lt;p&gt;&lt;a title="Just Fits" href="http://www.flickr.com/photos/84306903@N00/2288601625/"&gt;&lt;img height="286" alt="Just Fits" src="http://static.flickr.com/2108/2288601625_4777fde56b.jpg" width="425" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;P.S. Sorry about the title - it's a vague allusion to one of my &lt;a href="http://icanhascheezburger.com/2008/02/08/funny-pictures-and-i-can-not-lie/" target="_blank"&gt;favourite&lt;/a&gt; &lt;a href="http://icanhascheezburger.com/2008/02/08/funny-pictures-nutz-and-i-can-not-lie/" target="_blank"&gt;websites&lt;/a&gt;, as well as nod to Damana's post above.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-4756938498186887727?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/4756938498186887727/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=4756938498186887727' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/4756938498186887727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/4756938498186887727'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2008/02/i-like-big-boats-and-i-cannot-lie.html' title='I like big boats (and I cannot lie)'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-4459960182730897203</id><published>2008-02-08T14:05:00.001+11:00</published><updated>2008-02-08T14:05:15.665+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><title type='text'>Google's Elmer Fudd Edition</title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;a href="http://lh6.google.com/davidkeaveny/R6vG34lfSqI/AAAAAAAAAOQ/sk6As7pWlsQ/81122-big%5B3%5D"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="194" alt="Elmer Fudd and Daffy Duck" src="http://lh5.google.com/davidkeaveny/R6vG6olfSrI/AAAAAAAAAOY/gkpAZ3tCDGM/81122-big_thumb%5B1%5D" width="244" align="left" border="0"&gt;&lt;/a&gt; While Googling for &lt;a href="http://davidkeaveny.blogspot.com/2008/02/geek-goes-luddite.html" target="_blank"&gt;something to say about Elmer Fudd&lt;/a&gt;, I discovered that Google maintains an Elmer-ised version of their &lt;a href="http://www.google.com/intl/xx-elmer/" target="_blank"&gt;own search page&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;I still can't help think that this is one of the things that set Microsoft and Google apart, no matter how much Microsoft tries to beat Google - people at Google have a sense of humour, whereas any such creativity at Microsoft appears to be squashed under layers of corporate management, blandness, and established branding. Maybe in a million years, it will be mined as a valuable natural resource, but until then, I don't see &lt;a href="www.live.com" target="_blank"&gt;Live.com&lt;/a&gt; &lt;a href="tp://news.smh.com.au/microsoft-unveils-bid-for-yahoo-at-446-bln/20080201-1pmh.html" target="_blank"&gt;replacing Google&lt;/a&gt; as the search engine of choice.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-4459960182730897203?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/4459960182730897203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=4459960182730897203' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/4459960182730897203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/4459960182730897203'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2008/02/google-elmer-fudd-edition.html' title='Google&amp;#39;s Elmer Fudd Edition'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-6811873612297491754</id><published>2008-02-08T12:02:00.001+11:00</published><updated>2008-02-08T12:02:04.113+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><title type='text'>Geek Goes Luddite</title><content type='html'>&lt;p&gt;Don't worry, I'm not going to be burning my keyboard; but that badly-expressed metaphor does lead nicely into my thought for the day - what is the point, for the average computer user, of speech recognition systems?&lt;/p&gt; &lt;p&gt;I'm sure there's a market for all those developers and typists who have sacrificed their wrist tendons at the 104-key altar, but this isn't a post for them.&lt;/p&gt; &lt;p&gt;As seductive as the image portrayed by Star Trek of talking to your computer is to the average geek (although it only seems to be Captain Picard who gets the voice recognition systems, everyone else still seems to get keyboards), there are a few warning signs:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;every time Intel brings out a new super powerful processor, pundits proclaim that this is the one that will make speech recognition a practicality (yay for alliteration!). They've been doing this since the first generation Pentiums and are still doing it, so a pinch of salt is needed;&lt;/li&gt; &lt;li&gt;Optus customer support. OK, so not the most obvious reason, but if you've ever had the misfortune of having to get help from Optus, you'll know the pain of their voice recognition menu systems. I have few problems with using menu-driven destination selection when the menu is driven by your phone's keypad, but trying to tell the system which option you want is an exercise in futility. Optus refuses to understand my very English accent, and the only way I can get it to recognise me more than 20% of the time is to speak like &lt;a href="http://en.wikipedia.org/wiki/Elmer_Fudd" target="_blank"&gt;Elmer Fudd&lt;/a&gt;, "vewwy vewwy swowy" and with the same accent. It's so embarrassing, I have to hide myself away even from my own family, just so I can complain about my busted bandwidth cap;&lt;/li&gt; &lt;li&gt;Imagine a typical office. Now imagine 20-odd users (not 20 odd users), all trying to tell their computers what to do. Can you hear yourself think? It'll sound more like the local pub at 7pm.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;So when I see &lt;a href="http://www.smh.com.au/news/reviews/dictators-joy/2008/02/06/1202090429161.html" target="_blank"&gt;yet another pronouncement&lt;/a&gt; that speech recognition is ready for the masses, I shake my head, and keep my mouth shut.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-6811873612297491754?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/6811873612297491754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=6811873612297491754' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/6811873612297491754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/6811873612297491754'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2008/02/geek-goes-luddite.html' title='Geek Goes Luddite'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-6585248947288882051</id><published>2008-01-30T23:14:00.001+11:00</published><updated>2008-01-30T23:14:46.614+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='meme'/><title type='text'>Album Cover</title><content type='html'>&lt;p&gt;Never to let a &lt;a href="http://plasmasturm.org/log/490/" target="_blank"&gt;good meme&lt;/a&gt; go to waste, I've taken up &lt;a href="http://damana.blogspot.com/2008/01/my-new-album.html" target="_blank"&gt;Damana's challenge&lt;/a&gt; to produce my own album cover.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.google.com/davidkeaveny/R6BqMolfShI/AAAAAAAAANo/jFBhj9deuao/album_cover%5B4%5D"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="304" alt="Imaginary album cover" src="http://lh5.google.com/davidkeaveny/R6BqNYlfSiI/AAAAAAAAANw/dgODL3ijXsQ/album_cover_thumb%5B2%5D" width="304" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Here's the &lt;a href="http://en.wikipedia.org/wiki/Tom_Knight" target="_blank"&gt;band name&lt;/a&gt;, the &lt;a href="http://www.quotationspage.com/quote/33462.html" target="_blank"&gt;album title&lt;/a&gt;, and the &lt;a href="http://www.flickr.com/photos/fotoflippr/2222327337/" target="_blank"&gt;album art&lt;/a&gt;. I think it works rather well!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-6585248947288882051?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/6585248947288882051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=6585248947288882051' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/6585248947288882051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/6585248947288882051'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2008/01/album-cover.html' title='Album Cover'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-6405409283517106342</id><published>2008-01-25T09:41:00.001+11:00</published><updated>2008-01-25T09:44:39.964+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='mediacentre'/><title type='text'>Seagate's Power-Hungry Woes</title><content type='html'>&lt;p&gt;Not too long ago I bought a Seagate 250Gb 2.5" SATA2 notebook drive, intending to use it as an external hard drive in a USB2 enclosure - very handy for backups and lots of portable storage in a case that will fit in your pocket.&lt;/p&gt; &lt;p&gt;Unfortunately, Seagate's drives appear to be &lt;a href="http://www.macintouch.com/readerreports/harddrives/topic4091.html" target="_blank"&gt;notoriously power-hungry&lt;/a&gt; when spinning up, drawing up to twice the current that other brands use. This means that the drive is completely useless when drawing its power from the USB bus - you'll need an external power supply to keep it stable.&lt;/p&gt; &lt;p&gt;For me, this means it'll go into one of my HTPCs; my Vista Media Centre is about to be upgraded to have run off a RAID 0 array of Seagate 160Gb 2.5" SATA2 drives, so I guess this one will go into the XP Media Centre. Hopefully it will contribute to reducing the amount of noise from the system. (Oh, and my laptop runs off a Seagate 160Gb 7200rpm SATA2 drive. Notice a pattern emerging?)&lt;/p&gt; &lt;p&gt;So, you have been warned. If you want to use a notebook hard drive in a portable enclosure, don't buy Seagate.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-6405409283517106342?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/6405409283517106342/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=6405409283517106342' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/6405409283517106342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/6405409283517106342'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2008/01/seagate-power-hungry-woes.html' title='Seagate&apos;s Power-Hungry Woes'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-8624700311286796866</id><published>2008-01-25T00:56:00.001+11:00</published><updated>2008-01-25T00:56:55.636+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='photography'/><title type='text'>The Trouble With Sharing Photographs Online</title><content type='html'>&lt;p&gt;&lt;a title="Platypus #1" href="http://www.flickr.com/photos/84306903@N00/2215800089/"&gt;&lt;img style="margin: 0px 10px 0px 0px" alt="Duck-Billed Platypus, spotted while on holiday in Tasmania" src="http://static.flickr.com/2028/2215800089_473fdabbd1_m.jpg" align="left" border="0" /&gt;&lt;/a&gt;Having recently spent several weeks processing a few hundred photos taken while on holiday in Tasmania, I then spent most of another evening uploading them to the Internet. The trouble was, where should I upload them too?&lt;/p&gt;  &lt;p&gt;Top of the list is &lt;a href="http://www.flickr.com" target="_blank"&gt;Flickr&lt;/a&gt;. I have it listed to the right, and I can upload a lot of photos there and generally network with other people who love photography.&lt;/p&gt;  &lt;p&gt;Then there's &lt;a href="http://www.facebook.com" target="_blank"&gt;Facebook&lt;/a&gt;; this one's more for my friends, as they nearly all have FB accounts these days, and the notifications when photos are uploaded help encourage them to come and have a look-see.&lt;/p&gt;  &lt;p&gt;Finally there is &lt;a href="http://www.ringo.com" target="_blank"&gt;Ringo&lt;/a&gt;. Not as high-profile as the above two, but a lot of people I know in the church are on it, and again it's good for keeping people updated when new photos come in - an ecclesiastical Facebook, if you will.&lt;/p&gt;  &lt;p&gt;So the problem is threefold - firstly, choosing which photos to upload to which site; secondly, the time/bandwidth necessary to upload the photos to the site; and thirdly, and the biggest killer, the time necessary to tag and identify the photos. Flickr is the easiest, as &lt;a href="http://regex.info/blog/" target="_blank"&gt;Jeffrey Friedl&lt;/a&gt;'s &lt;a href="http://davidkeaveny.blogspot.com/2007/11/integrating-flickr-with-lightroom.html" target="_blank"&gt;Export-to-Flickr plug-in&lt;/a&gt; for Lightroom will set tags, title and description from metadata already entered in Lightroom. Facebook can manage dates extracted from the EXIF data embedded in the photo by the camera, while Ringo can't manage anything.&lt;/p&gt;  &lt;p&gt;I haven't mentioned the Kodak Gallery nor Picasa, since I don't use them for storage, although I have friends who do. So there's two more photo sharing sites to check out from time-to-time.&lt;/p&gt;  &lt;p&gt;Isn't it about time someone started rationalising a few of these sites? Having so many sites to upload to, or to keep up-to-date with is not an easy job, especially when the site makes you key in your data all over again.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-8624700311286796866?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/8624700311286796866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=8624700311286796866' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/8624700311286796866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/8624700311286796866'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2008/01/trouble-with-sharing-photographs-online.html' title='The Trouble With Sharing Photographs Online'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-7952585215606547667</id><published>2008-01-19T10:20:00.001+11:00</published><updated>2008-01-19T10:20:04.720+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='photography'/><category scheme='http://www.blogger.com/atom/ns#' term='lightroom'/><title type='text'>Lightroom 2.0 Request List</title><content type='html'>&lt;p&gt;Scott Kelby is putting together a &lt;a href="http://www.scottkelby.com/blog/2008/archives/932" target="_blank"&gt;feature request list&lt;/a&gt; for the next version of Adobe's fantastic &lt;a href="http://www.adobe.com/products/photoshoplightroom/" target="_blank"&gt;Lightroom&lt;/a&gt; product, based on user feedback from the many training sessions he runs.&lt;/p&gt;  &lt;p&gt;Based on my experiences with Lightroom since Beta 2, my two requests are:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Better management tools for keywords - dragging and dropping keywords into a category is OK to start with, but when your list starts getting long, management gets really difficult.&lt;/li&gt;    &lt;li&gt;Slideshow DVD authoring - as Scott points out, even consumer-level tools like &lt;a href="http://www.apple.com/ilife/iphoto/" target="_blank"&gt;iPhoto&lt;/a&gt; do a better job of slideshow generation, and Lightroom is supposed to be a tool for professional photographers. Even Lightroom's nearest direct competitor, &lt;a href="http://www.apple.com/aperture/" target="_blank"&gt;Aperture&lt;/a&gt;, does a better job.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;I did consider adding panoramic picture generation, but I'm still in to two minds as to whether it belongs in Lightroom or not. Others have requested it, though, so that base is at least covered.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-7952585215606547667?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/7952585215606547667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=7952585215606547667' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/7952585215606547667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/7952585215606547667'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2008/01/lightroom-20-request-list.html' title='Lightroom 2.0 Request List'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-6982429976507199797</id><published>2008-01-16T01:30:00.001+11:00</published><updated>2008-01-16T01:30:55.300+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><title type='text'>Computer Generated Crowds</title><content type='html'>&lt;p&gt;One of the reasons for the success of films such as the &lt;a href="http://www.imdb.com/title/tt0120737/" target="_blank"&gt;Lord of the Rings&lt;/a&gt; &lt;a href="http://www.imdb.com/title/tt0167261/" target="_blank"&gt;trilogy&lt;/a&gt; is the relentless onslaught of technological progress allowing intense battle scenes featuring thousands of characters to be filmed with hundreds or even dozens of extras. The days of films such as Gandhi using in excess of 100000 extras for a scene are consigned to the same bin as men in rubber suits pretending to be Tokyo-saving lizards.&lt;/p&gt;  &lt;p&gt;Barely 5 years since the &lt;a href="http://www.imdb.com/title/tt0167260/" target="_blank"&gt;Return of the King&lt;/a&gt; hit the big screen, and that technology has already filtered down into the hands of the little guy. Or in this specific case, four guys armed with a video camera, some World War 2 uniforms and four days on &lt;a href="http://en.wikipedia.org/wiki/Omaha_Beach" target="_blank"&gt;Omaha Beach&lt;/a&gt;. Throw in some explosives, a green screen, and some time behind the computer, and you have a film that would have cost Steven Spielberg millions to shoot. Just awesome.&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:3b232585-9a7f-4ef1-9585-e3c86a4251ba" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;div&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/WRS9cpOMYv0&amp;amp;rel=1&amp;amp;border=1"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/WRS9cpOMYv0&amp;amp;rel=1&amp;amp;border=1" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-6982429976507199797?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/6982429976507199797/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=6982429976507199797' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/6982429976507199797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/6982429976507199797'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2008/01/computer-generated-crowds.html' title='Computer Generated Crowds'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-8968774385445772867</id><published>2008-01-09T16:03:00.001+11:00</published><updated>2008-01-09T16:03:18.874+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Certified again</title><content type='html'>&lt;p&gt;Having completed a Microsoft certification &lt;a href="http://davidkeaveny.blogspot.com/2007/12/certifiable.html" target="_blank"&gt;just before Christmas&lt;/a&gt;, I've added another to my collection (&lt;a href="http://www.microsoft.com/learning/exams/70-528.mspx"&gt;Microsoft .NET Framework 2.0 - Web-Based Client Development&lt;/a&gt;). This now makes me a Technical Specialist, and &lt;a href="http://www.microsoft.com/learning/exams/70-547.mspx" target="_blank"&gt;one small step&lt;/a&gt; away from the lofty heights of being a certified &lt;a href="http://www.microsoft.com/learning/mcp/mcpd/webdev/default.mspx" target="_blank"&gt;Professional Developer&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The world is truly my oyster, and the $$ signs are already going up before my eyes...&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-8968774385445772867?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/8968774385445772867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=8968774385445772867' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/8968774385445772867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/8968774385445772867'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2008/01/certified-again.html' title='Certified again'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-1653545040300971032</id><published>2008-01-07T22:05:00.001+11:00</published><updated>2008-01-07T22:05:28.176+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><title type='text'>Round and round we go</title><content type='html'>&lt;p&gt;Damana has been &lt;a href="http://geekdamana.blogspot.com/2008/01/blogging-about-meta-blogging.html" target="_blank"&gt;blogging about meta blogging&lt;/a&gt; - the way most blog entries these days seem to be referring to what somebody else has been blogging about.&lt;/p&gt;  &lt;p&gt;Having just proved her point, I thought I'd add an AOL-style &amp;quot;me too&amp;quot;; quite a few of the tech news sites I follow with RSS are feed aggregators; I get quite tired of playing &amp;quot;follow-the-link&amp;quot; to try and find the original article.&lt;/p&gt;  &lt;p&gt;It also leads to feeds being saturated with nearly identical posts when a significant (at least, significant from the very narrow viewpoint of the community) event occurs. Best time to witness this effect is barely a week away, when Apple will raise their skirts to reveal their latest shiny toys. You'll suddenly find your aggregator full of posts referring to the same announcement, some of them indirectly as Damana contends above. You might as well just click on one randomly and have done with it.&lt;/p&gt;  &lt;p&gt;P.S. Props to Damana for not completely embarrassing herself with Martin Fowler :-)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-1653545040300971032?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/1653545040300971032/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=1653545040300971032' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/1653545040300971032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/1653545040300971032'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2008/01/round-and-round-we-go.html' title='Round and round we go'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-2969632566996011401</id><published>2007-12-19T21:32:00.001+11:00</published><updated>2007-12-19T21:32:01.733+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Certifiable</title><content type='html'>&lt;p&gt;I'm back on the Microsoft certification treadmill again; my original qualification was an MCSE back in the days when Windows NT 4 was putting the moves on Novell Netware. In the interests of getting my career moving in a forwards direction, I've started doing the exams again.&lt;/p&gt;  &lt;p&gt;This afternoon was the snappily-titled &lt;a href="http://www.microsoft.com/learning/exams/70-536.mspx" target="_blank"&gt;Microsoft .NET Framework 2.0 - Application Development Foundation&lt;/a&gt; exam. I didn't do myself any favours by forgetting the date of the exam - I was just sitting down to some tasty sashimi with &lt;a href="http://j00ster.blogspot.com/" target="_blank"&gt;Mei&lt;/a&gt; when my phone hopefully chimed in to remind me that I had 30 minutes to go. One quick dash to the nearest internet cafe later, and the exam was rescheduled long enough for me to finish my beef teriyaki.&lt;/p&gt;  &lt;p&gt;My practice exams had not been encouraging, as they indicated that I would be tested on a whole lot of esoterica that I don't use on a daily basis. Fortunately the revision exams pushed me in the right direction, so I was able to pass, although I had to sweat for it. Next up (some time in January) is the equally titularly-challenged &lt;a href="http://www.microsoft.com/learning/exams/70-528.mspx" target="_blank"&gt;Microsoft .NET Framework 2.0 - Web-Based Client Development&lt;/a&gt;, after which I will apparently be considered to be a &lt;a href="http://www.microsoft.com/learning/mcp/mcts/webapps/default.mspx" target="_blank"&gt;Technical Specialist&lt;/a&gt;. Just one small step on my way to world domination...&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-2969632566996011401?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/2969632566996011401/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=2969632566996011401' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/2969632566996011401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/2969632566996011401'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2007/12/certifiable.html' title='Certifiable'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-7903234209292381161</id><published>2007-12-05T10:50:00.001+11:00</published><updated>2007-12-05T10:50:07.230+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>You know it's going to be one of those days...</title><content type='html'>&lt;p&gt;... when your build server suddenly drops off the network. After a little investigation, you discover that it was unplugged by someone who had started working at the desk where the server was, who very kindly unplugged it and moved it halfway across the building to where they used to sit, and then left it unplugged and switched off on the floor.&lt;/p&gt; &lt;p&gt;There are two solutions to this:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;stick a big fat red label on the build server warning of the dire consequences associated with even touching the server;  &lt;li&gt;get a proper server installed in the datacenter, rather than an ageing PC that masquerades as a server, at what at the time was an empty desk.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Care to guess which solution we will be going for?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-7903234209292381161?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/7903234209292381161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=7903234209292381161' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/7903234209292381161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/7903234209292381161'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2007/12/you-know-it-going-to-be-one-of-those.html' title='You know it&amp;#39;s going to be one of those days...'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-769185682861009046</id><published>2007-11-24T20:39:00.001+11:00</published><updated>2008-01-25T09:51:02.235+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='photography'/><category scheme='http://www.blogger.com/atom/ns#' term='flickr'/><category scheme='http://www.blogger.com/atom/ns#' term='lightroom'/><title type='text'>Integrating Flickr with Lightroom</title><content type='html'>&lt;p&gt;I've long been a &lt;a title="My Flickr site" href="http://www.flickr.com/photos/davidkeaveny/" target="_blank"&gt;Flickr fan&lt;/a&gt;, and more recently, a firm &lt;a href="http://davidkeaveny.blogspot.com/2007/11/lightroom-to-rescue.html" target="_blank"&gt;Adobe Lightroom&lt;/a&gt; fan. With the recent release of version 1.3 of Lightroom, Adobe has started opening it up to third-party developers, and Jeffrey Friedl has &lt;a href="http://regex.info/blog/photo-tech/lightroom-flickr/" target="_blank"&gt;put two and two together&lt;/a&gt;, creating what is sure to be a very popular plug-in, allowing you to export directly from Lightroom to Flickr.&lt;/p&gt;  &lt;p&gt;I haven't upgraded from version 1.2 yet, but I will do very shortly. One of the big annoyances for me is tagging all my photos carefully in Lightroom, then having to tag them all over again in Flickr. Hopefully, this plug-in will automatically copy them over, as well as saving me the trouble of wading through Explorer looking for photos to upload.&lt;/p&gt; &lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;UPDATE&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;: the good news it that it does, as well as other metadata. The Title and Description fields can be populated from several different ITPC fields in Lightroom (selectable in the plug-in), and the tags are all copied over. Now, I wonder if you can have a tag-exclusion list (so, for example, I could add a tag in Lightroom to indicate that the photo had been uploaded to Flickr, then if I wanted to re-upload it, that tag wouldn't get uploaded too).&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-769185682861009046?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/769185682861009046/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=769185682861009046' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/769185682861009046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/769185682861009046'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2007/11/integrating-flickr-with-lightroom.html' title='Integrating Flickr with Lightroom'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-3042374307609400112</id><published>2007-11-09T13:37:00.000+11:00</published><updated>2007-11-09T13:38:33.415+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='education'/><title type='text'>Blog readability</title><content type='html'>&lt;p&gt;For those who like to maintain that they did actually receive some form of  education in their lives, why not run &lt;a href="http://www.criticsrant.com/bb/reading_level.aspx" target="_blank"&gt;The Blog  Readability Test&lt;/a&gt; over your blog? It analyses your blogging style, and then  gives you a rating based on the quality of your vocabulary and grammar - at  least, that's what one would rather assume it does, the tool doesn't explicitly  to do that. It could be plucking numbers out of thin air as far as I could  tell.&lt;/p&gt; &lt;p&gt;Anyway, if you're wondering whether your blogging style is more suited to  MySpace and LiveJournal than to Wordpress or Blogspot, give it a go. For those  who really like a bit of self-validation, you can then add an image link on your  blog, although beware that the site does use the image for a bit of advertising  as well.&lt;/p&gt; &lt;p&gt;Apparently I write at undergraduate level. I'm not too sure if I should be  happy with that or not though.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-3042374307609400112?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/3042374307609400112/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=3042374307609400112' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/3042374307609400112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/3042374307609400112'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2007/11/blog-readability.html' title='Blog readability'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-3488100524455416251</id><published>2007-11-03T22:20:00.001+11:00</published><updated>2007-11-03T22:20:06.527+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='weddings'/><category scheme='http://www.blogger.com/atom/ns#' term='photography'/><title type='text'>Lightroom to the rescue!</title><content type='html'>&lt;p&gt;The other weekend I was doing photography for a couple in the church, and what with one shooting photos inside and outside in rapid succession, I eventually ended up with a bunch of photos that were horribly overexposed.&lt;/p&gt;  &lt;p&gt;&lt;a title="Overexposed" href="http://www.flickr.com/photos/84306903@N00/1840838938/"&gt;&lt;img height="270" alt="A horribly overexposed photo of some very nice young ladies" src="http://static.flickr.com/2009/1840838938_902f0740dc.jpg" width="400" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Fortunately, I use &lt;a href="http://www.adobe.com/products/photoshoplightroom/" target="_blank"&gt;Adobe Lightroom&lt;/a&gt;, which works really well with my Canon EOS30D's RAW file format. RAW files store the data directly off the camera's sensor, unlike JPEG, which throws away large chunks of it to keep file sizes down. Lightroom can access all that data, and rescue many an otherwise-ruined picture; here's what 60 seconds in Lightroom will do for you.&lt;/p&gt;  &lt;p&gt;&lt;a title="IMG_8864-2" href="http://www.flickr.com/photos/84306903@N00/1840879550/"&gt;&lt;img height="270" alt="A little bit of tweaking in Lightroom later, and most of the colour is restored" src="http://static.flickr.com/2299/1840879550_c0b227ef71.jpg" width="400" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Of course, it's not perfect - the bridesmaids' dresses were actually a pale green, but the picture was too overexposed to rescue that. The solution there would be to paint the colour back in using Photoshop, but since I can't afford the scandalous markup that products sold in Australia attract...&lt;/p&gt;  &lt;p&gt;The moral of this story (other than checking settings before a shot and then checking the result afterwards) - if you use a DSLR, use RAW &lt;u&gt;always&lt;/u&gt;.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-3488100524455416251?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/3488100524455416251/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=3488100524455416251' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/3488100524455416251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/3488100524455416251'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2007/11/lightroom-to-rescue.html' title='Lightroom to the rescue!'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-8218837471507211813</id><published>2007-11-01T11:14:00.001+11:00</published><updated>2007-11-01T11:14:47.601+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><title type='text'>Return to the IT Dark Ages</title><content type='html'>&lt;p&gt;Last year I bought an &lt;a href="http://au.lge.com/md/product/prodcategorylist.do?actType=detail&amp;amp;currPage=1&amp;amp;categoryId=1000000198&amp;amp;parentCategoryId=0200000603&amp;amp;categoryLevel=4&amp;amp;productId=1100000873" target="_blank"&gt;LG S1 Express&lt;/a&gt; laptop, which at the time was about as top-of-the-line as you could buy in Australia. Of course, shortly after, Intel came out with the Core 2 Duo, which immediately put me a generation behind, but never mind.&lt;/p&gt;  &lt;p&gt;For the last few months, I've been bumping against the limits of its 100Gb hard drive, and what with holidays overseas and the opening of the wedding photography season, I decided it was time to upgrade to a bigger hard drive.&lt;/p&gt;  &lt;p&gt;I picked up a 250Gb model from &lt;a href="http://www.mwave.com.au" target="_blank"&gt;MWave&lt;/a&gt;, did a full system backup, swapped in the new drive, and restored the backup onto the new drive. So far, so flawless. However, when I started up, I noticed that I was missing some 100Gb of disk space.&lt;/p&gt;  &lt;p&gt;Incredible though it may seem to anyone who's into computers, but top-end laptops in 1996 still seem to have 32-bit addressing issues, so the laptop won't recognise more than 137Gb. Just to rub extra salt into the wound, LG have no plans to add 48-bit addressing to the BIOS (and in fact, &lt;a href="http://forum.notebookreview.com/showthread.php?t=131605" target="_blank"&gt;from the forums&lt;/a&gt;, LG just don't do BIOS upgrades - way to provide service, guys).&lt;/p&gt;  &lt;p&gt;These laptops are very nice to use and to look at. Just don't buy one if you think you'll ever need to upgrade the hard drive.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-8218837471507211813?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/8218837471507211813/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=8218837471507211813' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/8218837471507211813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/8218837471507211813'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2007/11/return-to-it-dark-ages.html' title='Return to the IT Dark Ages'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-106223257341574727</id><published>2007-10-28T20:45:00.001+11:00</published><updated>2007-10-28T20:45:13.814+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='holidays'/><category scheme='http://www.blogger.com/atom/ns#' term='japan'/><title type='text'>Days #15 and #16 - Homeward bound</title><content type='html'>&lt;p&gt;Having been beaten by the weather in our quest to see Mount Fuji, we spent our last few hours in Hakone in the toy museum. Lauren whizzed through the museum very quickly, showing little interest until I pointed out the Playstation 2 set up with a port of Galaxians, after which she was, of course, hooked.&lt;/p&gt;  &lt;p&gt;We got back to Tokyo without any dramas, and spent the remaining hours of daylight wandering out Shinjuku once more, firstly in search of a kimono for Emily (she rather baulked at the &amp;#xA5;750000 price tags though), secondly in search of an iPod Touch for me (they were all sold out, and I hadn't thought to jot down the address of the local Apple Store), and thirdly somewhere to have coffee (preferably one which offered soy milk). For once, there wasn't a Starbucks on every corner, so after walking around in circles for an hour or so, we settled for Cafe Espresso, whose sign outside looks suspiciously like Starbucks', at least from a distance.&lt;/p&gt;  &lt;p&gt;After dinner with our hosts, it was time to pack for our flights back to Australia the next day. The only excitement at Narita was trying to get through security - Emily had the usual problems with liquids in bottles (gotta watch out for that highly dangerous exploding soy milk), and for once I had a problem with my camera tripod; then we just had enough time to spend our remaining yen, before getting on the plane.&lt;/p&gt;  &lt;p&gt;This time our stopover in KL was a mere 90 minutes, barely enough time for to find the Starbucks there and to spend the last of our Malaysian currency. I, of course, had to keep away from the many TV sets which would have given the game away as to who won the Chinese Grand Prix.&lt;/p&gt;  &lt;p&gt;Monday morning saw us touching down once more in Sydney - with Monica waiting at the airport to pick us up, I was at work in time for our usual 9:30 meeting. It took a while to get over the urge to bow to everyone in sight - I might have gotten looks...&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-106223257341574727?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/106223257341574727/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=106223257341574727' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/106223257341574727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/106223257341574727'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2007/10/days-15-and-16-homeward-bound.html' title='Days #15 and #16 - Homeward bound'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-8158405881263598072</id><published>2007-10-28T20:27:00.001+11:00</published><updated>2007-10-28T20:27:05.380+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='holidays'/><category scheme='http://www.blogger.com/atom/ns#' term='japan'/><title type='text'>Day #14 - In search of Mount Fuji</title><content type='html'>&lt;p&gt;How hard can it be to spot a 3778m high volcanic cone? That was the question that plagued us on our journey down to Kyoto and back up from Tokushima. Each time, I would get a seat on the north-facing side of the train and sit with camera in hand; and each time, the clouds would descend, the mist would roll in, and Mount Fuji remained obstinately invisible.&lt;/p&gt;  &lt;p&gt;So for our last few days, we thought that we could go to one of the more favoured spots for Fuij-watching, up in the mountains to the west of Tokyo. Hakone is a popular destination for Tokyo's population at the weekends, either because of the views of Fuji, or the large number of hot springs. Most of the hotels have their own private baths fed from these springs, so we thought that it was time for us to strike out on our own and stay in a traditional hotel and experience the pleasures of Japanese bathing.&lt;/p&gt;  &lt;p&gt;&lt;a title="IMG_8498" href="http://www.flickr.com/photos/84306903@N00/1787494960/"&gt;&lt;img style="margin: 0px 10px 0px 0px" alt="View from the cab of the Hakone mountain railway" src="http://static.flickr.com/2065/1787494960_2c2d0ce119_m.jpg" align="left" border="0" /&gt;&lt;/a&gt;The Hikari &lt;em&gt;shinkansen&lt;/em&gt;, charmingly but inaccurately called the Romance Car, took us from Shinjuku as far as Hakone itself; after a quick stop for lunch (and at the only place that we'd been to which actually gave us miso soup - eating out in Japanese restaurants in Sydney, you get the impression that the Japanese have miso soup for breakfast, lunch and dinner every day), we hopped on to our next train, which switchbacked its way up the mountains, gaining some 1000m in elevation before dropping us off at Ohiradai, where our hotel was. &lt;/p&gt;  &lt;p&gt;&lt;a title="IMG_8502" href="http://www.flickr.com/photos/84306903@N00/1787496722/"&gt;&lt;img style="margin: 0px 0px 10px" alt="Hot springs at Owakudani, seen from the cable car" src="http://static.flickr.com/2089/1787496722_f6bf8265b9_m.jpg" align="right" border="0" /&gt;&lt;/a&gt;We dropped off our bags, then hopped back on the train to continue the ride up to Gora, where we changed rides again, getting on to the funicular that runs up to Sounzan, which signals yet another change, this time for a cable car. This then takes you up to Owakudani, where you see the first real indications that you are in hot spring country. You're also supposed to be able to smell the sulphur in the air, but I can't say that it was that noticeable. From here we were also supposed to be able to get our first real view of Mount Fuji, but who would have thought it, Fuji-sama was once more hiding behind the clouds. From Owakudani, the cable car descended a bit to Lake Ashi, and we crossed to the other end on a very kitsch mock pirate ship. If there's a reason for those ships, I'd be interested to know it. With the sun now setting, we continued our quest to use as many forms of transport as possible in one day, and got on the bus back to Hakone, then back on to the mountain train up to Ohiradai and the hotel.&lt;/p&gt;  &lt;p&gt;By now we were quite used to sleeping on &lt;em&gt;tatami&lt;/em&gt; and futons, but this was the first time that I experienced the low ceilings -when it came to dinner time, I had to stoop continually to avoid braining myself on the roof beams. Fortunately I was able to turn those stoops into polite bows to the other guests, so I didn't look too much like a chicken scratching for corn.&lt;/p&gt;  &lt;p&gt;After dinner, it was bathtime. This meant same-sex communal baths, so if you feel embarrassed about being naked in front of strangers, then it's not for you, and you're greatly missing out. As it happened though, I had the male baths at the hotel to myself. The baths themselves are not for washing in - you're supposed to have cleaned up first; instead, you just sit there, enjoying/enduring the heat and whatever company is there. I was worried that I would come out looking like freshly cooked lobster, but actually the water was just about the perfect temperature for me, so I was able to soak in solitude.&lt;/p&gt;  &lt;p&gt;After the baths, there was enough time to watch a few incomprehensible Japanese game shows, then off to bed.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-8158405881263598072?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/8158405881263598072/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=8158405881263598072' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/8158405881263598072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/8158405881263598072'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2007/10/day-14-in-search-of-mount-fuji.html' title='Day #14 - In search of Mount Fuji'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-3168514017670433164</id><published>2007-10-28T17:57:00.001+11:00</published><updated>2007-10-28T17:57:20.505+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tokyo'/><category scheme='http://www.blogger.com/atom/ns#' term='holidays'/><category scheme='http://www.blogger.com/atom/ns#' term='japan'/><title type='text'>Day #13 - House of Mouse</title><content type='html'>&lt;p&gt;One of the secrets of our success on this holiday was bribery; knowing Lauren's predilection for complaining about the food in front of her, we'd promised her a trip to Disneyland Tokyo before we left, if she managed to avoid sulking through every meal because it wasn't chicken nuggets and chips. Well, Lauren managed to deliver (and we managed to get through the whole holiday without having to go near a McDonalds), so it was time for us to deliver.&lt;/p&gt;  &lt;p&gt;&lt;a title="IMG_8440" href="http://www.flickr.com/photos/84306903@N00/1785215289/"&gt;&lt;img style="margin: 0px 10px 0px 0px" alt="IMG_8440" src="http://static.flickr.com/2083/1785215289_f078965a38_m.jpg" align="left" border="0" /&gt;&lt;/a&gt;We thought that going midweek might save us from the usual crowds; if midweek crowds mean queues of 90 minutes for the Haunted House and Space Mountain, I'd hate to think what they're like at the weekend. There's not too much else to say about Disneyland Tokyo - if you've been to one Disneyland, you've been to them all. So here's a picture of Lauren by the Magic Castle, although the magic was partly spoiled by the scaffolding at the front; and quite why the Japanese have to be subjected to Halloween, I don't know.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-3168514017670433164?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/3168514017670433164/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=3168514017670433164' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/3168514017670433164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/3168514017670433164'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2007/10/day-13-house-of-mouse.html' title='Day #13 - House of Mouse'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-3948291631621946528</id><published>2007-10-28T17:31:00.001+11:00</published><updated>2007-10-28T17:31:13.678+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tokyo'/><category scheme='http://www.blogger.com/atom/ns#' term='holidays'/><category scheme='http://www.blogger.com/atom/ns#' term='japan'/><title type='text'>Day #12 - Culture vultures</title><content type='html'>&lt;p&gt;&lt;a title="IMG_8419" href="http://www.flickr.com/photos/84306903@N00/1784175205/"&gt;&lt;img style="margin: 0px 10px 0px 0px" alt="IMG_8419" src="http://static.flickr.com/2298/1784175205_1b872fb329_m.jpg" align="left" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;After the hustle and bustle of Asakusa, we reckoned it was time to go somewhere a bit quieter. We had just about had our fill of shrines, palaces, and castles, so instead we headed to Ueno, and the Tokyo National Museum, the Japanese equivalent of the British Museum, for a day's wander around exhibits of artifacts such as ceramics, weaponry, clothes and art from throughout Japanese history. &lt;/p&gt;  &lt;p&gt;With Rie and Yoshiko once again playing guide and interpreter, we took a stroll through Ueno park, where Lauren and Emily wasted no time in finding the local stray cat population.&lt;/p&gt;  &lt;p&gt;&lt;a title="IMG_8414" href="http://www.flickr.com/photos/84306903@N00/1785020204/"&gt;&lt;img style="margin: 0px 0px 0px 10px" alt="Natural Disaster Evacuation Area" src="http://static.flickr.com/2028/1785020204_42b1b9ba09_m.jpg" align="right" border="0" /&gt;&lt;/a&gt;We did try to get into the local &lt;em&gt;shitamachi&lt;/em&gt; museum, for a look at what Tokyo used to look like before earthquake, fire and the US Air Force destroyed most of it. Unfortunately we got there about 5 minutes before they closed, so they waved us in for a whirlwind wander round, before they politely ushered us out again.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-3948291631621946528?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/3948291631621946528/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=3948291631621946528' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/3948291631621946528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/3948291631621946528'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2007/10/day-12-culture-vultures.html' title='Day #12 - Culture vultures'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-2484722836787428314</id><published>2007-10-27T20:17:00.001+10:00</published><updated>2007-10-27T20:17:02.500+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='shrines'/><category scheme='http://www.blogger.com/atom/ns#' term='tokyo'/><category scheme='http://www.blogger.com/atom/ns#' term='nightlife'/><category scheme='http://www.blogger.com/atom/ns#' term='holidays'/><category scheme='http://www.blogger.com/atom/ns#' term='japan'/><title type='text'>Day #11 - Shinjuku and Asasuka</title><content type='html'>&lt;p&gt;Our first full day in Tokyo began with an initiation into the ways of the public transport system. Packing in with the last of the morning's commuters, we headed out to Shinjuku to meet up with our friend Noriko, who was in Sydney a few months ago. We caught up over coffee and a bit of shopping, then met up with Rie and Yoshiko for lunch, having our first real experience of &lt;em&gt;okonomiykai&lt;/em&gt;, Japanese-style pancakes. &lt;/p&gt;  &lt;p&gt;&lt;a title="IMG_8304" href="http://www.flickr.com/photos/84306903@N00/1757889196/"&gt;&lt;img style="margin: 0px 5px 0px 0px" height="162" alt="Honzonmon gate outside Sensoji" src="http://static.flickr.com/2004/1757889196_dd785644ee.jpg" width="240" align="left" border="0" /&gt;&lt;/a&gt;After lunch, it was back on the trains to Asasuka and the Buddhist shrine of Sensoji, one of the more touristy of Tokyo's sights. The between the outer gate, Kaminarimon, and the main gate, Hozonmon, is packed with stalls set up for tourists, selling fans and sweets and kimonos and ninja suits. Yes, apparently all girls want kimonos and all boys want ninja suits. I'm glad we have a girl...&lt;/p&gt;  &lt;p&gt;&lt;a title="IMG_8331" href="http://www.flickr.com/photos/84306903@N00/1757875802/"&gt;&lt;img style="margin: 0px 0px 0px 5px" alt="Local ladies dolled up for a night on the town" src="http://static.flickr.com/2356/1757875802_a99dda87a8_m.jpg" align="right" border="0" /&gt;&lt;/a&gt;As night fell, the crowds of tourists started to make way for the locals. This group of ladies came out of this shop just as we were passing - one quick introduction and request from Rie later, and they were happily lining up for me. My favourite has to be the lady in black, third from left - notice that while the others were all wearing traditional &lt;em&gt;tabi &lt;/em&gt;and clogs, she was wearing bubblegum pink Converse boots...&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-2484722836787428314?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/2484722836787428314/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=2484722836787428314' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/2484722836787428314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/2484722836787428314'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2007/10/day-11-shinjuku-and-asasuka.html' title='Day #11 - Shinjuku and Asasuka'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-4540418201986520718</id><published>2007-10-14T13:38:00.001+10:00</published><updated>2007-10-14T13:38:44.301+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tokyo'/><category scheme='http://www.blogger.com/atom/ns#' term='holidays'/><category scheme='http://www.blogger.com/atom/ns#' term='japan'/><title type='text'>Day #10 - Tokyo once more</title><content type='html'>&lt;p&gt;Monday saw us back on the &lt;em&gt;shinkansen&lt;/em&gt; again, heading for Tokyo. Lauren managed to bring a few souvenirs with her, in the form of a dozen or more mosquito bites. Emily and I obviously don't taste as good to the &lt;em&gt;ka&lt;/em&gt; palate, as we got away with one or two apiece; and they're vicious-looking so-and-sos.&lt;/p&gt;  &lt;p&gt;We managed to get to Tokyo just in time for the rush hour, so we got a good opportunity to enjoy sitting in traffic, and a brief view of the bright lights of Shinjuku.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-4540418201986520718?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/4540418201986520718/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=4540418201986520718' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/4540418201986520718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/4540418201986520718'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2007/10/day-10-tokyo-once-more.html' title='Day #10 - Tokyo once more'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-432050405848062961</id><published>2007-10-13T23:23:00.001+10:00</published><updated>2007-10-13T23:23:55.555+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dance'/><category scheme='http://www.blogger.com/atom/ns#' term='holidays'/><category scheme='http://www.blogger.com/atom/ns#' term='japan'/><category scheme='http://www.blogger.com/atom/ns#' term='animals'/><title type='text'>Day #9 - Getting on down</title><content type='html'>&lt;p&gt;As with KL, we spent the Sunday morning with the church at the Lord's Table meeting. Lunch afterwards was a question mainly of eating things which we could not identify, fortunately with fairly pleasant results. We then broke out the guitar for a cross-cultural jam session - fortunately, the Japanese can read English a whole lot better than we can read Japanese.&lt;/p&gt;  &lt;p&gt;After lunch and the obligatory photo-call, we wandered round the local zoo, which was rather small, with a number of rather morose inhabitants, of which the reindeer looked the least happy with his plight. &lt;a href="http://lh4.google.com/davidkeaveny/RxDG3N4zYQI/AAAAAAAAAJQ/DjuvtxFNlGw/IMG_81492.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="164" alt="A monkey. And a squirrel monkey." src="http://lh6.google.com/davidkeaveny/RxDG3t4zYRI/AAAAAAAAAJY/MoZA0DVUFjk/IMG_8149_thumb.jpg" width="244" align="left" border="0" /&gt;&lt;/a&gt;The most interesting section was the monkey house, where we were let right into the home of the squirrel monkeys. They obviously relished the attention, especially from the smaller kids.&lt;/p&gt;  &lt;p&gt;&amp;#xA0;&lt;/p&gt;  &lt;p&gt;Dinner was at the local sushi train, where Lauren let the side down by asking for sausages and chips (which were actually on the menu, although the sausages were served sushi style, fortunately cooked). We finished the day by going to a display of Awa Odori, the local traditional dance style. &lt;a href="http://lh5.google.com/davidkeaveny/RxDG6d4zYSI/AAAAAAAAAJg/SaRqD46N0vY/IMG_82063.jpg"&gt;&lt;img id="id" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="164" alt="Awa Odori" src="http://lh6.google.com/davidkeaveny/RxDG6t4zYTI/AAAAAAAAAJo/pmndsiU4Hpo/IMG_8206_thumb1.jpg" width="240" align="right" border="0" /&gt;&lt;/a&gt; There's a big festival at the end of August, with dancing in the streets, but these sessions allow the various teams to practice in between. The girls in particular get the hard part, as they wear the traditional wooden clogs, complete with inch-high wooden blocks, while the guys get a form of &lt;em&gt;tabi&lt;/em&gt;. After the main display, it was time for a little audience participation, with the best dancers being given small awards. Emily was one of the lucky recipients.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-432050405848062961?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/432050405848062961/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=432050405848062961' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/432050405848062961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/432050405848062961'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2007/10/day-9-getting-on-down.html' title='Day #9 - Getting on down'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-1011061604419854545</id><published>2007-10-13T23:22:00.001+10:00</published><updated>2007-10-13T23:22:41.843+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='osaka'/><category scheme='http://www.blogger.com/atom/ns#' term='japan'/><title type='text'>Day #8 - One big fish</title><content type='html'>&lt;p&gt;&lt;a href="http://lh6.google.com/davidkeaveny/RxDGnt4zYOI/AAAAAAAAAJA/9vO7mbG6oDg/IMG_80152.jpg"&gt;&lt;img id="id" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="164" alt="IMG_8015" src="http://lh5.google.com/davidkeaveny/RxDGod4zYPI/AAAAAAAAAJI/vv4CoCI08F8/IMG_8015_thumb.jpg" width="244" align="left" border="0" /&gt;&lt;/a&gt; Our morning in Osaka was spent at the aquarium, which is mainly known for its biggest occupant, a rather young whale shark. Currently 4m long, when fully grown it will be 12m long. Do these things make good sushi? Its fellow inmates include a variety of marine creatures from around the Pacific Rim, including sea otters from the Aleutians and dolphins from the Cook Straight.&lt;/p&gt;  &lt;p&gt;After lunch, we were picked up and driven through Kobe and down to Tokushima in Shikoku, just across the water from Honshu. We already knew the family we were staying with, as they stayed with us in Sydney when their daughter Ai got married earlier this year (the other two daughters, Nozomi and Rie, acted as guides/interpreters for us in Tokushima and Tokyo respectively - we would have been very lost without them!)&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-1011061604419854545?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/1011061604419854545/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=1011061604419854545' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/1011061604419854545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/1011061604419854545'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2007/10/day-8-one-big-fish.html' title='Day #8 - One big fish'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-1720126031036941337</id><published>2007-10-11T23:47:00.001+10:00</published><updated>2007-10-11T23:47:30.219+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='castles'/><category scheme='http://www.blogger.com/atom/ns#' term='kyoto'/><category scheme='http://www.blogger.com/atom/ns#' term='holidays'/><category scheme='http://www.blogger.com/atom/ns#' term='japan'/><title type='text'>Day #6 - Palaces and castles</title><content type='html'>&lt;p&gt;&lt;a title="IMG_7767" href="http://www.flickr.com/photos/84306903@N00/1523616921/"&gt;&lt;img style="margin: 0px 5px 0px 0px" alt="IMG_7767" src="http://static.flickr.com/2298/1523616921_97909ab7ab_m.jpg" align="left" border="0" /&gt;&lt;/a&gt;After two days of traipsing round shrines, it was probably about time we visited something more down to earth. First up was the Kyoto Gosho, the imperial palace. It's been burnt to the ground a fair few times, and moved around, in its history; and of course, the emperor now resides in Tokyo, so it's only really used for ceremonial occasions. This was also a guided tour, but at least this time, the guide was able to interject the occasional English explanation, although I dare say I missed a fair amount as I was often lagging behind the group, waiting for all the other tourists to move out of my camera frame!&lt;/p&gt;  &lt;p&gt;&lt;a title="IMG_7885" href="http://www.flickr.com/photos/84306903@N00/1540765335/"&gt;&lt;img alt="IMG_7885" src="http://static.flickr.com/2339/1540765335_949dc2a19e_m.jpg" align="right" border="0" /&gt;&lt;/a&gt;Nijo-jo, built by shogun Tokugawa Ieyasu at the beginning of the 17th Century, was a different kettle of fish. Here, we were able to rent an audio guide, particularly for the interior of the palace. Sadly, no photos permitted in there, but the grounds were fair game. Once again, Japan's long history with fire meant that the main donjon of the castle, which had been relocated from nearby Fujimi castle, burned to the ground in the 18th Century, but at least the major fortifications were a little more longlasting. One of the highlights of the shogun's palace is the Nightingale Floor, which through ingenious springing and balancing, makes it impossible to sneak or walk down the passageways without being pursued by a cacophony of squeaks and whistles.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-1720126031036941337?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/1720126031036941337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=1720126031036941337' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/1720126031036941337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/1720126031036941337'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2007/10/day-6-palaces-and-castles.html' title='Day #6 - Palaces and castles'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-3158891487826736453</id><published>2007-10-09T22:28:00.001+10:00</published><updated>2007-10-09T22:28:48.915+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='shrines'/><category scheme='http://www.blogger.com/atom/ns#' term='religion'/><category scheme='http://www.blogger.com/atom/ns#' term='holidays'/><category scheme='http://www.blogger.com/atom/ns#' term='japan'/><title type='text'>Day #5 - Lost in Translation</title><content type='html'>&lt;p&gt;With our hosts having to go to work for the day, we were left to our own devices, which mainly consisted of a guided bus tour of Kyoto. Due to the toilets at the bus station being located almost half a block away, we missed our scheduled bus by about a minute (curse that Japanese punctuality!), so with a cry of, &amp;quot;Follow that bus!&amp;quot;, we grabbed a taxi and attempted to get to the first stop on the itinerary ahead of the bus. We were rather mindful of horror stories of how much Tokyo cabs cost, but fortunately our man came through, and we pulled up at the first shrine just as our fellow tourists were disembarking.&lt;/p&gt;  &lt;p&gt;One thing that became immediately obvious was that we were the only foreigners on the tour, and also that no-one else spoke Japanese, the guide included. In some cases, this even included the various guide pamphlets, so there are some places that we have been to that we have absolutely no idea what their significance is.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.google.com/davidkeaveny/Rwtz4N4zYII/AAAAAAAAAIM/L_enyUfKtRE/IMG_7695%5B2%5D.jpg"&gt;&lt;img id="id" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="164" alt="The rear of Heian-jingu shrine" src="http://lh4.google.com/davidkeaveny/Rwtz5d4zYJI/AAAAAAAAAIU/drBmju-1lbY/IMG_7695_thumb.jpg" width="244" align="left" border="0" /&gt;&lt;/a&gt; Heian-jingu was the first stop along the route, built in 1895 to commemorate the 1100th anniversary of the founding of the Kyoto. The buildings are reduced-size replicas of the Heian-period Imperial palace; the garden is also very photogenic, so we had a slightly-hurried wander around, not wanting to miss the bus onwards.&lt;/p&gt;  &lt;p&gt;Our next stop was Togetsukyo Bridge. Unfortunately, the language barrier meant that we had no idea what we were looking at, or why we were looking at it! This also meant that I didn't take any photos of it, since at this time of year it's just a bridge. Later on we Googled it to work out &lt;a href="http://www.japan-guide.com/e/e3912.html"&gt;what we missed&lt;/a&gt; - apparently it's good for viewing the cherry blossom in spring and the autumn leaves in, um, autumn - shame we missed both! On the plus side, we did get to eat &lt;em&gt;unagi&lt;/em&gt;, although again we had no idea what it was at the time.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.google.com/davidkeaveny/Rwtz8t4zYKI/AAAAAAAAAIc/gQv2WhvWGHw/IMG_7712%5B3%5D.jpg"&gt;&lt;img id="id" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="164" alt="The Golden Temple earns its name" src="http://lh6.google.com/davidkeaveny/Rwtz894zYLI/AAAAAAAAAIk/GtN-brwIf50/IMG_7712_thumb%5B1%5D.jpg" width="244" align="right" border="0" /&gt;&lt;/a&gt;After lunch, we headed for probably the most visually spectacular shrine, at Kinkaku-ji, the Golden Temple. This is a 20th century reconstruction of the the 14th century original (a rather obsessed monk burned it down in 1950), and the gold leaf now covers the first floor as well as the second. The gardens were equally impressive, with a few more signs of trees turning colour with the autumn.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.google.com/davidkeaveny/Rwtz_d4zYMI/AAAAAAAAAIs/aC5M0wsPtOU/IMG_7742%5B4%5D.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="164" alt="Kimonoed ladies on their way to somewhere" src="http://lh6.google.com/davidkeaveny/Rwtz_94zYNI/AAAAAAAAAI4/5mLVwOmgILY/IMG_7742_thumb%5B2%5D.jpg" width="217" align="left" border="0" /&gt;&lt;/a&gt;Kiyomizu-dera required a bit more hard work to reach, climbing up the hillside along a street lined with touristy-type shops. It was obviously a favourite destination for school trips, as there were several busloads of uniformed children, many of them tying prayers to the prayer fences. There were also a good number of women wearing kimonos about. Feeling a bit worn out from all the hard slogging, we sat down for some &lt;em&gt;mat-cha&lt;/em&gt;, the formal whisked green tea, along with some sticky sweet rice balls filled with red bean paste, then back down the hill and on to our bus to return home.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-3158891487826736453?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/3158891487826736453/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=3158891487826736453' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/3158891487826736453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/3158891487826736453'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2007/10/day-5-lost-in-translation.html' title='Day #5 - Lost in Translation'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-632518524439925709</id><published>2007-10-08T22:15:00.001+10:00</published><updated>2007-10-08T22:15:39.802+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='shrines'/><category scheme='http://www.blogger.com/atom/ns#' term='trains'/><category scheme='http://www.blogger.com/atom/ns#' term='holidays'/><category scheme='http://www.blogger.com/atom/ns#' term='japan'/><title type='text'>Day #4 - Narita to Kyoto</title><content type='html'>&lt;p&gt;&lt;a href="http://lh6.google.com/davidkeaveny/RwofUN4zYCI/AAAAAAAAAHY/bNbmAdZ42FM/IMG_7646%5B2%5D.jpg"&gt;&lt;img id="id" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="164" alt="Shinkansen at Maibara station" src="http://lh5.google.com/davidkeaveny/RwofU94zYDI/AAAAAAAAAHg/4GYnz4WDJ8I/IMG_7646_thumb.jpg" width="244" align="left" border="0" /&gt;&lt;/a&gt; The run down from Narita to Kyoto, our first real port of call, was pretty fast and smooth, thanks to the combination of a Japan Rail pass and the shinkansen. A bus from the hotel back to the airport got us on to the express service to Tokyo, then a short walk got us on the shinkansen for Kyoto. Japan definitely seems to have got trains sorted out, something which both London and Sydney desperately need to do. The inter-city service in Australia looks like a train set in comparison.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.google.com/davidkeaveny/RwofXd4zYEI/AAAAAAAAAHo/Rk54EpGRbrk/IMG_7631%5B3%5D.jpg"&gt;&lt;img id="id" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="164" alt="View from the window of the shinkansen" src="http://lh5.google.com/davidkeaveny/RwofX94zYFI/AAAAAAAAAHw/G0OVhox4m9k/IMG_7631_thumb%5B1%5D.jpg" width="244" align="right" border="0" /&gt;&lt;/a&gt; The view along the way was fascinating, albeit rather blurred. It seems like almost every almost flat piece is terraced and farmed, even small areas a couple of meters across will have rows of rice planted in them. Sadly, a view of Mount Fuji was not on the cards, staying hidden behind the low-lying clouds.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.google.com/davidkeaveny/Rwofad4zYGI/AAAAAAAAAH4/v0AbVK44gLU/IMG_7652%5B2%5D.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="164" alt="Ginkaku-ji temple" src="http://lh5.google.com/davidkeaveny/Rwofa94zYHI/AAAAAAAAAIE/wRDzytF8YL8/IMG_7652_thumb.jpg" width="111" align="left" border="0" /&gt;&lt;/a&gt;Our hosts in Kyoto picked us up from the station; we went back to their home in the west of Kyoto, and dumped our bags, then headed in search of Ginkaku-ji, the closest of Kyoto's major temples.&amp;#xA0; Our timing was rather good, as we got there in the late afternoon, with the setting sun adding a golden hue to the scene. I'd rather been hoping that autumn had set in a little more, so that we could see the beautiful colours of autumn in the maples, but summer appears to have been quite warm, so only the first few leaves are starting to turn. Quite why New South Wales's schools can't have their spring holiday to coincide with Japan's autumn better, I don't know...&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-632518524439925709?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/632518524439925709/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=632518524439925709' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/632518524439925709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/632518524439925709'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2007/10/day-4-narita-to-kyoto.html' title='Day #4 - Narita to Kyoto'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-3437361381108791971</id><published>2007-10-01T08:36:00.001+10:00</published><updated>2007-10-01T08:36:59.703+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='babies'/><category scheme='http://www.blogger.com/atom/ns#' term='kualalumpur'/><category scheme='http://www.blogger.com/atom/ns#' term='holidays'/><category scheme='http://www.blogger.com/atom/ns#' term='malaysia'/><title type='text'>Day #3 - Babies</title><content type='html'>&lt;p&gt;Many congratulations to Cheryl back in England who had a baby girl last night in what has to be one of the fastest unassisted deliveries that we've heard of.&lt;/p&gt;  &lt;p&gt;Meanwhile, it's still dark in KL, and we're off to the airport. Hope I can find a few wireless access point or two...&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-3437361381108791971?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/3437361381108791971/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=3437361381108791971' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/3437361381108791971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/3437361381108791971'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2007/10/day-3-babies.html' title='Day #3 - Babies'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-1159922376671659405</id><published>2007-10-01T02:01:00.001+10:00</published><updated>2007-10-01T02:01:39.724+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kualalumpur'/><category scheme='http://www.blogger.com/atom/ns#' term='holidays'/><category scheme='http://www.blogger.com/atom/ns#' term='malaysia'/><title type='text'>Day #2 - KL once more</title><content type='html'>&lt;p&gt;&lt;a href="http://lh6.google.com/davidkeaveny/Rv_IU94zX8I/AAAAAAAAAGc/DGAFVPIzLM0/IMG_7519%5B3%5D.jpg"&gt;&lt;img id="id" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="164" alt="Lauren having lunch with some new-found friends" src="http://lh5.google.com/davidkeaveny/Rv_IVt4zX9I/AAAAAAAAAGk/POWxucGd1vI/IMG_7519_thumb%5B1%5D.jpg" width="244" align="left" border="0" /&gt;&lt;/a&gt; We spent Sunday morning in KL doing what we do every Sunday morning in Sydney, at the Lord's Table meeting. In fact, since the meeting was spoken 50% Chinese and 50% English, it was very much like Sydney, although with a little less Korean. We felt very much at home, and the brothers and sisters were very warm and open. Lauren, of course, fitted right in, happy to meet new friends, even if she was the only one without black hair and brown oval eyes!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.google.com/davidkeaveny/Rv_IWd4zX-I/AAAAAAAAAGs/T5P3_IC4bf8/IMG_7538%5B3%5D.jpg"&gt;&lt;img id="id" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="244" alt="The Eye of Malaysia, with the Petronas Towers in the distance" src="http://lh3.google.com/davidkeaveny/Rv_IXN4zX_I/AAAAAAAAAG0/SSp0ydNLwiw/IMG_7538_thumb%5B1%5D.jpg" width="164" align="right" border="0" /&gt;&lt;/a&gt; After a typical Malaysian lunch, one of the brothers took us for a quick drive round part of KL, starting with the Eye of Malaysia, a rather poor relation to the London Eye, built on the shores of Lake Titiwangsa as part of Malaysia's celebrations of their 50th year of indepedence. The weather was once again very hot and sticky, which made for rather poor photographic conditions, but it also meant there wasn't much wind, which makes for good reflections!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.google.com/davidkeaveny/Rv_IX94zYAI/AAAAAAAAAG8/10xQPJyFtKI/IMG_7589%5B3%5D.jpg"&gt;&lt;img id="id" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="164" alt="Lauren wonders why butterflies like to nibble her finger" src="http://lh4.google.com/davidkeaveny/Rv_IYd4zYBI/AAAAAAAAAHE/HMo9Vw53WZo/IMG_7589_thumb%5B1%5D.jpg" width="244" align="left" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Next stop was Lauren's choice - presented with the options of aviary, planetarium or butterfly park, she went with the butterflies. At first, the butterflies showed remarkable sense and kept their distance, but it didn't take long before they were landing on her hands, arms and clothes - I don't know, maybe she &lt;em&gt;does&lt;/em&gt; wash in ambrosia... Even the chamber of horrors, which contained the sort of spiders that would send Australia's biggest and hairiest running for mummy, was a success, no mean feat when both Emily and Lauren loathe nearly all forms of the six- and eight-legged varieties of God's creation.&lt;/p&gt;  &lt;p&gt;We wrapped up the day with a return to the Petronas Towers, this time in daylight, for a few more photos and dinner, then back to the hotel for an early night, as tomorrow's start is going to be an early one.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-1159922376671659405?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/1159922376671659405/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=1159922376671659405' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/1159922376671659405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/1159922376671659405'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2007/10/day-2-kl-once-more.html' title='Day #2 - KL once more'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-3652770774089796654</id><published>2007-10-01T01:02:00.000+10:00</published><updated>2007-10-01T01:22:56.839+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kualalumpur'/><category scheme='http://www.blogger.com/atom/ns#' term='holidays'/><category scheme='http://www.blogger.com/atom/ns#' term='malaysia'/><title type='text'>Malaysia/Japan Holiday 2007, Day #1</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.flickr.com/photos/davidkeaveny/1463797244/in/set-72157602215947695/"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px;" src="http://farm2.static.flickr.com/1365/1463797244_eb6f389c35.jpg?v=0" alt="" border="0" /&gt;&lt;/a&gt;
Here we are in Kuala Lumpur, on the first day of our two week holiday. We stopped off here for a number of reasons: firstly, to visit &lt;a href="http://www.flickr.com/photos/davidkeaveny/1463798110/"&gt;old friends&lt;/a&gt; from our university days; secondly, to visit the church in KL; thirdly,  we've never been there before; and fourthly, because it breaks up the lengthy flight to Japan, our ultimate destination.

We took the overnight flight from Sydney to KL, which got us in before dawn; then a taxi to our hotel, and then straight to bed (definitely the ultimate remedy for upset body clocks). Up again for lunch, we met up with Penny and Oliver, and headed out in search for food and somewhere to chat. The searing heat and wilting humidity outside meant that we'd be spending the rest of the day in air-conditioned shopping malls or by the pool at the hotel, so there's not too much by way of touristy photos of KL.

However, we did go out for dinner at the rather trendy Traders Hotel, which is directly opposite the Petronas Towers. We were rather outnumbered by the local Muslim population breaking their Ramadan fasts, but the food was excellent; a small shame that the rather snooty staff at the club on the observation deck upstairs wouldn't let us in because some of us were wearing open-toed sandals...

By this time, Lauren was about to collapse with exhaustion (and had passed into her grouchy phase), so back to the hotel and drinkies in the lounge downstairs, while being serenaded with some live music - a rather eclectic mix of local Chinese pop favourites, Boney M medleys and ABBA. We might as well have gone to the karaoke bar across the way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-3652770774089796654?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/3652770774089796654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=3652770774089796654' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/3652770774089796654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/3652770774089796654'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2007/10/malaysiajapan-holiday-2007-day-1.html' title='Malaysia/Japan Holiday 2007, Day #1'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-428119160987778455</id><published>2007-08-18T19:06:00.000+10:00</published><updated>2007-08-18T20:06:34.503+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cats'/><title type='text'>The naming of cats</title><content type='html'>&lt;blockquote&gt;      
The naming of cats is a difficult matter,
It isn't just one of your holiday games;
     You may think at first I'm mad as a hatter
     When I tell you a cat must have three different names.
&lt;/blockquote&gt;&lt;a href="http://damana.blogspot.com/"&gt;Damana&lt;/a&gt; recently asked me about how I named my cats. So here's the history of cats in the Keaveny household:
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.flickr.com/photos/davidkeaveny/147782583/in/set-72057594136895060/"&gt;Dusty&lt;/a&gt;, our first cat. Actually, Emily chose Dusty, both the cat and the name, when she went to the Cat's Protection League and bought her for a tin of cat food. Emily and I moved in shortly afterwards into our first home together in Roehampton in south-west London, starting out with a few sticks of furniture and a mostly grey Domestic Short-Hair kitten. Dusty was not neutered when we got her, and she soon attracted the attention of every tomcat in the area. So it didn't take too long for her to produce kittens, four of them in our bed, one Sunday morning. Ew the mess...&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.flickr.com/photos/davidkeaveny/147782774/in/set-72057594136895060/"&gt;Jack&lt;/a&gt; - kitten #1 and Emily's favourite, we identified this kitten as a boy. Later examination by the vet pointed that he was actually a she, so we just pretend that her full name is Jacqueline. At the age of about 6, Jack disappeared a few months after we moved from Roehampton to Worcester Park, a few miles down the road from Roehampton, and we never saw her again.
&lt;/li&gt;&lt;li&gt;Claws - kitten #2 and my favourite, I originally wanted to call him &lt;a href="http://en.wikipedia.org/wiki/Greebo"&gt;Greebo&lt;/a&gt;, after &lt;a href="http://en.wikipedia.org/wiki/Nanny_Ogg"&gt;Nanny Ogg&lt;/a&gt;'s foul tomcat, not that I thought that he would grow up to be foul-natured (and Dusty was foul-natured enough for two Greebos). Unfortunately, like Jack, our ability to sex a kitten accurately was limited, so he also became a she, and I gave her the name Claudia, which reduced to Claws. Sadly, she died suddenly a few months before her 2nd birthday.&lt;/li&gt;&lt;li&gt;We named kittens #3 and #4 Charlie and Susie, but we gave them away before we had the opportunity to find out whether our luck in identifying gender identification had improved.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.flickr.com/photos/davidkeaveny/219980308/in/set-72057594136895060/"&gt;Jasmine&lt;/a&gt; - a few months after Claws died, we went to the RSPCA to find another cat in need of a home. Jasmine made it very clear that she was the one for us - she put her front legs around Emily's neck and just purred. Emily named her after a cat she'd had when she was younger, a dark tortoiseshell named Jasmine.
&lt;/li&gt;&lt;li&gt;With the disappearance of Jack, we were once more down to two cats, which made the house feel a little empty. So off to the RSPCA again, this time in search of two more. We settled on a brother/sister pair of kittens, both DSHs again, one black/white boy and another ginger/white tortie girl. Unfortunately, the male kitten died before he could come home with us, but we were told that there was a similar male kitten left behind when the rest of his siblings were sold, so we took him. Lauren named the girl &lt;a href="http://www.flickr.com/photos/davidkeaveny/159014967/in/set-72057594136895060/"&gt;Amy&lt;/a&gt;, and in a display of dazzling &lt;a href="http://en.wikipedia.org/wiki/Little_Women"&gt;literary knowledge&lt;/a&gt;, we named the boy &lt;a href="http://www.flickr.com/photos/davidkeaveny/159015072/in/set-72057594136895060/"&gt;Laurie&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Moving to Australia proved rather expensive when transporting cats, at about $2500 per animal, so we knew we were going to have to say some sad farewells. Dusty went to live with &lt;a href="http://www.facebook.com/profile.php?id=692920231"&gt;Cheryl&lt;/a&gt;, while Laurie and Amy went to live with Emily's parents for a while, and then on to Emily's sister Polly. About 9 months after settling in Sydney, we decided that it was time to get another cat, so we stopped by several local vets who were advertising kittens, but in the end settled for &lt;a href="http://www.flickr.com/photos/davidkeaveny/219980086/in/set-72057594136895060/"&gt;Coco&lt;/a&gt;, our first longhaired cat.&lt;/li&gt;&lt;/ul&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm1.static.flickr.com/178/448192003_f5a12e3ab7.jpg?v=0"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px;" src="http://farm1.static.flickr.com/178/448192003_f5a12e3ab7.jpg?v=0" alt="" border="0" /&gt;&lt;/a&gt;And that about completes the set. Of course, the story isn't over yet, as Emily as designs on being a cat breeder, so I'm sure there'll be a lot more cats passing through our doors. Jasmine is now 9 years old, so passing out of middle age into her senior years, while Coco is a fair bit younger.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-428119160987778455?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/428119160987778455/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=428119160987778455' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/428119160987778455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/428119160987778455'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2007/08/naming-of-cats.html' title='The naming of cats'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-3331496500160614949</id><published>2007-08-12T21:58:00.000+10:00</published><updated>2007-08-12T23:36:35.832+10:00</updated><title type='text'>Travel Photography</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm2.static.flickr.com/1294/1089732337_edc8de217c.jpg?v=0"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px;" src="http://farm2.static.flickr.com/1294/1089732337_edc8de217c.jpg?v=0" alt="" border="0" /&gt;&lt;/a&gt;
I spent pretty much all of this Saturday roaming around Sydney with &lt;a href="http://www.sydneyphotoworkshops.com.au/"&gt;Sydney Photographic Workshops&lt;/a&gt;, doing their &lt;a href="http://www.sydneyphotoworkshops.com.au/workshop_course_7.htm"&gt;Travel &amp; Documentary Workshop&lt;/a&gt;. I thought that seeing as we'll be going to Japan on holiday this coming spring, somewhere that Emily and I have long wanted to visit, that I should make an effort to come back with some decent photographs, conveying something more than just, "Here's my in front of a temple. Here's me in front of another temple". Of course, those who know me would realise that it's more, "Here's Lauren in front of a temple. Here's Lauren in front of another temple"!

The weather was great for the day, probably the first hint of spring on its way, with perfect clear blue skies and temperatures in the mid-20s. We did various kinds of photography at several locations around Sydney, starting with portrait work down at the fish markets (many thanks to &lt;a href="http://www.flickr.com/photos/davidkeaveny/1089696131/in/set-72157601388555991/"&gt;Dallas&lt;/a&gt;, &lt;a href="http://www.flickr.com/photos/davidkeaveny/1090557966/in/set-72157601388555991/"&gt;Troy&lt;/a&gt; and &lt;a href="http://www.flickr.com/photos/davidkeaveny/1089694657/in/set-72157601388555991/"&gt;Neil&lt;/a&gt; for modelling for us aboard the &lt;a href="http://www.tribalwarrior.org/tribalwarrior.html"&gt;Tribal Warrior&lt;/a&gt;). We then headed round the bay to &lt;a href="http://www.flickr.com/photos/davidkeaveny/1090563152/in/set-72157601388555991/"&gt;Blackwattle Bay&lt;/a&gt; to work on various techniques on the old incinerator site, which is now a mix of public space and townhousing.

After lunch we headed south to La Perouse, for some more compositional work, on both an old World War 2 &lt;a href="http://www.flickr.com/photos/davidkeaveny/1089710255/in/set-72157601388555991/"&gt;listening post&lt;/a&gt;, and above the &lt;a href="http://www.flickr.com/photos/davidkeaveny/1090576584/in/set-72157601388555991/"&gt;cliffs themselves&lt;/a&gt;. We also had a small treat in the form of the &lt;a href="http://www.flickr.com/photos/davidkeaveny/1090577184/in/set-72157601388555991/"&gt;air rescue helicopter&lt;/a&gt; taking for a sortie of some description (training? medical emergency?), and then returning a while later; I got pretty close to it on takeoff, and the downdraft (and noise!) they create even more 20 yards out is pretty impressive.

Finally, with the sun dipping down towards the horizon, we crossed over the peninsula to Yarra Bay, first to catch the sun going down over &lt;a href="http://www.flickr.com/photos/davidkeaveny/1090590546/in/set-72157601388555991/"&gt;Port Botany&lt;/a&gt;, and then to be entertained by the lovely &lt;a href="http://www.flickr.com/photos/davidkeaveny/1090552092/in/set-72157601388555991/"&gt;fire-twirling Annabelle&lt;/a&gt;.

My thanks to Daniel, Ben and Wendy for all they showed us; I think it's a testimony to their teaching abilities that a) roughly half of all the photos I took were worth keeping (at least 50% up on my usual success rate), and b) post-processing took me less than half a day to do them all - usually the source material isn't that good so it needs a fair amount of work done on the computer to bring out the best in the photos. By getting the photos right first time, I save time later on! If you're into digital photography, and want to improve your game from being just a happy snapper, then give these guys a call.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-3331496500160614949?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/3331496500160614949/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=3331496500160614949' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/3331496500160614949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/3331496500160614949'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2007/08/travel-photography.html' title='Travel Photography'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-1678030125362351407</id><published>2007-08-10T16:25:00.000+10:00</published><updated>2007-08-10T16:30:30.928+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><title type='text'>How mice work</title><content type='html'>A big thank you to &lt;a href="http://damana.blogspot.com"&gt;Damana&lt;/a&gt; for emailing me a demonstration of &lt;a href="http://www.1-click.jp/"&gt;how a computer mouse actually works&lt;/a&gt;. Through the magic of modern technology, we can now zoom really close into the screen and see how that little cursor zips around.

Monday may only a few days away, but now I have something to really smile about. In the meantime, the British banking system will give me plenty to frown about - trying to get reasonable chunks of money from account A in country B to account C in country D ought not be that hard in the 21st Century. At the current rate of progress, I might as well have sent my mail in a packet ship, and it would still get there sooner.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-1678030125362351407?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/1678030125362351407/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=1678030125362351407' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/1678030125362351407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/1678030125362351407'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2007/08/how-mice-work.html' title='How mice work'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-6119210506657575748</id><published>2007-07-09T13:15:00.000+10:00</published><updated>2007-07-09T13:18:37.131+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><title type='text'>Outstanding quote of the month</title><content type='html'>I wonder how long &lt;a href="http://minimsft.blogspot.com/2007/07/whether-life-here-or-life-there-life-is.html"&gt;Mini-Microsoft&lt;/a&gt; has been saving up this gem of a quote:
&lt;blockquote&gt;The only thing I've seen the Xbox business accomplish, besides making a lot of money disappear, is make Sony dash themselves against the rocks with the PS3. Monkey-see, monkey-do even better. In the meantime, the Nintendo little piggy gleefully exclaims, "&lt;span style="color: rgb(0, 0, 128);"&gt;Wii! Wii! Wii!&lt;/span&gt;" all the way to the bank.&lt;/blockquote&gt;I don't have any consoles, so I'm well out of that war (and I don't have any hi-def video players, so I'm even better out of &lt;span style="font-style: italic;"&gt;that&lt;/span&gt; format war), but it certainly made me smile.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-6119210506657575748?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/6119210506657575748/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=6119210506657575748' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/6119210506657575748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/6119210506657575748'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2007/07/outstanding-quote-of-month.html' title='Outstanding quote of the month'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-4708299650377236756</id><published>2007-07-02T12:28:00.001+10:00</published><updated>2007-07-02T12:30:45.057+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='boats'/><title type='text'>A trip to Newcastle</title><content type='html'>&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt; &lt;a href="http://www.flickr.com/photos/davidkeaveny/686900207/" title="photo sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1263/686900207_14f93dff30_m.jpg" alt="" style="border: 2px solid rgb(0, 0, 0);" /&gt;&lt;/a&gt;
&lt;span style="margin-top: 0px;font-size:0;" &gt;  &lt;a href="http://www.flickr.com/photos/davidkeaveny/686900207/"&gt;Pasha Bulker&lt;/a&gt; 
 Originally uploaded by &lt;a href="http://www.flickr.com/people/davidkeaveny/"&gt;DavidKeaveny&lt;/a&gt; &lt;/span&gt;&lt;/div&gt;I'd been planning a trip up to Newcastle for the past few weeks, ever since I heard about &lt;a href="http://en.wikipedia.org/wiki/Pasha_Bulker"&gt;this ship running aground&lt;/a&gt; during the bad weather we had in early June (finally something to put Newcastle on the world map! The locals must have been coining it from tourists). Well, this weekend I got the opportunity, as we all went up to visit the church in Newcastle.

Rather selfishly, I'd been hoping that salvage attempts would continue to fail until we got there, so I was relieved when an attempt during the week failed when several of the tow ropes snapped, then attempts to reattach them could not be completed in time. Fortunately, the team was in no hurry to get the ship afloat again, with several good high tides still to come. From what I've seen in the news, they've now started to make some progress, so we got there in the nick of time.

It was freezing cold, mainly from the wind chill, so I didn't take many photos, and even with the tripod, some were rather blurry. This was the best of the bunch.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-4708299650377236756?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/4708299650377236756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=4708299650377236756' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/4708299650377236756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/4708299650377236756'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2007/07/trip-to-newcastle.html' title='A trip to Newcastle'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm2.static.flickr.com/1263/686900207_14f93dff30_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-8856152649395486982</id><published>2007-06-17T22:18:00.000+10:00</published><updated>2007-06-17T22:44:47.079+10:00</updated><title type='text'>Après moi, la déluge</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_lMyetu2DK1E/RnUoKU8XLAI/AAAAAAAAACE/dc5LqLT2URA/s1600-h/CRW_6888.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_lMyetu2DK1E/RnUoKU8XLAI/AAAAAAAAACE/dc5LqLT2URA/s320/CRW_6888.jpg" alt="" id="BLOGGER_PHOTO_ID_5077008312815791106" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;You'd think that with all that rain that has been falling on Sydney, some of it would hang around in reservoirs. Well, it seems that a new Warragamba has been established in our basement; it looks like there's a problem with the drainage at that end of the house, which is causing water to well up through the concrete floor.&lt;br /&gt;&lt;br /&gt;Fortunately, not too much stuff was damaged - some duvets got wet in their storage cases (where the water got through the zips), and one or two containers which had had their bottoms smashed in during the move from England got flooded. Emily and I spent several hours bailing and mopping; within a few hours, it was filling up again, fortunately not at the rate where you have to worry about the TV room flooding as well.&lt;br /&gt;&lt;br /&gt;The rain appears to have stopped now, and also stopped coming up through the floor; hopefully this'll give the room a chance to dry out. Then we can get someone in to make the floor more permanently dry. In the meantime, we've taken the opportunity to throw out a lot of suddenly-soggy boxes and bits of old carpet that we didn't want anyway.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-8856152649395486982?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/8856152649395486982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=8856152649395486982' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/8856152649395486982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/8856152649395486982'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2007/06/aprs-moi-la-dluge.html' title='Après moi, la déluge'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_lMyetu2DK1E/RnUoKU8XLAI/AAAAAAAAACE/dc5LqLT2URA/s72-c/CRW_6888.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-9129961847799754836</id><published>2007-06-17T09:01:00.000+10:00</published><updated>2007-06-17T09:21:40.873+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><title type='text'>Safari vs Firefox</title><content type='html'>Apple has now released a Windows version of the beta of version 3 of their Safari browser. In the first 24 hours of availability, it has been downloaded &lt;a href="http://www.macworld.com/news/2007/06/14/safaridl/index.php"&gt;one million times&lt;/a&gt;, a feat roughly on par with &lt;a href="http://www.spreadfirefox.com/"&gt;Firefox&lt;/a&gt;. One question I've seen asked on such luminary sites as &lt;a href="http://slashdot.org"&gt;Slashdot&lt;/a&gt; is, "Will Safari steal market share from Firefox?". This is obviously a concern for the rabid anti-Microsoft crowd at Slashdot, but I really don't see it that way.

One reason that I believe Firefox spread so quickly is because it was a browser that web developers could really use to enhance their productivity. Where I work, it seems most, if not all, developers use Firefox to develop the web pages, and then use IE to check that the site renders properly there too. These developers would then encourage friends and relatives to install Firefox on their PCs at home, not so much because that they could then be good developers too, but because Firefox blew IE6 out of the water on almost all counts. In the absence of a conventional marketing machine, Mozilla used word-of-mouth to "ignite the web".

In my opinion, Safari is aimed at a different audience - people who have bought an iPod, and use it with their Windows PC. Apple already bundle in their atrocious QuickTime player in with iTunes, and adding a decent web browser to the bundle is a no-brainer for them. There's not too much denying that it performs better than IE when it comes to outright speed, and it appears to focus on simplicity (although many  complain that it is missing &lt;span style="font-style:italic;"&gt;too&lt;/span&gt; much (such as the use of the left thumb button on the mouse to navigate back a page, as IE and Firefox do. Of course, since Mac users barely get a right mouse button, it's no surprise there's no support for further buttons!)), but that is also a good thing if you don't do anything complex when browsing.

What Apple are doing is playing Microsoft's monopoly game; if Microsoft can use a monopoly on the OS market to drive sales of the Office suite (or, more relevantly, to completely crush Netscape's dire Navigator 4 browser), then Apple can turn a monopoly on the MP3-player market into browser market share (by the way, see how I manage to avoid use of the most pointless and hideous word to be shoe-horned into the English language - "leveraged". Guys, the word is "used" - just because it has three times as many syllables, it doesn't make it three times as clever to use it).

Even better, there is a good proportion of the market that only uses their Windows PC for music, email and web browsing. With iTunes and Safari, Apple now has a good chance of hooking those users, and converting them into Mac owners. And that's where the real money for Apple still is, selling expensive white boxes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-9129961847799754836?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/9129961847799754836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=9129961847799754836' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/9129961847799754836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/9129961847799754836'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2007/06/safari-vs-firefox.html' title='Safari vs Firefox'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-46132711864618488</id><published>2007-05-25T21:29:00.001+10:00</published><updated>2007-05-25T21:30:47.394+10:00</updated><title type='text'></title><content type='html'>I don't usually go in for posting cutesy videos off of YouTube, but I couldn't resist this:

&lt;embed src="http://update.videoegg.com/flash/proxy.swf?jsver=1.4" FlashVars="jsver=1.4&amp;MMdoctitle=Ringo - The Wildlife of Sarawak, Malaysia - Flash Player Installation&amp;MMplayerType=PlugIn&amp;MMredirectURL=http://www.ringo.com/videos/videos.html?videoId=202011242&amp;adVars=site=ringo&amp;area=videos&amp;va=[age]&amp;wmode=transparent&amp;autoPlay=true&amp;file=http://hi5.352.download.videoegg.com/gid370/cid1275/5C/DW/1178647386UMgBAvFBa9br1ARnbAhd_high.flv&amp;rootUrl=http://update.videoegg.com/flash/player&amp;swfpath=http://update.videoegg.com/flash/proxy.swf?jsver=1.4" quality="high" allowFullScreen="true" allowScriptAccess="always" scale="noscale" wmode="transparent" width="448" height="368" name="VE_Player" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;

Surf-boardin' rodents. 'Nuff said.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-46132711864618488?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/46132711864618488/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=46132711864618488' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/46132711864618488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/46132711864618488'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2007/05/i-dont-usually-go-in-for-posting-cutesy.html' title=''/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-4594820804560636698</id><published>2007-04-09T22:14:00.001+10:00</published><updated>2007-04-09T22:31:07.240+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='canberra'/><title type='text'>Australia, Australia, Australia, we love you. Amen!</title><content type='html'>&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt; &lt;a href="http://www.flickr.com/photos/davidkeaveny/452191037/" title="photo sharing"&gt;&lt;img src="http://farm1.static.flickr.com/175/452191037_29888b59f9_m.jpg" alt="" style="border: 2px solid rgb(0, 0, 0);" /&gt;&lt;/a&gt;
&lt;span style="margin-top: 0px;font-size:0;" &gt;  &lt;a href="http://www.flickr.com/photos/davidkeaveny/452191037/"&gt;Canberra from Mount Ainslie&lt;/a&gt;
Originally uploaded by &lt;a href="http://www.flickr.com/people/davidkeaveny/"&gt;DavidKeaveny&lt;/a&gt;. &lt;/span&gt;&lt;/div&gt;Ah yes, captivating Canberra. The capital city so good that practically none of the nation's politicians who work there actually live there. Also home to the roundabouts left over from when England had had enough of ripping out traffic lights (see the &lt;a href="http://en.allexperts.com/e/m/ma/magic_roundabout_%28swindon%29.htm"&gt;Swindon's&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Image:Swindon_Magic_Roundabout_eng.png"&gt;Magic&lt;/a&gt; &lt;a href="http://www.easier.com/view/News/Motoring/article-33515.html"&gt;Roundabout&lt;/a&gt; for the perfect example).

Having spent almost nine hours travelling (there-and-back, of course) for three hours visiting time back in February, we thought that maybe the Easter weekend would offer us the opportunity to take a closer look at this triumph of urban planning. So having taken our chances with the &lt;a href="http://www.smh.com.au/news/national/headon-crash-kills-two-more/2007/04/09/1175971004149.html"&gt;traditional Easter road carnage&lt;/a&gt;, and notched up a whole bunch more of hours in Emily's learner driver's logbook, we settled in for two days.

Actually, when it came to sightseeing, we didn't see that many sights. Being the weekend of a major religious event, most places were shut. Still, we got a good view of the environs from the top of Mount Ainslie, and we were able to feel sorry for the staff manning the parliament building, who were at least able to sell me a copy of How To Photograph Australia. I look forward to the sequel, How To Photograph Australia And Blog About It Later.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-4594820804560636698?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/4594820804560636698/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=4594820804560636698' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/4594820804560636698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/4594820804560636698'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2007/04/australia-australia-australia-we-love.html' title='Australia, Australia, Australia, we love you. Amen!'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm1.static.flickr.com/175/452191037_29888b59f9_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-99210053413723508</id><published>2007-03-28T11:13:00.000+10:00</published><updated>2007-03-28T11:38:11.868+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='cruisecontrol'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><title type='text'>CruiseControl.NET and Subversion Revision Labeller plug-in</title><content type='html'>Last year, I finally managed to get into automated builds at work. We write a lot of platform code for the other business units in our organisation, so any bugs/defects have quite a high visibility; what could be a better way of improving the transparency of our processes than having an easily accessible automated build system, which would not only compile and test our code, but create release/deployment packages, all before we had even arrived at the office?

It didn't take too long to get &lt;a href="http://ccnet.thoughtworks.com/"&gt;CruiseControl.NET&lt;/a&gt; up and running, using a fairly typical open-source blend of &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt;, &lt;a href="http://nant.sourceforge.net/"&gt;NAnt&lt;/a&gt;, &lt;a href="http://nantcontrib.sourceforge.net/"&gt;NAntContrib&lt;/a&gt;, &lt;a href="http://nunit.org/"&gt;NUnit&lt;/a&gt; etc etc, whicb should all be familiar to anyone who has read &lt;a href="http://safari.oreilly.com/0321228103"&gt;Open Source .NET Development&lt;/a&gt;, which should really be required reading for all .NET programmers.

Using NAntContrib's &lt;span style="color: rgb(51, 51, 255);font-size:85%;" &gt;&lt;span style="font-family: courier new;"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;&lt;/span&gt; task, it's easy enough to automatically set the version number in an assembly. What it didn't allow us to do was pass that information back up to CruiseControl for display in the web dashboard or the system tray application for more immediate feedback. So I decided to knock up a plug-in to do just that. I'd already &lt;a href="http://davidkeaveny.blogspot.com/2006/07/beginning-open-source-programming.html"&gt;played about with plug-ins&lt;/a&gt; for open-source applications, so it wasn't quite so much of a big step. So in October 2006, I posted to the &lt;a href="http://groups.google.com/group/ccnet-user/browse_thread/thread/1833f27b978c0701/92ceab6a2572d49c"&gt;ccnet-user&lt;/a&gt; group, announcing the creation of the plug-in, inspired by a blog entry by &lt;a href="http://www.jonathanmalek.com/blog/CruiseControlNETAndSubversionRevisionNumbersUsingNAnt.aspx"&gt;Jonathan Malek&lt;/a&gt;. I got a response from Richard Hensley, who was putting together a library of plug-ins, suggesting I might want to add my code to his library, but unfortunately I haven't had any response to my emails.

So I thought I'd take matters into my own hands, and post directly to the &lt;a href="http://confluence.public.thoughtworks.org/display/CCNETCOMM/Contributions"&gt;CC.NET community site&lt;/a&gt;; you can imagine my surprise when I saw that someone else has, fairly recently, also uploaded a Subversion revision labeller! Fortunately, there are enough differences between the two to make it worth uploading; so I now have two contributions to the open-source community, both small and specific to my job, but hopefully useful enough for others to use. Now I just have to get the NAntContrib guys to actually include mine in the builds...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-99210053413723508?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/99210053413723508/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=99210053413723508' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/99210053413723508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/99210053413723508'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2007/03/cruisecontrolnet-and-subversion.html' title='CruiseControl.NET and Subversion Revision Labeller plug-in'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-4436520769453398929</id><published>2007-03-16T07:59:00.000+11:00</published><updated>2007-03-16T08:16:13.616+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cars'/><category scheme='http://www.blogger.com/atom/ns#' term='accidents'/><category scheme='http://www.blogger.com/atom/ns#' term='trains'/><title type='text'>Truck vs. Parked Car</title><content type='html'>So Thursday was shaping up to be a day from Hell. &lt;a href="http://www.fxj.com.au/"&gt;At work&lt;/a&gt;, what should have been a simple web application deployment dragged itself out into an all-day affair, first with configuration issues at our end, then with web services that we communicate with and so on. I finally decided that I had enough around 6pm and headed for home, dreading a repeat of &lt;a href="http://www.smh.com.au/news/national/rail-chaos-brings-city-to-a-halt/2007/03/14/1173722551334.html"&gt;Wednesday's rail SNAFU&lt;/a&gt;.&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_lMyetu2DK1E/Rfm2pPiF3PI/AAAAAAAAAAM/uqELdmYSoqU/s1600-h/prang.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_lMyetu2DK1E/Rfm2pPiF3PI/AAAAAAAAAAM/uqELdmYSoqU/s320/prang.jpg" alt="" id="BLOGGER_PHOTO_ID_5042262077478395122" border="0" /&gt;&lt;/a&gt; Actually, the journey home turned out well enough; however, I wasn't expecting this when I got off the train. I guess one of the lorry drivers who visit the industrial park at the other end of the road was in a hurry and misjudged the size of the corner just behind me. Of course, they didn't leave a note or anything.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Oh well, just as well I wasn't planning on buying a plasma screen in the near future...&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-4436520769453398929?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/4436520769453398929/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=4436520769453398929' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/4436520769453398929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/4436520769453398929'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2007/03/truck-vs-parked-car.html' title='Truck vs. Parked Car'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_lMyetu2DK1E/Rfm2pPiF3PI/AAAAAAAAAAM/uqELdmYSoqU/s72-c/prang.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-6217172704928202998</id><published>2007-03-14T13:43:00.000+11:00</published><updated>2007-03-14T14:01:45.532+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jedi'/><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='mediacentre'/><category scheme='http://www.blogger.com/atom/ns#' term='religion'/><title type='text'>The Path of the Jedi</title><content type='html'>Jeff Attwood has been discussing the geek ethic of &lt;a href="http://www.codinghorror.com/blog/archives/000814.html"&gt;building your own PC&lt;/a&gt;, particularly in relation to  Google's use of commodity components.
&lt;blockquote&gt; We aren't typical users. We're programmers. &lt;b&gt;The x86 commodity PC is the essential, ultimate tool of our craft.&lt;/b&gt; It's the end product of 30 years of computer evolution. And it's still evolving today, with profound impact on the way we code. If you treat your PC like an appliance you plug into a wall, you've robbed yourself of a crucial lesson on the symbiotic relationship between software and hardware. The best way to truly &lt;i&gt;understand&lt;/i&gt; the commodity PC is to gleefully dig in and &lt;b&gt;build one yourself&lt;/b&gt;. Get your hands dirty and experience the economics of computer hardware first hand-- the same economics that have shaped the software industry since the very first line of code was stored in memory.&lt;/blockquote&gt;I'm definitely singing from the same hymn sheet. Every PC I've owned has been built from the ground up, from a Texas Instruments 486-clone CPU to an Intel Core 2 Duo; the day that I buy a desktop PC is the day that some kindly men fit me out for a white canvas jacket that does up at the back. (Laptops, of course are a different matter).

Naturally, rolling your own does lead to other problems, particularly in the tricky realm of hardware compatability. I've built some pretty unstable PCs in the past, where the motherboard doesn't like a particular sound card or graphics card, and the typical DIY-er doesn't really have the luxury of experimenting too much, at least if they're paying for everything themselves. My current interest is in media centres, and I'm reaping the benefits of Intel's &lt;a href="http://www.intel.com/go/viiv_info/"&gt;VIIV campaign&lt;/a&gt;, at least in the interaction between &lt;a href="http://www.microsoft.com/windowsxp/mediacenter/default.mspx"&gt;MCE2005&lt;/a&gt; and the hardware (the less said about the special 'content' the better, because as is sadly typical, countries outside the US don't actually exist)

P.S. In case you're wondering about the heading, it comes from one of the comments on Jeff's posting:
&lt;blockquote&gt;It's the whole Jedi build their own light saber bit.&lt;/blockquote&gt;While I might not claim Jedi &lt;a href="http://news.bbc.co.uk/2/hi/entertainment/2218456.stm"&gt;to be my religion&lt;/a&gt; when the census forms come round, the man has a good point.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-6217172704928202998?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/6217172704928202998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=6217172704928202998' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/6217172704928202998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/6217172704928202998'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2007/03/path-of-jedi.html' title='The Path of the Jedi'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-4565966140824156381</id><published>2006-12-04T16:37:00.000+11:00</published><updated>2007-03-28T11:40:51.691+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>MCP #7</title><content type='html'>A mere three years after buying the first tutorial book, I finally sat the succintly-named &lt;a href="http://www.microsoft.com/learning/exams/70-315.asp"&gt;Developing and Implementing Web Applications with Microsoft Visual C# .NET and Microsoft Visual Studio .NET&lt;/a&gt; exam. Like a few too many of the MS exams, a lot of it seems to be aimed at stuff you're never likely to need - honestly, DataSets? So it was more a question of finding the time to learn stuff I'm never going to use than anything else. Anyway, since getting some more MCP certifications was part of the KPIs for my next performance review (which is only a month or so away), I thought I'd better pull my finger out.

So an intensive session with &lt;a href="http://www.transcender.com/"&gt;Transcender&lt;/a&gt; over the weekend saw me back in the game, and after a stroll round the corner to the local testing centre and a couple of finger-chewing hours, I passed the exam with a score of 943 something-or-others. Out of what, I don't know? 1000? Microsoft aren't saying specifically, but given that the pass is 700, I'm pretty pleased.

Now to do it all over again with the equally terse &lt;a href="http://www.microsoft.com/learning/exams/70-320.asp"&gt;Developing XML Web Services and Server Components with Microsoft Visual C# .NET and the Microsoft .NET Framework&lt;/a&gt;. Perhaps the people who write these exams get paid by the word...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-4565966140824156381?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/4565966140824156381/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=4565966140824156381' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/4565966140824156381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/4565966140824156381'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2006/12/mcp-5.html' title='MCP #7'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-115824542604105837</id><published>2006-09-15T00:29:00.000+10:00</published><updated>2007-03-28T11:41:34.147+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='boats'/><title type='text'>Messing About In Boats</title><content type='html'>&lt;blockquote&gt;Believe me, my young friend, there is NOTHING - absolute nothing - half so much worth doing as simply messing about in boats.&lt;/blockquote&gt;&lt;p&gt;Kenneth Graham could not have penned a truer word. There is something special about boats, or to be more precise, sailing boats. As a practical means of getting from A to B, they're not too practical, but if you're someone who believes that the journey is as important as the destination, then sailing is for you.&lt;/p&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.flickr.com/photos/davidkeaveny/243114683/in/set-72157594283848168/"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px;" src="http://static.flickr.com/96/243114683_551a3ac0cf.jpg?v=0" alt="Jules grabs some rays" border="0" /&gt;&lt;/a&gt;And so it proved for the Fairfax Digital Classifieds Services team. Having shipped a big software project some six weeks ahead of schedule, and under budget, we felt we were due a little bit of a letting down of hair before cracking on with the next big project. So with winter safely out of the way, the vote for sailing was pretty much unanimous. Seeing as our office building is only two minute's walk from the offices of Sydney By Sail, it couldn't be easier, and so here's some photographic evidence of people enjoying themselves, maybe helped a little by the cases of beer that found their way on board, maybe by the fact that it had been raining heavily for the past week and today was the first clear day, and maybe by the fact that the rest of our colleagues were still hard at it.&lt;/p&gt;
&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.flickr.com/photos/davidkeaveny/243116775/in/set-72157594283848168/"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px;" src="http://static.flickr.com/90/243116775_989e93369d.jpg?v=0" alt="" border="0" /&gt;&lt;/a&gt;The conditions were pretty much spot on for us, with a light northerly wind, and the gentlest of swells coming in through the Heads. With only seven of us, we didn't need a big boat, so Charlotte, a Hunter 33, was more than sufficient - no jetski, but plenty of drinks holders... Anyhow, we motored out past the Harbour Bridge away from the traffic of ferries, shook the sails out and tacked our way up towards Manly. We then dropped the anchor for an hour while we finished lunch, then ran back down with the wind and back into harbour. Now we just need to finish the next project in record time too, catch the end of summer, and we can bring our bathers with us.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-115824542604105837?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/115824542604105837/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=115824542604105837' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/115824542604105837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/115824542604105837'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2006/09/messing-about-in-boats.html' title='Messing About In Boats'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-115804302765531745</id><published>2006-09-12T16:06:00.000+10:00</published><updated>2007-03-28T11:39:06.750+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='cruisecontrol'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><title type='text'>CruiseControl.NET - Using the Multi SourceControl block with filters</title><content type='html'>As some have been &lt;a href="http://www.jonathanmalek.com/blog/CruiseControlNETHowToUseFilteredSourceControlWithCVS.aspx"&gt;led to observe&lt;/a&gt;, the documentation that goes with &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET"&gt;CruiseControl.NET&lt;/a&gt; is, charitably speaking, a little sparse. This is particularly true of the &lt;a href="http://ccnet.thoughtworks.net/display/CCNET/Multi+Source+Control+Block"&gt;Multi SourceControl Block&lt;/a&gt;, which, unsurprisingly, allows the use of multiple source control blocks in a project. In the project that I am currently working on, I have some five separate CVS projects to check, and to add to the fun, I wanted to add some &lt;a href="http://ccnet.sourceforge.net/CCNET/Filtered%20Source%20Control%20Block.html"&gt;path filters&lt;/a&gt; to the mix. So, after a little trial and error, and a quick peek at the source code, here's a code sample for using path filters with multiple source control providers:

&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white; border : 1 1 1 1; border-color: #0000dd; padding: 4 4 4 4; background-color: #dddddd;"&gt;
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;sourcecontrol&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;="multi"&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;sourceControls&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;filtered&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;sourceControlProvider&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;="cvs"&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;executable&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;C:\Program Files\cvsnt\cvs.exe&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;executable&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;workingDirectory&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;D:\Cvs\Services&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;workingDirectory&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;sourceControlProvider&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;exclusionFilters&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;pathFilter&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;pattern&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;**/build.number&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;pattern&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;pathFilter&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;pathFilter&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;pattern&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;**/CommonAssemblyInfo.cs&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;pattern&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;pathFilter&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;exclusionFilters&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;filtered&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;filtered&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;sourceControlProvider&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;="cvs"&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;executable&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;C:\Program Files\cvsnt\cvs.exe&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;executable&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;workingDirectory&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;D:\Cvs\Console&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;workingDirectory&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;sourceControlProvider&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;exclusionFilters&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;pathFilter&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;pattern&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;**/build.number&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;pattern&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;pathFilter&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;pathFilter&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;pattern&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;**/CommonAssemblyInfo.cs&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;pattern&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;pathFilter&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;exclusionFilters&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;filtered&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;sourceControls&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;sourcecontrol&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-115804302765531745?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/115804302765531745/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=115804302765531745' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/115804302765531745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/115804302765531745'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2006/09/cruisecontrolnet-using-multi.html' title='CruiseControl.NET - Using the Multi SourceControl block with filters'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-115608666299653161</id><published>2006-08-21T01:05:00.000+10:00</published><updated>2007-03-28T11:41:17.187+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cats'/><title type='text'>A new addition to the Keaveny household</title><content type='html'>&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt; &lt;a href="http://www.flickr.com/photos/davidkeaveny/219980086/" title="photo sharing"&gt;&lt;img src="http://static.flickr.com/58/219980086_544f5d3c2a_m.jpg" alt="" style="border: solid 2px #000000;" /&gt;&lt;/a&gt; &lt;br /&gt; &lt;span style="font-size: 0.9em; margin-top: 0px;"&gt;  &lt;a href="http://www.flickr.com/photos/davidkeaveny/219980086/"&gt;Coco&lt;/a&gt;  &lt;br /&gt;  Originally uploaded by &lt;a href="http://www.flickr.com/people/davidkeaveny/"&gt;DavidKeaveny&lt;/a&gt;. &lt;/span&gt;&lt;/div&gt;Please welcome the 7th cat to grace our quilts since Emily and I moved in together! This lovely little lady is Coco (although I sometimes call her Keiko), a three year old black domestic long hair. We got her from the local vet, who rescued her after her previous owners were going to have her sent to the pound after they couldn't afford the medical bills when she broke her leg. We were very happy to have her!&lt;br /&gt;&lt;br /&gt;Life has been strange these past nine months with only one cat around. We kinda missed constantly tripping over felines, especially when they were waiting right behind us when we were preparing food. To tell the truth, we think Jasmine rather missed the company too, so she now has a new friend.&lt;br /&gt;&lt;br /&gt;Coco is quite shy at the moment while she settles in, but very friendly when she's got a little more confidence - I have never had a cat lick my hand so much, even when I've just been handling fish!&lt;br clear="all" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-115608666299653161?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/115608666299653161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=115608666299653161' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/115608666299653161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/115608666299653161'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2006/08/new-addition-to-keaveny-household.html' title='A new addition to the Keaveny household'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30748878.post-115371811511948244</id><published>2006-07-24T14:56:00.000+10:00</published><updated>2007-03-28T11:40:17.735+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><title type='text'>Beginning Open-Source Programming</title><content type='html'>Having spent the last few years making good use of some of the many &lt;a href="http://www.nunit.org"&gt;excellent&lt;/a&gt; &lt;a href="http://www.ncover.org"&gt;open-source&lt;/a&gt; &lt;a href="http://nant.sourceforge.net"&gt;tools&lt;/a&gt; &lt;a href="http://ccnet.thoughtworks.com"&gt;for&lt;/a&gt; &lt;a href="http://wix.sourceforge.net"&gt;.NET&lt;/a&gt;, I thought that it was long past time that I contributed a little something back. I don't claim to be a guru programmer, but the situation arose at work where I needed a bit of functionality that present in &lt;a href="http://nant.sourceforge.net"&gt;NAnt&lt;/a&gt; or &lt;a href="http://nantcontrib.sourceforge.net"&gt;NAntContrib&lt;/a&gt;. I've been playing around with Microsoft's &lt;a href="http://wix.sourceforge.net"&gt;WiX Toolset&lt;/a&gt; for creating MSI deployment packages, and as part of the process, a GUID is required to identify the particular product. You can do this easily enough in NAnt with a bit of script, thusly:

&lt;div    style="border-color: rgb(0, 0, 221); padding: 4px; background: rgb(221, 221, 221) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;font-family:Courier New;font-size:10pt;color:black;"&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;script&lt;/span&gt;&lt;span style="color:fuchsia;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;language&lt;/span&gt;&lt;span style="color:blue;"&gt;="C#"&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;      &lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;code&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;![&lt;/span&gt;&lt;span style="color:fuchsia;"&gt;CDATA[&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color:fuchsia;"&gt;  public static void ScriptMain&lt;/span&gt;&lt;span style="color:blue;"&gt;(&lt;/span&gt;&lt;span style="color:fuchsia;"&gt;Project project&lt;/span&gt;&lt;span style="color:blue;"&gt;)&lt;/span&gt;&lt;span style="color:fuchsia;"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color:fuchsia;"&gt;  {&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color:fuchsia;"&gt;    project.Properties[&lt;/span&gt;&lt;span style="color:blue;"&gt;"mynew.guid"]&lt;span style="color:fuchsia;"&gt; =&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color:fuchsia;"&gt;    Guid.NewGuid&lt;/span&gt;&lt;span style="color:blue;"&gt;()&lt;/span&gt;&lt;span style="color:fuchsia;"&gt;.ToString&lt;/span&gt;&lt;span style="color:blue;"&gt;()&lt;/span&gt;&lt;span style="color:fuchsia;"&gt;.ToUpper&lt;/span&gt;&lt;span style="color:blue;"&gt;()&lt;/span&gt;&lt;span style="color:fuchsia;"&gt;;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color:fuchsia;"&gt;  }&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;  &lt;span style="color:blue;"&gt;]]&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;    &lt;span style="color:blue;"&gt;&lt;!--&lt;/span--&gt;&lt;span style="color:maroon;"&gt;  &lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;code&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color:blue;"&gt;&lt;!--&lt;/span--&gt;&lt;span style="color:maroon;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;
but when, as in my case, you are building four separate MSI packages and therefore need four GUIDs, it becomes a bit of a chore. So, I downloaded the source for NAntContrib, and knocked together the tiniest of tasks to do the same.

&lt;div    style="border-color: rgb(0, 0, 221); padding: 4px; background: rgb(221, 221, 221) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;font-family:Courier New;font-size:10pt;color:black;"&gt; &lt;p style="margin: 0px;"&gt;[TaskName(&lt;span style="color:maroon;"&gt;"guid"&lt;/span&gt;)]&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; GuidTask : Task {&lt;/p&gt; &lt;p style="margin: 0px;"&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;      &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; _prefix = &lt;span style="color:maroon;"&gt;"new"&lt;/span&gt;;&lt;/p&gt; &lt;p style="margin: 0px;"&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;      &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;      &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; The generated GUID will be stored in a property &lt;/span&gt;&lt;span style="color:gray;"&gt;&lt;c&gt;&lt;em&gt;&lt;/em&gt;&lt;/c&gt;&lt;/span&gt;&lt;span style="color:green;"&gt;&lt;em&gt;prefix&lt;/em&gt;&lt;/span&gt;&lt;span style="color:green;"&gt;.guid&lt;/span&gt;&lt;span style="color:green;"&gt;.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;      &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; The default is &lt;/span&gt;&lt;span style="color:gray;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="color:green;"&gt;&lt;strong&gt;new&lt;/strong&gt;&lt;/span&gt;&lt;span style="color:green;"&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;      &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;  [TaskAttribute(&lt;span style="color:maroon;"&gt;"prefix"&lt;/span&gt;, Required=&lt;span style="color:blue;"&gt;false&lt;/span&gt;)]&lt;/p&gt; &lt;p style="margin: 0px;"&gt;  [StringValidator(AllowEmpty=&lt;span style="color:blue;"&gt;true&lt;/span&gt;)]&lt;/p&gt; &lt;p style="margin: 0px;"&gt;      &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; Prefix {&lt;/p&gt; &lt;p style="margin: 0px;"&gt;            &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; _prefix; }&lt;/p&gt; &lt;p style="margin: 0px;"&gt;            &lt;span style="color:blue;"&gt;set&lt;/span&gt; { _prefix = StringUtils.ConvertEmptyToNull(&lt;span style="color:blue;"&gt;value&lt;/span&gt;); }&lt;/p&gt; &lt;p style="margin: 0px;"&gt;  }&lt;/p&gt; &lt;p style="margin: 0px;"&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;      &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;      &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; Executes the task.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;      &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;      &lt;span style="color:blue;"&gt;protected&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; ExecuteTask()  {&lt;/p&gt; &lt;p style="margin: 0px;"&gt;    &lt;span style="color:blue;"&gt;string&lt;/span&gt; guid = Guid.NewGuid().ToString().ToUpper();&lt;/p&gt; &lt;p style="margin: 0px;"&gt; &lt;/p&gt; &lt;p style="margin: 0px;"&gt;    Project.Properties[Prefix + &lt;span style="color:maroon;"&gt;".guid"&lt;/span&gt;] = guid;&lt;/p&gt; &lt;p style="margin: 0px;"&gt; &lt;/p&gt; &lt;p style="margin: 0px;"&gt;    Log(Level.Info, &lt;span style="color:maroon;"&gt;"Generated new GUID {0} for property '{1}.guid'."&lt;/span&gt;, guid, Prefix);&lt;/p&gt; &lt;p style="margin: 0px;"&gt;  }&lt;/p&gt; &lt;p style="margin: 0px;"&gt; &lt;/p&gt;&lt;/div&gt;
I &lt;span style="font-style: italic;"&gt;did&lt;/span&gt; say that it was tiny! Actually, that's about half of the code; the rest is pretty much all XML code comments for the API documentation. The result of this all is that the NAnt script to do what my first sample does is now:

&lt;div    style="border-color: rgb(0, 0, 221); padding: 4px; background: rgb(221, 221, 221) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;font-family:Courier New;font-size:10pt;color:black;"&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color:blue;"&gt;&lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;guid&lt;/span&gt;&lt;span style="color:fuchsia;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;prefix&lt;/span&gt;&lt;span style="color:blue;"&gt;="mynew"&lt;/span&gt;&lt;span style="color:fuchsia;"&gt; &lt;/span&gt;&lt;span style="color:blue;"&gt;/&gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;
Personally, I'm rather pleased with it the whole process. It's quite enlightening being able to trawl through the various codebases for some high-profile open-source .NET applications; and definitely rather pleasing to be able to contribute to the community which provides such great tools. I'm hoping that I'll see the code included in 0.85-rc5.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30748878-115371811511948244?l=davidkeaveny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidkeaveny.blogspot.com/feeds/115371811511948244/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30748878&amp;postID=115371811511948244' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/115371811511948244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30748878/posts/default/115371811511948244'/><link rel='alternate' type='text/html' href='http://davidkeaveny.blogspot.com/2006/07/beginning-open-source-programming.html' title='Beginning Open-Source Programming'/><author><name>David Keaveny</name><uri>http://www.blogger.com/profile/07944978161341604262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
